]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
Merge remote-tracking branch 'upstream/pull/2079'
[rails.git] / vendor / assets / iD / iD.js
1 (function () {
2   var version = "4.13.0";
3
4   function ascending(a, b) {
5     return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
6   }
7
8   function bisector(compare) {
9     if (compare.length === 1) compare = ascendingComparator(compare);
10     return {
11       left: function(a, x, lo, hi) {
12         if (lo == null) lo = 0;
13         if (hi == null) hi = a.length;
14         while (lo < hi) {
15           var mid = lo + hi >>> 1;
16           if (compare(a[mid], x) < 0) lo = mid + 1;
17           else hi = mid;
18         }
19         return lo;
20       },
21       right: function(a, x, lo, hi) {
22         if (lo == null) lo = 0;
23         if (hi == null) hi = a.length;
24         while (lo < hi) {
25           var mid = lo + hi >>> 1;
26           if (compare(a[mid], x) > 0) hi = mid;
27           else lo = mid + 1;
28         }
29         return lo;
30       }
31     };
32   }
33
34   function ascendingComparator(f) {
35     return function(d, x) {
36       return ascending(f(d), x);
37     };
38   }
39
40   var ascendingBisect = bisector(ascending);
41   var bisectRight = ascendingBisect.right;
42   var bisectLeft = ascendingBisect.left;
43
44   function pairs(array, f) {
45     if (f == null) f = pair;
46     var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);
47     while (i < n) pairs[i] = f(p, p = array[++i]);
48     return pairs;
49   }
50
51   function pair(a, b) {
52     return [a, b];
53   }
54
55   function cross(values0, values1, reduce) {
56     var n0 = values0.length,
57         n1 = values1.length,
58         values = new Array(n0 * n1),
59         i0,
60         i1,
61         i,
62         value0;
63
64     if (reduce == null) reduce = pair;
65
66     for (i0 = i = 0; i0 < n0; ++i0) {
67       for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {
68         values[i] = reduce(value0, values1[i1]);
69       }
70     }
71
72     return values;
73   }
74
75   function d3_descending(a, b) {
76     return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
77   }
78
79   function number(x) {
80     return x === null ? NaN : +x;
81   }
82
83   function variance(values, valueof) {
84     var n = values.length,
85         m = 0,
86         i = -1,
87         mean = 0,
88         value,
89         delta,
90         sum = 0;
91
92     if (valueof == null) {
93       while (++i < n) {
94         if (!isNaN(value = number(values[i]))) {
95           delta = value - mean;
96           mean += delta / ++m;
97           sum += delta * (value - mean);
98         }
99       }
100     }
101
102     else {
103       while (++i < n) {
104         if (!isNaN(value = number(valueof(values[i], i, values)))) {
105           delta = value - mean;
106           mean += delta / ++m;
107           sum += delta * (value - mean);
108         }
109       }
110     }
111
112     if (m > 1) return sum / (m - 1);
113   }
114
115   function deviation(array, f) {
116     var v = variance(array, f);
117     return v ? Math.sqrt(v) : v;
118   }
119
120   function extent(values, valueof) {
121     var n = values.length,
122         i = -1,
123         value,
124         min,
125         max;
126
127     if (valueof == null) {
128       while (++i < n) { // Find the first comparable value.
129         if ((value = values[i]) != null && value >= value) {
130           min = max = value;
131           while (++i < n) { // Compare the remaining values.
132             if ((value = values[i]) != null) {
133               if (min > value) min = value;
134               if (max < value) max = value;
135             }
136           }
137         }
138       }
139     }
140
141     else {
142       while (++i < n) { // Find the first comparable value.
143         if ((value = valueof(values[i], i, values)) != null && value >= value) {
144           min = max = value;
145           while (++i < n) { // Compare the remaining values.
146             if ((value = valueof(values[i], i, values)) != null) {
147               if (min > value) min = value;
148               if (max < value) max = value;
149             }
150           }
151         }
152       }
153     }
154
155     return [min, max];
156   }
157
158   var array = Array.prototype;
159
160   var slice = array.slice;
161   var map = array.map;
162
163   function constant(x) {
164     return function() {
165       return x;
166     };
167   }
168
169   function identity(x) {
170     return x;
171   }
172
173   function range(start, stop, step) {
174     start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
175
176     var i = -1,
177         n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
178         range = new Array(n);
179
180     while (++i < n) {
181       range[i] = start + i * step;
182     }
183
184     return range;
185   }
186
187   var e10 = Math.sqrt(50),
188       e5 = Math.sqrt(10),
189       e2 = Math.sqrt(2);
190
191   function ticks(start, stop, count) {
192     var reverse,
193         i = -1,
194         n,
195         ticks,
196         step;
197
198     stop = +stop, start = +start, count = +count;
199     if (start === stop && count > 0) return [start];
200     if (reverse = stop < start) n = start, start = stop, stop = n;
201     if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
202
203     if (step > 0) {
204       start = Math.ceil(start / step);
205       stop = Math.floor(stop / step);
206       ticks = new Array(n = Math.ceil(stop - start + 1));
207       while (++i < n) ticks[i] = (start + i) * step;
208     } else {
209       start = Math.floor(start * step);
210       stop = Math.ceil(stop * step);
211       ticks = new Array(n = Math.ceil(start - stop + 1));
212       while (++i < n) ticks[i] = (start - i) / step;
213     }
214
215     if (reverse) ticks.reverse();
216
217     return ticks;
218   }
219
220   function tickIncrement(start, stop, count) {
221     var step = (stop - start) / Math.max(0, count),
222         power = Math.floor(Math.log(step) / Math.LN10),
223         error = step / Math.pow(10, power);
224     return power >= 0
225         ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)
226         : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
227   }
228
229   function tickStep(start, stop, count) {
230     var step0 = Math.abs(stop - start) / Math.max(0, count),
231         step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
232         error = step0 / step1;
233     if (error >= e10) step1 *= 10;
234     else if (error >= e5) step1 *= 5;
235     else if (error >= e2) step1 *= 2;
236     return stop < start ? -step1 : step1;
237   }
238
239   function sturges(values) {
240     return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
241   }
242
243   function histogram() {
244     var value = identity,
245         domain = extent,
246         threshold = sturges;
247
248     function histogram(data) {
249       var i,
250           n = data.length,
251           x,
252           values = new Array(n);
253
254       for (i = 0; i < n; ++i) {
255         values[i] = value(data[i], i, data);
256       }
257
258       var xz = domain(values),
259           x0 = xz[0],
260           x1 = xz[1],
261           tz = threshold(values, x0, x1);
262
263       // Convert number of thresholds into uniform thresholds.
264       if (!Array.isArray(tz)) {
265         tz = tickStep(x0, x1, tz);
266         tz = range(Math.ceil(x0 / tz) * tz, Math.floor(x1 / tz) * tz, tz); // exclusive
267       }
268
269       // Remove any thresholds outside the domain.
270       var m = tz.length;
271       while (tz[0] <= x0) tz.shift(), --m;
272       while (tz[m - 1] > x1) tz.pop(), --m;
273
274       var bins = new Array(m + 1),
275           bin;
276
277       // Initialize bins.
278       for (i = 0; i <= m; ++i) {
279         bin = bins[i] = [];
280         bin.x0 = i > 0 ? tz[i - 1] : x0;
281         bin.x1 = i < m ? tz[i] : x1;
282       }
283
284       // Assign data to bins by value, ignoring any outside the domain.
285       for (i = 0; i < n; ++i) {
286         x = values[i];
287         if (x0 <= x && x <= x1) {
288           bins[bisectRight(tz, x, 0, m)].push(data[i]);
289         }
290       }
291
292       return bins;
293     }
294
295     histogram.value = function(_) {
296       return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
297     };
298
299     histogram.domain = function(_) {
300       return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain;
301     };
302
303     histogram.thresholds = function(_) {
304       return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;
305     };
306
307     return histogram;
308   }
309
310   function quantile(values, p, valueof) {
311     if (valueof == null) valueof = number;
312     if (!(n = values.length)) return;
313     if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
314     if (p >= 1) return +valueof(values[n - 1], n - 1, values);
315     var n,
316         i = (n - 1) * p,
317         i0 = Math.floor(i),
318         value0 = +valueof(values[i0], i0, values),
319         value1 = +valueof(values[i0 + 1], i0 + 1, values);
320     return value0 + (value1 - value0) * (i - i0);
321   }
322
323   function freedmanDiaconis(values, min, max) {
324     values = map.call(values, number).sort(ascending);
325     return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3)));
326   }
327
328   function scott(values, min, max) {
329     return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
330   }
331
332   function max(values, valueof) {
333     var n = values.length,
334         i = -1,
335         value,
336         max;
337
338     if (valueof == null) {
339       while (++i < n) { // Find the first comparable value.
340         if ((value = values[i]) != null && value >= value) {
341           max = value;
342           while (++i < n) { // Compare the remaining values.
343             if ((value = values[i]) != null && value > max) {
344               max = value;
345             }
346           }
347         }
348       }
349     }
350
351     else {
352       while (++i < n) { // Find the first comparable value.
353         if ((value = valueof(values[i], i, values)) != null && value >= value) {
354           max = value;
355           while (++i < n) { // Compare the remaining values.
356             if ((value = valueof(values[i], i, values)) != null && value > max) {
357               max = value;
358             }
359           }
360         }
361       }
362     }
363
364     return max;
365   }
366
367   function mean(values, valueof) {
368     var n = values.length,
369         m = n,
370         i = -1,
371         value,
372         sum = 0;
373
374     if (valueof == null) {
375       while (++i < n) {
376         if (!isNaN(value = number(values[i]))) sum += value;
377         else --m;
378       }
379     }
380
381     else {
382       while (++i < n) {
383         if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;
384         else --m;
385       }
386     }
387
388     if (m) return sum / m;
389   }
390
391   function d3_median(values, valueof) {
392     var n = values.length,
393         i = -1,
394         value,
395         numbers = [];
396
397     if (valueof == null) {
398       while (++i < n) {
399         if (!isNaN(value = number(values[i]))) {
400           numbers.push(value);
401         }
402       }
403     }
404
405     else {
406       while (++i < n) {
407         if (!isNaN(value = number(valueof(values[i], i, values)))) {
408           numbers.push(value);
409         }
410       }
411     }
412
413     return quantile(numbers.sort(ascending), 0.5);
414   }
415
416   function merge(arrays) {
417     var n = arrays.length,
418         m,
419         i = -1,
420         j = 0,
421         merged,
422         array;
423
424     while (++i < n) j += arrays[i].length;
425     merged = new Array(j);
426
427     while (--n >= 0) {
428       array = arrays[n];
429       m = array.length;
430       while (--m >= 0) {
431         merged[--j] = array[m];
432       }
433     }
434
435     return merged;
436   }
437
438   function min(values, valueof) {
439     var n = values.length,
440         i = -1,
441         value,
442         min;
443
444     if (valueof == null) {
445       while (++i < n) { // Find the first comparable value.
446         if ((value = values[i]) != null && value >= value) {
447           min = value;
448           while (++i < n) { // Compare the remaining values.
449             if ((value = values[i]) != null && min > value) {
450               min = value;
451             }
452           }
453         }
454       }
455     }
456
457     else {
458       while (++i < n) { // Find the first comparable value.
459         if ((value = valueof(values[i], i, values)) != null && value >= value) {
460           min = value;
461           while (++i < n) { // Compare the remaining values.
462             if ((value = valueof(values[i], i, values)) != null && min > value) {
463               min = value;
464             }
465           }
466         }
467       }
468     }
469
470     return min;
471   }
472
473   function permute(array, indexes) {
474     var i = indexes.length, permutes = new Array(i);
475     while (i--) permutes[i] = array[indexes[i]];
476     return permutes;
477   }
478
479   function scan(values, compare) {
480     if (!(n = values.length)) return;
481     var n,
482         i = 0,
483         j = 0,
484         xi,
485         xj = values[j];
486
487     if (compare == null) compare = ascending;
488
489     while (++i < n) {
490       if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {
491         xj = xi, j = i;
492       }
493     }
494
495     if (compare(xj, xj) === 0) return j;
496   }
497
498   function shuffle(array, i0, i1) {
499     var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
500         t,
501         i;
502
503     while (m) {
504       i = Math.random() * m-- | 0;
505       t = array[m + i0];
506       array[m + i0] = array[i + i0];
507       array[i + i0] = t;
508     }
509
510     return array;
511   }
512
513   function sum(values, valueof) {
514     var n = values.length,
515         i = -1,
516         value,
517         sum = 0;
518
519     if (valueof == null) {
520       while (++i < n) {
521         if (value = +values[i]) sum += value; // Note: zero and null are equivalent.
522       }
523     }
524
525     else {
526       while (++i < n) {
527         if (value = +valueof(values[i], i, values)) sum += value;
528       }
529     }
530
531     return sum;
532   }
533
534   function transpose(matrix) {
535     if (!(n = matrix.length)) return [];
536     for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {
537       for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
538         row[j] = matrix[j][i];
539       }
540     }
541     return transpose;
542   }
543
544   function length(d) {
545     return d.length;
546   }
547
548   function zip() {
549     return transpose(arguments);
550   }
551
552   var slice$1 = Array.prototype.slice;
553
554   function identity$1(x) {
555     return x;
556   }
557
558   var top = 1,
559       right = 2,
560       bottom = 3,
561       left = 4,
562       epsilon = 1e-6;
563
564   function translateX(x) {
565     return "translate(" + (x + 0.5) + ",0)";
566   }
567
568   function translateY(y) {
569     return "translate(0," + (y + 0.5) + ")";
570   }
571
572   function number$1(scale) {
573     return function(d) {
574       return +scale(d);
575     };
576   }
577
578   function center(scale) {
579     var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.
580     if (scale.round()) offset = Math.round(offset);
581     return function(d) {
582       return +scale(d) + offset;
583     };
584   }
585
586   function entering() {
587     return !this.__axis;
588   }
589
590   function axis(orient, scale) {
591     var tickArguments = [],
592         tickValues = null,
593         tickFormat = null,
594         tickSizeInner = 6,
595         tickSizeOuter = 6,
596         tickPadding = 3,
597         k = orient === top || orient === left ? -1 : 1,
598         x = orient === left || orient === right ? "x" : "y",
599         transform = orient === top || orient === bottom ? translateX : translateY;
600
601     function axis(context) {
602       var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,
603           format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$1) : tickFormat,
604           spacing = Math.max(tickSizeInner, 0) + tickPadding,
605           range = scale.range(),
606           range0 = +range[0] + 0.5,
607           range1 = +range[range.length - 1] + 0.5,
608           position = (scale.bandwidth ? center : number$1)(scale.copy()),
609           selection = context.selection ? context.selection() : context,
610           path = selection.selectAll(".domain").data([null]),
611           tick = selection.selectAll(".tick").data(values, scale).order(),
612           tickExit = tick.exit(),
613           tickEnter = tick.enter().append("g").attr("class", "tick"),
614           line = tick.select("line"),
615           text = tick.select("text");
616
617       path = path.merge(path.enter().insert("path", ".tick")
618           .attr("class", "domain")
619           .attr("stroke", "#000"));
620
621       tick = tick.merge(tickEnter);
622
623       line = line.merge(tickEnter.append("line")
624           .attr("stroke", "#000")
625           .attr(x + "2", k * tickSizeInner));
626
627       text = text.merge(tickEnter.append("text")
628           .attr("fill", "#000")
629           .attr(x, k * spacing)
630           .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em"));
631
632       if (context !== selection) {
633         path = path.transition(context);
634         tick = tick.transition(context);
635         line = line.transition(context);
636         text = text.transition(context);
637
638         tickExit = tickExit.transition(context)
639             .attr("opacity", epsilon)
640             .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); });
641
642         tickEnter
643             .attr("opacity", epsilon)
644             .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });
645       }
646
647       tickExit.remove();
648
649       path
650           .attr("d", orient === left || orient == right
651               ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter
652               : "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter);
653
654       tick
655           .attr("opacity", 1)
656           .attr("transform", function(d) { return transform(position(d)); });
657
658       line
659           .attr(x + "2", k * tickSizeInner);
660
661       text
662           .attr(x, k * spacing)
663           .text(format);
664
665       selection.filter(entering)
666           .attr("fill", "none")
667           .attr("font-size", 10)
668           .attr("font-family", "sans-serif")
669           .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle");
670
671       selection
672           .each(function() { this.__axis = position; });
673     }
674
675     axis.scale = function(_) {
676       return arguments.length ? (scale = _, axis) : scale;
677     };
678
679     axis.ticks = function() {
680       return tickArguments = slice$1.call(arguments), axis;
681     };
682
683     axis.tickArguments = function(_) {
684       return arguments.length ? (tickArguments = _ == null ? [] : slice$1.call(_), axis) : tickArguments.slice();
685     };
686
687     axis.tickValues = function(_) {
688       return arguments.length ? (tickValues = _ == null ? null : slice$1.call(_), axis) : tickValues && tickValues.slice();
689     };
690
691     axis.tickFormat = function(_) {
692       return arguments.length ? (tickFormat = _, axis) : tickFormat;
693     };
694
695     axis.tickSize = function(_) {
696       return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;
697     };
698
699     axis.tickSizeInner = function(_) {
700       return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;
701     };
702
703     axis.tickSizeOuter = function(_) {
704       return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;
705     };
706
707     axis.tickPadding = function(_) {
708       return arguments.length ? (tickPadding = +_, axis) : tickPadding;
709     };
710
711     return axis;
712   }
713
714   function axisTop(scale) {
715     return axis(top, scale);
716   }
717
718   function axisRight(scale) {
719     return axis(right, scale);
720   }
721
722   function axisBottom(scale) {
723     return axis(bottom, scale);
724   }
725
726   function axisLeft(scale) {
727     return axis(left, scale);
728   }
729
730   var noop = {value: function() {}};
731
732   function dispatch() {
733     for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
734       if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t);
735       _[t] = [];
736     }
737     return new Dispatch(_);
738   }
739
740   function Dispatch(_) {
741     this._ = _;
742   }
743
744   function parseTypenames(typenames, types) {
745     return typenames.trim().split(/^|\s+/).map(function(t) {
746       var name = "", i = t.indexOf(".");
747       if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
748       if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
749       return {type: t, name: name};
750     });
751   }
752
753   Dispatch.prototype = dispatch.prototype = {
754     constructor: Dispatch,
755     on: function(typename, callback) {
756       var _ = this._,
757           T = parseTypenames(typename + "", _),
758           t,
759           i = -1,
760           n = T.length;
761
762       // If no callback was specified, return the callback of the given type and name.
763       if (arguments.length < 2) {
764         while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;
765         return;
766       }
767
768       // If a type was specified, set the callback for the given type and name.
769       // Otherwise, if a null callback was specified, remove callbacks of the given name.
770       if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
771       while (++i < n) {
772         if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);
773         else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);
774       }
775
776       return this;
777     },
778     copy: function() {
779       var copy = {}, _ = this._;
780       for (var t in _) copy[t] = _[t].slice();
781       return new Dispatch(copy);
782     },
783     call: function(type, that) {
784       if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
785       if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
786       for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
787     },
788     apply: function(type, that, args) {
789       if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
790       for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
791     }
792   };
793
794   function get(type, name) {
795     for (var i = 0, n = type.length, c; i < n; ++i) {
796       if ((c = type[i]).name === name) {
797         return c.value;
798       }
799     }
800   }
801
802   function set(type, name, callback) {
803     for (var i = 0, n = type.length; i < n; ++i) {
804       if (type[i].name === name) {
805         type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));
806         break;
807       }
808     }
809     if (callback != null) type.push({name: name, value: callback});
810     return type;
811   }
812
813   var xhtml = "http://www.w3.org/1999/xhtml";
814
815   var namespaces = {
816     svg: "http://www.w3.org/2000/svg",
817     xhtml: xhtml,
818     xlink: "http://www.w3.org/1999/xlink",
819     xml: "http://www.w3.org/XML/1998/namespace",
820     xmlns: "http://www.w3.org/2000/xmlns/"
821   };
822
823   function namespace(name) {
824     var prefix = name += "", i = prefix.indexOf(":");
825     if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
826     return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;
827   }
828
829   function creatorInherit(name) {
830     return function() {
831       var document = this.ownerDocument,
832           uri = this.namespaceURI;
833       return uri === xhtml && document.documentElement.namespaceURI === xhtml
834           ? document.createElement(name)
835           : document.createElementNS(uri, name);
836     };
837   }
838
839   function creatorFixed(fullname) {
840     return function() {
841       return this.ownerDocument.createElementNS(fullname.space, fullname.local);
842     };
843   }
844
845   function creator(name) {
846     var fullname = namespace(name);
847     return (fullname.local
848         ? creatorFixed
849         : creatorInherit)(fullname);
850   }
851
852   function none() {}
853
854   function selector(selector) {
855     return selector == null ? none : function() {
856       return this.querySelector(selector);
857     };
858   }
859
860   function selection_select(select) {
861     if (typeof select !== "function") select = selector(select);
862
863     for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
864       for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
865         if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
866           if ("__data__" in node) subnode.__data__ = node.__data__;
867           subgroup[i] = subnode;
868         }
869       }
870     }
871
872     return new Selection(subgroups, this._parents);
873   }
874
875   function empty() {
876     return [];
877   }
878
879   function selectorAll(selector) {
880     return selector == null ? empty : function() {
881       return this.querySelectorAll(selector);
882     };
883   }
884
885   function selection_selectAll(select) {
886     if (typeof select !== "function") select = selectorAll(select);
887
888     for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
889       for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
890         if (node = group[i]) {
891           subgroups.push(select.call(node, node.__data__, i, group));
892           parents.push(node);
893         }
894       }
895     }
896
897     return new Selection(subgroups, parents);
898   }
899
900   var matcher = function(selector) {
901     return function() {
902       return this.matches(selector);
903     };
904   };
905
906   if (typeof document !== "undefined") {
907     var element = document.documentElement;
908     if (!element.matches) {
909       var vendorMatches = element.webkitMatchesSelector
910           || element.msMatchesSelector
911           || element.mozMatchesSelector
912           || element.oMatchesSelector;
913       matcher = function(selector) {
914         return function() {
915           return vendorMatches.call(this, selector);
916         };
917       };
918     }
919   }
920
921   var matcher$1 = matcher;
922
923   function selection_filter(match) {
924     if (typeof match !== "function") match = matcher$1(match);
925
926     for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
927       for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
928         if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
929           subgroup.push(node);
930         }
931       }
932     }
933
934     return new Selection(subgroups, this._parents);
935   }
936
937   function sparse(update) {
938     return new Array(update.length);
939   }
940
941   function selection_enter() {
942     return new Selection(this._enter || this._groups.map(sparse), this._parents);
943   }
944
945   function EnterNode(parent, datum) {
946     this.ownerDocument = parent.ownerDocument;
947     this.namespaceURI = parent.namespaceURI;
948     this._next = null;
949     this._parent = parent;
950     this.__data__ = datum;
951   }
952
953   EnterNode.prototype = {
954     constructor: EnterNode,
955     appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
956     insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
957     querySelector: function(selector) { return this._parent.querySelector(selector); },
958     querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
959   };
960
961   function constant$1(x) {
962     return function() {
963       return x;
964     };
965   }
966
967   var keyPrefix = "$"; // Protect against keys like “__proto__”.
968
969   function bindIndex(parent, group, enter, update, exit, data) {
970     var i = 0,
971         node,
972         groupLength = group.length,
973         dataLength = data.length;
974
975     // Put any non-null nodes that fit into update.
976     // Put any null nodes into enter.
977     // Put any remaining data into enter.
978     for (; i < dataLength; ++i) {
979       if (node = group[i]) {
980         node.__data__ = data[i];
981         update[i] = node;
982       } else {
983         enter[i] = new EnterNode(parent, data[i]);
984       }
985     }
986
987     // Put any non-null nodes that don’t fit into exit.
988     for (; i < groupLength; ++i) {
989       if (node = group[i]) {
990         exit[i] = node;
991       }
992     }
993   }
994
995   function bindKey(parent, group, enter, update, exit, data, key) {
996     var i,
997         node,
998         nodeByKeyValue = {},
999         groupLength = group.length,
1000         dataLength = data.length,
1001         keyValues = new Array(groupLength),
1002         keyValue;
1003
1004     // Compute the key for each node.
1005     // If multiple nodes have the same key, the duplicates are added to exit.
1006     for (i = 0; i < groupLength; ++i) {
1007       if (node = group[i]) {
1008         keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
1009         if (keyValue in nodeByKeyValue) {
1010           exit[i] = node;
1011         } else {
1012           nodeByKeyValue[keyValue] = node;
1013         }
1014       }
1015     }
1016
1017     // Compute the key for each datum.
1018     // If there a node associated with this key, join and add it to update.
1019     // If there is not (or the key is a duplicate), add it to enter.
1020     for (i = 0; i < dataLength; ++i) {
1021       keyValue = keyPrefix + key.call(parent, data[i], i, data);
1022       if (node = nodeByKeyValue[keyValue]) {
1023         update[i] = node;
1024         node.__data__ = data[i];
1025         nodeByKeyValue[keyValue] = null;
1026       } else {
1027         enter[i] = new EnterNode(parent, data[i]);
1028       }
1029     }
1030
1031     // Add any remaining nodes that were not bound to data to exit.
1032     for (i = 0; i < groupLength; ++i) {
1033       if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
1034         exit[i] = node;
1035       }
1036     }
1037   }
1038
1039   function selection_data(value, key) {
1040     if (!value) {
1041       data = new Array(this.size()), j = -1;
1042       this.each(function(d) { data[++j] = d; });
1043       return data;
1044     }
1045
1046     var bind = key ? bindKey : bindIndex,
1047         parents = this._parents,
1048         groups = this._groups;
1049
1050     if (typeof value !== "function") value = constant$1(value);
1051
1052     for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
1053       var parent = parents[j],
1054           group = groups[j],
1055           groupLength = group.length,
1056           data = value.call(parent, parent && parent.__data__, j, parents),
1057           dataLength = data.length,
1058           enterGroup = enter[j] = new Array(dataLength),
1059           updateGroup = update[j] = new Array(dataLength),
1060           exitGroup = exit[j] = new Array(groupLength);
1061
1062       bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
1063
1064       // Now connect the enter nodes to their following update node, such that
1065       // appendChild can insert the materialized enter node before this node,
1066       // rather than at the end of the parent node.
1067       for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
1068         if (previous = enterGroup[i0]) {
1069           if (i0 >= i1) i1 = i0 + 1;
1070           while (!(next = updateGroup[i1]) && ++i1 < dataLength);
1071           previous._next = next || null;
1072         }
1073       }
1074     }
1075
1076     update = new Selection(update, parents);
1077     update._enter = enter;
1078     update._exit = exit;
1079     return update;
1080   }
1081
1082   function selection_exit() {
1083     return new Selection(this._exit || this._groups.map(sparse), this._parents);
1084   }
1085
1086   function selection_merge(selection$$1) {
1087
1088     for (var groups0 = this._groups, groups1 = selection$$1._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
1089       for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
1090         if (node = group0[i] || group1[i]) {
1091           merge[i] = node;
1092         }
1093       }
1094     }
1095
1096     for (; j < m0; ++j) {
1097       merges[j] = groups0[j];
1098     }
1099
1100     return new Selection(merges, this._parents);
1101   }
1102
1103   function selection_order() {
1104
1105     for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
1106       for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
1107         if (node = group[i]) {
1108           if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
1109           next = node;
1110         }
1111       }
1112     }
1113
1114     return this;
1115   }
1116
1117   function selection_sort(compare) {
1118     if (!compare) compare = ascending$1;
1119
1120     function compareNode(a, b) {
1121       return a && b ? compare(a.__data__, b.__data__) : !a - !b;
1122     }
1123
1124     for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
1125       for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
1126         if (node = group[i]) {
1127           sortgroup[i] = node;
1128         }
1129       }
1130       sortgroup.sort(compareNode);
1131     }
1132
1133     return new Selection(sortgroups, this._parents).order();
1134   }
1135
1136   function ascending$1(a, b) {
1137     return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
1138   }
1139
1140   function selection_call() {
1141     var callback = arguments[0];
1142     arguments[0] = this;
1143     callback.apply(null, arguments);
1144     return this;
1145   }
1146
1147   function selection_nodes() {
1148     var nodes = new Array(this.size()), i = -1;
1149     this.each(function() { nodes[++i] = this; });
1150     return nodes;
1151   }
1152
1153   function selection_node() {
1154
1155     for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
1156       for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
1157         var node = group[i];
1158         if (node) return node;
1159       }
1160     }
1161
1162     return null;
1163   }
1164
1165   function selection_size() {
1166     var size = 0;
1167     this.each(function() { ++size; });
1168     return size;
1169   }
1170
1171   function selection_empty() {
1172     return !this.node();
1173   }
1174
1175   function selection_each(callback) {
1176
1177     for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
1178       for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
1179         if (node = group[i]) callback.call(node, node.__data__, i, group);
1180       }
1181     }
1182
1183     return this;
1184   }
1185
1186   function attrRemove(name) {
1187     return function() {
1188       this.removeAttribute(name);
1189     };
1190   }
1191
1192   function attrRemoveNS(fullname) {
1193     return function() {
1194       this.removeAttributeNS(fullname.space, fullname.local);
1195     };
1196   }
1197
1198   function attrConstant(name, value) {
1199     return function() {
1200       this.setAttribute(name, value);
1201     };
1202   }
1203
1204   function attrConstantNS(fullname, value) {
1205     return function() {
1206       this.setAttributeNS(fullname.space, fullname.local, value);
1207     };
1208   }
1209
1210   function attrFunction(name, value) {
1211     return function() {
1212       var v = value.apply(this, arguments);
1213       if (v == null) this.removeAttribute(name);
1214       else this.setAttribute(name, v);
1215     };
1216   }
1217
1218   function attrFunctionNS(fullname, value) {
1219     return function() {
1220       var v = value.apply(this, arguments);
1221       if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
1222       else this.setAttributeNS(fullname.space, fullname.local, v);
1223     };
1224   }
1225
1226   function selection_attr(name, value) {
1227     var fullname = namespace(name);
1228
1229     if (arguments.length < 2) {
1230       var node = this.node();
1231       return fullname.local
1232           ? node.getAttributeNS(fullname.space, fullname.local)
1233           : node.getAttribute(fullname);
1234     }
1235
1236     return this.each((value == null
1237         ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
1238         ? (fullname.local ? attrFunctionNS : attrFunction)
1239         : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
1240   }
1241
1242   function defaultView(node) {
1243     return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
1244         || (node.document && node) // node is a Window
1245         || node.defaultView; // node is a Document
1246   }
1247
1248   function styleRemove(name) {
1249     return function() {
1250       this.style.removeProperty(name);
1251     };
1252   }
1253
1254   function styleConstant(name, value, priority) {
1255     return function() {
1256       this.style.setProperty(name, value, priority);
1257     };
1258   }
1259
1260   function styleFunction(name, value, priority) {
1261     return function() {
1262       var v = value.apply(this, arguments);
1263       if (v == null) this.style.removeProperty(name);
1264       else this.style.setProperty(name, v, priority);
1265     };
1266   }
1267
1268   function selection_style(name, value, priority) {
1269     return arguments.length > 1
1270         ? this.each((value == null
1271               ? styleRemove : typeof value === "function"
1272               ? styleFunction
1273               : styleConstant)(name, value, priority == null ? "" : priority))
1274         : styleValue(this.node(), name);
1275   }
1276
1277   function styleValue(node, name) {
1278     return node.style.getPropertyValue(name)
1279         || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
1280   }
1281
1282   function propertyRemove(name) {
1283     return function() {
1284       delete this[name];
1285     };
1286   }
1287
1288   function propertyConstant(name, value) {
1289     return function() {
1290       this[name] = value;
1291     };
1292   }
1293
1294   function propertyFunction(name, value) {
1295     return function() {
1296       var v = value.apply(this, arguments);
1297       if (v == null) delete this[name];
1298       else this[name] = v;
1299     };
1300   }
1301
1302   function selection_property(name, value) {
1303     return arguments.length > 1
1304         ? this.each((value == null
1305             ? propertyRemove : typeof value === "function"
1306             ? propertyFunction
1307             : propertyConstant)(name, value))
1308         : this.node()[name];
1309   }
1310
1311   function classArray(string) {
1312     return string.trim().split(/^|\s+/);
1313   }
1314
1315   function classList(node) {
1316     return node.classList || new ClassList(node);
1317   }
1318
1319   function ClassList(node) {
1320     this._node = node;
1321     this._names = classArray(node.getAttribute("class") || "");
1322   }
1323
1324   ClassList.prototype = {
1325     add: function(name) {
1326       var i = this._names.indexOf(name);
1327       if (i < 0) {
1328         this._names.push(name);
1329         this._node.setAttribute("class", this._names.join(" "));
1330       }
1331     },
1332     remove: function(name) {
1333       var i = this._names.indexOf(name);
1334       if (i >= 0) {
1335         this._names.splice(i, 1);
1336         this._node.setAttribute("class", this._names.join(" "));
1337       }
1338     },
1339     contains: function(name) {
1340       return this._names.indexOf(name) >= 0;
1341     }
1342   };
1343
1344   function classedAdd(node, names) {
1345     var list = classList(node), i = -1, n = names.length;
1346     while (++i < n) list.add(names[i]);
1347   }
1348
1349   function classedRemove(node, names) {
1350     var list = classList(node), i = -1, n = names.length;
1351     while (++i < n) list.remove(names[i]);
1352   }
1353
1354   function classedTrue(names) {
1355     return function() {
1356       classedAdd(this, names);
1357     };
1358   }
1359
1360   function classedFalse(names) {
1361     return function() {
1362       classedRemove(this, names);
1363     };
1364   }
1365
1366   function classedFunction(names, value) {
1367     return function() {
1368       (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
1369     };
1370   }
1371
1372   function selection_classed(name, value) {
1373     var names = classArray(name + "");
1374
1375     if (arguments.length < 2) {
1376       var list = classList(this.node()), i = -1, n = names.length;
1377       while (++i < n) if (!list.contains(names[i])) return false;
1378       return true;
1379     }
1380
1381     return this.each((typeof value === "function"
1382         ? classedFunction : value
1383         ? classedTrue
1384         : classedFalse)(names, value));
1385   }
1386
1387   function textRemove() {
1388     this.textContent = "";
1389   }
1390
1391   function textConstant(value) {
1392     return function() {
1393       this.textContent = value;
1394     };
1395   }
1396
1397   function textFunction(value) {
1398     return function() {
1399       var v = value.apply(this, arguments);
1400       this.textContent = v == null ? "" : v;
1401     };
1402   }
1403
1404   function selection_text(value) {
1405     return arguments.length
1406         ? this.each(value == null
1407             ? textRemove : (typeof value === "function"
1408             ? textFunction
1409             : textConstant)(value))
1410         : this.node().textContent;
1411   }
1412
1413   function htmlRemove() {
1414     this.innerHTML = "";
1415   }
1416
1417   function htmlConstant(value) {
1418     return function() {
1419       this.innerHTML = value;
1420     };
1421   }
1422
1423   function htmlFunction(value) {
1424     return function() {
1425       var v = value.apply(this, arguments);
1426       this.innerHTML = v == null ? "" : v;
1427     };
1428   }
1429
1430   function selection_html(value) {
1431     return arguments.length
1432         ? this.each(value == null
1433             ? htmlRemove : (typeof value === "function"
1434             ? htmlFunction
1435             : htmlConstant)(value))
1436         : this.node().innerHTML;
1437   }
1438
1439   function raise() {
1440     if (this.nextSibling) this.parentNode.appendChild(this);
1441   }
1442
1443   function selection_raise() {
1444     return this.each(raise);
1445   }
1446
1447   function lower() {
1448     if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
1449   }
1450
1451   function selection_lower() {
1452     return this.each(lower);
1453   }
1454
1455   function selection_append(name) {
1456     var create = typeof name === "function" ? name : creator(name);
1457     return this.select(function() {
1458       return this.appendChild(create.apply(this, arguments));
1459     });
1460   }
1461
1462   function constantNull() {
1463     return null;
1464   }
1465
1466   function selection_insert(name, before) {
1467     var create = typeof name === "function" ? name : creator(name),
1468         select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
1469     return this.select(function() {
1470       return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
1471     });
1472   }
1473
1474   function remove() {
1475     var parent = this.parentNode;
1476     if (parent) parent.removeChild(this);
1477   }
1478
1479   function selection_remove() {
1480     return this.each(remove);
1481   }
1482
1483   function selection_cloneShallow() {
1484     return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);
1485   }
1486
1487   function selection_cloneDeep() {
1488     return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);
1489   }
1490
1491   function selection_clone(deep) {
1492     return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
1493   }
1494
1495   function selection_datum(value) {
1496     return arguments.length
1497         ? this.property("__data__", value)
1498         : this.node().__data__;
1499   }
1500
1501   var filterEvents = {};
1502
1503   var event = null;
1504
1505   if (typeof document !== "undefined") {
1506     var element$1 = document.documentElement;
1507     if (!("onmouseenter" in element$1)) {
1508       filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
1509     }
1510   }
1511
1512   function filterContextListener(listener, index, group) {
1513     listener = contextListener(listener, index, group);
1514     return function(event) {
1515       var related = event.relatedTarget;
1516       if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
1517         listener.call(this, event);
1518       }
1519     };
1520   }
1521
1522   function contextListener(listener, index, group) {
1523     return function(event1) {
1524       var event0 = event; // Events can be reentrant (e.g., focus).
1525       event = event1;
1526       try {
1527         listener.call(this, this.__data__, index, group);
1528       } finally {
1529         event = event0;
1530       }
1531     };
1532   }
1533
1534   function parseTypenames$1(typenames) {
1535     return typenames.trim().split(/^|\s+/).map(function(t) {
1536       var name = "", i = t.indexOf(".");
1537       if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
1538       return {type: t, name: name};
1539     });
1540   }
1541
1542   function onRemove(typename) {
1543     return function() {
1544       var on = this.__on;
1545       if (!on) return;
1546       for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
1547         if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
1548           this.removeEventListener(o.type, o.listener, o.capture);
1549         } else {
1550           on[++i] = o;
1551         }
1552       }
1553       if (++i) on.length = i;
1554       else delete this.__on;
1555     };
1556   }
1557
1558   function onAdd(typename, value, capture) {
1559     var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
1560     return function(d, i, group) {
1561       var on = this.__on, o, listener = wrap(value, i, group);
1562       if (on) for (var j = 0, m = on.length; j < m; ++j) {
1563         if ((o = on[j]).type === typename.type && o.name === typename.name) {
1564           this.removeEventListener(o.type, o.listener, o.capture);
1565           this.addEventListener(o.type, o.listener = listener, o.capture = capture);
1566           o.value = value;
1567           return;
1568         }
1569       }
1570       this.addEventListener(typename.type, listener, capture);
1571       o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
1572       if (!on) this.__on = [o];
1573       else on.push(o);
1574     };
1575   }
1576
1577   function selection_on(typename, value, capture) {
1578     var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
1579
1580     if (arguments.length < 2) {
1581       var on = this.node().__on;
1582       if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
1583         for (i = 0, o = on[j]; i < n; ++i) {
1584           if ((t = typenames[i]).type === o.type && t.name === o.name) {
1585             return o.value;
1586           }
1587         }
1588       }
1589       return;
1590     }
1591
1592     on = value ? onAdd : onRemove;
1593     if (capture == null) capture = false;
1594     for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
1595     return this;
1596   }
1597
1598   function customEvent(event1, listener, that, args) {
1599     var event0 = event;
1600     event1.sourceEvent = event;
1601     event = event1;
1602     try {
1603       return listener.apply(that, args);
1604     } finally {
1605       event = event0;
1606     }
1607   }
1608
1609   function dispatchEvent(node, type, params) {
1610     var window = defaultView(node),
1611         event = window.CustomEvent;
1612
1613     if (typeof event === "function") {
1614       event = new event(type, params);
1615     } else {
1616       event = window.document.createEvent("Event");
1617       if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
1618       else event.initEvent(type, false, false);
1619     }
1620
1621     node.dispatchEvent(event);
1622   }
1623
1624   function dispatchConstant(type, params) {
1625     return function() {
1626       return dispatchEvent(this, type, params);
1627     };
1628   }
1629
1630   function dispatchFunction(type, params) {
1631     return function() {
1632       return dispatchEvent(this, type, params.apply(this, arguments));
1633     };
1634   }
1635
1636   function selection_dispatch(type, params) {
1637     return this.each((typeof params === "function"
1638         ? dispatchFunction
1639         : dispatchConstant)(type, params));
1640   }
1641
1642   var root = [null];
1643
1644   function Selection(groups, parents) {
1645     this._groups = groups;
1646     this._parents = parents;
1647   }
1648
1649   function selection() {
1650     return new Selection([[document.documentElement]], root);
1651   }
1652
1653   Selection.prototype = selection.prototype = {
1654     constructor: Selection,
1655     select: selection_select,
1656     selectAll: selection_selectAll,
1657     filter: selection_filter,
1658     data: selection_data,
1659     enter: selection_enter,
1660     exit: selection_exit,
1661     merge: selection_merge,
1662     order: selection_order,
1663     sort: selection_sort,
1664     call: selection_call,
1665     nodes: selection_nodes,
1666     node: selection_node,
1667     size: selection_size,
1668     empty: selection_empty,
1669     each: selection_each,
1670     attr: selection_attr,
1671     style: selection_style,
1672     property: selection_property,
1673     classed: selection_classed,
1674     text: selection_text,
1675     html: selection_html,
1676     raise: selection_raise,
1677     lower: selection_lower,
1678     append: selection_append,
1679     insert: selection_insert,
1680     remove: selection_remove,
1681     clone: selection_clone,
1682     datum: selection_datum,
1683     on: selection_on,
1684     dispatch: selection_dispatch
1685   };
1686
1687   function select(selector) {
1688     return typeof selector === "string"
1689         ? new Selection([[document.querySelector(selector)]], [document.documentElement])
1690         : new Selection([[selector]], root);
1691   }
1692
1693   function create(name) {
1694     return select(creator(name).call(document.documentElement));
1695   }
1696
1697   var nextId = 0;
1698
1699   function local() {
1700     return new Local;
1701   }
1702
1703   function Local() {
1704     this._ = "@" + (++nextId).toString(36);
1705   }
1706
1707   Local.prototype = local.prototype = {
1708     constructor: Local,
1709     get: function(node) {
1710       var id = this._;
1711       while (!(id in node)) if (!(node = node.parentNode)) return;
1712       return node[id];
1713     },
1714     set: function(node, value) {
1715       return node[this._] = value;
1716     },
1717     remove: function(node) {
1718       return this._ in node && delete node[this._];
1719     },
1720     toString: function() {
1721       return this._;
1722     }
1723   };
1724
1725   function sourceEvent() {
1726     var current = event, source;
1727     while (source = current.sourceEvent) current = source;
1728     return current;
1729   }
1730
1731   function point(node, event) {
1732     var svg = node.ownerSVGElement || node;
1733
1734     if (svg.createSVGPoint) {
1735       var point = svg.createSVGPoint();
1736       point.x = event.clientX, point.y = event.clientY;
1737       point = point.matrixTransform(node.getScreenCTM().inverse());
1738       return [point.x, point.y];
1739     }
1740
1741     var rect = node.getBoundingClientRect();
1742     return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
1743   }
1744
1745   function mouse(node) {
1746     var event = sourceEvent();
1747     if (event.changedTouches) event = event.changedTouches[0];
1748     return point(node, event);
1749   }
1750
1751   function d3_selectAll(selector) {
1752     return typeof selector === "string"
1753         ? new Selection([document.querySelectorAll(selector)], [document.documentElement])
1754         : new Selection([selector == null ? [] : selector], root);
1755   }
1756
1757   function touch(node, touches, identifier) {
1758     if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
1759
1760     for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
1761       if ((touch = touches[i]).identifier === identifier) {
1762         return point(node, touch);
1763       }
1764     }
1765
1766     return null;
1767   }
1768
1769   function d3_touches(node, touches) {
1770     if (touches == null) touches = sourceEvent().touches;
1771
1772     for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
1773       points[i] = point(node, touches[i]);
1774     }
1775
1776     return points;
1777   }
1778
1779   function nopropagation() {
1780     event.stopImmediatePropagation();
1781   }
1782
1783   function noevent() {
1784     event.preventDefault();
1785     event.stopImmediatePropagation();
1786   }
1787
1788   function dragDisable(view) {
1789     var root = view.document.documentElement,
1790         selection$$1 = select(view).on("dragstart.drag", noevent, true);
1791     if ("onselectstart" in root) {
1792       selection$$1.on("selectstart.drag", noevent, true);
1793     } else {
1794       root.__noselect = root.style.MozUserSelect;
1795       root.style.MozUserSelect = "none";
1796     }
1797   }
1798
1799   function yesdrag(view, noclick) {
1800     var root = view.document.documentElement,
1801         selection$$1 = select(view).on("dragstart.drag", null);
1802     if (noclick) {
1803       selection$$1.on("click.drag", noevent, true);
1804       setTimeout(function() { selection$$1.on("click.drag", null); }, 0);
1805     }
1806     if ("onselectstart" in root) {
1807       selection$$1.on("selectstart.drag", null);
1808     } else {
1809       root.style.MozUserSelect = root.__noselect;
1810       delete root.__noselect;
1811     }
1812   }
1813
1814   function constant$2(x) {
1815     return function() {
1816       return x;
1817     };
1818   }
1819
1820   function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
1821     this.target = target;
1822     this.type = type;
1823     this.subject = subject;
1824     this.identifier = id;
1825     this.active = active;
1826     this.x = x;
1827     this.y = y;
1828     this.dx = dx;
1829     this.dy = dy;
1830     this._ = dispatch;
1831   }
1832
1833   DragEvent.prototype.on = function() {
1834     var value = this._.on.apply(this._, arguments);
1835     return value === this._ ? this : value;
1836   };
1837
1838   // Ignore right-click, since that should open the context menu.
1839   function defaultFilter() {
1840     return !event.button;
1841   }
1842
1843   function defaultContainer() {
1844     return this.parentNode;
1845   }
1846
1847   function defaultSubject(d) {
1848     return d == null ? {x: event.x, y: event.y} : d;
1849   }
1850
1851   function defaultTouchable() {
1852     return "ontouchstart" in this;
1853   }
1854
1855   function d3_drag() {
1856     var filter = defaultFilter,
1857         container = defaultContainer,
1858         subject = defaultSubject,
1859         touchable = defaultTouchable,
1860         gestures = {},
1861         listeners = dispatch("start", "drag", "end"),
1862         active = 0,
1863         mousedownx,
1864         mousedowny,
1865         mousemoving,
1866         touchending,
1867         clickDistance2 = 0;
1868
1869     function drag(selection$$1) {
1870       selection$$1
1871           .on("mousedown.drag", mousedowned)
1872         .filter(touchable)
1873           .on("touchstart.drag", touchstarted)
1874           .on("touchmove.drag", touchmoved)
1875           .on("touchend.drag touchcancel.drag", touchended)
1876           .style("touch-action", "none")
1877           .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
1878     }
1879
1880     function mousedowned() {
1881       if (touchending || !filter.apply(this, arguments)) return;
1882       var gesture = beforestart("mouse", container.apply(this, arguments), mouse, this, arguments);
1883       if (!gesture) return;
1884       select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
1885       dragDisable(event.view);
1886       nopropagation();
1887       mousemoving = false;
1888       mousedownx = event.clientX;
1889       mousedowny = event.clientY;
1890       gesture("start");
1891     }
1892
1893     function mousemoved() {
1894       noevent();
1895       if (!mousemoving) {
1896         var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
1897         mousemoving = dx * dx + dy * dy > clickDistance2;
1898       }
1899       gestures.mouse("drag");
1900     }
1901
1902     function mouseupped() {
1903       select(event.view).on("mousemove.drag mouseup.drag", null);
1904       yesdrag(event.view, mousemoving);
1905       noevent();
1906       gestures.mouse("end");
1907     }
1908
1909     function touchstarted() {
1910       if (!filter.apply(this, arguments)) return;
1911       var touches = event.changedTouches,
1912           c = container.apply(this, arguments),
1913           n = touches.length, i, gesture;
1914
1915       for (i = 0; i < n; ++i) {
1916         if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
1917           nopropagation();
1918           gesture("start");
1919         }
1920       }
1921     }
1922
1923     function touchmoved() {
1924       var touches = event.changedTouches,
1925           n = touches.length, i, gesture;
1926
1927       for (i = 0; i < n; ++i) {
1928         if (gesture = gestures[touches[i].identifier]) {
1929           noevent();
1930           gesture("drag");
1931         }
1932       }
1933     }
1934
1935     function touchended() {
1936       var touches = event.changedTouches,
1937           n = touches.length, i, gesture;
1938
1939       if (touchending) clearTimeout(touchending);
1940       touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
1941       for (i = 0; i < n; ++i) {
1942         if (gesture = gestures[touches[i].identifier]) {
1943           nopropagation();
1944           gesture("end");
1945         }
1946       }
1947     }
1948
1949     function beforestart(id, container, point$$1, that, args) {
1950       var p = point$$1(container, id), s, dx, dy,
1951           sublisteners = listeners.copy();
1952
1953       if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
1954         if ((event.subject = s = subject.apply(that, args)) == null) return false;
1955         dx = s.x - p[0] || 0;
1956         dy = s.y - p[1] || 0;
1957         return true;
1958       })) return;
1959
1960       return function gesture(type) {
1961         var p0 = p, n;
1962         switch (type) {
1963           case "start": gestures[id] = gesture, n = active++; break;
1964           case "end": delete gestures[id], --active; // nobreak
1965           case "drag": p = point$$1(container, id), n = active; break;
1966         }
1967         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]);
1968       };
1969     }
1970
1971     drag.filter = function(_) {
1972       return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
1973     };
1974
1975     drag.container = function(_) {
1976       return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
1977     };
1978
1979     drag.subject = function(_) {
1980       return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
1981     };
1982
1983     drag.touchable = function(_) {
1984       return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
1985     };
1986
1987     drag.on = function() {
1988       var value = listeners.on.apply(listeners, arguments);
1989       return value === listeners ? drag : value;
1990     };
1991
1992     drag.clickDistance = function(_) {
1993       return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
1994     };
1995
1996     return drag;
1997   }
1998
1999   function define(constructor, factory, prototype) {
2000     constructor.prototype = factory.prototype = prototype;
2001     prototype.constructor = constructor;
2002   }
2003
2004   function extend(parent, definition) {
2005     var prototype = Object.create(parent.prototype);
2006     for (var key in definition) prototype[key] = definition[key];
2007     return prototype;
2008   }
2009
2010   function Color() {}
2011
2012   var darker = 0.7;
2013   var brighter = 1 / darker;
2014
2015   var reI = "\\s*([+-]?\\d+)\\s*",
2016       reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",
2017       reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
2018       reHex3 = /^#([0-9a-f]{3})$/,
2019       reHex6 = /^#([0-9a-f]{6})$/,
2020       reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"),
2021       reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"),
2022       reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"),
2023       reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"),
2024       reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"),
2025       reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
2026
2027   var named = {
2028     aliceblue: 0xf0f8ff,
2029     antiquewhite: 0xfaebd7,
2030     aqua: 0x00ffff,
2031     aquamarine: 0x7fffd4,
2032     azure: 0xf0ffff,
2033     beige: 0xf5f5dc,
2034     bisque: 0xffe4c4,
2035     black: 0x000000,
2036     blanchedalmond: 0xffebcd,
2037     blue: 0x0000ff,
2038     blueviolet: 0x8a2be2,
2039     brown: 0xa52a2a,
2040     burlywood: 0xdeb887,
2041     cadetblue: 0x5f9ea0,
2042     chartreuse: 0x7fff00,
2043     chocolate: 0xd2691e,
2044     coral: 0xff7f50,
2045     cornflowerblue: 0x6495ed,
2046     cornsilk: 0xfff8dc,
2047     crimson: 0xdc143c,
2048     cyan: 0x00ffff,
2049     darkblue: 0x00008b,
2050     darkcyan: 0x008b8b,
2051     darkgoldenrod: 0xb8860b,
2052     darkgray: 0xa9a9a9,
2053     darkgreen: 0x006400,
2054     darkgrey: 0xa9a9a9,
2055     darkkhaki: 0xbdb76b,
2056     darkmagenta: 0x8b008b,
2057     darkolivegreen: 0x556b2f,
2058     darkorange: 0xff8c00,
2059     darkorchid: 0x9932cc,
2060     darkred: 0x8b0000,
2061     darksalmon: 0xe9967a,
2062     darkseagreen: 0x8fbc8f,
2063     darkslateblue: 0x483d8b,
2064     darkslategray: 0x2f4f4f,
2065     darkslategrey: 0x2f4f4f,
2066     darkturquoise: 0x00ced1,
2067     darkviolet: 0x9400d3,
2068     deeppink: 0xff1493,
2069     deepskyblue: 0x00bfff,
2070     dimgray: 0x696969,
2071     dimgrey: 0x696969,
2072     dodgerblue: 0x1e90ff,
2073     firebrick: 0xb22222,
2074     floralwhite: 0xfffaf0,
2075     forestgreen: 0x228b22,
2076     fuchsia: 0xff00ff,
2077     gainsboro: 0xdcdcdc,
2078     ghostwhite: 0xf8f8ff,
2079     gold: 0xffd700,
2080     goldenrod: 0xdaa520,
2081     gray: 0x808080,
2082     green: 0x008000,
2083     greenyellow: 0xadff2f,
2084     grey: 0x808080,
2085     honeydew: 0xf0fff0,
2086     hotpink: 0xff69b4,
2087     indianred: 0xcd5c5c,
2088     indigo: 0x4b0082,
2089     ivory: 0xfffff0,
2090     khaki: 0xf0e68c,
2091     lavender: 0xe6e6fa,
2092     lavenderblush: 0xfff0f5,
2093     lawngreen: 0x7cfc00,
2094     lemonchiffon: 0xfffacd,
2095     lightblue: 0xadd8e6,
2096     lightcoral: 0xf08080,
2097     lightcyan: 0xe0ffff,
2098     lightgoldenrodyellow: 0xfafad2,
2099     lightgray: 0xd3d3d3,
2100     lightgreen: 0x90ee90,
2101     lightgrey: 0xd3d3d3,
2102     lightpink: 0xffb6c1,
2103     lightsalmon: 0xffa07a,
2104     lightseagreen: 0x20b2aa,
2105     lightskyblue: 0x87cefa,
2106     lightslategray: 0x778899,
2107     lightslategrey: 0x778899,
2108     lightsteelblue: 0xb0c4de,
2109     lightyellow: 0xffffe0,
2110     lime: 0x00ff00,
2111     limegreen: 0x32cd32,
2112     linen: 0xfaf0e6,
2113     magenta: 0xff00ff,
2114     maroon: 0x800000,
2115     mediumaquamarine: 0x66cdaa,
2116     mediumblue: 0x0000cd,
2117     mediumorchid: 0xba55d3,
2118     mediumpurple: 0x9370db,
2119     mediumseagreen: 0x3cb371,
2120     mediumslateblue: 0x7b68ee,
2121     mediumspringgreen: 0x00fa9a,
2122     mediumturquoise: 0x48d1cc,
2123     mediumvioletred: 0xc71585,
2124     midnightblue: 0x191970,
2125     mintcream: 0xf5fffa,
2126     mistyrose: 0xffe4e1,
2127     moccasin: 0xffe4b5,
2128     navajowhite: 0xffdead,
2129     navy: 0x000080,
2130     oldlace: 0xfdf5e6,
2131     olive: 0x808000,
2132     olivedrab: 0x6b8e23,
2133     orange: 0xffa500,
2134     orangered: 0xff4500,
2135     orchid: 0xda70d6,
2136     palegoldenrod: 0xeee8aa,
2137     palegreen: 0x98fb98,
2138     paleturquoise: 0xafeeee,
2139     palevioletred: 0xdb7093,
2140     papayawhip: 0xffefd5,
2141     peachpuff: 0xffdab9,
2142     peru: 0xcd853f,
2143     pink: 0xffc0cb,
2144     plum: 0xdda0dd,
2145     powderblue: 0xb0e0e6,
2146     purple: 0x800080,
2147     rebeccapurple: 0x663399,
2148     red: 0xff0000,
2149     rosybrown: 0xbc8f8f,
2150     royalblue: 0x4169e1,
2151     saddlebrown: 0x8b4513,
2152     salmon: 0xfa8072,
2153     sandybrown: 0xf4a460,
2154     seagreen: 0x2e8b57,
2155     seashell: 0xfff5ee,
2156     sienna: 0xa0522d,
2157     silver: 0xc0c0c0,
2158     skyblue: 0x87ceeb,
2159     slateblue: 0x6a5acd,
2160     slategray: 0x708090,
2161     slategrey: 0x708090,
2162     snow: 0xfffafa,
2163     springgreen: 0x00ff7f,
2164     steelblue: 0x4682b4,
2165     tan: 0xd2b48c,
2166     teal: 0x008080,
2167     thistle: 0xd8bfd8,
2168     tomato: 0xff6347,
2169     turquoise: 0x40e0d0,
2170     violet: 0xee82ee,
2171     wheat: 0xf5deb3,
2172     white: 0xffffff,
2173     whitesmoke: 0xf5f5f5,
2174     yellow: 0xffff00,
2175     yellowgreen: 0x9acd32
2176   };
2177
2178   define(Color, color, {
2179     displayable: function() {
2180       return this.rgb().displayable();
2181     },
2182     toString: function() {
2183       return this.rgb() + "";
2184     }
2185   });
2186
2187   function color(format) {
2188     var m;
2189     format = (format + "").trim().toLowerCase();
2190     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
2191         : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
2192         : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
2193         : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
2194         : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
2195         : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
2196         : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
2197         : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
2198         : named.hasOwnProperty(format) ? rgbn(named[format])
2199         : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
2200         : null;
2201   }
2202
2203   function rgbn(n) {
2204     return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
2205   }
2206
2207   function rgba(r, g, b, a) {
2208     if (a <= 0) r = g = b = NaN;
2209     return new Rgb(r, g, b, a);
2210   }
2211
2212   function rgbConvert(o) {
2213     if (!(o instanceof Color)) o = color(o);
2214     if (!o) return new Rgb;
2215     o = o.rgb();
2216     return new Rgb(o.r, o.g, o.b, o.opacity);
2217   }
2218
2219   function rgb(r, g, b, opacity) {
2220     return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
2221   }
2222
2223   function Rgb(r, g, b, opacity) {
2224     this.r = +r;
2225     this.g = +g;
2226     this.b = +b;
2227     this.opacity = +opacity;
2228   }
2229
2230   define(Rgb, rgb, extend(Color, {
2231     brighter: function(k) {
2232       k = k == null ? brighter : Math.pow(brighter, k);
2233       return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2234     },
2235     darker: function(k) {
2236       k = k == null ? darker : Math.pow(darker, k);
2237       return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2238     },
2239     rgb: function() {
2240       return this;
2241     },
2242     displayable: function() {
2243       return (0 <= this.r && this.r <= 255)
2244           && (0 <= this.g && this.g <= 255)
2245           && (0 <= this.b && this.b <= 255)
2246           && (0 <= this.opacity && this.opacity <= 1);
2247     },
2248     toString: function() {
2249       var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
2250       return (a === 1 ? "rgb(" : "rgba(")
2251           + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
2252           + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
2253           + Math.max(0, Math.min(255, Math.round(this.b) || 0))
2254           + (a === 1 ? ")" : ", " + a + ")");
2255     }
2256   }));
2257
2258   function hsla(h, s, l, a) {
2259     if (a <= 0) h = s = l = NaN;
2260     else if (l <= 0 || l >= 1) h = s = NaN;
2261     else if (s <= 0) h = NaN;
2262     return new Hsl(h, s, l, a);
2263   }
2264
2265   function hslConvert(o) {
2266     if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
2267     if (!(o instanceof Color)) o = color(o);
2268     if (!o) return new Hsl;
2269     if (o instanceof Hsl) return o;
2270     o = o.rgb();
2271     var r = o.r / 255,
2272         g = o.g / 255,
2273         b = o.b / 255,
2274         min = Math.min(r, g, b),
2275         max = Math.max(r, g, b),
2276         h = NaN,
2277         s = max - min,
2278         l = (max + min) / 2;
2279     if (s) {
2280       if (r === max) h = (g - b) / s + (g < b) * 6;
2281       else if (g === max) h = (b - r) / s + 2;
2282       else h = (r - g) / s + 4;
2283       s /= l < 0.5 ? max + min : 2 - max - min;
2284       h *= 60;
2285     } else {
2286       s = l > 0 && l < 1 ? 0 : h;
2287     }
2288     return new Hsl(h, s, l, o.opacity);
2289   }
2290
2291   function hsl(h, s, l, opacity) {
2292     return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
2293   }
2294
2295   function Hsl(h, s, l, opacity) {
2296     this.h = +h;
2297     this.s = +s;
2298     this.l = +l;
2299     this.opacity = +opacity;
2300   }
2301
2302   define(Hsl, hsl, extend(Color, {
2303     brighter: function(k) {
2304       k = k == null ? brighter : Math.pow(brighter, k);
2305       return new Hsl(this.h, this.s, this.l * k, this.opacity);
2306     },
2307     darker: function(k) {
2308       k = k == null ? darker : Math.pow(darker, k);
2309       return new Hsl(this.h, this.s, this.l * k, this.opacity);
2310     },
2311     rgb: function() {
2312       var h = this.h % 360 + (this.h < 0) * 360,
2313           s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
2314           l = this.l,
2315           m2 = l + (l < 0.5 ? l : 1 - l) * s,
2316           m1 = 2 * l - m2;
2317       return new Rgb(
2318         hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
2319         hsl2rgb(h, m1, m2),
2320         hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
2321         this.opacity
2322       );
2323     },
2324     displayable: function() {
2325       return (0 <= this.s && this.s <= 1 || isNaN(this.s))
2326           && (0 <= this.l && this.l <= 1)
2327           && (0 <= this.opacity && this.opacity <= 1);
2328     }
2329   }));
2330
2331   /* From FvD 13.37, CSS Color Module Level 3 */
2332   function hsl2rgb(h, m1, m2) {
2333     return (h < 60 ? m1 + (m2 - m1) * h / 60
2334         : h < 180 ? m2
2335         : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
2336         : m1) * 255;
2337   }
2338
2339   var deg2rad = Math.PI / 180;
2340   var rad2deg = 180 / Math.PI;
2341
2342   var Kn = 18,
2343       Xn = 0.950470, // D65 standard referent
2344       Yn = 1,
2345       Zn = 1.088830,
2346       t0 = 4 / 29,
2347       t1 = 6 / 29,
2348       t2 = 3 * t1 * t1,
2349       t3 = t1 * t1 * t1;
2350
2351   function labConvert(o) {
2352     if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
2353     if (o instanceof Hcl) {
2354       var h = o.h * deg2rad;
2355       return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
2356     }
2357     if (!(o instanceof Rgb)) o = rgbConvert(o);
2358     var b = rgb2xyz(o.r),
2359         a = rgb2xyz(o.g),
2360         l = rgb2xyz(o.b),
2361         x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn),
2362         y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn),
2363         z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn);
2364     return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
2365   }
2366
2367   function lab(l, a, b, opacity) {
2368     return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
2369   }
2370
2371   function Lab(l, a, b, opacity) {
2372     this.l = +l;
2373     this.a = +a;
2374     this.b = +b;
2375     this.opacity = +opacity;
2376   }
2377
2378   define(Lab, lab, extend(Color, {
2379     brighter: function(k) {
2380       return new Lab(this.l + Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2381     },
2382     darker: function(k) {
2383       return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2384     },
2385     rgb: function() {
2386       var y = (this.l + 16) / 116,
2387           x = isNaN(this.a) ? y : y + this.a / 500,
2388           z = isNaN(this.b) ? y : y - this.b / 200;
2389       y = Yn * lab2xyz(y);
2390       x = Xn * lab2xyz(x);
2391       z = Zn * lab2xyz(z);
2392       return new Rgb(
2393         xyz2rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB
2394         xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),
2395         xyz2rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z),
2396         this.opacity
2397       );
2398     }
2399   }));
2400
2401   function xyz2lab(t) {
2402     return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
2403   }
2404
2405   function lab2xyz(t) {
2406     return t > t1 ? t * t * t : t2 * (t - t0);
2407   }
2408
2409   function xyz2rgb(x) {
2410     return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
2411   }
2412
2413   function rgb2xyz(x) {
2414     return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
2415   }
2416
2417   function hclConvert(o) {
2418     if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
2419     if (!(o instanceof Lab)) o = labConvert(o);
2420     var h = Math.atan2(o.b, o.a) * rad2deg;
2421     return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
2422   }
2423
2424   function hcl(h, c, l, opacity) {
2425     return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
2426   }
2427
2428   function Hcl(h, c, l, opacity) {
2429     this.h = +h;
2430     this.c = +c;
2431     this.l = +l;
2432     this.opacity = +opacity;
2433   }
2434
2435   define(Hcl, hcl, extend(Color, {
2436     brighter: function(k) {
2437       return new Hcl(this.h, this.c, this.l + Kn * (k == null ? 1 : k), this.opacity);
2438     },
2439     darker: function(k) {
2440       return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity);
2441     },
2442     rgb: function() {
2443       return labConvert(this).rgb();
2444     }
2445   }));
2446
2447   var A = -0.14861,
2448       B = +1.78277,
2449       C = -0.29227,
2450       D = -0.90649,
2451       E = +1.97294,
2452       ED = E * D,
2453       EB = E * B,
2454       BC_DA = B * C - D * A;
2455
2456   function cubehelixConvert(o) {
2457     if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
2458     if (!(o instanceof Rgb)) o = rgbConvert(o);
2459     var r = o.r / 255,
2460         g = o.g / 255,
2461         b = o.b / 255,
2462         l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
2463         bl = b - l,
2464         k = (E * (g - l) - C * bl) / D,
2465         s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
2466         h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;
2467     return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
2468   }
2469
2470   function cubehelix(h, s, l, opacity) {
2471     return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
2472   }
2473
2474   function Cubehelix(h, s, l, opacity) {
2475     this.h = +h;
2476     this.s = +s;
2477     this.l = +l;
2478     this.opacity = +opacity;
2479   }
2480
2481   define(Cubehelix, cubehelix, extend(Color, {
2482     brighter: function(k) {
2483       k = k == null ? brighter : Math.pow(brighter, k);
2484       return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
2485     },
2486     darker: function(k) {
2487       k = k == null ? darker : Math.pow(darker, k);
2488       return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
2489     },
2490     rgb: function() {
2491       var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
2492           l = +this.l,
2493           a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
2494           cosh = Math.cos(h),
2495           sinh = Math.sin(h);
2496       return new Rgb(
2497         255 * (l + a * (A * cosh + B * sinh)),
2498         255 * (l + a * (C * cosh + D * sinh)),
2499         255 * (l + a * (E * cosh)),
2500         this.opacity
2501       );
2502     }
2503   }));
2504
2505   function basis(t1, v0, v1, v2, v3) {
2506     var t2 = t1 * t1, t3 = t2 * t1;
2507     return ((1 - 3 * t1 + 3 * t2 - t3) * v0
2508         + (4 - 6 * t2 + 3 * t3) * v1
2509         + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
2510         + t3 * v3) / 6;
2511   }
2512
2513   function basis$1(values) {
2514     var n = values.length - 1;
2515     return function(t) {
2516       var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
2517           v1 = values[i],
2518           v2 = values[i + 1],
2519           v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
2520           v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
2521       return basis((t - i / n) * n, v0, v1, v2, v3);
2522     };
2523   }
2524
2525   function basisClosed(values) {
2526     var n = values.length;
2527     return function(t) {
2528       var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
2529           v0 = values[(i + n - 1) % n],
2530           v1 = values[i % n],
2531           v2 = values[(i + 1) % n],
2532           v3 = values[(i + 2) % n];
2533       return basis((t - i / n) * n, v0, v1, v2, v3);
2534     };
2535   }
2536
2537   function constant$3(x) {
2538     return function() {
2539       return x;
2540     };
2541   }
2542
2543   function linear(a, d) {
2544     return function(t) {
2545       return a + t * d;
2546     };
2547   }
2548
2549   function exponential(a, b, y) {
2550     return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
2551       return Math.pow(a + t * b, y);
2552     };
2553   }
2554
2555   function hue(a, b) {
2556     var d = b - a;
2557     return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a);
2558   }
2559
2560   function gamma(y) {
2561     return (y = +y) === 1 ? nogamma : function(a, b) {
2562       return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a);
2563     };
2564   }
2565
2566   function nogamma(a, b) {
2567     var d = b - a;
2568     return d ? linear(a, d) : constant$3(isNaN(a) ? b : a);
2569   }
2570
2571   var interpolateRgb = (function rgbGamma(y) {
2572     var color$$1 = gamma(y);
2573
2574     function rgb$$1(start, end) {
2575       var r = color$$1((start = rgb(start)).r, (end = rgb(end)).r),
2576           g = color$$1(start.g, end.g),
2577           b = color$$1(start.b, end.b),
2578           opacity = nogamma(start.opacity, end.opacity);
2579       return function(t) {
2580         start.r = r(t);
2581         start.g = g(t);
2582         start.b = b(t);
2583         start.opacity = opacity(t);
2584         return start + "";
2585       };
2586     }
2587
2588     rgb$$1.gamma = rgbGamma;
2589
2590     return rgb$$1;
2591   })(1);
2592
2593   function rgbSpline(spline) {
2594     return function(colors) {
2595       var n = colors.length,
2596           r = new Array(n),
2597           g = new Array(n),
2598           b = new Array(n),
2599           i, color$$1;
2600       for (i = 0; i < n; ++i) {
2601         color$$1 = rgb(colors[i]);
2602         r[i] = color$$1.r || 0;
2603         g[i] = color$$1.g || 0;
2604         b[i] = color$$1.b || 0;
2605       }
2606       r = spline(r);
2607       g = spline(g);
2608       b = spline(b);
2609       color$$1.opacity = 1;
2610       return function(t) {
2611         color$$1.r = r(t);
2612         color$$1.g = g(t);
2613         color$$1.b = b(t);
2614         return color$$1 + "";
2615       };
2616     };
2617   }
2618
2619   var rgbBasis = rgbSpline(basis$1);
2620   var rgbBasisClosed = rgbSpline(basisClosed);
2621
2622   function array$1(a, b) {
2623     var nb = b ? b.length : 0,
2624         na = a ? Math.min(nb, a.length) : 0,
2625         x = new Array(na),
2626         c = new Array(nb),
2627         i;
2628
2629     for (i = 0; i < na; ++i) x[i] = interpolate(a[i], b[i]);
2630     for (; i < nb; ++i) c[i] = b[i];
2631
2632     return function(t) {
2633       for (i = 0; i < na; ++i) c[i] = x[i](t);
2634       return c;
2635     };
2636   }
2637
2638   function date(a, b) {
2639     var d = new Date;
2640     return a = +a, b -= a, function(t) {
2641       return d.setTime(a + b * t), d;
2642     };
2643   }
2644
2645   function interpolateNumber(a, b) {
2646     return a = +a, b -= a, function(t) {
2647       return a + b * t;
2648     };
2649   }
2650
2651   function object(a, b) {
2652     var i = {},
2653         c = {},
2654         k;
2655
2656     if (a === null || typeof a !== "object") a = {};
2657     if (b === null || typeof b !== "object") b = {};
2658
2659     for (k in b) {
2660       if (k in a) {
2661         i[k] = interpolate(a[k], b[k]);
2662       } else {
2663         c[k] = b[k];
2664       }
2665     }
2666
2667     return function(t) {
2668       for (k in i) c[k] = i[k](t);
2669       return c;
2670     };
2671   }
2672
2673   var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
2674       reB = new RegExp(reA.source, "g");
2675
2676   function zero(b) {
2677     return function() {
2678       return b;
2679     };
2680   }
2681
2682   function one(b) {
2683     return function(t) {
2684       return b(t) + "";
2685     };
2686   }
2687
2688   function interpolateString(a, b) {
2689     var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
2690         am, // current match in a
2691         bm, // current match in b
2692         bs, // string preceding current number in b, if any
2693         i = -1, // index in s
2694         s = [], // string constants and placeholders
2695         q = []; // number interpolators
2696
2697     // Coerce inputs to strings.
2698     a = a + "", b = b + "";
2699
2700     // Interpolate pairs of numbers in a & b.
2701     while ((am = reA.exec(a))
2702         && (bm = reB.exec(b))) {
2703       if ((bs = bm.index) > bi) { // a string precedes the next number in b
2704         bs = b.slice(bi, bs);
2705         if (s[i]) s[i] += bs; // coalesce with previous string
2706         else s[++i] = bs;
2707       }
2708       if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
2709         if (s[i]) s[i] += bm; // coalesce with previous string
2710         else s[++i] = bm;
2711       } else { // interpolate non-matching numbers
2712         s[++i] = null;
2713         q.push({i: i, x: interpolateNumber(am, bm)});
2714       }
2715       bi = reB.lastIndex;
2716     }
2717
2718     // Add remains of b.
2719     if (bi < b.length) {
2720       bs = b.slice(bi);
2721       if (s[i]) s[i] += bs; // coalesce with previous string
2722       else s[++i] = bs;
2723     }
2724
2725     // Special optimization for only a single match.
2726     // Otherwise, interpolate each of the numbers and rejoin the string.
2727     return s.length < 2 ? (q[0]
2728         ? one(q[0].x)
2729         : zero(b))
2730         : (b = q.length, function(t) {
2731             for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
2732             return s.join("");
2733           });
2734   }
2735
2736   function interpolate(a, b) {
2737     var t = typeof b, c;
2738     return b == null || t === "boolean" ? constant$3(b)
2739         : (t === "number" ? interpolateNumber
2740         : t === "string" ? ((c = color(b)) ? (b = c, interpolateRgb) : interpolateString)
2741         : b instanceof color ? interpolateRgb
2742         : b instanceof Date ? date
2743         : Array.isArray(b) ? array$1
2744         : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object
2745         : interpolateNumber)(a, b);
2746   }
2747
2748   function interpolateRound(a, b) {
2749     return a = +a, b -= a, function(t) {
2750       return Math.round(a + b * t);
2751     };
2752   }
2753
2754   var degrees = 180 / Math.PI;
2755
2756   var identity$2 = {
2757     translateX: 0,
2758     translateY: 0,
2759     rotate: 0,
2760     skewX: 0,
2761     scaleX: 1,
2762     scaleY: 1
2763   };
2764
2765   function decompose(a, b, c, d, e, f) {
2766     var scaleX, scaleY, skewX;
2767     if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
2768     if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
2769     if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
2770     if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
2771     return {
2772       translateX: e,
2773       translateY: f,
2774       rotate: Math.atan2(b, a) * degrees,
2775       skewX: Math.atan(skewX) * degrees,
2776       scaleX: scaleX,
2777       scaleY: scaleY
2778     };
2779   }
2780
2781   var cssNode,
2782       cssRoot,
2783       cssView,
2784       svgNode;
2785
2786   function parseCss(value) {
2787     if (value === "none") return identity$2;
2788     if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
2789     cssNode.style.transform = value;
2790     value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
2791     cssRoot.removeChild(cssNode);
2792     value = value.slice(7, -1).split(",");
2793     return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
2794   }
2795
2796   function parseSvg(value) {
2797     if (value == null) return identity$2;
2798     if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
2799     svgNode.setAttribute("transform", value);
2800     if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2;
2801     value = value.matrix;
2802     return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
2803   }
2804
2805   function interpolateTransform(parse, pxComma, pxParen, degParen) {
2806
2807     function pop(s) {
2808       return s.length ? s.pop() + " " : "";
2809     }
2810
2811     function translate(xa, ya, xb, yb, s, q) {
2812       if (xa !== xb || ya !== yb) {
2813         var i = s.push("translate(", null, pxComma, null, pxParen);
2814         q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)});
2815       } else if (xb || yb) {
2816         s.push("translate(" + xb + pxComma + yb + pxParen);
2817       }
2818     }
2819
2820     function rotate(a, b, s, q) {
2821       if (a !== b) {
2822         if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
2823         q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: interpolateNumber(a, b)});
2824       } else if (b) {
2825         s.push(pop(s) + "rotate(" + b + degParen);
2826       }
2827     }
2828
2829     function skewX(a, b, s, q) {
2830       if (a !== b) {
2831         q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: interpolateNumber(a, b)});
2832       } else if (b) {
2833         s.push(pop(s) + "skewX(" + b + degParen);
2834       }
2835     }
2836
2837     function scale(xa, ya, xb, yb, s, q) {
2838       if (xa !== xb || ya !== yb) {
2839         var i = s.push(pop(s) + "scale(", null, ",", null, ")");
2840         q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)});
2841       } else if (xb !== 1 || yb !== 1) {
2842         s.push(pop(s) + "scale(" + xb + "," + yb + ")");
2843       }
2844     }
2845
2846     return function(a, b) {
2847       var s = [], // string constants and placeholders
2848           q = []; // number interpolators
2849       a = parse(a), b = parse(b);
2850       translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
2851       rotate(a.rotate, b.rotate, s, q);
2852       skewX(a.skewX, b.skewX, s, q);
2853       scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
2854       a = b = null; // gc
2855       return function(t) {
2856         var i = -1, n = q.length, o;
2857         while (++i < n) s[(o = q[i]).i] = o.x(t);
2858         return s.join("");
2859       };
2860     };
2861   }
2862
2863   var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
2864   var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
2865
2866   var rho = Math.SQRT2,
2867       rho2 = 2,
2868       rho4 = 4,
2869       epsilon2 = 1e-12;
2870
2871   function cosh(x) {
2872     return ((x = Math.exp(x)) + 1 / x) / 2;
2873   }
2874
2875   function sinh(x) {
2876     return ((x = Math.exp(x)) - 1 / x) / 2;
2877   }
2878
2879   function tanh(x) {
2880     return ((x = Math.exp(2 * x)) - 1) / (x + 1);
2881   }
2882
2883   // p0 = [ux0, uy0, w0]
2884   // p1 = [ux1, uy1, w1]
2885   function interpolateZoom(p0, p1) {
2886     var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
2887         ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
2888         dx = ux1 - ux0,
2889         dy = uy1 - uy0,
2890         d2 = dx * dx + dy * dy,
2891         i,
2892         S;
2893
2894     // Special case for u0 ≅ u1.
2895     if (d2 < epsilon2) {
2896       S = Math.log(w1 / w0) / rho;
2897       i = function(t) {
2898         return [
2899           ux0 + t * dx,
2900           uy0 + t * dy,
2901           w0 * Math.exp(rho * t * S)
2902         ];
2903       };
2904     }
2905
2906     // General case.
2907     else {
2908       var d1 = Math.sqrt(d2),
2909           b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
2910           b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
2911           r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
2912           r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
2913       S = (r1 - r0) / rho;
2914       i = function(t) {
2915         var s = t * S,
2916             coshr0 = cosh(r0),
2917             u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
2918         return [
2919           ux0 + u * dx,
2920           uy0 + u * dy,
2921           w0 * coshr0 / cosh(rho * s + r0)
2922         ];
2923       };
2924     }
2925
2926     i.duration = S * 1000;
2927
2928     return i;
2929   }
2930
2931   function hsl$1(hue$$1) {
2932     return function(start, end) {
2933       var h = hue$$1((start = hsl(start)).h, (end = hsl(end)).h),
2934           s = nogamma(start.s, end.s),
2935           l = nogamma(start.l, end.l),
2936           opacity = nogamma(start.opacity, end.opacity);
2937       return function(t) {
2938         start.h = h(t);
2939         start.s = s(t);
2940         start.l = l(t);
2941         start.opacity = opacity(t);
2942         return start + "";
2943       };
2944     }
2945   }
2946
2947   var hsl$2 = hsl$1(hue);
2948   var hslLong = hsl$1(nogamma);
2949
2950   function lab$1(start, end) {
2951     var l = nogamma((start = lab(start)).l, (end = lab(end)).l),
2952         a = nogamma(start.a, end.a),
2953         b = nogamma(start.b, end.b),
2954         opacity = nogamma(start.opacity, end.opacity);
2955     return function(t) {
2956       start.l = l(t);
2957       start.a = a(t);
2958       start.b = b(t);
2959       start.opacity = opacity(t);
2960       return start + "";
2961     };
2962   }
2963
2964   function hcl$1(hue$$1) {
2965     return function(start, end) {
2966       var h = hue$$1((start = hcl(start)).h, (end = hcl(end)).h),
2967           c = nogamma(start.c, end.c),
2968           l = nogamma(start.l, end.l),
2969           opacity = nogamma(start.opacity, end.opacity);
2970       return function(t) {
2971         start.h = h(t);
2972         start.c = c(t);
2973         start.l = l(t);
2974         start.opacity = opacity(t);
2975         return start + "";
2976       };
2977     }
2978   }
2979
2980   var hcl$2 = hcl$1(hue);
2981   var hclLong = hcl$1(nogamma);
2982
2983   function cubehelix$1(hue$$1) {
2984     return (function cubehelixGamma(y) {
2985       y = +y;
2986
2987       function cubehelix$$1(start, end) {
2988         var h = hue$$1((start = cubehelix(start)).h, (end = cubehelix(end)).h),
2989             s = nogamma(start.s, end.s),
2990             l = nogamma(start.l, end.l),
2991             opacity = nogamma(start.opacity, end.opacity);
2992         return function(t) {
2993           start.h = h(t);
2994           start.s = s(t);
2995           start.l = l(Math.pow(t, y));
2996           start.opacity = opacity(t);
2997           return start + "";
2998         };
2999       }
3000
3001       cubehelix$$1.gamma = cubehelixGamma;
3002
3003       return cubehelix$$1;
3004     })(1);
3005   }
3006
3007   var cubehelix$2 = cubehelix$1(hue);
3008   var cubehelixLong = cubehelix$1(nogamma);
3009
3010   function d3_quantize(interpolator, n) {
3011     var samples = new Array(n);
3012     for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
3013     return samples;
3014   }
3015
3016   var frame = 0, // is an animation frame pending?
3017       timeout = 0, // is a timeout pending?
3018       interval = 0, // are any timers active?
3019       pokeDelay = 1000, // how frequently we check for clock skew
3020       taskHead,
3021       taskTail,
3022       clockLast = 0,
3023       clockNow = 0,
3024       clockSkew = 0,
3025       clock = typeof performance === "object" && performance.now ? performance : Date,
3026       setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
3027
3028   function now() {
3029     return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
3030   }
3031
3032   function clearNow() {
3033     clockNow = 0;
3034   }
3035
3036   function Timer() {
3037     this._call =
3038     this._time =
3039     this._next = null;
3040   }
3041
3042   Timer.prototype = timer.prototype = {
3043     constructor: Timer,
3044     restart: function(callback, delay, time) {
3045       if (typeof callback !== "function") throw new TypeError("callback is not a function");
3046       time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
3047       if (!this._next && taskTail !== this) {
3048         if (taskTail) taskTail._next = this;
3049         else taskHead = this;
3050         taskTail = this;
3051       }
3052       this._call = callback;
3053       this._time = time;
3054       sleep();
3055     },
3056     stop: function() {
3057       if (this._call) {
3058         this._call = null;
3059         this._time = Infinity;
3060         sleep();
3061       }
3062     }
3063   };
3064
3065   function timer(callback, delay, time) {
3066     var t = new Timer;
3067     t.restart(callback, delay, time);
3068     return t;
3069   }
3070
3071   function timerFlush() {
3072     now(); // Get the current time, if not already set.
3073     ++frame; // Pretend we’ve set an alarm, if we haven’t already.
3074     var t = taskHead, e;
3075     while (t) {
3076       if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
3077       t = t._next;
3078     }
3079     --frame;
3080   }
3081
3082   function wake() {
3083     clockNow = (clockLast = clock.now()) + clockSkew;
3084     frame = timeout = 0;
3085     try {
3086       timerFlush();
3087     } finally {
3088       frame = 0;
3089       nap();
3090       clockNow = 0;
3091     }
3092   }
3093
3094   function poke() {
3095     var now = clock.now(), delay = now - clockLast;
3096     if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
3097   }
3098
3099   function nap() {
3100     var t0, t1 = taskHead, t2, time = Infinity;
3101     while (t1) {
3102       if (t1._call) {
3103         if (time > t1._time) time = t1._time;
3104         t0 = t1, t1 = t1._next;
3105       } else {
3106         t2 = t1._next, t1._next = null;
3107         t1 = t0 ? t0._next = t2 : taskHead = t2;
3108       }
3109     }
3110     taskTail = t0;
3111     sleep(time);
3112   }
3113
3114   function sleep(time) {
3115     if (frame) return; // Soonest alarm already set, or will be.
3116     if (timeout) timeout = clearTimeout(timeout);
3117     var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
3118     if (delay > 24) {
3119       if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
3120       if (interval) interval = clearInterval(interval);
3121     } else {
3122       if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
3123       frame = 1, setFrame(wake);
3124     }
3125   }
3126
3127   function timeout$1(callback, delay, time) {
3128     var t = new Timer;
3129     delay = delay == null ? 0 : +delay;
3130     t.restart(function(elapsed) {
3131       t.stop();
3132       callback(elapsed + delay);
3133     }, delay, time);
3134     return t;
3135   }
3136
3137   function interval$1(callback, delay, time) {
3138     var t = new Timer, total = delay;
3139     if (delay == null) return t.restart(callback, delay, time), t;
3140     delay = +delay, time = time == null ? now() : +time;
3141     t.restart(function tick(elapsed) {
3142       elapsed += total;
3143       t.restart(tick, total += delay, time);
3144       callback(elapsed);
3145     }, delay, time);
3146     return t;
3147   }
3148
3149   var emptyOn = dispatch("start", "end", "interrupt");
3150   var emptyTween = [];
3151
3152   var CREATED = 0;
3153   var SCHEDULED = 1;
3154   var STARTING = 2;
3155   var STARTED = 3;
3156   var RUNNING = 4;
3157   var ENDING = 5;
3158   var ENDED = 6;
3159
3160   function schedule(node, name, id, index, group, timing) {
3161     var schedules = node.__transition;
3162     if (!schedules) node.__transition = {};
3163     else if (id in schedules) return;
3164     create$1(node, id, {
3165       name: name,
3166       index: index, // For context during callback.
3167       group: group, // For context during callback.
3168       on: emptyOn,
3169       tween: emptyTween,
3170       time: timing.time,
3171       delay: timing.delay,
3172       duration: timing.duration,
3173       ease: timing.ease,
3174       timer: null,
3175       state: CREATED
3176     });
3177   }
3178
3179   function init(node, id) {
3180     var schedule = get$1(node, id);
3181     if (schedule.state > CREATED) throw new Error("too late; already scheduled");
3182     return schedule;
3183   }
3184
3185   function set$1(node, id) {
3186     var schedule = get$1(node, id);
3187     if (schedule.state > STARTING) throw new Error("too late; already started");
3188     return schedule;
3189   }
3190
3191   function get$1(node, id) {
3192     var schedule = node.__transition;
3193     if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
3194     return schedule;
3195   }
3196
3197   function create$1(node, id, self) {
3198     var schedules = node.__transition,
3199         tween;
3200
3201     // Initialize the self timer when the transition is created.
3202     // Note the actual delay is not known until the first callback!
3203     schedules[id] = self;
3204     self.timer = timer(schedule, 0, self.time);
3205
3206     function schedule(elapsed) {
3207       self.state = SCHEDULED;
3208       self.timer.restart(start, self.delay, self.time);
3209
3210       // If the elapsed delay is less than our first sleep, start immediately.
3211       if (self.delay <= elapsed) start(elapsed - self.delay);
3212     }
3213
3214     function start(elapsed) {
3215       var i, j, n, o;
3216
3217       // If the state is not SCHEDULED, then we previously errored on start.
3218       if (self.state !== SCHEDULED) return stop();
3219
3220       for (i in schedules) {
3221         o = schedules[i];
3222         if (o.name !== self.name) continue;
3223
3224         // While this element already has a starting transition during this frame,
3225         // defer starting an interrupting transition until that transition has a
3226         // chance to tick (and possibly end); see d3/d3-transition#54!
3227         if (o.state === STARTED) return timeout$1(start);
3228
3229         // Interrupt the active transition, if any.
3230         // Dispatch the interrupt event.
3231         if (o.state === RUNNING) {
3232           o.state = ENDED;
3233           o.timer.stop();
3234           o.on.call("interrupt", node, node.__data__, o.index, o.group);
3235           delete schedules[i];
3236         }
3237
3238         // Cancel any pre-empted transitions. No interrupt event is dispatched
3239         // because the cancelled transitions never started. Note that this also
3240         // removes this transition from the pending list!
3241         else if (+i < id) {
3242           o.state = ENDED;
3243           o.timer.stop();
3244           delete schedules[i];
3245         }
3246       }
3247
3248       // Defer the first tick to end of the current frame; see d3/d3#1576.
3249       // Note the transition may be canceled after start and before the first tick!
3250       // Note this must be scheduled before the start event; see d3/d3-transition#16!
3251       // Assuming this is successful, subsequent callbacks go straight to tick.
3252       timeout$1(function() {
3253         if (self.state === STARTED) {
3254           self.state = RUNNING;
3255           self.timer.restart(tick, self.delay, self.time);
3256           tick(elapsed);
3257         }
3258       });
3259
3260       // Dispatch the start event.
3261       // Note this must be done before the tween are initialized.
3262       self.state = STARTING;
3263       self.on.call("start", node, node.__data__, self.index, self.group);
3264       if (self.state !== STARTING) return; // interrupted
3265       self.state = STARTED;
3266
3267       // Initialize the tween, deleting null tween.
3268       tween = new Array(n = self.tween.length);
3269       for (i = 0, j = -1; i < n; ++i) {
3270         if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
3271           tween[++j] = o;
3272         }
3273       }
3274       tween.length = j + 1;
3275     }
3276
3277     function tick(elapsed) {
3278       var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
3279           i = -1,
3280           n = tween.length;
3281
3282       while (++i < n) {
3283         tween[i].call(null, t);
3284       }
3285
3286       // Dispatch the end event.
3287       if (self.state === ENDING) {
3288         self.on.call("end", node, node.__data__, self.index, self.group);
3289         stop();
3290       }
3291     }
3292
3293     function stop() {
3294       self.state = ENDED;
3295       self.timer.stop();
3296       delete schedules[id];
3297       for (var i in schedules) return; // eslint-disable-line no-unused-vars
3298       delete node.__transition;
3299     }
3300   }
3301
3302   function interrupt(node, name) {
3303     var schedules = node.__transition,
3304         schedule$$1,
3305         active,
3306         empty = true,
3307         i;
3308
3309     if (!schedules) return;
3310
3311     name = name == null ? null : name + "";
3312
3313     for (i in schedules) {
3314       if ((schedule$$1 = schedules[i]).name !== name) { empty = false; continue; }
3315       active = schedule$$1.state > STARTING && schedule$$1.state < ENDING;
3316       schedule$$1.state = ENDED;
3317       schedule$$1.timer.stop();
3318       if (active) schedule$$1.on.call("interrupt", node, node.__data__, schedule$$1.index, schedule$$1.group);
3319       delete schedules[i];
3320     }
3321
3322     if (empty) delete node.__transition;
3323   }
3324
3325   function selection_interrupt(name) {
3326     return this.each(function() {
3327       interrupt(this, name);
3328     });
3329   }
3330
3331   function tweenRemove(id, name) {
3332     var tween0, tween1;
3333     return function() {
3334       var schedule$$1 = set$1(this, id),
3335           tween = schedule$$1.tween;
3336
3337       // If this node shared tween with the previous node,
3338       // just assign the updated shared tween and we’re done!
3339       // Otherwise, copy-on-write.
3340       if (tween !== tween0) {
3341         tween1 = tween0 = tween;
3342         for (var i = 0, n = tween1.length; i < n; ++i) {
3343           if (tween1[i].name === name) {
3344             tween1 = tween1.slice();
3345             tween1.splice(i, 1);
3346             break;
3347           }
3348         }
3349       }
3350
3351       schedule$$1.tween = tween1;
3352     };
3353   }
3354
3355   function tweenFunction(id, name, value) {
3356     var tween0, tween1;
3357     if (typeof value !== "function") throw new Error;
3358     return function() {
3359       var schedule$$1 = set$1(this, id),
3360           tween = schedule$$1.tween;
3361
3362       // If this node shared tween with the previous node,
3363       // just assign the updated shared tween and we’re done!
3364       // Otherwise, copy-on-write.
3365       if (tween !== tween0) {
3366         tween1 = (tween0 = tween).slice();
3367         for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
3368           if (tween1[i].name === name) {
3369             tween1[i] = t;
3370             break;
3371           }
3372         }
3373         if (i === n) tween1.push(t);
3374       }
3375
3376       schedule$$1.tween = tween1;
3377     };
3378   }
3379
3380   function transition_tween(name, value) {
3381     var id = this._id;
3382
3383     name += "";
3384
3385     if (arguments.length < 2) {
3386       var tween = get$1(this.node(), id).tween;
3387       for (var i = 0, n = tween.length, t; i < n; ++i) {
3388         if ((t = tween[i]).name === name) {
3389           return t.value;
3390         }
3391       }
3392       return null;
3393     }
3394
3395     return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
3396   }
3397
3398   function tweenValue(transition, name, value) {
3399     var id = transition._id;
3400
3401     transition.each(function() {
3402       var schedule$$1 = set$1(this, id);
3403       (schedule$$1.value || (schedule$$1.value = {}))[name] = value.apply(this, arguments);
3404     });
3405
3406     return function(node) {
3407       return get$1(node, id).value[name];
3408     };
3409   }
3410
3411   function interpolate$1(a, b) {
3412     var c;
3413     return (typeof b === "number" ? interpolateNumber
3414         : b instanceof color ? interpolateRgb
3415         : (c = color(b)) ? (b = c, interpolateRgb)
3416         : interpolateString)(a, b);
3417   }
3418
3419   function attrRemove$1(name) {
3420     return function() {
3421       this.removeAttribute(name);
3422     };
3423   }
3424
3425   function attrRemoveNS$1(fullname) {
3426     return function() {
3427       this.removeAttributeNS(fullname.space, fullname.local);
3428     };
3429   }
3430
3431   function attrConstant$1(name, interpolate$$1, value1) {
3432     var value00,
3433         interpolate0;
3434     return function() {
3435       var value0 = this.getAttribute(name);
3436       return value0 === value1 ? null
3437           : value0 === value00 ? interpolate0
3438           : interpolate0 = interpolate$$1(value00 = value0, value1);
3439     };
3440   }
3441
3442   function attrConstantNS$1(fullname, interpolate$$1, value1) {
3443     var value00,
3444         interpolate0;
3445     return function() {
3446       var value0 = this.getAttributeNS(fullname.space, fullname.local);
3447       return value0 === value1 ? null
3448           : value0 === value00 ? interpolate0
3449           : interpolate0 = interpolate$$1(value00 = value0, value1);
3450     };
3451   }
3452
3453   function attrFunction$1(name, interpolate$$1, value) {
3454     var value00,
3455         value10,
3456         interpolate0;
3457     return function() {
3458       var value0, value1 = value(this);
3459       if (value1 == null) return void this.removeAttribute(name);
3460       value0 = this.getAttribute(name);
3461       return value0 === value1 ? null
3462           : value0 === value00 && value1 === value10 ? interpolate0
3463           : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3464     };
3465   }
3466
3467   function attrFunctionNS$1(fullname, interpolate$$1, value) {
3468     var value00,
3469         value10,
3470         interpolate0;
3471     return function() {
3472       var value0, value1 = value(this);
3473       if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
3474       value0 = this.getAttributeNS(fullname.space, fullname.local);
3475       return value0 === value1 ? null
3476           : value0 === value00 && value1 === value10 ? interpolate0
3477           : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3478     };
3479   }
3480
3481   function transition_attr(name, value) {
3482     var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate$1;
3483     return this.attrTween(name, typeof value === "function"
3484         ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
3485         : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
3486         : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value + ""));
3487   }
3488
3489   function attrTweenNS(fullname, value) {
3490     function tween() {
3491       var node = this, i = value.apply(node, arguments);
3492       return i && function(t) {
3493         node.setAttributeNS(fullname.space, fullname.local, i(t));
3494       };
3495     }
3496     tween._value = value;
3497     return tween;
3498   }
3499
3500   function attrTween(name, value) {
3501     function tween() {
3502       var node = this, i = value.apply(node, arguments);
3503       return i && function(t) {
3504         node.setAttribute(name, i(t));
3505       };
3506     }
3507     tween._value = value;
3508     return tween;
3509   }
3510
3511   function transition_attrTween(name, value) {
3512     var key = "attr." + name;
3513     if (arguments.length < 2) return (key = this.tween(key)) && key._value;
3514     if (value == null) return this.tween(key, null);
3515     if (typeof value !== "function") throw new Error;
3516     var fullname = namespace(name);
3517     return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
3518   }
3519
3520   function delayFunction(id, value) {
3521     return function() {
3522       init(this, id).delay = +value.apply(this, arguments);
3523     };
3524   }
3525
3526   function delayConstant(id, value) {
3527     return value = +value, function() {
3528       init(this, id).delay = value;
3529     };
3530   }
3531
3532   function transition_delay(value) {
3533     var id = this._id;
3534
3535     return arguments.length
3536         ? this.each((typeof value === "function"
3537             ? delayFunction
3538             : delayConstant)(id, value))
3539         : get$1(this.node(), id).delay;
3540   }
3541
3542   function durationFunction(id, value) {
3543     return function() {
3544       set$1(this, id).duration = +value.apply(this, arguments);
3545     };
3546   }
3547
3548   function durationConstant(id, value) {
3549     return value = +value, function() {
3550       set$1(this, id).duration = value;
3551     };
3552   }
3553
3554   function transition_duration(value) {
3555     var id = this._id;
3556
3557     return arguments.length
3558         ? this.each((typeof value === "function"
3559             ? durationFunction
3560             : durationConstant)(id, value))
3561         : get$1(this.node(), id).duration;
3562   }
3563
3564   function easeConstant(id, value) {
3565     if (typeof value !== "function") throw new Error;
3566     return function() {
3567       set$1(this, id).ease = value;
3568     };
3569   }
3570
3571   function transition_ease(value) {
3572     var id = this._id;
3573
3574     return arguments.length
3575         ? this.each(easeConstant(id, value))
3576         : get$1(this.node(), id).ease;
3577   }
3578
3579   function transition_filter(match) {
3580     if (typeof match !== "function") match = matcher$1(match);
3581
3582     for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
3583       for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
3584         if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
3585           subgroup.push(node);
3586         }
3587       }
3588     }
3589
3590     return new Transition(subgroups, this._parents, this._name, this._id);
3591   }
3592
3593   function transition_merge(transition$$1) {
3594     if (transition$$1._id !== this._id) throw new Error;
3595
3596     for (var groups0 = this._groups, groups1 = transition$$1._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
3597       for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
3598         if (node = group0[i] || group1[i]) {
3599           merge[i] = node;
3600         }
3601       }
3602     }
3603
3604     for (; j < m0; ++j) {
3605       merges[j] = groups0[j];
3606     }
3607
3608     return new Transition(merges, this._parents, this._name, this._id);
3609   }
3610
3611   function start(name) {
3612     return (name + "").trim().split(/^|\s+/).every(function(t) {
3613       var i = t.indexOf(".");
3614       if (i >= 0) t = t.slice(0, i);
3615       return !t || t === "start";
3616     });
3617   }
3618
3619   function onFunction(id, name, listener) {
3620     var on0, on1, sit = start(name) ? init : set$1;
3621     return function() {
3622       var schedule$$1 = sit(this, id),
3623           on = schedule$$1.on;
3624
3625       // If this node shared a dispatch with the previous node,
3626       // just assign the updated shared dispatch and we’re done!
3627       // Otherwise, copy-on-write.
3628       if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
3629
3630       schedule$$1.on = on1;
3631     };
3632   }
3633
3634   function transition_on(name, listener) {
3635     var id = this._id;
3636
3637     return arguments.length < 2
3638         ? get$1(this.node(), id).on.on(name)
3639         : this.each(onFunction(id, name, listener));
3640   }
3641
3642   function removeFunction(id) {
3643     return function() {
3644       var parent = this.parentNode;
3645       for (var i in this.__transition) if (+i !== id) return;
3646       if (parent) parent.removeChild(this);
3647     };
3648   }
3649
3650   function transition_remove() {
3651     return this.on("end.remove", removeFunction(this._id));
3652   }
3653
3654   function transition_select(select$$1) {
3655     var name = this._name,
3656         id = this._id;
3657
3658     if (typeof select$$1 !== "function") select$$1 = selector(select$$1);
3659
3660     for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
3661       for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
3662         if ((node = group[i]) && (subnode = select$$1.call(node, node.__data__, i, group))) {
3663           if ("__data__" in node) subnode.__data__ = node.__data__;
3664           subgroup[i] = subnode;
3665           schedule(subgroup[i], name, id, i, subgroup, get$1(node, id));
3666         }
3667       }
3668     }
3669
3670     return new Transition(subgroups, this._parents, name, id);
3671   }
3672
3673   function transition_selectAll(select$$1) {
3674     var name = this._name,
3675         id = this._id;
3676
3677     if (typeof select$$1 !== "function") select$$1 = selectorAll(select$$1);
3678
3679     for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
3680       for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
3681         if (node = group[i]) {
3682           for (var children = select$$1.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) {
3683             if (child = children[k]) {
3684               schedule(child, name, id, k, children, inherit);
3685             }
3686           }
3687           subgroups.push(children);
3688           parents.push(node);
3689         }
3690       }
3691     }
3692
3693     return new Transition(subgroups, parents, name, id);
3694   }
3695
3696   var Selection$1 = selection.prototype.constructor;
3697
3698   function transition_selection() {
3699     return new Selection$1(this._groups, this._parents);
3700   }
3701
3702   function styleRemove$1(name, interpolate$$1) {
3703     var value00,
3704         value10,
3705         interpolate0;
3706     return function() {
3707       var value0 = styleValue(this, name),
3708           value1 = (this.style.removeProperty(name), styleValue(this, name));
3709       return value0 === value1 ? null
3710           : value0 === value00 && value1 === value10 ? interpolate0
3711           : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3712     };
3713   }
3714
3715   function styleRemoveEnd(name) {
3716     return function() {
3717       this.style.removeProperty(name);
3718     };
3719   }
3720
3721   function styleConstant$1(name, interpolate$$1, value1) {
3722     var value00,
3723         interpolate0;
3724     return function() {
3725       var value0 = styleValue(this, name);
3726       return value0 === value1 ? null
3727           : value0 === value00 ? interpolate0
3728           : interpolate0 = interpolate$$1(value00 = value0, value1);
3729     };
3730   }
3731
3732   function styleFunction$1(name, interpolate$$1, value) {
3733     var value00,
3734         value10,
3735         interpolate0;
3736     return function() {
3737       var value0 = styleValue(this, name),
3738           value1 = value(this);
3739       if (value1 == null) value1 = (this.style.removeProperty(name), styleValue(this, name));
3740       return value0 === value1 ? null
3741           : value0 === value00 && value1 === value10 ? interpolate0
3742           : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3743     };
3744   }
3745
3746   function transition_style(name, value, priority) {
3747     var i = (name += "") === "transform" ? interpolateTransformCss : interpolate$1;
3748     return value == null ? this
3749             .styleTween(name, styleRemove$1(name, i))
3750             .on("end.style." + name, styleRemoveEnd(name))
3751         : this.styleTween(name, typeof value === "function"
3752             ? styleFunction$1(name, i, tweenValue(this, "style." + name, value))
3753             : styleConstant$1(name, i, value + ""), priority);
3754   }
3755
3756   function styleTween(name, value, priority) {
3757     function tween() {
3758       var node = this, i = value.apply(node, arguments);
3759       return i && function(t) {
3760         node.style.setProperty(name, i(t), priority);
3761       };
3762     }
3763     tween._value = value;
3764     return tween;
3765   }
3766
3767   function transition_styleTween(name, value, priority) {
3768     var key = "style." + (name += "");
3769     if (arguments.length < 2) return (key = this.tween(key)) && key._value;
3770     if (value == null) return this.tween(key, null);
3771     if (typeof value !== "function") throw new Error;
3772     return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
3773   }
3774
3775   function textConstant$1(value) {
3776     return function() {
3777       this.textContent = value;
3778     };
3779   }
3780
3781   function textFunction$1(value) {
3782     return function() {
3783       var value1 = value(this);
3784       this.textContent = value1 == null ? "" : value1;
3785     };
3786   }
3787
3788   function transition_text(value) {
3789     return this.tween("text", typeof value === "function"
3790         ? textFunction$1(tweenValue(this, "text", value))
3791         : textConstant$1(value == null ? "" : value + ""));
3792   }
3793
3794   function transition_transition() {
3795     var name = this._name,
3796         id0 = this._id,
3797         id1 = newId();
3798
3799     for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
3800       for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
3801         if (node = group[i]) {
3802           var inherit = get$1(node, id0);
3803           schedule(node, name, id1, i, group, {
3804             time: inherit.time + inherit.delay + inherit.duration,
3805             delay: 0,
3806             duration: inherit.duration,
3807             ease: inherit.ease
3808           });
3809         }
3810       }
3811     }
3812
3813     return new Transition(groups, this._parents, name, id1);
3814   }
3815
3816   var id = 0;
3817
3818   function Transition(groups, parents, name, id) {
3819     this._groups = groups;
3820     this._parents = parents;
3821     this._name = name;
3822     this._id = id;
3823   }
3824
3825   function transition(name) {
3826     return selection().transition(name);
3827   }
3828
3829   function newId() {
3830     return ++id;
3831   }
3832
3833   var selection_prototype = selection.prototype;
3834
3835   Transition.prototype = transition.prototype = {
3836     constructor: Transition,
3837     select: transition_select,
3838     selectAll: transition_selectAll,
3839     filter: transition_filter,
3840     merge: transition_merge,
3841     selection: transition_selection,
3842     transition: transition_transition,
3843     call: selection_prototype.call,
3844     nodes: selection_prototype.nodes,
3845     node: selection_prototype.node,
3846     size: selection_prototype.size,
3847     empty: selection_prototype.empty,
3848     each: selection_prototype.each,
3849     on: transition_on,
3850     attr: transition_attr,
3851     attrTween: transition_attrTween,
3852     style: transition_style,
3853     styleTween: transition_styleTween,
3854     text: transition_text,
3855     remove: transition_remove,
3856     tween: transition_tween,
3857     delay: transition_delay,
3858     duration: transition_duration,
3859     ease: transition_ease
3860   };
3861
3862   function linear$1(t) {
3863     return +t;
3864   }
3865
3866   function quadIn(t) {
3867     return t * t;
3868   }
3869
3870   function quadOut(t) {
3871     return t * (2 - t);
3872   }
3873
3874   function quadInOut(t) {
3875     return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
3876   }
3877
3878   function cubicIn(t) {
3879     return t * t * t;
3880   }
3881
3882   function cubicOut(t) {
3883     return --t * t * t + 1;
3884   }
3885
3886   function cubicInOut(t) {
3887     return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
3888   }
3889
3890   var exponent = 3;
3891
3892   var polyIn = (function custom(e) {
3893     e = +e;
3894
3895     function polyIn(t) {
3896       return Math.pow(t, e);
3897     }
3898
3899     polyIn.exponent = custom;
3900
3901     return polyIn;
3902   })(exponent);
3903
3904   var polyOut = (function custom(e) {
3905     e = +e;
3906
3907     function polyOut(t) {
3908       return 1 - Math.pow(1 - t, e);
3909     }
3910
3911     polyOut.exponent = custom;
3912
3913     return polyOut;
3914   })(exponent);
3915
3916   var polyInOut = (function custom(e) {
3917     e = +e;
3918
3919     function polyInOut(t) {
3920       return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
3921     }
3922
3923     polyInOut.exponent = custom;
3924
3925     return polyInOut;
3926   })(exponent);
3927
3928   var pi = Math.PI,
3929       halfPi = pi / 2;
3930
3931   function sinIn(t) {
3932     return 1 - Math.cos(t * halfPi);
3933   }
3934
3935   function sinOut(t) {
3936     return Math.sin(t * halfPi);
3937   }
3938
3939   function sinInOut(t) {
3940     return (1 - Math.cos(pi * t)) / 2;
3941   }
3942
3943   function expIn(t) {
3944     return Math.pow(2, 10 * t - 10);
3945   }
3946
3947   function expOut(t) {
3948     return 1 - Math.pow(2, -10 * t);
3949   }
3950
3951   function expInOut(t) {
3952     return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
3953   }
3954
3955   function circleIn(t) {
3956     return 1 - Math.sqrt(1 - t * t);
3957   }
3958
3959   function circleOut(t) {
3960     return Math.sqrt(1 - --t * t);
3961   }
3962
3963   function circleInOut(t) {
3964     return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
3965   }
3966
3967   var b1 = 4 / 11,
3968       b2 = 6 / 11,
3969       b3 = 8 / 11,
3970       b4 = 3 / 4,
3971       b5 = 9 / 11,
3972       b6 = 10 / 11,
3973       b7 = 15 / 16,
3974       b8 = 21 / 22,
3975       b9 = 63 / 64,
3976       b0 = 1 / b1 / b1;
3977
3978   function bounceIn(t) {
3979     return 1 - bounceOut(1 - t);
3980   }
3981
3982   function bounceOut(t) {
3983     return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;
3984   }
3985
3986   function bounceInOut(t) {
3987     return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
3988   }
3989
3990   var overshoot = 1.70158;
3991
3992   var backIn = (function custom(s) {
3993     s = +s;
3994
3995     function backIn(t) {
3996       return t * t * ((s + 1) * t - s);
3997     }
3998
3999     backIn.overshoot = custom;
4000
4001     return backIn;
4002   })(overshoot);
4003
4004   var backOut = (function custom(s) {
4005     s = +s;
4006
4007     function backOut(t) {
4008       return --t * t * ((s + 1) * t + s) + 1;
4009     }
4010
4011     backOut.overshoot = custom;
4012
4013     return backOut;
4014   })(overshoot);
4015
4016   var backInOut = (function custom(s) {
4017     s = +s;
4018
4019     function backInOut(t) {
4020       return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
4021     }
4022
4023     backInOut.overshoot = custom;
4024
4025     return backInOut;
4026   })(overshoot);
4027
4028   var tau = 2 * Math.PI,
4029       amplitude = 1,
4030       period = 0.3;
4031
4032   var elasticIn = (function custom(a, p) {
4033     var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4034
4035     function elasticIn(t) {
4036       return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
4037     }
4038
4039     elasticIn.amplitude = function(a) { return custom(a, p * tau); };
4040     elasticIn.period = function(p) { return custom(a, p); };
4041
4042     return elasticIn;
4043   })(amplitude, period);
4044
4045   var elasticOut = (function custom(a, p) {
4046     var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4047
4048     function elasticOut(t) {
4049       return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
4050     }
4051
4052     elasticOut.amplitude = function(a) { return custom(a, p * tau); };
4053     elasticOut.period = function(p) { return custom(a, p); };
4054
4055     return elasticOut;
4056   })(amplitude, period);
4057
4058   var elasticInOut = (function custom(a, p) {
4059     var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4060
4061     function elasticInOut(t) {
4062       return ((t = t * 2 - 1) < 0
4063           ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)
4064           : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;
4065     }
4066
4067     elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
4068     elasticInOut.period = function(p) { return custom(a, p); };
4069
4070     return elasticInOut;
4071   })(amplitude, period);
4072
4073   var defaultTiming = {
4074     time: null, // Set on use.
4075     delay: 0,
4076     duration: 250,
4077     ease: cubicInOut
4078   };
4079
4080   function inherit(node, id) {
4081     var timing;
4082     while (!(timing = node.__transition) || !(timing = timing[id])) {
4083       if (!(node = node.parentNode)) {
4084         return defaultTiming.time = now(), defaultTiming;
4085       }
4086     }
4087     return timing;
4088   }
4089
4090   function selection_transition(name) {
4091     var id,
4092         timing;
4093
4094     if (name instanceof Transition) {
4095       id = name._id, name = name._name;
4096     } else {
4097       id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
4098     }
4099
4100     for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
4101       for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
4102         if (node = group[i]) {
4103           schedule(node, name, id, i, group, timing || inherit(node, id));
4104         }
4105       }
4106     }
4107
4108     return new Transition(groups, this._parents, name, id);
4109   }
4110
4111   selection.prototype.interrupt = selection_interrupt;
4112   selection.prototype.transition = selection_transition;
4113
4114   var root$1 = [null];
4115
4116   function active(node, name) {
4117     var schedules = node.__transition,
4118         schedule$$1,
4119         i;
4120
4121     if (schedules) {
4122       name = name == null ? null : name + "";
4123       for (i in schedules) {
4124         if ((schedule$$1 = schedules[i]).state > SCHEDULED && schedule$$1.name === name) {
4125           return new Transition([[node]], root$1, name, +i);
4126         }
4127       }
4128     }
4129
4130     return null;
4131   }
4132
4133   function constant$4(x) {
4134     return function() {
4135       return x;
4136     };
4137   }
4138
4139   function BrushEvent(target, type, selection) {
4140     this.target = target;
4141     this.type = type;
4142     this.selection = selection;
4143   }
4144
4145   function nopropagation$1() {
4146     event.stopImmediatePropagation();
4147   }
4148
4149   function noevent$1() {
4150     event.preventDefault();
4151     event.stopImmediatePropagation();
4152   }
4153
4154   var MODE_DRAG = {name: "drag"},
4155       MODE_SPACE = {name: "space"},
4156       MODE_HANDLE = {name: "handle"},
4157       MODE_CENTER = {name: "center"};
4158
4159   var X = {
4160     name: "x",
4161     handles: ["e", "w"].map(type),
4162     input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },
4163     output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }
4164   };
4165
4166   var Y = {
4167     name: "y",
4168     handles: ["n", "s"].map(type),
4169     input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },
4170     output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }
4171   };
4172
4173   var XY = {
4174     name: "xy",
4175     handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type),
4176     input: function(xy) { return xy; },
4177     output: function(xy) { return xy; }
4178   };
4179
4180   var cursors = {
4181     overlay: "crosshair",
4182     selection: "move",
4183     n: "ns-resize",
4184     e: "ew-resize",
4185     s: "ns-resize",
4186     w: "ew-resize",
4187     nw: "nwse-resize",
4188     ne: "nesw-resize",
4189     se: "nwse-resize",
4190     sw: "nesw-resize"
4191   };
4192
4193   var flipX = {
4194     e: "w",
4195     w: "e",
4196     nw: "ne",
4197     ne: "nw",
4198     se: "sw",
4199     sw: "se"
4200   };
4201
4202   var flipY = {
4203     n: "s",
4204     s: "n",
4205     nw: "sw",
4206     ne: "se",
4207     se: "ne",
4208     sw: "nw"
4209   };
4210
4211   var signsX = {
4212     overlay: +1,
4213     selection: +1,
4214     n: null,
4215     e: +1,
4216     s: null,
4217     w: -1,
4218     nw: -1,
4219     ne: +1,
4220     se: +1,
4221     sw: -1
4222   };
4223
4224   var signsY = {
4225     overlay: +1,
4226     selection: +1,
4227     n: -1,
4228     e: null,
4229     s: +1,
4230     w: null,
4231     nw: -1,
4232     ne: -1,
4233     se: +1,
4234     sw: +1
4235   };
4236
4237   function type(t) {
4238     return {type: t};
4239   }
4240
4241   // Ignore right-click, since that should open the context menu.
4242   function defaultFilter$1() {
4243     return !event.button;
4244   }
4245
4246   function defaultExtent() {
4247     var svg = this.ownerSVGElement || this;
4248     return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
4249   }
4250
4251   // Like d3.local, but with the name “__brush” rather than auto-generated.
4252   function local$1(node) {
4253     while (!node.__brush) if (!(node = node.parentNode)) return;
4254     return node.__brush;
4255   }
4256
4257   function empty$1(extent) {
4258     return extent[0][0] === extent[1][0]
4259         || extent[0][1] === extent[1][1];
4260   }
4261
4262   function brushSelection(node) {
4263     var state = node.__brush;
4264     return state ? state.dim.output(state.selection) : null;
4265   }
4266
4267   function brushX() {
4268     return brush$1(X);
4269   }
4270
4271   function brushY() {
4272     return brush$1(Y);
4273   }
4274
4275   function brush() {
4276     return brush$1(XY);
4277   }
4278
4279   function brush$1(dim) {
4280     var extent = defaultExtent,
4281         filter = defaultFilter$1,
4282         listeners = dispatch(brush, "start", "brush", "end"),
4283         handleSize = 6,
4284         touchending;
4285
4286     function brush(group) {
4287       var overlay = group
4288           .property("__brush", initialize)
4289         .selectAll(".overlay")
4290         .data([type("overlay")]);
4291
4292       overlay.enter().append("rect")
4293           .attr("class", "overlay")
4294           .attr("pointer-events", "all")
4295           .attr("cursor", cursors.overlay)
4296         .merge(overlay)
4297           .each(function() {
4298             var extent = local$1(this).extent;
4299             select(this)
4300                 .attr("x", extent[0][0])
4301                 .attr("y", extent[0][1])
4302                 .attr("width", extent[1][0] - extent[0][0])
4303                 .attr("height", extent[1][1] - extent[0][1]);
4304           });
4305
4306       group.selectAll(".selection")
4307         .data([type("selection")])
4308         .enter().append("rect")
4309           .attr("class", "selection")
4310           .attr("cursor", cursors.selection)
4311           .attr("fill", "#777")
4312           .attr("fill-opacity", 0.3)
4313           .attr("stroke", "#fff")
4314           .attr("shape-rendering", "crispEdges");
4315
4316       var handle = group.selectAll(".handle")
4317         .data(dim.handles, function(d) { return d.type; });
4318
4319       handle.exit().remove();
4320
4321       handle.enter().append("rect")
4322           .attr("class", function(d) { return "handle handle--" + d.type; })
4323           .attr("cursor", function(d) { return cursors[d.type]; });
4324
4325       group
4326           .each(redraw)
4327           .attr("fill", "none")
4328           .attr("pointer-events", "all")
4329           .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)")
4330           .on("mousedown.brush touchstart.brush", started);
4331     }
4332
4333     brush.move = function(group, selection$$1) {
4334       if (group.selection) {
4335         group
4336             .on("start.brush", function() { emitter(this, arguments).beforestart().start(); })
4337             .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); })
4338             .tween("brush", function() {
4339               var that = this,
4340                   state = that.__brush,
4341                   emit = emitter(that, arguments),
4342                   selection0 = state.selection,
4343                   selection1 = dim.input(typeof selection$$1 === "function" ? selection$$1.apply(this, arguments) : selection$$1, state.extent),
4344                   i = interpolate(selection0, selection1);
4345
4346               function tween(t) {
4347                 state.selection = t === 1 && empty$1(selection1) ? null : i(t);
4348                 redraw.call(that);
4349                 emit.brush();
4350               }
4351
4352               return selection0 && selection1 ? tween : tween(1);
4353             });
4354       } else {
4355         group
4356             .each(function() {
4357               var that = this,
4358                   args = arguments,
4359                   state = that.__brush,
4360                   selection1 = dim.input(typeof selection$$1 === "function" ? selection$$1.apply(that, args) : selection$$1, state.extent),
4361                   emit = emitter(that, args).beforestart();
4362
4363               interrupt(that);
4364               state.selection = selection1 == null || empty$1(selection1) ? null : selection1;
4365               redraw.call(that);
4366               emit.start().brush().end();
4367             });
4368       }
4369     };
4370
4371     function redraw() {
4372       var group = select(this),
4373           selection$$1 = local$1(this).selection;
4374
4375       if (selection$$1) {
4376         group.selectAll(".selection")
4377             .style("display", null)
4378             .attr("x", selection$$1[0][0])
4379             .attr("y", selection$$1[0][1])
4380             .attr("width", selection$$1[1][0] - selection$$1[0][0])
4381             .attr("height", selection$$1[1][1] - selection$$1[0][1]);
4382
4383         group.selectAll(".handle")
4384             .style("display", null)
4385             .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection$$1[1][0] - handleSize / 2 : selection$$1[0][0] - handleSize / 2; })
4386             .attr("y", function(d) { return d.type[0] === "s" ? selection$$1[1][1] - handleSize / 2 : selection$$1[0][1] - handleSize / 2; })
4387             .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection$$1[1][0] - selection$$1[0][0] + handleSize : handleSize; })
4388             .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection$$1[1][1] - selection$$1[0][1] + handleSize : handleSize; });
4389       }
4390
4391       else {
4392         group.selectAll(".selection,.handle")
4393             .style("display", "none")
4394             .attr("x", null)
4395             .attr("y", null)
4396             .attr("width", null)
4397             .attr("height", null);
4398       }
4399     }
4400
4401     function emitter(that, args) {
4402       return that.__brush.emitter || new Emitter(that, args);
4403     }
4404
4405     function Emitter(that, args) {
4406       this.that = that;
4407       this.args = args;
4408       this.state = that.__brush;
4409       this.active = 0;
4410     }
4411
4412     Emitter.prototype = {
4413       beforestart: function() {
4414         if (++this.active === 1) this.state.emitter = this, this.starting = true;
4415         return this;
4416       },
4417       start: function() {
4418         if (this.starting) this.starting = false, this.emit("start");
4419         return this;
4420       },
4421       brush: function() {
4422         this.emit("brush");
4423         return this;
4424       },
4425       end: function() {
4426         if (--this.active === 0) delete this.state.emitter, this.emit("end");
4427         return this;
4428       },
4429       emit: function(type) {
4430         customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);
4431       }
4432     };
4433
4434     function started() {
4435       if (event.touches) { if (event.changedTouches.length < event.touches.length) return noevent$1(); }
4436       else if (touchending) return;
4437       if (!filter.apply(this, arguments)) return;
4438
4439       var that = this,
4440           type = event.target.__data__.type,
4441           mode = (event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE),
4442           signX = dim === Y ? null : signsX[type],
4443           signY = dim === X ? null : signsY[type],
4444           state = local$1(that),
4445           extent = state.extent,
4446           selection$$1 = state.selection,
4447           W = extent[0][0], w0, w1,
4448           N = extent[0][1], n0, n1,
4449           E = extent[1][0], e0, e1,
4450           S = extent[1][1], s0, s1,
4451           dx,
4452           dy,
4453           moving,
4454           shifting = signX && signY && event.shiftKey,
4455           lockX,
4456           lockY,
4457           point0 = mouse(that),
4458           point$$1 = point0,
4459           emit = emitter(that, arguments).beforestart();
4460
4461       if (type === "overlay") {
4462         state.selection = selection$$1 = [
4463           [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],
4464           [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]
4465         ];
4466       } else {
4467         w0 = selection$$1[0][0];
4468         n0 = selection$$1[0][1];
4469         e0 = selection$$1[1][0];
4470         s0 = selection$$1[1][1];
4471       }
4472
4473       w1 = w0;
4474       n1 = n0;
4475       e1 = e0;
4476       s1 = s0;
4477
4478       var group = select(that)
4479           .attr("pointer-events", "none");
4480
4481       var overlay = group.selectAll(".overlay")
4482           .attr("cursor", cursors[type]);
4483
4484       if (event.touches) {
4485         group
4486             .on("touchmove.brush", moved, true)
4487             .on("touchend.brush touchcancel.brush", ended, true);
4488       } else {
4489         var view = select(event.view)
4490             .on("keydown.brush", keydowned, true)
4491             .on("keyup.brush", keyupped, true)
4492             .on("mousemove.brush", moved, true)
4493             .on("mouseup.brush", ended, true);
4494
4495         dragDisable(event.view);
4496       }
4497
4498       nopropagation$1();
4499       interrupt(that);
4500       redraw.call(that);
4501       emit.start();
4502
4503       function moved() {
4504         var point1 = mouse(that);
4505         if (shifting && !lockX && !lockY) {
4506           if (Math.abs(point1[0] - point$$1[0]) > Math.abs(point1[1] - point$$1[1])) lockY = true;
4507           else lockX = true;
4508         }
4509         point$$1 = point1;
4510         moving = true;
4511         noevent$1();
4512         move();
4513       }
4514
4515       function move() {
4516         var t;
4517
4518         dx = point$$1[0] - point0[0];
4519         dy = point$$1[1] - point0[1];
4520
4521         switch (mode) {
4522           case MODE_SPACE:
4523           case MODE_DRAG: {
4524             if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;
4525             if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;
4526             break;
4527           }
4528           case MODE_HANDLE: {
4529             if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;
4530             else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;
4531             if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;
4532             else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;
4533             break;
4534           }
4535           case MODE_CENTER: {
4536             if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));
4537             if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));
4538             break;
4539           }
4540         }
4541
4542         if (e1 < w1) {
4543           signX *= -1;
4544           t = w0, w0 = e0, e0 = t;
4545           t = w1, w1 = e1, e1 = t;
4546           if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]);
4547         }
4548
4549         if (s1 < n1) {
4550           signY *= -1;
4551           t = n0, n0 = s0, s0 = t;
4552           t = n1, n1 = s1, s1 = t;
4553           if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]);
4554         }
4555
4556         if (state.selection) selection$$1 = state.selection; // May be set by brush.move!
4557         if (lockX) w1 = selection$$1[0][0], e1 = selection$$1[1][0];
4558         if (lockY) n1 = selection$$1[0][1], s1 = selection$$1[1][1];
4559
4560         if (selection$$1[0][0] !== w1
4561             || selection$$1[0][1] !== n1
4562             || selection$$1[1][0] !== e1
4563             || selection$$1[1][1] !== s1) {
4564           state.selection = [[w1, n1], [e1, s1]];
4565           redraw.call(that);
4566           emit.brush();
4567         }
4568       }
4569
4570       function ended() {
4571         nopropagation$1();
4572         if (event.touches) {
4573           if (event.touches.length) return;
4574           if (touchending) clearTimeout(touchending);
4575           touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
4576           group.on("touchmove.brush touchend.brush touchcancel.brush", null);
4577         } else {
4578           yesdrag(event.view, moving);
4579           view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
4580         }
4581         group.attr("pointer-events", "all");
4582         overlay.attr("cursor", cursors.overlay);
4583         if (state.selection) selection$$1 = state.selection; // May be set by brush.move (on start)!
4584         if (empty$1(selection$$1)) state.selection = null, redraw.call(that);
4585         emit.end();
4586       }
4587
4588       function keydowned() {
4589         switch (event.keyCode) {
4590           case 16: { // SHIFT
4591             shifting = signX && signY;
4592             break;
4593           }
4594           case 18: { // ALT
4595             if (mode === MODE_HANDLE) {
4596               if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4597               if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4598               mode = MODE_CENTER;
4599               move();
4600             }
4601             break;
4602           }
4603           case 32: { // SPACE; takes priority over ALT
4604             if (mode === MODE_HANDLE || mode === MODE_CENTER) {
4605               if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;
4606               if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;
4607               mode = MODE_SPACE;
4608               overlay.attr("cursor", cursors.selection);
4609               move();
4610             }
4611             break;
4612           }
4613           default: return;
4614         }
4615         noevent$1();
4616       }
4617
4618       function keyupped() {
4619         switch (event.keyCode) {
4620           case 16: { // SHIFT
4621             if (shifting) {
4622               lockX = lockY = shifting = false;
4623               move();
4624             }
4625             break;
4626           }
4627           case 18: { // ALT
4628             if (mode === MODE_CENTER) {
4629               if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4630               if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4631               mode = MODE_HANDLE;
4632               move();
4633             }
4634             break;
4635           }
4636           case 32: { // SPACE
4637             if (mode === MODE_SPACE) {
4638               if (event.altKey) {
4639                 if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4640                 if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4641                 mode = MODE_CENTER;
4642               } else {
4643                 if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4644                 if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4645                 mode = MODE_HANDLE;
4646               }
4647               overlay.attr("cursor", cursors[type]);
4648               move();
4649             }
4650             break;
4651           }
4652           default: return;
4653         }
4654         noevent$1();
4655       }
4656     }
4657
4658     function initialize() {
4659       var state = this.__brush || {selection: null};
4660       state.extent = extent.apply(this, arguments);
4661       state.dim = dim;
4662       return state;
4663     }
4664
4665     brush.extent = function(_) {
4666       return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;
4667     };
4668
4669     brush.filter = function(_) {
4670       return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter;
4671     };
4672
4673     brush.handleSize = function(_) {
4674       return arguments.length ? (handleSize = +_, brush) : handleSize;
4675     };
4676
4677     brush.on = function() {
4678       var value = listeners.on.apply(listeners, arguments);
4679       return value === listeners ? brush : value;
4680     };
4681
4682     return brush;
4683   }
4684
4685   var cos = Math.cos;
4686   var sin = Math.sin;
4687   var pi$1 = Math.PI;
4688   var halfPi$1 = pi$1 / 2;
4689   var tau$1 = pi$1 * 2;
4690   var max$1 = Math.max;
4691
4692   function compareValue(compare) {
4693     return function(a, b) {
4694       return compare(
4695         a.source.value + a.target.value,
4696         b.source.value + b.target.value
4697       );
4698     };
4699   }
4700
4701   function chord() {
4702     var padAngle = 0,
4703         sortGroups = null,
4704         sortSubgroups = null,
4705         sortChords = null;
4706
4707     function chord(matrix) {
4708       var n = matrix.length,
4709           groupSums = [],
4710           groupIndex = range(n),
4711           subgroupIndex = [],
4712           chords = [],
4713           groups = chords.groups = new Array(n),
4714           subgroups = new Array(n * n),
4715           k,
4716           x,
4717           x0,
4718           dx,
4719           i,
4720           j;
4721
4722       // Compute the sum.
4723       k = 0, i = -1; while (++i < n) {
4724         x = 0, j = -1; while (++j < n) {
4725           x += matrix[i][j];
4726         }
4727         groupSums.push(x);
4728         subgroupIndex.push(range(n));
4729         k += x;
4730       }
4731
4732       // Sort groups…
4733       if (sortGroups) groupIndex.sort(function(a, b) {
4734         return sortGroups(groupSums[a], groupSums[b]);
4735       });
4736
4737       // Sort subgroups…
4738       if (sortSubgroups) subgroupIndex.forEach(function(d, i) {
4739         d.sort(function(a, b) {
4740           return sortSubgroups(matrix[i][a], matrix[i][b]);
4741         });
4742       });
4743
4744       // Convert the sum to scaling factor for [0, 2pi].
4745       // TODO Allow start and end angle to be specified?
4746       // TODO Allow padding to be specified as percentage?
4747       k = max$1(0, tau$1 - padAngle * n) / k;
4748       dx = k ? padAngle : tau$1 / n;
4749
4750       // Compute the start and end angle for each group and subgroup.
4751       // Note: Opera has a bug reordering object literal properties!
4752       x = 0, i = -1; while (++i < n) {
4753         x0 = x, j = -1; while (++j < n) {
4754           var di = groupIndex[i],
4755               dj = subgroupIndex[di][j],
4756               v = matrix[di][dj],
4757               a0 = x,
4758               a1 = x += v * k;
4759           subgroups[dj * n + di] = {
4760             index: di,
4761             subindex: dj,
4762             startAngle: a0,
4763             endAngle: a1,
4764             value: v
4765           };
4766         }
4767         groups[di] = {
4768           index: di,
4769           startAngle: x0,
4770           endAngle: x,
4771           value: groupSums[di]
4772         };
4773         x += dx;
4774       }
4775
4776       // Generate chords for each (non-empty) subgroup-subgroup link.
4777       i = -1; while (++i < n) {
4778         j = i - 1; while (++j < n) {
4779           var source = subgroups[j * n + i],
4780               target = subgroups[i * n + j];
4781           if (source.value || target.value) {
4782             chords.push(source.value < target.value
4783                 ? {source: target, target: source}
4784                 : {source: source, target: target});
4785           }
4786         }
4787       }
4788
4789       return sortChords ? chords.sort(sortChords) : chords;
4790     }
4791
4792     chord.padAngle = function(_) {
4793       return arguments.length ? (padAngle = max$1(0, _), chord) : padAngle;
4794     };
4795
4796     chord.sortGroups = function(_) {
4797       return arguments.length ? (sortGroups = _, chord) : sortGroups;
4798     };
4799
4800     chord.sortSubgroups = function(_) {
4801       return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;
4802     };
4803
4804     chord.sortChords = function(_) {
4805       return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;
4806     };
4807
4808     return chord;
4809   }
4810
4811   var slice$2 = Array.prototype.slice;
4812
4813   function constant$5(x) {
4814     return function() {
4815       return x;
4816     };
4817   }
4818
4819   var pi$2 = Math.PI,
4820       tau$2 = 2 * pi$2,
4821       epsilon$1 = 1e-6,
4822       tauEpsilon = tau$2 - epsilon$1;
4823
4824   function Path() {
4825     this._x0 = this._y0 = // start of current subpath
4826     this._x1 = this._y1 = null; // end of current subpath
4827     this._ = "";
4828   }
4829
4830   function path() {
4831     return new Path;
4832   }
4833
4834   Path.prototype = path.prototype = {
4835     constructor: Path,
4836     moveTo: function(x, y) {
4837       this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
4838     },
4839     closePath: function() {
4840       if (this._x1 !== null) {
4841         this._x1 = this._x0, this._y1 = this._y0;
4842         this._ += "Z";
4843       }
4844     },
4845     lineTo: function(x, y) {
4846       this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
4847     },
4848     quadraticCurveTo: function(x1, y1, x, y) {
4849       this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4850     },
4851     bezierCurveTo: function(x1, y1, x2, y2, x, y) {
4852       this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4853     },
4854     arcTo: function(x1, y1, x2, y2, r) {
4855       x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
4856       var x0 = this._x1,
4857           y0 = this._y1,
4858           x21 = x2 - x1,
4859           y21 = y2 - y1,
4860           x01 = x0 - x1,
4861           y01 = y0 - y1,
4862           l01_2 = x01 * x01 + y01 * y01;
4863
4864       // Is the radius negative? Error.
4865       if (r < 0) throw new Error("negative radius: " + r);
4866
4867       // Is this path empty? Move to (x1,y1).
4868       if (this._x1 === null) {
4869         this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
4870       }
4871
4872       // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
4873       else if (!(l01_2 > epsilon$1)) ;
4874
4875       // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?
4876       // Equivalently, is (x1,y1) coincident with (x2,y2)?
4877       // Or, is the radius zero? Line to (x1,y1).
4878       else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) {
4879         this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
4880       }
4881
4882       // Otherwise, draw an arc!
4883       else {
4884         var x20 = x2 - x0,
4885             y20 = y2 - y0,
4886             l21_2 = x21 * x21 + y21 * y21,
4887             l20_2 = x20 * x20 + y20 * y20,
4888             l21 = Math.sqrt(l21_2),
4889             l01 = Math.sqrt(l01_2),
4890             l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),
4891             t01 = l / l01,
4892             t21 = l / l21;
4893
4894         // If the start tangent is not coincident with (x0,y0), line to.
4895         if (Math.abs(t01 - 1) > epsilon$1) {
4896           this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
4897         }
4898
4899         this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
4900       }
4901     },
4902     arc: function(x, y, r, a0, a1, ccw) {
4903       x = +x, y = +y, r = +r;
4904       var dx = r * Math.cos(a0),
4905           dy = r * Math.sin(a0),
4906           x0 = x + dx,
4907           y0 = y + dy,
4908           cw = 1 ^ ccw,
4909           da = ccw ? a0 - a1 : a1 - a0;
4910
4911       // Is the radius negative? Error.
4912       if (r < 0) throw new Error("negative radius: " + r);
4913
4914       // Is this path empty? Move to (x0,y0).
4915       if (this._x1 === null) {
4916         this._ += "M" + x0 + "," + y0;
4917       }
4918
4919       // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
4920       else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) {
4921         this._ += "L" + x0 + "," + y0;
4922       }
4923
4924       // Is this arc empty? We’re done.
4925       if (!r) return;
4926
4927       // Does the angle go the wrong way? Flip the direction.
4928       if (da < 0) da = da % tau$2 + tau$2;
4929
4930       // Is this a complete circle? Draw two arcs to complete the circle.
4931       if (da > tauEpsilon) {
4932         this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
4933       }
4934
4935       // Is this arc non-empty? Draw an arc!
4936       else if (da > epsilon$1) {
4937         this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
4938       }
4939     },
4940     rect: function(x, y, w, h) {
4941       this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z";
4942     },
4943     toString: function() {
4944       return this._;
4945     }
4946   };
4947
4948   function defaultSource(d) {
4949     return d.source;
4950   }
4951
4952   function defaultTarget(d) {
4953     return d.target;
4954   }
4955
4956   function defaultRadius(d) {
4957     return d.radius;
4958   }
4959
4960   function defaultStartAngle(d) {
4961     return d.startAngle;
4962   }
4963
4964   function defaultEndAngle(d) {
4965     return d.endAngle;
4966   }
4967
4968   function ribbon() {
4969     var source = defaultSource,
4970         target = defaultTarget,
4971         radius = defaultRadius,
4972         startAngle = defaultStartAngle,
4973         endAngle = defaultEndAngle,
4974         context = null;
4975
4976     function ribbon() {
4977       var buffer,
4978           argv = slice$2.call(arguments),
4979           s = source.apply(this, argv),
4980           t = target.apply(this, argv),
4981           sr = +radius.apply(this, (argv[0] = s, argv)),
4982           sa0 = startAngle.apply(this, argv) - halfPi$1,
4983           sa1 = endAngle.apply(this, argv) - halfPi$1,
4984           sx0 = sr * cos(sa0),
4985           sy0 = sr * sin(sa0),
4986           tr = +radius.apply(this, (argv[0] = t, argv)),
4987           ta0 = startAngle.apply(this, argv) - halfPi$1,
4988           ta1 = endAngle.apply(this, argv) - halfPi$1;
4989
4990       if (!context) context = buffer = path();
4991
4992       context.moveTo(sx0, sy0);
4993       context.arc(0, 0, sr, sa0, sa1);
4994       if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?
4995         context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));
4996         context.arc(0, 0, tr, ta0, ta1);
4997       }
4998       context.quadraticCurveTo(0, 0, sx0, sy0);
4999       context.closePath();
5000
5001       if (buffer) return context = null, buffer + "" || null;
5002     }
5003
5004     ribbon.radius = function(_) {
5005       return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius;
5006     };
5007
5008     ribbon.startAngle = function(_) {
5009       return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle;
5010     };
5011
5012     ribbon.endAngle = function(_) {
5013       return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle;
5014     };
5015
5016     ribbon.source = function(_) {
5017       return arguments.length ? (source = _, ribbon) : source;
5018     };
5019
5020     ribbon.target = function(_) {
5021       return arguments.length ? (target = _, ribbon) : target;
5022     };
5023
5024     ribbon.context = function(_) {
5025       return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;
5026     };
5027
5028     return ribbon;
5029   }
5030
5031   var prefix = "$";
5032
5033   function Map() {}
5034
5035   Map.prototype = map$1.prototype = {
5036     constructor: Map,
5037     has: function(key) {
5038       return (prefix + key) in this;
5039     },
5040     get: function(key) {
5041       return this[prefix + key];
5042     },
5043     set: function(key, value) {
5044       this[prefix + key] = value;
5045       return this;
5046     },
5047     remove: function(key) {
5048       var property = prefix + key;
5049       return property in this && delete this[property];
5050     },
5051     clear: function() {
5052       for (var property in this) if (property[0] === prefix) delete this[property];
5053     },
5054     keys: function() {
5055       var keys = [];
5056       for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
5057       return keys;
5058     },
5059     values: function() {
5060       var values = [];
5061       for (var property in this) if (property[0] === prefix) values.push(this[property]);
5062       return values;
5063     },
5064     entries: function() {
5065       var entries = [];
5066       for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
5067       return entries;
5068     },
5069     size: function() {
5070       var size = 0;
5071       for (var property in this) if (property[0] === prefix) ++size;
5072       return size;
5073     },
5074     empty: function() {
5075       for (var property in this) if (property[0] === prefix) return false;
5076       return true;
5077     },
5078     each: function(f) {
5079       for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
5080     }
5081   };
5082
5083   function map$1(object, f) {
5084     var map = new Map;
5085
5086     // Copy constructor.
5087     if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });
5088
5089     // Index array by numeric index or specified key function.
5090     else if (Array.isArray(object)) {
5091       var i = -1,
5092           n = object.length,
5093           o;
5094
5095       if (f == null) while (++i < n) map.set(i, object[i]);
5096       else while (++i < n) map.set(f(o = object[i], i, object), o);
5097     }
5098
5099     // Convert object to map.
5100     else if (object) for (var key in object) map.set(key, object[key]);
5101
5102     return map;
5103   }
5104
5105   function nest() {
5106     var keys = [],
5107         sortKeys = [],
5108         sortValues,
5109         rollup,
5110         nest;
5111
5112     function apply(array, depth, createResult, setResult) {
5113       if (depth >= keys.length) {
5114         if (sortValues != null) array.sort(sortValues);
5115         return rollup != null ? rollup(array) : array;
5116       }
5117
5118       var i = -1,
5119           n = array.length,
5120           key = keys[depth++],
5121           keyValue,
5122           value,
5123           valuesByKey = map$1(),
5124           values,
5125           result = createResult();
5126
5127       while (++i < n) {
5128         if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
5129           values.push(value);
5130         } else {
5131           valuesByKey.set(keyValue, [value]);
5132         }
5133       }
5134
5135       valuesByKey.each(function(values, key) {
5136         setResult(result, key, apply(values, depth, createResult, setResult));
5137       });
5138
5139       return result;
5140     }
5141
5142     function entries(map, depth) {
5143       if (++depth > keys.length) return map;
5144       var array, sortKey = sortKeys[depth - 1];
5145       if (rollup != null && depth >= keys.length) array = map.entries();
5146       else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });
5147       return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;
5148     }
5149
5150     return nest = {
5151       object: function(array) { return apply(array, 0, createObject, setObject); },
5152       map: function(array) { return apply(array, 0, createMap, setMap); },
5153       entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },
5154       key: function(d) { keys.push(d); return nest; },
5155       sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },
5156       sortValues: function(order) { sortValues = order; return nest; },
5157       rollup: function(f) { rollup = f; return nest; }
5158     };
5159   }
5160
5161   function createObject() {
5162     return {};
5163   }
5164
5165   function setObject(object, key, value) {
5166     object[key] = value;
5167   }
5168
5169   function createMap() {
5170     return map$1();
5171   }
5172
5173   function setMap(map, key, value) {
5174     map.set(key, value);
5175   }
5176
5177   function Set() {}
5178
5179   var proto = map$1.prototype;
5180
5181   Set.prototype = set$2.prototype = {
5182     constructor: Set,
5183     has: proto.has,
5184     add: function(value) {
5185       value += "";
5186       this[prefix + value] = value;
5187       return this;
5188     },
5189     remove: proto.remove,
5190     clear: proto.clear,
5191     values: proto.keys,
5192     size: proto.size,
5193     empty: proto.empty,
5194     each: proto.each
5195   };
5196
5197   function set$2(object, f) {
5198     var set = new Set;
5199
5200     // Copy constructor.
5201     if (object instanceof Set) object.each(function(value) { set.add(value); });
5202
5203     // Otherwise, assume it’s an array.
5204     else if (object) {
5205       var i = -1, n = object.length;
5206       if (f == null) while (++i < n) set.add(object[i]);
5207       else while (++i < n) set.add(f(object[i], i, object));
5208     }
5209
5210     return set;
5211   }
5212
5213   function keys(map) {
5214     var keys = [];
5215     for (var key in map) keys.push(key);
5216     return keys;
5217   }
5218
5219   function values(map) {
5220     var values = [];
5221     for (var key in map) values.push(map[key]);
5222     return values;
5223   }
5224
5225   function entries(map) {
5226     var entries = [];
5227     for (var key in map) entries.push({key: key, value: map[key]});
5228     return entries;
5229   }
5230
5231   var EOL = {},
5232       EOF = {},
5233       QUOTE = 34,
5234       NEWLINE = 10,
5235       RETURN = 13;
5236
5237   function objectConverter(columns) {
5238     return new Function("d", "return {" + columns.map(function(name, i) {
5239       return JSON.stringify(name) + ": d[" + i + "]";
5240     }).join(",") + "}");
5241   }
5242
5243   function customConverter(columns, f) {
5244     var object = objectConverter(columns);
5245     return function(row, i) {
5246       return f(object(row), i, columns);
5247     };
5248   }
5249
5250   // Compute unique columns in order of discovery.
5251   function inferColumns(rows) {
5252     var columnSet = Object.create(null),
5253         columns = [];
5254
5255     rows.forEach(function(row) {
5256       for (var column in row) {
5257         if (!(column in columnSet)) {
5258           columns.push(columnSet[column] = column);
5259         }
5260       }
5261     });
5262
5263     return columns;
5264   }
5265
5266   function dsv(delimiter) {
5267     var reFormat = new RegExp("[\"" + delimiter + "\n\r]"),
5268         DELIMITER = delimiter.charCodeAt(0);
5269
5270     function parse(text, f) {
5271       var convert, columns, rows = parseRows(text, function(row, i) {
5272         if (convert) return convert(row, i - 1);
5273         columns = row, convert = f ? customConverter(row, f) : objectConverter(row);
5274       });
5275       rows.columns = columns || [];
5276       return rows;
5277     }
5278
5279     function parseRows(text, f) {
5280       var rows = [], // output rows
5281           N = text.length,
5282           I = 0, // current character index
5283           n = 0, // current line number
5284           t, // current token
5285           eof = N <= 0, // current token followed by EOF?
5286           eol = false; // current token followed by EOL?
5287
5288       // Strip the trailing newline.
5289       if (text.charCodeAt(N - 1) === NEWLINE) --N;
5290       if (text.charCodeAt(N - 1) === RETURN) --N;
5291
5292       function token() {
5293         if (eof) return EOF;
5294         if (eol) return eol = false, EOL;
5295
5296         // Unescape quotes.
5297         var i, j = I, c;
5298         if (text.charCodeAt(j) === QUOTE) {
5299           while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);
5300           if ((i = I) >= N) eof = true;
5301           else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;
5302           else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
5303           return text.slice(j + 1, i - 1).replace(/""/g, "\"");
5304         }
5305
5306         // Find next delimiter or newline.
5307         while (I < N) {
5308           if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;
5309           else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
5310           else if (c !== DELIMITER) continue;
5311           return text.slice(j, i);
5312         }
5313
5314         // Return last token before EOF.
5315         return eof = true, text.slice(j, N);
5316       }
5317
5318       while ((t = token()) !== EOF) {
5319         var row = [];
5320         while (t !== EOL && t !== EOF) row.push(t), t = token();
5321         if (f && (row = f(row, n++)) == null) continue;
5322         rows.push(row);
5323       }
5324
5325       return rows;
5326     }
5327
5328     function format(rows, columns) {
5329       if (columns == null) columns = inferColumns(rows);
5330       return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) {
5331         return columns.map(function(column) {
5332           return formatValue(row[column]);
5333         }).join(delimiter);
5334       })).join("\n");
5335     }
5336
5337     function formatRows(rows) {
5338       return rows.map(formatRow).join("\n");
5339     }
5340
5341     function formatRow(row) {
5342       return row.map(formatValue).join(delimiter);
5343     }
5344
5345     function formatValue(text) {
5346       return text == null ? ""
5347           : reFormat.test(text += "") ? "\"" + text.replace(/"/g, "\"\"") + "\""
5348           : text;
5349     }
5350
5351     return {
5352       parse: parse,
5353       parseRows: parseRows,
5354       format: format,
5355       formatRows: formatRows
5356     };
5357   }
5358
5359   var csv = dsv(",");
5360
5361   var csvParse = csv.parse;
5362   var csvParseRows = csv.parseRows;
5363   var csvFormat = csv.format;
5364   var csvFormatRows = csv.formatRows;
5365
5366   var tsv = dsv("\t");
5367
5368   var tsvParse = tsv.parse;
5369   var tsvParseRows = tsv.parseRows;
5370   var tsvFormat = tsv.format;
5371   var tsvFormatRows = tsv.formatRows;
5372
5373   function center$1(x, y) {
5374     var nodes;
5375
5376     if (x == null) x = 0;
5377     if (y == null) y = 0;
5378
5379     function force() {
5380       var i,
5381           n = nodes.length,
5382           node,
5383           sx = 0,
5384           sy = 0;
5385
5386       for (i = 0; i < n; ++i) {
5387         node = nodes[i], sx += node.x, sy += node.y;
5388       }
5389
5390       for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
5391         node = nodes[i], node.x -= sx, node.y -= sy;
5392       }
5393     }
5394
5395     force.initialize = function(_) {
5396       nodes = _;
5397     };
5398
5399     force.x = function(_) {
5400       return arguments.length ? (x = +_, force) : x;
5401     };
5402
5403     force.y = function(_) {
5404       return arguments.length ? (y = +_, force) : y;
5405     };
5406
5407     return force;
5408   }
5409
5410   function constant$6(x) {
5411     return function() {
5412       return x;
5413     };
5414   }
5415
5416   function jiggle() {
5417     return (Math.random() - 0.5) * 1e-6;
5418   }
5419
5420   function tree_add(d) {
5421     var x = +this._x.call(null, d),
5422         y = +this._y.call(null, d);
5423     return add(this.cover(x, y), x, y, d);
5424   }
5425
5426   function add(tree, x, y, d) {
5427     if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
5428
5429     var parent,
5430         node = tree._root,
5431         leaf = {data: d},
5432         x0 = tree._x0,
5433         y0 = tree._y0,
5434         x1 = tree._x1,
5435         y1 = tree._y1,
5436         xm,
5437         ym,
5438         xp,
5439         yp,
5440         right,
5441         bottom,
5442         i,
5443         j;
5444
5445     // If the tree is empty, initialize the root as a leaf.
5446     if (!node) return tree._root = leaf, tree;
5447
5448     // Find the existing leaf for the new point, or add it.
5449     while (node.length) {
5450       if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5451       if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5452       if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
5453     }
5454
5455     // Is the new point is exactly coincident with the existing point?
5456     xp = +tree._x.call(null, node.data);
5457     yp = +tree._y.call(null, node.data);
5458     if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
5459
5460     // Otherwise, split the leaf node until the old and new point are separated.
5461     do {
5462       parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
5463       if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5464       if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5465     } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
5466     return parent[j] = node, parent[i] = leaf, tree;
5467   }
5468
5469   function addAll(data) {
5470     var d, i, n = data.length,
5471         x,
5472         y,
5473         xz = new Array(n),
5474         yz = new Array(n),
5475         x0 = Infinity,
5476         y0 = Infinity,
5477         x1 = -Infinity,
5478         y1 = -Infinity;
5479
5480     // Compute the points and their extent.
5481     for (i = 0; i < n; ++i) {
5482       if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
5483       xz[i] = x;
5484       yz[i] = y;
5485       if (x < x0) x0 = x;
5486       if (x > x1) x1 = x;
5487       if (y < y0) y0 = y;
5488       if (y > y1) y1 = y;
5489     }
5490
5491     // If there were no (valid) points, inherit the existing extent.
5492     if (x1 < x0) x0 = this._x0, x1 = this._x1;
5493     if (y1 < y0) y0 = this._y0, y1 = this._y1;
5494
5495     // Expand the tree to cover the new points.
5496     this.cover(x0, y0).cover(x1, y1);
5497
5498     // Add the new points.
5499     for (i = 0; i < n; ++i) {
5500       add(this, xz[i], yz[i], data[i]);
5501     }
5502
5503     return this;
5504   }
5505
5506   function tree_cover(x, y) {
5507     if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
5508
5509     var x0 = this._x0,
5510         y0 = this._y0,
5511         x1 = this._x1,
5512         y1 = this._y1;
5513
5514     // If the quadtree has no extent, initialize them.
5515     // Integer extent are necessary so that if we later double the extent,
5516     // the existing quadrant boundaries don’t change due to floating point error!
5517     if (isNaN(x0)) {
5518       x1 = (x0 = Math.floor(x)) + 1;
5519       y1 = (y0 = Math.floor(y)) + 1;
5520     }
5521
5522     // Otherwise, double repeatedly to cover.
5523     else if (x0 > x || x > x1 || y0 > y || y > y1) {
5524       var z = x1 - x0,
5525           node = this._root,
5526           parent,
5527           i;
5528
5529       switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) {
5530         case 0: {
5531           do parent = new Array(4), parent[i] = node, node = parent;
5532           while (z *= 2, x1 = x0 + z, y1 = y0 + z, x > x1 || y > y1);
5533           break;
5534         }
5535         case 1: {
5536           do parent = new Array(4), parent[i] = node, node = parent;
5537           while (z *= 2, x0 = x1 - z, y1 = y0 + z, x0 > x || y > y1);
5538           break;
5539         }
5540         case 2: {
5541           do parent = new Array(4), parent[i] = node, node = parent;
5542           while (z *= 2, x1 = x0 + z, y0 = y1 - z, x > x1 || y0 > y);
5543           break;
5544         }
5545         case 3: {
5546           do parent = new Array(4), parent[i] = node, node = parent;
5547           while (z *= 2, x0 = x1 - z, y0 = y1 - z, x0 > x || y0 > y);
5548           break;
5549         }
5550       }
5551
5552       if (this._root && this._root.length) this._root = node;
5553     }
5554
5555     // If the quadtree covers the point already, just return.
5556     else return this;
5557
5558     this._x0 = x0;
5559     this._y0 = y0;
5560     this._x1 = x1;
5561     this._y1 = y1;
5562     return this;
5563   }
5564
5565   function tree_data() {
5566     var data = [];
5567     this.visit(function(node) {
5568       if (!node.length) do data.push(node.data); while (node = node.next)
5569     });
5570     return data;
5571   }
5572
5573   function tree_extent(_) {
5574     return arguments.length
5575         ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
5576         : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
5577   }
5578
5579   function Quad(node, x0, y0, x1, y1) {
5580     this.node = node;
5581     this.x0 = x0;
5582     this.y0 = y0;
5583     this.x1 = x1;
5584     this.y1 = y1;
5585   }
5586
5587   function tree_find(x, y, radius) {
5588     var data,
5589         x0 = this._x0,
5590         y0 = this._y0,
5591         x1,
5592         y1,
5593         x2,
5594         y2,
5595         x3 = this._x1,
5596         y3 = this._y1,
5597         quads = [],
5598         node = this._root,
5599         q,
5600         i;
5601
5602     if (node) quads.push(new Quad(node, x0, y0, x3, y3));
5603     if (radius == null) radius = Infinity;
5604     else {
5605       x0 = x - radius, y0 = y - radius;
5606       x3 = x + radius, y3 = y + radius;
5607       radius *= radius;
5608     }
5609
5610     while (q = quads.pop()) {
5611
5612       // Stop searching if this quadrant can’t contain a closer node.
5613       if (!(node = q.node)
5614           || (x1 = q.x0) > x3
5615           || (y1 = q.y0) > y3
5616           || (x2 = q.x1) < x0
5617           || (y2 = q.y1) < y0) continue;
5618
5619       // Bisect the current quadrant.
5620       if (node.length) {
5621         var xm = (x1 + x2) / 2,
5622             ym = (y1 + y2) / 2;
5623
5624         quads.push(
5625           new Quad(node[3], xm, ym, x2, y2),
5626           new Quad(node[2], x1, ym, xm, y2),
5627           new Quad(node[1], xm, y1, x2, ym),
5628           new Quad(node[0], x1, y1, xm, ym)
5629         );
5630
5631         // Visit the closest quadrant first.
5632         if (i = (y >= ym) << 1 | (x >= xm)) {
5633           q = quads[quads.length - 1];
5634           quads[quads.length - 1] = quads[quads.length - 1 - i];
5635           quads[quads.length - 1 - i] = q;
5636         }
5637       }
5638
5639       // Visit this point. (Visiting coincident points isn’t necessary!)
5640       else {
5641         var dx = x - +this._x.call(null, node.data),
5642             dy = y - +this._y.call(null, node.data),
5643             d2 = dx * dx + dy * dy;
5644         if (d2 < radius) {
5645           var d = Math.sqrt(radius = d2);
5646           x0 = x - d, y0 = y - d;
5647           x3 = x + d, y3 = y + d;
5648           data = node.data;
5649         }
5650       }
5651     }
5652
5653     return data;
5654   }
5655
5656   function tree_remove(d) {
5657     if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
5658
5659     var parent,
5660         node = this._root,
5661         retainer,
5662         previous,
5663         next,
5664         x0 = this._x0,
5665         y0 = this._y0,
5666         x1 = this._x1,
5667         y1 = this._y1,
5668         x,
5669         y,
5670         xm,
5671         ym,
5672         right,
5673         bottom,
5674         i,
5675         j;
5676
5677     // If the tree is empty, initialize the root as a leaf.
5678     if (!node) return this;
5679
5680     // Find the leaf node for the point.
5681     // While descending, also retain the deepest parent with a non-removed sibling.
5682     if (node.length) while (true) {
5683       if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5684       if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5685       if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
5686       if (!node.length) break;
5687       if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
5688     }
5689
5690     // Find the point to remove.
5691     while (node.data !== d) if (!(previous = node, node = node.next)) return this;
5692     if (next = node.next) delete node.next;
5693
5694     // If there are multiple coincident points, remove just the point.
5695     if (previous) return (next ? previous.next = next : delete previous.next), this;
5696
5697     // If this is the root point, remove it.
5698     if (!parent) return this._root = next, this;
5699
5700     // Remove this leaf.
5701     next ? parent[i] = next : delete parent[i];
5702
5703     // If the parent now contains exactly one leaf, collapse superfluous parents.
5704     if ((node = parent[0] || parent[1] || parent[2] || parent[3])
5705         && node === (parent[3] || parent[2] || parent[1] || parent[0])
5706         && !node.length) {
5707       if (retainer) retainer[j] = node;
5708       else this._root = node;
5709     }
5710
5711     return this;
5712   }
5713
5714   function removeAll(data) {
5715     for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
5716     return this;
5717   }
5718
5719   function tree_root() {
5720     return this._root;
5721   }
5722
5723   function tree_size() {
5724     var size = 0;
5725     this.visit(function(node) {
5726       if (!node.length) do ++size; while (node = node.next)
5727     });
5728     return size;
5729   }
5730
5731   function tree_visit(callback) {
5732     var quads = [], q, node = this._root, child, x0, y0, x1, y1;
5733     if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
5734     while (q = quads.pop()) {
5735       if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
5736         var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
5737         if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
5738         if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
5739         if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
5740         if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
5741       }
5742     }
5743     return this;
5744   }
5745
5746   function tree_visitAfter(callback) {
5747     var quads = [], next = [], q;
5748     if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
5749     while (q = quads.pop()) {
5750       var node = q.node;
5751       if (node.length) {
5752         var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
5753         if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
5754         if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
5755         if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
5756         if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
5757       }
5758       next.push(q);
5759     }
5760     while (q = next.pop()) {
5761       callback(q.node, q.x0, q.y0, q.x1, q.y1);
5762     }
5763     return this;
5764   }
5765
5766   function defaultX(d) {
5767     return d[0];
5768   }
5769
5770   function tree_x(_) {
5771     return arguments.length ? (this._x = _, this) : this._x;
5772   }
5773
5774   function defaultY(d) {
5775     return d[1];
5776   }
5777
5778   function tree_y(_) {
5779     return arguments.length ? (this._y = _, this) : this._y;
5780   }
5781
5782   function quadtree(nodes, x, y) {
5783     var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);
5784     return nodes == null ? tree : tree.addAll(nodes);
5785   }
5786
5787   function Quadtree(x, y, x0, y0, x1, y1) {
5788     this._x = x;
5789     this._y = y;
5790     this._x0 = x0;
5791     this._y0 = y0;
5792     this._x1 = x1;
5793     this._y1 = y1;
5794     this._root = undefined;
5795   }
5796
5797   function leaf_copy(leaf) {
5798     var copy = {data: leaf.data}, next = copy;
5799     while (leaf = leaf.next) next = next.next = {data: leaf.data};
5800     return copy;
5801   }
5802
5803   var treeProto = quadtree.prototype = Quadtree.prototype;
5804
5805   treeProto.copy = function() {
5806     var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
5807         node = this._root,
5808         nodes,
5809         child;
5810
5811     if (!node) return copy;
5812
5813     if (!node.length) return copy._root = leaf_copy(node), copy;
5814
5815     nodes = [{source: node, target: copy._root = new Array(4)}];
5816     while (node = nodes.pop()) {
5817       for (var i = 0; i < 4; ++i) {
5818         if (child = node.source[i]) {
5819           if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
5820           else node.target[i] = leaf_copy(child);
5821         }
5822       }
5823     }
5824
5825     return copy;
5826   };
5827
5828   treeProto.add = tree_add;
5829   treeProto.addAll = addAll;
5830   treeProto.cover = tree_cover;
5831   treeProto.data = tree_data;
5832   treeProto.extent = tree_extent;
5833   treeProto.find = tree_find;
5834   treeProto.remove = tree_remove;
5835   treeProto.removeAll = removeAll;
5836   treeProto.root = tree_root;
5837   treeProto.size = tree_size;
5838   treeProto.visit = tree_visit;
5839   treeProto.visitAfter = tree_visitAfter;
5840   treeProto.x = tree_x;
5841   treeProto.y = tree_y;
5842
5843   function x(d) {
5844     return d.x + d.vx;
5845   }
5846
5847   function y(d) {
5848     return d.y + d.vy;
5849   }
5850
5851   function collide(radius) {
5852     var nodes,
5853         radii,
5854         strength = 1,
5855         iterations = 1;
5856
5857     if (typeof radius !== "function") radius = constant$6(radius == null ? 1 : +radius);
5858
5859     function force() {
5860       var i, n = nodes.length,
5861           tree,
5862           node,
5863           xi,
5864           yi,
5865           ri,
5866           ri2;
5867
5868       for (var k = 0; k < iterations; ++k) {
5869         tree = quadtree(nodes, x, y).visitAfter(prepare);
5870         for (i = 0; i < n; ++i) {
5871           node = nodes[i];
5872           ri = radii[node.index], ri2 = ri * ri;
5873           xi = node.x + node.vx;
5874           yi = node.y + node.vy;
5875           tree.visit(apply);
5876         }
5877       }
5878
5879       function apply(quad, x0, y0, x1, y1) {
5880         var data = quad.data, rj = quad.r, r = ri + rj;
5881         if (data) {
5882           if (data.index > node.index) {
5883             var x = xi - data.x - data.vx,
5884                 y = yi - data.y - data.vy,
5885                 l = x * x + y * y;
5886             if (l < r * r) {
5887               if (x === 0) x = jiggle(), l += x * x;
5888               if (y === 0) y = jiggle(), l += y * y;
5889               l = (r - (l = Math.sqrt(l))) / l * strength;
5890               node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
5891               node.vy += (y *= l) * r;
5892               data.vx -= x * (r = 1 - r);
5893               data.vy -= y * r;
5894             }
5895           }
5896           return;
5897         }
5898         return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
5899       }
5900     }
5901
5902     function prepare(quad) {
5903       if (quad.data) return quad.r = radii[quad.data.index];
5904       for (var i = quad.r = 0; i < 4; ++i) {
5905         if (quad[i] && quad[i].r > quad.r) {
5906           quad.r = quad[i].r;
5907         }
5908       }
5909     }
5910
5911     function initialize() {
5912       if (!nodes) return;
5913       var i, n = nodes.length, node;
5914       radii = new Array(n);
5915       for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);
5916     }
5917
5918     force.initialize = function(_) {
5919       nodes = _;
5920       initialize();
5921     };
5922
5923     force.iterations = function(_) {
5924       return arguments.length ? (iterations = +_, force) : iterations;
5925     };
5926
5927     force.strength = function(_) {
5928       return arguments.length ? (strength = +_, force) : strength;
5929     };
5930
5931     force.radius = function(_) {
5932       return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
5933     };
5934
5935     return force;
5936   }
5937
5938   function index(d) {
5939     return d.index;
5940   }
5941
5942   function find(nodeById, nodeId) {
5943     var node = nodeById.get(nodeId);
5944     if (!node) throw new Error("missing: " + nodeId);
5945     return node;
5946   }
5947
5948   function link(links) {
5949     var id = index,
5950         strength = defaultStrength,
5951         strengths,
5952         distance = constant$6(30),
5953         distances,
5954         nodes,
5955         count,
5956         bias,
5957         iterations = 1;
5958
5959     if (links == null) links = [];
5960
5961     function defaultStrength(link) {
5962       return 1 / Math.min(count[link.source.index], count[link.target.index]);
5963     }
5964
5965     function force(alpha) {
5966       for (var k = 0, n = links.length; k < iterations; ++k) {
5967         for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
5968           link = links[i], source = link.source, target = link.target;
5969           x = target.x + target.vx - source.x - source.vx || jiggle();
5970           y = target.y + target.vy - source.y - source.vy || jiggle();
5971           l = Math.sqrt(x * x + y * y);
5972           l = (l - distances[i]) / l * alpha * strengths[i];
5973           x *= l, y *= l;
5974           target.vx -= x * (b = bias[i]);
5975           target.vy -= y * b;
5976           source.vx += x * (b = 1 - b);
5977           source.vy += y * b;
5978         }
5979       }
5980     }
5981
5982     function initialize() {
5983       if (!nodes) return;
5984
5985       var i,
5986           n = nodes.length,
5987           m = links.length,
5988           nodeById = map$1(nodes, id),
5989           link;
5990
5991       for (i = 0, count = new Array(n); i < m; ++i) {
5992         link = links[i], link.index = i;
5993         if (typeof link.source !== "object") link.source = find(nodeById, link.source);
5994         if (typeof link.target !== "object") link.target = find(nodeById, link.target);
5995         count[link.source.index] = (count[link.source.index] || 0) + 1;
5996         count[link.target.index] = (count[link.target.index] || 0) + 1;
5997       }
5998
5999       for (i = 0, bias = new Array(m); i < m; ++i) {
6000         link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
6001       }
6002
6003       strengths = new Array(m), initializeStrength();
6004       distances = new Array(m), initializeDistance();
6005     }
6006
6007     function initializeStrength() {
6008       if (!nodes) return;
6009
6010       for (var i = 0, n = links.length; i < n; ++i) {
6011         strengths[i] = +strength(links[i], i, links);
6012       }
6013     }
6014
6015     function initializeDistance() {
6016       if (!nodes) return;
6017
6018       for (var i = 0, n = links.length; i < n; ++i) {
6019         distances[i] = +distance(links[i], i, links);
6020       }
6021     }
6022
6023     force.initialize = function(_) {
6024       nodes = _;
6025       initialize();
6026     };
6027
6028     force.links = function(_) {
6029       return arguments.length ? (links = _, initialize(), force) : links;
6030     };
6031
6032     force.id = function(_) {
6033       return arguments.length ? (id = _, force) : id;
6034     };
6035
6036     force.iterations = function(_) {
6037       return arguments.length ? (iterations = +_, force) : iterations;
6038     };
6039
6040     force.strength = function(_) {
6041       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initializeStrength(), force) : strength;
6042     };
6043
6044     force.distance = function(_) {
6045       return arguments.length ? (distance = typeof _ === "function" ? _ : constant$6(+_), initializeDistance(), force) : distance;
6046     };
6047
6048     return force;
6049   }
6050
6051   function x$1(d) {
6052     return d.x;
6053   }
6054
6055   function y$1(d) {
6056     return d.y;
6057   }
6058
6059   var initialRadius = 10,
6060       initialAngle = Math.PI * (3 - Math.sqrt(5));
6061
6062   function simulation(nodes) {
6063     var simulation,
6064         alpha = 1,
6065         alphaMin = 0.001,
6066         alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
6067         alphaTarget = 0,
6068         velocityDecay = 0.6,
6069         forces = map$1(),
6070         stepper = timer(step),
6071         event = dispatch("tick", "end");
6072
6073     if (nodes == null) nodes = [];
6074
6075     function step() {
6076       tick();
6077       event.call("tick", simulation);
6078       if (alpha < alphaMin) {
6079         stepper.stop();
6080         event.call("end", simulation);
6081       }
6082     }
6083
6084     function tick() {
6085       var i, n = nodes.length, node;
6086
6087       alpha += (alphaTarget - alpha) * alphaDecay;
6088
6089       forces.each(function(force) {
6090         force(alpha);
6091       });
6092
6093       for (i = 0; i < n; ++i) {
6094         node = nodes[i];
6095         if (node.fx == null) node.x += node.vx *= velocityDecay;
6096         else node.x = node.fx, node.vx = 0;
6097         if (node.fy == null) node.y += node.vy *= velocityDecay;
6098         else node.y = node.fy, node.vy = 0;
6099       }
6100     }
6101
6102     function initializeNodes() {
6103       for (var i = 0, n = nodes.length, node; i < n; ++i) {
6104         node = nodes[i], node.index = i;
6105         if (isNaN(node.x) || isNaN(node.y)) {
6106           var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
6107           node.x = radius * Math.cos(angle);
6108           node.y = radius * Math.sin(angle);
6109         }
6110         if (isNaN(node.vx) || isNaN(node.vy)) {
6111           node.vx = node.vy = 0;
6112         }
6113       }
6114     }
6115
6116     function initializeForce(force) {
6117       if (force.initialize) force.initialize(nodes);
6118       return force;
6119     }
6120
6121     initializeNodes();
6122
6123     return simulation = {
6124       tick: tick,
6125
6126       restart: function() {
6127         return stepper.restart(step), simulation;
6128       },
6129
6130       stop: function() {
6131         return stepper.stop(), simulation;
6132       },
6133
6134       nodes: function(_) {
6135         return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
6136       },
6137
6138       alpha: function(_) {
6139         return arguments.length ? (alpha = +_, simulation) : alpha;
6140       },
6141
6142       alphaMin: function(_) {
6143         return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
6144       },
6145
6146       alphaDecay: function(_) {
6147         return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
6148       },
6149
6150       alphaTarget: function(_) {
6151         return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
6152       },
6153
6154       velocityDecay: function(_) {
6155         return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
6156       },
6157
6158       force: function(name, _) {
6159         return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
6160       },
6161
6162       find: function(x, y, radius) {
6163         var i = 0,
6164             n = nodes.length,
6165             dx,
6166             dy,
6167             d2,
6168             node,
6169             closest;
6170
6171         if (radius == null) radius = Infinity;
6172         else radius *= radius;
6173
6174         for (i = 0; i < n; ++i) {
6175           node = nodes[i];
6176           dx = x - node.x;
6177           dy = y - node.y;
6178           d2 = dx * dx + dy * dy;
6179           if (d2 < radius) closest = node, radius = d2;
6180         }
6181
6182         return closest;
6183       },
6184
6185       on: function(name, _) {
6186         return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
6187       }
6188     };
6189   }
6190
6191   function manyBody() {
6192     var nodes,
6193         node,
6194         alpha,
6195         strength = constant$6(-30),
6196         strengths,
6197         distanceMin2 = 1,
6198         distanceMax2 = Infinity,
6199         theta2 = 0.81;
6200
6201     function force(_) {
6202       var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate);
6203       for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
6204     }
6205
6206     function initialize() {
6207       if (!nodes) return;
6208       var i, n = nodes.length, node;
6209       strengths = new Array(n);
6210       for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);
6211     }
6212
6213     function accumulate(quad) {
6214       var strength = 0, q, c, weight = 0, x, y, i;
6215
6216       // For internal nodes, accumulate forces from child quadrants.
6217       if (quad.length) {
6218         for (x = y = i = 0; i < 4; ++i) {
6219           if ((q = quad[i]) && (c = Math.abs(q.value))) {
6220             strength += q.value, weight += c, x += c * q.x, y += c * q.y;
6221           }
6222         }
6223         quad.x = x / weight;
6224         quad.y = y / weight;
6225       }
6226
6227       // For leaf nodes, accumulate forces from coincident quadrants.
6228       else {
6229         q = quad;
6230         q.x = q.data.x;
6231         q.y = q.data.y;
6232         do strength += strengths[q.data.index];
6233         while (q = q.next);
6234       }
6235
6236       quad.value = strength;
6237     }
6238
6239     function apply(quad, x1, _, x2) {
6240       if (!quad.value) return true;
6241
6242       var x = quad.x - node.x,
6243           y = quad.y - node.y,
6244           w = x2 - x1,
6245           l = x * x + y * y;
6246
6247       // Apply the Barnes-Hut approximation if possible.
6248       // Limit forces for very close nodes; randomize direction if coincident.
6249       if (w * w / theta2 < l) {
6250         if (l < distanceMax2) {
6251           if (x === 0) x = jiggle(), l += x * x;
6252           if (y === 0) y = jiggle(), l += y * y;
6253           if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
6254           node.vx += x * quad.value * alpha / l;
6255           node.vy += y * quad.value * alpha / l;
6256         }
6257         return true;
6258       }
6259
6260       // Otherwise, process points directly.
6261       else if (quad.length || l >= distanceMax2) return;
6262
6263       // Limit forces for very close nodes; randomize direction if coincident.
6264       if (quad.data !== node || quad.next) {
6265         if (x === 0) x = jiggle(), l += x * x;
6266         if (y === 0) y = jiggle(), l += y * y;
6267         if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
6268       }
6269
6270       do if (quad.data !== node) {
6271         w = strengths[quad.data.index] * alpha / l;
6272         node.vx += x * w;
6273         node.vy += y * w;
6274       } while (quad = quad.next);
6275     }
6276
6277     force.initialize = function(_) {
6278       nodes = _;
6279       initialize();
6280     };
6281
6282     force.strength = function(_) {
6283       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6284     };
6285
6286     force.distanceMin = function(_) {
6287       return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
6288     };
6289
6290     force.distanceMax = function(_) {
6291       return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
6292     };
6293
6294     force.theta = function(_) {
6295       return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
6296     };
6297
6298     return force;
6299   }
6300
6301   function radial(radius, x, y) {
6302     var nodes,
6303         strength = constant$6(0.1),
6304         strengths,
6305         radiuses;
6306
6307     if (typeof radius !== "function") radius = constant$6(+radius);
6308     if (x == null) x = 0;
6309     if (y == null) y = 0;
6310
6311     function force(alpha) {
6312       for (var i = 0, n = nodes.length; i < n; ++i) {
6313         var node = nodes[i],
6314             dx = node.x - x || 1e-6,
6315             dy = node.y - y || 1e-6,
6316             r = Math.sqrt(dx * dx + dy * dy),
6317             k = (radiuses[i] - r) * strengths[i] * alpha / r;
6318         node.vx += dx * k;
6319         node.vy += dy * k;
6320       }
6321     }
6322
6323     function initialize() {
6324       if (!nodes) return;
6325       var i, n = nodes.length;
6326       strengths = new Array(n);
6327       radiuses = new Array(n);
6328       for (i = 0; i < n; ++i) {
6329         radiuses[i] = +radius(nodes[i], i, nodes);
6330         strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);
6331       }
6332     }
6333
6334     force.initialize = function(_) {
6335       nodes = _, initialize();
6336     };
6337
6338     force.strength = function(_) {
6339       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6340     };
6341
6342     force.radius = function(_) {
6343       return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
6344     };
6345
6346     force.x = function(_) {
6347       return arguments.length ? (x = +_, force) : x;
6348     };
6349
6350     force.y = function(_) {
6351       return arguments.length ? (y = +_, force) : y;
6352     };
6353
6354     return force;
6355   }
6356
6357   function x$2(x) {
6358     var strength = constant$6(0.1),
6359         nodes,
6360         strengths,
6361         xz;
6362
6363     if (typeof x !== "function") x = constant$6(x == null ? 0 : +x);
6364
6365     function force(alpha) {
6366       for (var i = 0, n = nodes.length, node; i < n; ++i) {
6367         node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
6368       }
6369     }
6370
6371     function initialize() {
6372       if (!nodes) return;
6373       var i, n = nodes.length;
6374       strengths = new Array(n);
6375       xz = new Array(n);
6376       for (i = 0; i < n; ++i) {
6377         strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
6378       }
6379     }
6380
6381     force.initialize = function(_) {
6382       nodes = _;
6383       initialize();
6384     };
6385
6386     force.strength = function(_) {
6387       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6388     };
6389
6390     force.x = function(_) {
6391       return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : x;
6392     };
6393
6394     return force;
6395   }
6396
6397   function y$2(y) {
6398     var strength = constant$6(0.1),
6399         nodes,
6400         strengths,
6401         yz;
6402
6403     if (typeof y !== "function") y = constant$6(y == null ? 0 : +y);
6404
6405     function force(alpha) {
6406       for (var i = 0, n = nodes.length, node; i < n; ++i) {
6407         node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
6408       }
6409     }
6410
6411     function initialize() {
6412       if (!nodes) return;
6413       var i, n = nodes.length;
6414       strengths = new Array(n);
6415       yz = new Array(n);
6416       for (i = 0; i < n; ++i) {
6417         strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
6418       }
6419     }
6420
6421     force.initialize = function(_) {
6422       nodes = _;
6423       initialize();
6424     };
6425
6426     force.strength = function(_) {
6427       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6428     };
6429
6430     force.y = function(_) {
6431       return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : y;
6432     };
6433
6434     return force;
6435   }
6436
6437   // Computes the decimal coefficient and exponent of the specified number x with
6438   // significant digits p, where x is positive and p is in [1, 21] or undefined.
6439   // For example, formatDecimal(1.23) returns ["123", 0].
6440   function formatDecimal(x, p) {
6441     if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
6442     var i, coefficient = x.slice(0, i);
6443
6444     // The string returned by toExponential either has the form \d\.\d+e[-+]\d+
6445     // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
6446     return [
6447       coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
6448       +x.slice(i + 1)
6449     ];
6450   }
6451
6452   function exponent$1(x) {
6453     return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
6454   }
6455
6456   function formatGroup(grouping, thousands) {
6457     return function(value, width) {
6458       var i = value.length,
6459           t = [],
6460           j = 0,
6461           g = grouping[0],
6462           length = 0;
6463
6464       while (i > 0 && g > 0) {
6465         if (length + g + 1 > width) g = Math.max(1, width - length);
6466         t.push(value.substring(i -= g, i + g));
6467         if ((length += g + 1) > width) break;
6468         g = grouping[j = (j + 1) % grouping.length];
6469       }
6470
6471       return t.reverse().join(thousands);
6472     };
6473   }
6474
6475   function formatNumerals(numerals) {
6476     return function(value) {
6477       return value.replace(/[0-9]/g, function(i) {
6478         return numerals[+i];
6479       });
6480     };
6481   }
6482
6483   function formatDefault(x, p) {
6484     x = x.toPrecision(p);
6485
6486     out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) {
6487       switch (x[i]) {
6488         case ".": i0 = i1 = i; break;
6489         case "0": if (i0 === 0) i0 = i; i1 = i; break;
6490         case "e": break out;
6491         default: if (i0 > 0) i0 = 0; break;
6492       }
6493     }
6494
6495     return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;
6496   }
6497
6498   var prefixExponent;
6499
6500   function formatPrefixAuto(x, p) {
6501     var d = formatDecimal(x, p);
6502     if (!d) return x + "";
6503     var coefficient = d[0],
6504         exponent = d[1],
6505         i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
6506         n = coefficient.length;
6507     return i === n ? coefficient
6508         : i > n ? coefficient + new Array(i - n + 1).join("0")
6509         : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)
6510         : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!
6511   }
6512
6513   function formatRounded(x, p) {
6514     var d = formatDecimal(x, p);
6515     if (!d) return x + "";
6516     var coefficient = d[0],
6517         exponent = d[1];
6518     return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
6519         : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)
6520         : coefficient + new Array(exponent - coefficient.length + 2).join("0");
6521   }
6522
6523   var formatTypes = {
6524     "": formatDefault,
6525     "%": function(x, p) { return (x * 100).toFixed(p); },
6526     "b": function(x) { return Math.round(x).toString(2); },
6527     "c": function(x) { return x + ""; },
6528     "d": function(x) { return Math.round(x).toString(10); },
6529     "e": function(x, p) { return x.toExponential(p); },
6530     "f": function(x, p) { return x.toFixed(p); },
6531     "g": function(x, p) { return x.toPrecision(p); },
6532     "o": function(x) { return Math.round(x).toString(8); },
6533     "p": function(x, p) { return formatRounded(x * 100, p); },
6534     "r": formatRounded,
6535     "s": formatPrefixAuto,
6536     "X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
6537     "x": function(x) { return Math.round(x).toString(16); }
6538   };
6539
6540   // [[fill]align][sign][symbol][0][width][,][.precision][type]
6541   var re = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;
6542
6543   function formatSpecifier(specifier) {
6544     return new FormatSpecifier(specifier);
6545   }
6546
6547   formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
6548
6549   function FormatSpecifier(specifier) {
6550     if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
6551
6552     var match,
6553         fill = match[1] || " ",
6554         align = match[2] || ">",
6555         sign = match[3] || "-",
6556         symbol = match[4] || "",
6557         zero = !!match[5],
6558         width = match[6] && +match[6],
6559         comma = !!match[7],
6560         precision = match[8] && +match[8].slice(1),
6561         type = match[9] || "";
6562
6563     // The "n" type is an alias for ",g".
6564     if (type === "n") comma = true, type = "g";
6565
6566     // Map invalid types to the default format.
6567     else if (!formatTypes[type]) type = "";
6568
6569     // If zero fill is specified, padding goes after sign and before digits.
6570     if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
6571
6572     this.fill = fill;
6573     this.align = align;
6574     this.sign = sign;
6575     this.symbol = symbol;
6576     this.zero = zero;
6577     this.width = width;
6578     this.comma = comma;
6579     this.precision = precision;
6580     this.type = type;
6581   }
6582
6583   FormatSpecifier.prototype.toString = function() {
6584     return this.fill
6585         + this.align
6586         + this.sign
6587         + this.symbol
6588         + (this.zero ? "0" : "")
6589         + (this.width == null ? "" : Math.max(1, this.width | 0))
6590         + (this.comma ? "," : "")
6591         + (this.precision == null ? "" : "." + Math.max(0, this.precision | 0))
6592         + this.type;
6593   };
6594
6595   function identity$3(x) {
6596     return x;
6597   }
6598
6599   var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];
6600
6601   function formatLocale(locale) {
6602     var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3,
6603         currency = locale.currency,
6604         decimal = locale.decimal,
6605         numerals = locale.numerals ? formatNumerals(locale.numerals) : identity$3,
6606         percent = locale.percent || "%";
6607
6608     function newFormat(specifier) {
6609       specifier = formatSpecifier(specifier);
6610
6611       var fill = specifier.fill,
6612           align = specifier.align,
6613           sign = specifier.sign,
6614           symbol = specifier.symbol,
6615           zero = specifier.zero,
6616           width = specifier.width,
6617           comma = specifier.comma,
6618           precision = specifier.precision,
6619           type = specifier.type;
6620
6621       // Compute the prefix and suffix.
6622       // For SI-prefix, the suffix is lazily computed.
6623       var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
6624           suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? percent : "";
6625
6626       // What format function should we use?
6627       // Is this an integer type?
6628       // Can this type generate exponential notation?
6629       var formatType = formatTypes[type],
6630           maybeSuffix = !type || /[defgprs%]/.test(type);
6631
6632       // Set the default precision if not specified,
6633       // or clamp the specified precision to the supported range.
6634       // For significant precision, it must be in [1, 21].
6635       // For fixed precision, it must be in [0, 20].
6636       precision = precision == null ? (type ? 6 : 12)
6637           : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))
6638           : Math.max(0, Math.min(20, precision));
6639
6640       function format(value) {
6641         var valuePrefix = prefix,
6642             valueSuffix = suffix,
6643             i, n, c;
6644
6645         if (type === "c") {
6646           valueSuffix = formatType(value) + valueSuffix;
6647           value = "";
6648         } else {
6649           value = +value;
6650
6651           // Perform the initial formatting.
6652           var valueNegative = value < 0;
6653           value = formatType(Math.abs(value), precision);
6654
6655           // If a negative value rounds to zero during formatting, treat as positive.
6656           if (valueNegative && +value === 0) valueNegative = false;
6657
6658           // Compute the prefix and suffix.
6659           valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
6660           valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : "");
6661
6662           // Break the formatted value into the integer “value” part that can be
6663           // grouped, and fractional or exponential “suffix” part that is not.
6664           if (maybeSuffix) {
6665             i = -1, n = value.length;
6666             while (++i < n) {
6667               if (c = value.charCodeAt(i), 48 > c || c > 57) {
6668                 valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
6669                 value = value.slice(0, i);
6670                 break;
6671               }
6672             }
6673           }
6674         }
6675
6676         // If the fill character is not "0", grouping is applied before padding.
6677         if (comma && !zero) value = group(value, Infinity);
6678
6679         // Compute the padding.
6680         var length = valuePrefix.length + value.length + valueSuffix.length,
6681             padding = length < width ? new Array(width - length + 1).join(fill) : "";
6682
6683         // If the fill character is "0", grouping is applied after padding.
6684         if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
6685
6686         // Reconstruct the final output based on the desired alignment.
6687         switch (align) {
6688           case "<": value = valuePrefix + value + valueSuffix + padding; break;
6689           case "=": value = valuePrefix + padding + value + valueSuffix; break;
6690           case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;
6691           default: value = padding + valuePrefix + value + valueSuffix; break;
6692         }
6693
6694         return numerals(value);
6695       }
6696
6697       format.toString = function() {
6698         return specifier + "";
6699       };
6700
6701       return format;
6702     }
6703
6704     function formatPrefix(specifier, value) {
6705       var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),
6706           e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3,
6707           k = Math.pow(10, -e),
6708           prefix = prefixes[8 + e / 3];
6709       return function(value) {
6710         return f(k * value) + prefix;
6711       };
6712     }
6713
6714     return {
6715       format: newFormat,
6716       formatPrefix: formatPrefix
6717     };
6718   }
6719
6720   var locale;
6721   var format;
6722   var formatPrefix;
6723
6724   defaultLocale({
6725     decimal: ".",
6726     thousands: ",",
6727     grouping: [3],
6728     currency: ["$", ""]
6729   });
6730
6731   function defaultLocale(definition) {
6732     locale = formatLocale(definition);
6733     format = locale.format;
6734     formatPrefix = locale.formatPrefix;
6735     return locale;
6736   }
6737
6738   function precisionFixed(step) {
6739     return Math.max(0, -exponent$1(Math.abs(step)));
6740   }
6741
6742   function precisionPrefix(step, value) {
6743     return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step)));
6744   }
6745
6746   function precisionRound(step, max) {
6747     step = Math.abs(step), max = Math.abs(max) - step;
6748     return Math.max(0, exponent$1(max) - exponent$1(step)) + 1;
6749   }
6750
6751   // Adds floating point numbers with twice the normal precision.
6752   // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and
6753   // Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)
6754   // 305–363 (1997).
6755   // Code adapted from GeographicLib by Charles F. F. Karney,
6756   // http://geographiclib.sourceforge.net/
6757
6758   function adder() {
6759     return new Adder;
6760   }
6761
6762   function Adder() {
6763     this.reset();
6764   }
6765
6766   Adder.prototype = {
6767     constructor: Adder,
6768     reset: function() {
6769       this.s = // rounded value
6770       this.t = 0; // exact error
6771     },
6772     add: function(y) {
6773       add$1(temp, y, this.t);
6774       add$1(this, temp.s, this.s);
6775       if (this.s) this.t += temp.t;
6776       else this.s = temp.t;
6777     },
6778     valueOf: function() {
6779       return this.s;
6780     }
6781   };
6782
6783   var temp = new Adder;
6784
6785   function add$1(adder, a, b) {
6786     var x = adder.s = a + b,
6787         bv = x - a,
6788         av = x - bv;
6789     adder.t = (a - av) + (b - bv);
6790   }
6791
6792   var epsilon$2 = 1e-6;
6793   var epsilon2$1 = 1e-12;
6794   var pi$3 = Math.PI;
6795   var halfPi$2 = pi$3 / 2;
6796   var quarterPi = pi$3 / 4;
6797   var tau$3 = pi$3 * 2;
6798
6799   var degrees$1 = 180 / pi$3;
6800   var radians = pi$3 / 180;
6801
6802   var abs = Math.abs;
6803   var atan = Math.atan;
6804   var atan2 = Math.atan2;
6805   var cos$1 = Math.cos;
6806   var ceil = Math.ceil;
6807   var exp = Math.exp;
6808   var log = Math.log;
6809   var pow = Math.pow;
6810   var sin$1 = Math.sin;
6811   var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };
6812   var sqrt = Math.sqrt;
6813   var tan = Math.tan;
6814
6815   function acos(x) {
6816     return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x);
6817   }
6818
6819   function asin(x) {
6820     return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x);
6821   }
6822
6823   function haversin(x) {
6824     return (x = sin$1(x / 2)) * x;
6825   }
6826
6827   function noop$1() {}
6828
6829   function streamGeometry(geometry, stream) {
6830     if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
6831       streamGeometryType[geometry.type](geometry, stream);
6832     }
6833   }
6834
6835   var streamObjectType = {
6836     Feature: function(object, stream) {
6837       streamGeometry(object.geometry, stream);
6838     },
6839     FeatureCollection: function(object, stream) {
6840       var features = object.features, i = -1, n = features.length;
6841       while (++i < n) streamGeometry(features[i].geometry, stream);
6842     }
6843   };
6844
6845   var streamGeometryType = {
6846     Sphere: function(object, stream) {
6847       stream.sphere();
6848     },
6849     Point: function(object, stream) {
6850       object = object.coordinates;
6851       stream.point(object[0], object[1], object[2]);
6852     },
6853     MultiPoint: function(object, stream) {
6854       var coordinates = object.coordinates, i = -1, n = coordinates.length;
6855       while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);
6856     },
6857     LineString: function(object, stream) {
6858       streamLine(object.coordinates, stream, 0);
6859     },
6860     MultiLineString: function(object, stream) {
6861       var coordinates = object.coordinates, i = -1, n = coordinates.length;
6862       while (++i < n) streamLine(coordinates[i], stream, 0);
6863     },
6864     Polygon: function(object, stream) {
6865       streamPolygon(object.coordinates, stream);
6866     },
6867     MultiPolygon: function(object, stream) {
6868       var coordinates = object.coordinates, i = -1, n = coordinates.length;
6869       while (++i < n) streamPolygon(coordinates[i], stream);
6870     },
6871     GeometryCollection: function(object, stream) {
6872       var geometries = object.geometries, i = -1, n = geometries.length;
6873       while (++i < n) streamGeometry(geometries[i], stream);
6874     }
6875   };
6876
6877   function streamLine(coordinates, stream, closed) {
6878     var i = -1, n = coordinates.length - closed, coordinate;
6879     stream.lineStart();
6880     while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
6881     stream.lineEnd();
6882   }
6883
6884   function streamPolygon(coordinates, stream) {
6885     var i = -1, n = coordinates.length;
6886     stream.polygonStart();
6887     while (++i < n) streamLine(coordinates[i], stream, 1);
6888     stream.polygonEnd();
6889   }
6890
6891   function geoStream(object, stream) {
6892     if (object && streamObjectType.hasOwnProperty(object.type)) {
6893       streamObjectType[object.type](object, stream);
6894     } else {
6895       streamGeometry(object, stream);
6896     }
6897   }
6898
6899   var areaRingSum = adder();
6900
6901   var areaSum = adder(),
6902       lambda00,
6903       phi00,
6904       lambda0,
6905       cosPhi0,
6906       sinPhi0;
6907
6908   var areaStream = {
6909     point: noop$1,
6910     lineStart: noop$1,
6911     lineEnd: noop$1,
6912     polygonStart: function() {
6913       areaRingSum.reset();
6914       areaStream.lineStart = areaRingStart;
6915       areaStream.lineEnd = areaRingEnd;
6916     },
6917     polygonEnd: function() {
6918       var areaRing = +areaRingSum;
6919       areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing);
6920       this.lineStart = this.lineEnd = this.point = noop$1;
6921     },
6922     sphere: function() {
6923       areaSum.add(tau$3);
6924     }
6925   };
6926
6927   function areaRingStart() {
6928     areaStream.point = areaPointFirst;
6929   }
6930
6931   function areaRingEnd() {
6932     areaPoint(lambda00, phi00);
6933   }
6934
6935   function areaPointFirst(lambda, phi) {
6936     areaStream.point = areaPoint;
6937     lambda00 = lambda, phi00 = phi;
6938     lambda *= radians, phi *= radians;
6939     lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi);
6940   }
6941
6942   function areaPoint(lambda, phi) {
6943     lambda *= radians, phi *= radians;
6944     phi = phi / 2 + quarterPi; // half the angular distance from south pole
6945
6946     // Spherical excess E for a spherical triangle with vertices: south pole,
6947     // previous point, current point.  Uses a formula derived from Cagnoli’s
6948     // theorem.  See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
6949     var dLambda = lambda - lambda0,
6950         sdLambda = dLambda >= 0 ? 1 : -1,
6951         adLambda = sdLambda * dLambda,
6952         cosPhi = cos$1(phi),
6953         sinPhi = sin$1(phi),
6954         k = sinPhi0 * sinPhi,
6955         u = cosPhi0 * cosPhi + k * cos$1(adLambda),
6956         v = k * sdLambda * sin$1(adLambda);
6957     areaRingSum.add(atan2(v, u));
6958
6959     // Advance the previous points.
6960     lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
6961   }
6962
6963   function d3_geoArea(object) {
6964     areaSum.reset();
6965     geoStream(object, areaStream);
6966     return areaSum * 2;
6967   }
6968
6969   function spherical(cartesian) {
6970     return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];
6971   }
6972
6973   function cartesian(spherical) {
6974     var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi);
6975     return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)];
6976   }
6977
6978   function cartesianDot(a, b) {
6979     return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
6980   }
6981
6982   function cartesianCross(a, b) {
6983     return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
6984   }
6985
6986   // TODO return a
6987   function cartesianAddInPlace(a, b) {
6988     a[0] += b[0], a[1] += b[1], a[2] += b[2];
6989   }
6990
6991   function cartesianScale(vector, k) {
6992     return [vector[0] * k, vector[1] * k, vector[2] * k];
6993   }
6994
6995   // TODO return d
6996   function cartesianNormalizeInPlace(d) {
6997     var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
6998     d[0] /= l, d[1] /= l, d[2] /= l;
6999   }
7000
7001   var lambda0$1, phi0, lambda1, phi1, // bounds
7002       lambda2, // previous lambda-coordinate
7003       lambda00$1, phi00$1, // first point
7004       p0, // previous 3D point
7005       deltaSum = adder(),
7006       ranges,
7007       range$1;
7008
7009   var boundsStream = {
7010     point: boundsPoint,
7011     lineStart: boundsLineStart,
7012     lineEnd: boundsLineEnd,
7013     polygonStart: function() {
7014       boundsStream.point = boundsRingPoint;
7015       boundsStream.lineStart = boundsRingStart;
7016       boundsStream.lineEnd = boundsRingEnd;
7017       deltaSum.reset();
7018       areaStream.polygonStart();
7019     },
7020     polygonEnd: function() {
7021       areaStream.polygonEnd();
7022       boundsStream.point = boundsPoint;
7023       boundsStream.lineStart = boundsLineStart;
7024       boundsStream.lineEnd = boundsLineEnd;
7025       if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
7026       else if (deltaSum > epsilon$2) phi1 = 90;
7027       else if (deltaSum < -epsilon$2) phi0 = -90;
7028       range$1[0] = lambda0$1, range$1[1] = lambda1;
7029     }
7030   };
7031
7032   function boundsPoint(lambda, phi) {
7033     ranges.push(range$1 = [lambda0$1 = lambda, lambda1 = lambda]);
7034     if (phi < phi0) phi0 = phi;
7035     if (phi > phi1) phi1 = phi;
7036   }
7037
7038   function linePoint(lambda, phi) {
7039     var p = cartesian([lambda * radians, phi * radians]);
7040     if (p0) {
7041       var normal = cartesianCross(p0, p),
7042           equatorial = [normal[1], -normal[0], 0],
7043           inflection = cartesianCross(equatorial, normal);
7044       cartesianNormalizeInPlace(inflection);
7045       inflection = spherical(inflection);
7046       var delta = lambda - lambda2,
7047           sign$$1 = delta > 0 ? 1 : -1,
7048           lambdai = inflection[0] * degrees$1 * sign$$1,
7049           phii,
7050           antimeridian = abs(delta) > 180;
7051       if (antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) {
7052         phii = inflection[1] * degrees$1;
7053         if (phii > phi1) phi1 = phii;
7054       } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) {
7055         phii = -inflection[1] * degrees$1;
7056         if (phii < phi0) phi0 = phii;
7057       } else {
7058         if (phi < phi0) phi0 = phi;
7059         if (phi > phi1) phi1 = phi;
7060       }
7061       if (antimeridian) {
7062         if (lambda < lambda2) {
7063           if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7064         } else {
7065           if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7066         }
7067       } else {
7068         if (lambda1 >= lambda0$1) {
7069           if (lambda < lambda0$1) lambda0$1 = lambda;
7070           if (lambda > lambda1) lambda1 = lambda;
7071         } else {
7072           if (lambda > lambda2) {
7073             if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7074           } else {
7075             if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7076           }
7077         }
7078       }
7079     } else {
7080       ranges.push(range$1 = [lambda0$1 = lambda, lambda1 = lambda]);
7081     }
7082     if (phi < phi0) phi0 = phi;
7083     if (phi > phi1) phi1 = phi;
7084     p0 = p, lambda2 = lambda;
7085   }
7086
7087   function boundsLineStart() {
7088     boundsStream.point = linePoint;
7089   }
7090
7091   function boundsLineEnd() {
7092     range$1[0] = lambda0$1, range$1[1] = lambda1;
7093     boundsStream.point = boundsPoint;
7094     p0 = null;
7095   }
7096
7097   function boundsRingPoint(lambda, phi) {
7098     if (p0) {
7099       var delta = lambda - lambda2;
7100       deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
7101     } else {
7102       lambda00$1 = lambda, phi00$1 = phi;
7103     }
7104     areaStream.point(lambda, phi);
7105     linePoint(lambda, phi);
7106   }
7107
7108   function boundsRingStart() {
7109     areaStream.lineStart();
7110   }
7111
7112   function boundsRingEnd() {
7113     boundsRingPoint(lambda00$1, phi00$1);
7114     areaStream.lineEnd();
7115     if (abs(deltaSum) > epsilon$2) lambda0$1 = -(lambda1 = 180);
7116     range$1[0] = lambda0$1, range$1[1] = lambda1;
7117     p0 = null;
7118   }
7119
7120   // Finds the left-right distance between two longitudes.
7121   // This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want
7122   // the distance between ±180° to be 360°.
7123   function angle(lambda0, lambda1) {
7124     return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;
7125   }
7126
7127   function rangeCompare(a, b) {
7128     return a[0] - b[0];
7129   }
7130
7131   function rangeContains(range, x) {
7132     return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
7133   }
7134
7135   function d3_geoBounds(feature) {
7136     var i, n, a, b, merged, deltaMax, delta;
7137
7138     phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
7139     ranges = [];
7140     geoStream(feature, boundsStream);
7141
7142     // First, sort ranges by their minimum longitudes.
7143     if (n = ranges.length) {
7144       ranges.sort(rangeCompare);
7145
7146       // Then, merge any ranges that overlap.
7147       for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
7148         b = ranges[i];
7149         if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
7150           if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
7151           if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
7152         } else {
7153           merged.push(a = b);
7154         }
7155       }
7156
7157       // Finally, find the largest gap between the merged ranges.
7158       // The final bounding box will be the inverse of this gap.
7159       for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {
7160         b = merged[i];
7161         if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1];
7162       }
7163     }
7164
7165     ranges = range$1 = null;
7166
7167     return lambda0$1 === Infinity || phi0 === Infinity
7168         ? [[NaN, NaN], [NaN, NaN]]
7169         : [[lambda0$1, phi0], [lambda1, phi1]];
7170   }
7171
7172   var W0, W1,
7173       X0, Y0, Z0,
7174       X1, Y1, Z1,
7175       X2, Y2, Z2,
7176       lambda00$2, phi00$2, // first point
7177       x0, y0, z0; // previous point
7178
7179   var centroidStream = {
7180     sphere: noop$1,
7181     point: centroidPoint,
7182     lineStart: centroidLineStart,
7183     lineEnd: centroidLineEnd,
7184     polygonStart: function() {
7185       centroidStream.lineStart = centroidRingStart;
7186       centroidStream.lineEnd = centroidRingEnd;
7187     },
7188     polygonEnd: function() {
7189       centroidStream.lineStart = centroidLineStart;
7190       centroidStream.lineEnd = centroidLineEnd;
7191     }
7192   };
7193
7194   // Arithmetic mean of Cartesian vectors.
7195   function centroidPoint(lambda, phi) {
7196     lambda *= radians, phi *= radians;
7197     var cosPhi = cos$1(phi);
7198     centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi));
7199   }
7200
7201   function centroidPointCartesian(x, y, z) {
7202     ++W0;
7203     X0 += (x - X0) / W0;
7204     Y0 += (y - Y0) / W0;
7205     Z0 += (z - Z0) / W0;
7206   }
7207
7208   function centroidLineStart() {
7209     centroidStream.point = centroidLinePointFirst;
7210   }
7211
7212   function centroidLinePointFirst(lambda, phi) {
7213     lambda *= radians, phi *= radians;
7214     var cosPhi = cos$1(phi);
7215     x0 = cosPhi * cos$1(lambda);
7216     y0 = cosPhi * sin$1(lambda);
7217     z0 = sin$1(phi);
7218     centroidStream.point = centroidLinePoint;
7219     centroidPointCartesian(x0, y0, z0);
7220   }
7221
7222   function centroidLinePoint(lambda, phi) {
7223     lambda *= radians, phi *= radians;
7224     var cosPhi = cos$1(phi),
7225         x = cosPhi * cos$1(lambda),
7226         y = cosPhi * sin$1(lambda),
7227         z = sin$1(phi),
7228         w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);
7229     W1 += w;
7230     X1 += w * (x0 + (x0 = x));
7231     Y1 += w * (y0 + (y0 = y));
7232     Z1 += w * (z0 + (z0 = z));
7233     centroidPointCartesian(x0, y0, z0);
7234   }
7235
7236   function centroidLineEnd() {
7237     centroidStream.point = centroidPoint;
7238   }
7239
7240   // See J. E. Brock, The Inertia Tensor for a Spherical Triangle,
7241   // J. Applied Mechanics 42, 239 (1975).
7242   function centroidRingStart() {
7243     centroidStream.point = centroidRingPointFirst;
7244   }
7245
7246   function centroidRingEnd() {
7247     centroidRingPoint(lambda00$2, phi00$2);
7248     centroidStream.point = centroidPoint;
7249   }
7250
7251   function centroidRingPointFirst(lambda, phi) {
7252     lambda00$2 = lambda, phi00$2 = phi;
7253     lambda *= radians, phi *= radians;
7254     centroidStream.point = centroidRingPoint;
7255     var cosPhi = cos$1(phi);
7256     x0 = cosPhi * cos$1(lambda);
7257     y0 = cosPhi * sin$1(lambda);
7258     z0 = sin$1(phi);
7259     centroidPointCartesian(x0, y0, z0);
7260   }
7261
7262   function centroidRingPoint(lambda, phi) {
7263     lambda *= radians, phi *= radians;
7264     var cosPhi = cos$1(phi),
7265         x = cosPhi * cos$1(lambda),
7266         y = cosPhi * sin$1(lambda),
7267         z = sin$1(phi),
7268         cx = y0 * z - z0 * y,
7269         cy = z0 * x - x0 * z,
7270         cz = x0 * y - y0 * x,
7271         m = sqrt(cx * cx + cy * cy + cz * cz),
7272         w = asin(m), // line weight = angle
7273         v = m && -w / m; // area weight multiplier
7274     X2 += v * cx;
7275     Y2 += v * cy;
7276     Z2 += v * cz;
7277     W1 += w;
7278     X1 += w * (x0 + (x0 = x));
7279     Y1 += w * (y0 + (y0 = y));
7280     Z1 += w * (z0 + (z0 = z));
7281     centroidPointCartesian(x0, y0, z0);
7282   }
7283
7284   function d3_geoCentroid(object) {
7285     W0 = W1 =
7286     X0 = Y0 = Z0 =
7287     X1 = Y1 = Z1 =
7288     X2 = Y2 = Z2 = 0;
7289     geoStream(object, centroidStream);
7290
7291     var x = X2,
7292         y = Y2,
7293         z = Z2,
7294         m = x * x + y * y + z * z;
7295
7296     // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.
7297     if (m < epsilon2$1) {
7298       x = X1, y = Y1, z = Z1;
7299       // If the feature has zero length, fall back to arithmetic mean of point vectors.
7300       if (W1 < epsilon$2) x = X0, y = Y0, z = Z0;
7301       m = x * x + y * y + z * z;
7302       // If the feature still has an undefined ccentroid, then return.
7303       if (m < epsilon2$1) return [NaN, NaN];
7304     }
7305
7306     return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1];
7307   }
7308
7309   function constant$7(x) {
7310     return function() {
7311       return x;
7312     };
7313   }
7314
7315   function compose(a, b) {
7316
7317     function compose(x, y) {
7318       return x = a(x, y), b(x[0], x[1]);
7319     }
7320
7321     if (a.invert && b.invert) compose.invert = function(x, y) {
7322       return x = b.invert(x, y), x && a.invert(x[0], x[1]);
7323     };
7324
7325     return compose;
7326   }
7327
7328   function rotationIdentity(lambda, phi) {
7329     return [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7330   }
7331
7332   rotationIdentity.invert = rotationIdentity;
7333
7334   function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
7335     return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))
7336       : rotationLambda(deltaLambda))
7337       : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)
7338       : rotationIdentity);
7339   }
7340
7341   function forwardRotationLambda(deltaLambda) {
7342     return function(lambda, phi) {
7343       return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7344     };
7345   }
7346
7347   function rotationLambda(deltaLambda) {
7348     var rotation = forwardRotationLambda(deltaLambda);
7349     rotation.invert = forwardRotationLambda(-deltaLambda);
7350     return rotation;
7351   }
7352
7353   function rotationPhiGamma(deltaPhi, deltaGamma) {
7354     var cosDeltaPhi = cos$1(deltaPhi),
7355         sinDeltaPhi = sin$1(deltaPhi),
7356         cosDeltaGamma = cos$1(deltaGamma),
7357         sinDeltaGamma = sin$1(deltaGamma);
7358
7359     function rotation(lambda, phi) {
7360       var cosPhi = cos$1(phi),
7361           x = cos$1(lambda) * cosPhi,
7362           y = sin$1(lambda) * cosPhi,
7363           z = sin$1(phi),
7364           k = z * cosDeltaPhi + x * sinDeltaPhi;
7365       return [
7366         atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
7367         asin(k * cosDeltaGamma + y * sinDeltaGamma)
7368       ];
7369     }
7370
7371     rotation.invert = function(lambda, phi) {
7372       var cosPhi = cos$1(phi),
7373           x = cos$1(lambda) * cosPhi,
7374           y = sin$1(lambda) * cosPhi,
7375           z = sin$1(phi),
7376           k = z * cosDeltaGamma - y * sinDeltaGamma;
7377       return [
7378         atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
7379         asin(k * cosDeltaPhi - x * sinDeltaPhi)
7380       ];
7381     };
7382
7383     return rotation;
7384   }
7385
7386   function rotation(rotate) {
7387     rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
7388
7389     function forward(coordinates) {
7390       coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
7391       return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7392     }
7393
7394     forward.invert = function(coordinates) {
7395       coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
7396       return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7397     };
7398
7399     return forward;
7400   }
7401
7402   // Generates a circle centered at [0°, 0°], with a given radius and precision.
7403   function circleStream(stream, radius, delta, direction, t0, t1) {
7404     if (!delta) return;
7405     var cosRadius = cos$1(radius),
7406         sinRadius = sin$1(radius),
7407         step = direction * delta;
7408     if (t0 == null) {
7409       t0 = radius + direction * tau$3;
7410       t1 = radius - step / 2;
7411     } else {
7412       t0 = circleRadius(cosRadius, t0);
7413       t1 = circleRadius(cosRadius, t1);
7414       if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3;
7415     }
7416     for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
7417       point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]);
7418       stream.point(point[0], point[1]);
7419     }
7420   }
7421
7422   // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].
7423   function circleRadius(cosRadius, point) {
7424     point = cartesian(point), point[0] -= cosRadius;
7425     cartesianNormalizeInPlace(point);
7426     var radius = acos(-point[1]);
7427     return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3;
7428   }
7429
7430   function circle() {
7431     var center = constant$7([0, 0]),
7432         radius = constant$7(90),
7433         precision = constant$7(6),
7434         ring,
7435         rotate,
7436         stream = {point: point};
7437
7438     function point(x, y) {
7439       ring.push(x = rotate(x, y));
7440       x[0] *= degrees$1, x[1] *= degrees$1;
7441     }
7442
7443     function circle() {
7444       var c = center.apply(this, arguments),
7445           r = radius.apply(this, arguments) * radians,
7446           p = precision.apply(this, arguments) * radians;
7447       ring = [];
7448       rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;
7449       circleStream(stream, r, p, 1);
7450       c = {type: "Polygon", coordinates: [ring]};
7451       ring = rotate = null;
7452       return c;
7453     }
7454
7455     circle.center = function(_) {
7456       return arguments.length ? (center = typeof _ === "function" ? _ : constant$7([+_[0], +_[1]]), circle) : center;
7457     };
7458
7459     circle.radius = function(_) {
7460       return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), circle) : radius;
7461     };
7462
7463     circle.precision = function(_) {
7464       return arguments.length ? (precision = typeof _ === "function" ? _ : constant$7(+_), circle) : precision;
7465     };
7466
7467     return circle;
7468   }
7469
7470   function clipBuffer() {
7471     var lines = [],
7472         line;
7473     return {
7474       point: function(x, y) {
7475         line.push([x, y]);
7476       },
7477       lineStart: function() {
7478         lines.push(line = []);
7479       },
7480       lineEnd: noop$1,
7481       rejoin: function() {
7482         if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
7483       },
7484       result: function() {
7485         var result = lines;
7486         lines = [];
7487         line = null;
7488         return result;
7489       }
7490     };
7491   }
7492
7493   function pointEqual(a, b) {
7494     return abs(a[0] - b[0]) < epsilon$2 && abs(a[1] - b[1]) < epsilon$2;
7495   }
7496
7497   function Intersection(point, points, other, entry) {
7498     this.x = point;
7499     this.z = points;
7500     this.o = other; // another intersection
7501     this.e = entry; // is an entry?
7502     this.v = false; // visited
7503     this.n = this.p = null; // next & previous
7504   }
7505
7506   // A generalized polygon clipping algorithm: given a polygon that has been cut
7507   // into its visible line segments, and rejoins the segments by interpolating
7508   // along the clip edge.
7509   function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) {
7510     var subject = [],
7511         clip = [],
7512         i,
7513         n;
7514
7515     segments.forEach(function(segment) {
7516       if ((n = segment.length - 1) <= 0) return;
7517       var n, p0 = segment[0], p1 = segment[n], x;
7518
7519       // If the first and last points of a segment are coincident, then treat as a
7520       // closed ring. TODO if all rings are closed, then the winding order of the
7521       // exterior ring should be checked.
7522       if (pointEqual(p0, p1)) {
7523         stream.lineStart();
7524         for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);
7525         stream.lineEnd();
7526         return;
7527       }
7528
7529       subject.push(x = new Intersection(p0, segment, null, true));
7530       clip.push(x.o = new Intersection(p0, null, x, false));
7531       subject.push(x = new Intersection(p1, segment, null, false));
7532       clip.push(x.o = new Intersection(p1, null, x, true));
7533     });
7534
7535     if (!subject.length) return;
7536
7537     clip.sort(compareIntersection);
7538     link$1(subject);
7539     link$1(clip);
7540
7541     for (i = 0, n = clip.length; i < n; ++i) {
7542       clip[i].e = startInside = !startInside;
7543     }
7544
7545     var start = subject[0],
7546         points,
7547         point;
7548
7549     while (1) {
7550       // Find first unvisited intersection.
7551       var current = start,
7552           isSubject = true;
7553       while (current.v) if ((current = current.n) === start) return;
7554       points = current.z;
7555       stream.lineStart();
7556       do {
7557         current.v = current.o.v = true;
7558         if (current.e) {
7559           if (isSubject) {
7560             for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);
7561           } else {
7562             interpolate(current.x, current.n.x, 1, stream);
7563           }
7564           current = current.n;
7565         } else {
7566           if (isSubject) {
7567             points = current.p.z;
7568             for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
7569           } else {
7570             interpolate(current.x, current.p.x, -1, stream);
7571           }
7572           current = current.p;
7573         }
7574         current = current.o;
7575         points = current.z;
7576         isSubject = !isSubject;
7577       } while (!current.v);
7578       stream.lineEnd();
7579     }
7580   }
7581
7582   function link$1(array) {
7583     if (!(n = array.length)) return;
7584     var n,
7585         i = 0,
7586         a = array[0],
7587         b;
7588     while (++i < n) {
7589       a.n = b = array[i];
7590       b.p = a;
7591       a = b;
7592     }
7593     a.n = b = array[0];
7594     b.p = a;
7595   }
7596
7597   var sum$1 = adder();
7598
7599   function polygonContains(polygon, point) {
7600     var lambda = point[0],
7601         phi = point[1],
7602         normal = [sin$1(lambda), -cos$1(lambda), 0],
7603         angle = 0,
7604         winding = 0;
7605
7606     sum$1.reset();
7607
7608     for (var i = 0, n = polygon.length; i < n; ++i) {
7609       if (!(m = (ring = polygon[i]).length)) continue;
7610       var ring,
7611           m,
7612           point0 = ring[m - 1],
7613           lambda0 = point0[0],
7614           phi0 = point0[1] / 2 + quarterPi,
7615           sinPhi0 = sin$1(phi0),
7616           cosPhi0 = cos$1(phi0);
7617
7618       for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {
7619         var point1 = ring[j],
7620             lambda1 = point1[0],
7621             phi1 = point1[1] / 2 + quarterPi,
7622             sinPhi1 = sin$1(phi1),
7623             cosPhi1 = cos$1(phi1),
7624             delta = lambda1 - lambda0,
7625             sign$$1 = delta >= 0 ? 1 : -1,
7626             absDelta = sign$$1 * delta,
7627             antimeridian = absDelta > pi$3,
7628             k = sinPhi0 * sinPhi1;
7629
7630         sum$1.add(atan2(k * sign$$1 * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta)));
7631         angle += antimeridian ? delta + sign$$1 * tau$3 : delta;
7632
7633         // Are the longitudes either side of the point’s meridian (lambda),
7634         // and are the latitudes smaller than the parallel (phi)?
7635         if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {
7636           var arc = cartesianCross(cartesian(point0), cartesian(point1));
7637           cartesianNormalizeInPlace(arc);
7638           var intersection = cartesianCross(normal, arc);
7639           cartesianNormalizeInPlace(intersection);
7640           var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
7641           if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
7642             winding += antimeridian ^ delta >= 0 ? 1 : -1;
7643           }
7644         }
7645       }
7646     }
7647
7648     // First, determine whether the South pole is inside or outside:
7649     //
7650     // It is inside if:
7651     // * the polygon winds around it in a clockwise direction.
7652     // * the polygon does not (cumulatively) wind around it, but has a negative
7653     //   (counter-clockwise) area.
7654     //
7655     // Second, count the (signed) number of times a segment crosses a lambda
7656     // from the point to the South pole.  If it is zero, then the point is the
7657     // same side as the South pole.
7658
7659     return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1);
7660   }
7661
7662   function clip(pointVisible, clipLine, interpolate, start) {
7663     return function(sink) {
7664       var line = clipLine(sink),
7665           ringBuffer = clipBuffer(),
7666           ringSink = clipLine(ringBuffer),
7667           polygonStarted = false,
7668           polygon,
7669           segments,
7670           ring;
7671
7672       var clip = {
7673         point: point,
7674         lineStart: lineStart,
7675         lineEnd: lineEnd,
7676         polygonStart: function() {
7677           clip.point = pointRing;
7678           clip.lineStart = ringStart;
7679           clip.lineEnd = ringEnd;
7680           segments = [];
7681           polygon = [];
7682         },
7683         polygonEnd: function() {
7684           clip.point = point;
7685           clip.lineStart = lineStart;
7686           clip.lineEnd = lineEnd;
7687           segments = merge(segments);
7688           var startInside = polygonContains(polygon, start);
7689           if (segments.length) {
7690             if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7691             clipRejoin(segments, compareIntersection, startInside, interpolate, sink);
7692           } else if (startInside) {
7693             if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7694             sink.lineStart();
7695             interpolate(null, null, 1, sink);
7696             sink.lineEnd();
7697           }
7698           if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
7699           segments = polygon = null;
7700         },
7701         sphere: function() {
7702           sink.polygonStart();
7703           sink.lineStart();
7704           interpolate(null, null, 1, sink);
7705           sink.lineEnd();
7706           sink.polygonEnd();
7707         }
7708       };
7709
7710       function point(lambda, phi) {
7711         if (pointVisible(lambda, phi)) sink.point(lambda, phi);
7712       }
7713
7714       function pointLine(lambda, phi) {
7715         line.point(lambda, phi);
7716       }
7717
7718       function lineStart() {
7719         clip.point = pointLine;
7720         line.lineStart();
7721       }
7722
7723       function lineEnd() {
7724         clip.point = point;
7725         line.lineEnd();
7726       }
7727
7728       function pointRing(lambda, phi) {
7729         ring.push([lambda, phi]);
7730         ringSink.point(lambda, phi);
7731       }
7732
7733       function ringStart() {
7734         ringSink.lineStart();
7735         ring = [];
7736       }
7737
7738       function ringEnd() {
7739         pointRing(ring[0][0], ring[0][1]);
7740         ringSink.lineEnd();
7741
7742         var clean = ringSink.clean(),
7743             ringSegments = ringBuffer.result(),
7744             i, n = ringSegments.length, m,
7745             segment,
7746             point;
7747
7748         ring.pop();
7749         polygon.push(ring);
7750         ring = null;
7751
7752         if (!n) return;
7753
7754         // No intersections.
7755         if (clean & 1) {
7756           segment = ringSegments[0];
7757           if ((m = segment.length - 1) > 0) {
7758             if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7759             sink.lineStart();
7760             for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
7761             sink.lineEnd();
7762           }
7763           return;
7764         }
7765
7766         // Rejoin connected segments.
7767         // TODO reuse ringBuffer.rejoin()?
7768         if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
7769
7770         segments.push(ringSegments.filter(validSegment));
7771       }
7772
7773       return clip;
7774     };
7775   }
7776
7777   function validSegment(segment) {
7778     return segment.length > 1;
7779   }
7780
7781   // Intersections are sorted along the clip edge. For both antimeridian cutting
7782   // and circle clipping, the same comparison is used.
7783   function compareIntersection(a, b) {
7784     return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1])
7785          - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]);
7786   }
7787
7788   var clipAntimeridian = clip(
7789     function() { return true; },
7790     clipAntimeridianLine,
7791     clipAntimeridianInterpolate,
7792     [-pi$3, -halfPi$2]
7793   );
7794
7795   // Takes a line and cuts into visible segments. Return values: 0 - there were
7796   // intersections or the line was empty; 1 - no intersections; 2 - there were
7797   // intersections, and the first and last segments should be rejoined.
7798   function clipAntimeridianLine(stream) {
7799     var lambda0 = NaN,
7800         phi0 = NaN,
7801         sign0 = NaN,
7802         clean; // no intersections
7803
7804     return {
7805       lineStart: function() {
7806         stream.lineStart();
7807         clean = 1;
7808       },
7809       point: function(lambda1, phi1) {
7810         var sign1 = lambda1 > 0 ? pi$3 : -pi$3,
7811             delta = abs(lambda1 - lambda0);
7812         if (abs(delta - pi$3) < epsilon$2) { // line crosses a pole
7813           stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2);
7814           stream.point(sign0, phi0);
7815           stream.lineEnd();
7816           stream.lineStart();
7817           stream.point(sign1, phi0);
7818           stream.point(lambda1, phi0);
7819           clean = 0;
7820         } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian
7821           if (abs(lambda0 - sign0) < epsilon$2) lambda0 -= sign0 * epsilon$2; // handle degeneracies
7822           if (abs(lambda1 - sign1) < epsilon$2) lambda1 -= sign1 * epsilon$2;
7823           phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);
7824           stream.point(sign0, phi0);
7825           stream.lineEnd();
7826           stream.lineStart();
7827           stream.point(sign1, phi0);
7828           clean = 0;
7829         }
7830         stream.point(lambda0 = lambda1, phi0 = phi1);
7831         sign0 = sign1;
7832       },
7833       lineEnd: function() {
7834         stream.lineEnd();
7835         lambda0 = phi0 = NaN;
7836       },
7837       clean: function() {
7838         return 2 - clean; // if intersections, rejoin first and last segments
7839       }
7840     };
7841   }
7842
7843   function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
7844     var cosPhi0,
7845         cosPhi1,
7846         sinLambda0Lambda1 = sin$1(lambda0 - lambda1);
7847     return abs(sinLambda0Lambda1) > epsilon$2
7848         ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1)
7849             - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0))
7850             / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))
7851         : (phi0 + phi1) / 2;
7852   }
7853
7854   function clipAntimeridianInterpolate(from, to, direction, stream) {
7855     var phi;
7856     if (from == null) {
7857       phi = direction * halfPi$2;
7858       stream.point(-pi$3, phi);
7859       stream.point(0, phi);
7860       stream.point(pi$3, phi);
7861       stream.point(pi$3, 0);
7862       stream.point(pi$3, -phi);
7863       stream.point(0, -phi);
7864       stream.point(-pi$3, -phi);
7865       stream.point(-pi$3, 0);
7866       stream.point(-pi$3, phi);
7867     } else if (abs(from[0] - to[0]) > epsilon$2) {
7868       var lambda = from[0] < to[0] ? pi$3 : -pi$3;
7869       phi = direction * lambda / 2;
7870       stream.point(-lambda, phi);
7871       stream.point(0, phi);
7872       stream.point(lambda, phi);
7873     } else {
7874       stream.point(to[0], to[1]);
7875     }
7876   }
7877
7878   function clipCircle(radius) {
7879     var cr = cos$1(radius),
7880         delta = 6 * radians,
7881         smallRadius = cr > 0,
7882         notHemisphere = abs(cr) > epsilon$2; // TODO optimise for this common case
7883
7884     function interpolate(from, to, direction, stream) {
7885       circleStream(stream, radius, delta, direction, from, to);
7886     }
7887
7888     function visible(lambda, phi) {
7889       return cos$1(lambda) * cos$1(phi) > cr;
7890     }
7891
7892     // Takes a line and cuts into visible segments. Return values used for polygon
7893     // clipping: 0 - there were intersections or the line was empty; 1 - no
7894     // intersections 2 - there were intersections, and the first and last segments
7895     // should be rejoined.
7896     function clipLine(stream) {
7897       var point0, // previous point
7898           c0, // code for previous point
7899           v0, // visibility of previous point
7900           v00, // visibility of first point
7901           clean; // no intersections
7902       return {
7903         lineStart: function() {
7904           v00 = v0 = false;
7905           clean = 1;
7906         },
7907         point: function(lambda, phi) {
7908           var point1 = [lambda, phi],
7909               point2,
7910               v = visible(lambda, phi),
7911               c = smallRadius
7912                 ? v ? 0 : code(lambda, phi)
7913                 : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0;
7914           if (!point0 && (v00 = v0 = v)) stream.lineStart();
7915           // Handle degeneracies.
7916           // TODO ignore if not clipping polygons.
7917           if (v !== v0) {
7918             point2 = intersect(point0, point1);
7919             if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) {
7920               point1[0] += epsilon$2;
7921               point1[1] += epsilon$2;
7922               v = visible(point1[0], point1[1]);
7923             }
7924           }
7925           if (v !== v0) {
7926             clean = 0;
7927             if (v) {
7928               // outside going in
7929               stream.lineStart();
7930               point2 = intersect(point1, point0);
7931               stream.point(point2[0], point2[1]);
7932             } else {
7933               // inside going out
7934               point2 = intersect(point0, point1);
7935               stream.point(point2[0], point2[1]);
7936               stream.lineEnd();
7937             }
7938             point0 = point2;
7939           } else if (notHemisphere && point0 && smallRadius ^ v) {
7940             var t;
7941             // If the codes for two points are different, or are both zero,
7942             // and there this segment intersects with the small circle.
7943             if (!(c & c0) && (t = intersect(point1, point0, true))) {
7944               clean = 0;
7945               if (smallRadius) {
7946                 stream.lineStart();
7947                 stream.point(t[0][0], t[0][1]);
7948                 stream.point(t[1][0], t[1][1]);
7949                 stream.lineEnd();
7950               } else {
7951                 stream.point(t[1][0], t[1][1]);
7952                 stream.lineEnd();
7953                 stream.lineStart();
7954                 stream.point(t[0][0], t[0][1]);
7955               }
7956             }
7957           }
7958           if (v && (!point0 || !pointEqual(point0, point1))) {
7959             stream.point(point1[0], point1[1]);
7960           }
7961           point0 = point1, v0 = v, c0 = c;
7962         },
7963         lineEnd: function() {
7964           if (v0) stream.lineEnd();
7965           point0 = null;
7966         },
7967         // Rejoin first and last segments if there were intersections and the first
7968         // and last points were visible.
7969         clean: function() {
7970           return clean | ((v00 && v0) << 1);
7971         }
7972       };
7973     }
7974
7975     // Intersects the great circle between a and b with the clip circle.
7976     function intersect(a, b, two) {
7977       var pa = cartesian(a),
7978           pb = cartesian(b);
7979
7980       // We have two planes, n1.p = d1 and n2.p = d2.
7981       // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
7982       var n1 = [1, 0, 0], // normal
7983           n2 = cartesianCross(pa, pb),
7984           n2n2 = cartesianDot(n2, n2),
7985           n1n2 = n2[0], // cartesianDot(n1, n2),
7986           determinant = n2n2 - n1n2 * n1n2;
7987
7988       // Two polar points.
7989       if (!determinant) return !two && a;
7990
7991       var c1 =  cr * n2n2 / determinant,
7992           c2 = -cr * n1n2 / determinant,
7993           n1xn2 = cartesianCross(n1, n2),
7994           A = cartesianScale(n1, c1),
7995           B = cartesianScale(n2, c2);
7996       cartesianAddInPlace(A, B);
7997
7998       // Solve |p(t)|^2 = 1.
7999       var u = n1xn2,
8000           w = cartesianDot(A, u),
8001           uu = cartesianDot(u, u),
8002           t2 = w * w - uu * (cartesianDot(A, A) - 1);
8003
8004       if (t2 < 0) return;
8005
8006       var t = sqrt(t2),
8007           q = cartesianScale(u, (-w - t) / uu);
8008       cartesianAddInPlace(q, A);
8009       q = spherical(q);
8010
8011       if (!two) return q;
8012
8013       // Two intersection points.
8014       var lambda0 = a[0],
8015           lambda1 = b[0],
8016           phi0 = a[1],
8017           phi1 = b[1],
8018           z;
8019
8020       if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
8021
8022       var delta = lambda1 - lambda0,
8023           polar = abs(delta - pi$3) < epsilon$2,
8024           meridian = polar || delta < epsilon$2;
8025
8026       if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
8027
8028       // Check that the first point is between a and b.
8029       if (meridian
8030           ? polar
8031             ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon$2 ? phi0 : phi1)
8032             : phi0 <= q[1] && q[1] <= phi1
8033           : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
8034         var q1 = cartesianScale(u, (-w + t) / uu);
8035         cartesianAddInPlace(q1, A);
8036         return [q, spherical(q1)];
8037       }
8038     }
8039
8040     // Generates a 4-bit vector representing the location of a point relative to
8041     // the small circle's bounding box.
8042     function code(lambda, phi) {
8043       var r = smallRadius ? radius : pi$3 - radius,
8044           code = 0;
8045       if (lambda < -r) code |= 1; // left
8046       else if (lambda > r) code |= 2; // right
8047       if (phi < -r) code |= 4; // below
8048       else if (phi > r) code |= 8; // above
8049       return code;
8050     }
8051
8052     return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]);
8053   }
8054
8055   function clipLine(a, b, x0, y0, x1, y1) {
8056     var ax = a[0],
8057         ay = a[1],
8058         bx = b[0],
8059         by = b[1],
8060         t0 = 0,
8061         t1 = 1,
8062         dx = bx - ax,
8063         dy = by - ay,
8064         r;
8065
8066     r = x0 - ax;
8067     if (!dx && r > 0) return;
8068     r /= dx;
8069     if (dx < 0) {
8070       if (r < t0) return;
8071       if (r < t1) t1 = r;
8072     } else if (dx > 0) {
8073       if (r > t1) return;
8074       if (r > t0) t0 = r;
8075     }
8076
8077     r = x1 - ax;
8078     if (!dx && r < 0) return;
8079     r /= dx;
8080     if (dx < 0) {
8081       if (r > t1) return;
8082       if (r > t0) t0 = r;
8083     } else if (dx > 0) {
8084       if (r < t0) return;
8085       if (r < t1) t1 = r;
8086     }
8087
8088     r = y0 - ay;
8089     if (!dy && r > 0) return;
8090     r /= dy;
8091     if (dy < 0) {
8092       if (r < t0) return;
8093       if (r < t1) t1 = r;
8094     } else if (dy > 0) {
8095       if (r > t1) return;
8096       if (r > t0) t0 = r;
8097     }
8098
8099     r = y1 - ay;
8100     if (!dy && r < 0) return;
8101     r /= dy;
8102     if (dy < 0) {
8103       if (r > t1) return;
8104       if (r > t0) t0 = r;
8105     } else if (dy > 0) {
8106       if (r < t0) return;
8107       if (r < t1) t1 = r;
8108     }
8109
8110     if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
8111     if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
8112     return true;
8113   }
8114
8115   var clipMax = 1e9, clipMin = -clipMax;
8116
8117   // TODO Use d3-polygon’s polygonContains here for the ring check?
8118   // TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
8119
8120   function clipRectangle(x0, y0, x1, y1) {
8121
8122     function visible(x, y) {
8123       return x0 <= x && x <= x1 && y0 <= y && y <= y1;
8124     }
8125
8126     function interpolate(from, to, direction, stream) {
8127       var a = 0, a1 = 0;
8128       if (from == null
8129           || (a = corner(from, direction)) !== (a1 = corner(to, direction))
8130           || comparePoint(from, to) < 0 ^ direction > 0) {
8131         do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
8132         while ((a = (a + direction + 4) % 4) !== a1);
8133       } else {
8134         stream.point(to[0], to[1]);
8135       }
8136     }
8137
8138     function corner(p, direction) {
8139       return abs(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3
8140           : abs(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1
8141           : abs(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0
8142           : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
8143     }
8144
8145     function compareIntersection(a, b) {
8146       return comparePoint(a.x, b.x);
8147     }
8148
8149     function comparePoint(a, b) {
8150       var ca = corner(a, 1),
8151           cb = corner(b, 1);
8152       return ca !== cb ? ca - cb
8153           : ca === 0 ? b[1] - a[1]
8154           : ca === 1 ? a[0] - b[0]
8155           : ca === 2 ? a[1] - b[1]
8156           : b[0] - a[0];
8157     }
8158
8159     return function(stream) {
8160       var activeStream = stream,
8161           bufferStream = clipBuffer(),
8162           segments,
8163           polygon,
8164           ring,
8165           x__, y__, v__, // first point
8166           x_, y_, v_, // previous point
8167           first,
8168           clean;
8169
8170       var clipStream = {
8171         point: point,
8172         lineStart: lineStart,
8173         lineEnd: lineEnd,
8174         polygonStart: polygonStart,
8175         polygonEnd: polygonEnd
8176       };
8177
8178       function point(x, y) {
8179         if (visible(x, y)) activeStream.point(x, y);
8180       }
8181
8182       function polygonInside() {
8183         var winding = 0;
8184
8185         for (var i = 0, n = polygon.length; i < n; ++i) {
8186           for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {
8187             a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];
8188             if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }
8189             else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }
8190           }
8191         }
8192
8193         return winding;
8194       }
8195
8196       // Buffer geometry within a polygon and then clip it en masse.
8197       function polygonStart() {
8198         activeStream = bufferStream, segments = [], polygon = [], clean = true;
8199       }
8200
8201       function polygonEnd() {
8202         var startInside = polygonInside(),
8203             cleanInside = clean && startInside,
8204             visible = (segments = merge(segments)).length;
8205         if (cleanInside || visible) {
8206           stream.polygonStart();
8207           if (cleanInside) {
8208             stream.lineStart();
8209             interpolate(null, null, 1, stream);
8210             stream.lineEnd();
8211           }
8212           if (visible) {
8213             clipRejoin(segments, compareIntersection, startInside, interpolate, stream);
8214           }
8215           stream.polygonEnd();
8216         }
8217         activeStream = stream, segments = polygon = ring = null;
8218       }
8219
8220       function lineStart() {
8221         clipStream.point = linePoint;
8222         if (polygon) polygon.push(ring = []);
8223         first = true;
8224         v_ = false;
8225         x_ = y_ = NaN;
8226       }
8227
8228       // TODO rather than special-case polygons, simply handle them separately.
8229       // Ideally, coincident intersection points should be jittered to avoid
8230       // clipping issues.
8231       function lineEnd() {
8232         if (segments) {
8233           linePoint(x__, y__);
8234           if (v__ && v_) bufferStream.rejoin();
8235           segments.push(bufferStream.result());
8236         }
8237         clipStream.point = point;
8238         if (v_) activeStream.lineEnd();
8239       }
8240
8241       function linePoint(x, y) {
8242         var v = visible(x, y);
8243         if (polygon) ring.push([x, y]);
8244         if (first) {
8245           x__ = x, y__ = y, v__ = v;
8246           first = false;
8247           if (v) {
8248             activeStream.lineStart();
8249             activeStream.point(x, y);
8250           }
8251         } else {
8252           if (v && v_) activeStream.point(x, y);
8253           else {
8254             var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],
8255                 b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
8256             if (clipLine(a, b, x0, y0, x1, y1)) {
8257               if (!v_) {
8258                 activeStream.lineStart();
8259                 activeStream.point(a[0], a[1]);
8260               }
8261               activeStream.point(b[0], b[1]);
8262               if (!v) activeStream.lineEnd();
8263               clean = false;
8264             } else if (v) {
8265               activeStream.lineStart();
8266               activeStream.point(x, y);
8267               clean = false;
8268             }
8269           }
8270         }
8271         x_ = x, y_ = y, v_ = v;
8272       }
8273
8274       return clipStream;
8275     };
8276   }
8277
8278   function extent$1() {
8279     var x0 = 0,
8280         y0 = 0,
8281         x1 = 960,
8282         y1 = 500,
8283         cache,
8284         cacheStream,
8285         clip;
8286
8287     return clip = {
8288       stream: function(stream) {
8289         return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);
8290       },
8291       extent: function(_) {
8292         return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];
8293       }
8294     };
8295   }
8296
8297   var lengthSum = adder(),
8298       lambda0$2,
8299       sinPhi0$1,
8300       cosPhi0$1;
8301
8302   var lengthStream = {
8303     sphere: noop$1,
8304     point: noop$1,
8305     lineStart: lengthLineStart,
8306     lineEnd: noop$1,
8307     polygonStart: noop$1,
8308     polygonEnd: noop$1
8309   };
8310
8311   function lengthLineStart() {
8312     lengthStream.point = lengthPointFirst;
8313     lengthStream.lineEnd = lengthLineEnd;
8314   }
8315
8316   function lengthLineEnd() {
8317     lengthStream.point = lengthStream.lineEnd = noop$1;
8318   }
8319
8320   function lengthPointFirst(lambda, phi) {
8321     lambda *= radians, phi *= radians;
8322     lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi);
8323     lengthStream.point = lengthPoint;
8324   }
8325
8326   function lengthPoint(lambda, phi) {
8327     lambda *= radians, phi *= radians;
8328     var sinPhi = sin$1(phi),
8329         cosPhi = cos$1(phi),
8330         delta = abs(lambda - lambda0$2),
8331         cosDelta = cos$1(delta),
8332         sinDelta = sin$1(delta),
8333         x = cosPhi * sinDelta,
8334         y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta,
8335         z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta;
8336     lengthSum.add(atan2(sqrt(x * x + y * y), z));
8337     lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi;
8338   }
8339
8340   function length$1(object) {
8341     lengthSum.reset();
8342     geoStream(object, lengthStream);
8343     return +lengthSum;
8344   }
8345
8346   var coordinates = [null, null],
8347       object$1 = {type: "LineString", coordinates: coordinates};
8348
8349   function distance(a, b) {
8350     coordinates[0] = a;
8351     coordinates[1] = b;
8352     return length$1(object$1);
8353   }
8354
8355   var containsObjectType = {
8356     Feature: function(object, point) {
8357       return containsGeometry(object.geometry, point);
8358     },
8359     FeatureCollection: function(object, point) {
8360       var features = object.features, i = -1, n = features.length;
8361       while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;
8362       return false;
8363     }
8364   };
8365
8366   var containsGeometryType = {
8367     Sphere: function() {
8368       return true;
8369     },
8370     Point: function(object, point) {
8371       return containsPoint(object.coordinates, point);
8372     },
8373     MultiPoint: function(object, point) {
8374       var coordinates = object.coordinates, i = -1, n = coordinates.length;
8375       while (++i < n) if (containsPoint(coordinates[i], point)) return true;
8376       return false;
8377     },
8378     LineString: function(object, point) {
8379       return containsLine(object.coordinates, point);
8380     },
8381     MultiLineString: function(object, point) {
8382       var coordinates = object.coordinates, i = -1, n = coordinates.length;
8383       while (++i < n) if (containsLine(coordinates[i], point)) return true;
8384       return false;
8385     },
8386     Polygon: function(object, point) {
8387       return containsPolygon(object.coordinates, point);
8388     },
8389     MultiPolygon: function(object, point) {
8390       var coordinates = object.coordinates, i = -1, n = coordinates.length;
8391       while (++i < n) if (containsPolygon(coordinates[i], point)) return true;
8392       return false;
8393     },
8394     GeometryCollection: function(object, point) {
8395       var geometries = object.geometries, i = -1, n = geometries.length;
8396       while (++i < n) if (containsGeometry(geometries[i], point)) return true;
8397       return false;
8398     }
8399   };
8400
8401   function containsGeometry(geometry, point) {
8402     return geometry && containsGeometryType.hasOwnProperty(geometry.type)
8403         ? containsGeometryType[geometry.type](geometry, point)
8404         : false;
8405   }
8406
8407   function containsPoint(coordinates, point) {
8408     return distance(coordinates, point) === 0;
8409   }
8410
8411   function containsLine(coordinates, point) {
8412     var ab = distance(coordinates[0], coordinates[1]),
8413         ao = distance(coordinates[0], point),
8414         ob = distance(point, coordinates[1]);
8415     return ao + ob <= ab + epsilon$2;
8416   }
8417
8418   function containsPolygon(coordinates, point) {
8419     return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
8420   }
8421
8422   function ringRadians(ring) {
8423     return ring = ring.map(pointRadians), ring.pop(), ring;
8424   }
8425
8426   function pointRadians(point) {
8427     return [point[0] * radians, point[1] * radians];
8428   }
8429
8430   function contains(object, point) {
8431     return (object && containsObjectType.hasOwnProperty(object.type)
8432         ? containsObjectType[object.type]
8433         : containsGeometry)(object, point);
8434   }
8435
8436   function graticuleX(y0, y1, dy) {
8437     var y = range(y0, y1 - epsilon$2, dy).concat(y1);
8438     return function(x) { return y.map(function(y) { return [x, y]; }); };
8439   }
8440
8441   function graticuleY(x0, x1, dx) {
8442     var x = range(x0, x1 - epsilon$2, dx).concat(x1);
8443     return function(y) { return x.map(function(x) { return [x, y]; }); };
8444   }
8445
8446   function graticule() {
8447     var x1, x0, X1, X0,
8448         y1, y0, Y1, Y0,
8449         dx = 10, dy = dx, DX = 90, DY = 360,
8450         x, y, X, Y,
8451         precision = 2.5;
8452
8453     function graticule() {
8454       return {type: "MultiLineString", coordinates: lines()};
8455     }
8456
8457     function lines() {
8458       return range(ceil(X0 / DX) * DX, X1, DX).map(X)
8459           .concat(range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))
8460           .concat(range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon$2; }).map(x))
8461           .concat(range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon$2; }).map(y));
8462     }
8463
8464     graticule.lines = function() {
8465       return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
8466     };
8467
8468     graticule.outline = function() {
8469       return {
8470         type: "Polygon",
8471         coordinates: [
8472           X(X0).concat(
8473           Y(Y1).slice(1),
8474           X(X1).reverse().slice(1),
8475           Y(Y0).reverse().slice(1))
8476         ]
8477       };
8478     };
8479
8480     graticule.extent = function(_) {
8481       if (!arguments.length) return graticule.extentMinor();
8482       return graticule.extentMajor(_).extentMinor(_);
8483     };
8484
8485     graticule.extentMajor = function(_) {
8486       if (!arguments.length) return [[X0, Y0], [X1, Y1]];
8487       X0 = +_[0][0], X1 = +_[1][0];
8488       Y0 = +_[0][1], Y1 = +_[1][1];
8489       if (X0 > X1) _ = X0, X0 = X1, X1 = _;
8490       if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
8491       return graticule.precision(precision);
8492     };
8493
8494     graticule.extentMinor = function(_) {
8495       if (!arguments.length) return [[x0, y0], [x1, y1]];
8496       x0 = +_[0][0], x1 = +_[1][0];
8497       y0 = +_[0][1], y1 = +_[1][1];
8498       if (x0 > x1) _ = x0, x0 = x1, x1 = _;
8499       if (y0 > y1) _ = y0, y0 = y1, y1 = _;
8500       return graticule.precision(precision);
8501     };
8502
8503     graticule.step = function(_) {
8504       if (!arguments.length) return graticule.stepMinor();
8505       return graticule.stepMajor(_).stepMinor(_);
8506     };
8507
8508     graticule.stepMajor = function(_) {
8509       if (!arguments.length) return [DX, DY];
8510       DX = +_[0], DY = +_[1];
8511       return graticule;
8512     };
8513
8514     graticule.stepMinor = function(_) {
8515       if (!arguments.length) return [dx, dy];
8516       dx = +_[0], dy = +_[1];
8517       return graticule;
8518     };
8519
8520     graticule.precision = function(_) {
8521       if (!arguments.length) return precision;
8522       precision = +_;
8523       x = graticuleX(y0, y1, 90);
8524       y = graticuleY(x0, x1, precision);
8525       X = graticuleX(Y0, Y1, 90);
8526       Y = graticuleY(X0, X1, precision);
8527       return graticule;
8528     };
8529
8530     return graticule
8531         .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]])
8532         .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]);
8533   }
8534
8535   function graticule10() {
8536     return graticule()();
8537   }
8538
8539   function interpolate$2(a, b) {
8540     var x0 = a[0] * radians,
8541         y0 = a[1] * radians,
8542         x1 = b[0] * radians,
8543         y1 = b[1] * radians,
8544         cy0 = cos$1(y0),
8545         sy0 = sin$1(y0),
8546         cy1 = cos$1(y1),
8547         sy1 = sin$1(y1),
8548         kx0 = cy0 * cos$1(x0),
8549         ky0 = cy0 * sin$1(x0),
8550         kx1 = cy1 * cos$1(x1),
8551         ky1 = cy1 * sin$1(x1),
8552         d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),
8553         k = sin$1(d);
8554
8555     var interpolate = d ? function(t) {
8556       var B = sin$1(t *= d) / k,
8557           A = sin$1(d - t) / k,
8558           x = A * kx0 + B * kx1,
8559           y = A * ky0 + B * ky1,
8560           z = A * sy0 + B * sy1;
8561       return [
8562         atan2(y, x) * degrees$1,
8563         atan2(z, sqrt(x * x + y * y)) * degrees$1
8564       ];
8565     } : function() {
8566       return [x0 * degrees$1, y0 * degrees$1];
8567     };
8568
8569     interpolate.distance = d;
8570
8571     return interpolate;
8572   }
8573
8574   function identity$4(x) {
8575     return x;
8576   }
8577
8578   var areaSum$1 = adder(),
8579       areaRingSum$1 = adder(),
8580       x00,
8581       y00,
8582       x0$1,
8583       y0$1;
8584
8585   var areaStream$1 = {
8586     point: noop$1,
8587     lineStart: noop$1,
8588     lineEnd: noop$1,
8589     polygonStart: function() {
8590       areaStream$1.lineStart = areaRingStart$1;
8591       areaStream$1.lineEnd = areaRingEnd$1;
8592     },
8593     polygonEnd: function() {
8594       areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$1;
8595       areaSum$1.add(abs(areaRingSum$1));
8596       areaRingSum$1.reset();
8597     },
8598     result: function() {
8599       var area = areaSum$1 / 2;
8600       areaSum$1.reset();
8601       return area;
8602     }
8603   };
8604
8605   function areaRingStart$1() {
8606     areaStream$1.point = areaPointFirst$1;
8607   }
8608
8609   function areaPointFirst$1(x, y) {
8610     areaStream$1.point = areaPoint$1;
8611     x00 = x0$1 = x, y00 = y0$1 = y;
8612   }
8613
8614   function areaPoint$1(x, y) {
8615     areaRingSum$1.add(y0$1 * x - x0$1 * y);
8616     x0$1 = x, y0$1 = y;
8617   }
8618
8619   function areaRingEnd$1() {
8620     areaPoint$1(x00, y00);
8621   }
8622
8623   var x0$2 = Infinity,
8624       y0$2 = x0$2,
8625       x1 = -x0$2,
8626       y1 = x1;
8627
8628   var boundsStream$1 = {
8629     point: boundsPoint$1,
8630     lineStart: noop$1,
8631     lineEnd: noop$1,
8632     polygonStart: noop$1,
8633     polygonEnd: noop$1,
8634     result: function() {
8635       var bounds = [[x0$2, y0$2], [x1, y1]];
8636       x1 = y1 = -(y0$2 = x0$2 = Infinity);
8637       return bounds;
8638     }
8639   };
8640
8641   function boundsPoint$1(x, y) {
8642     if (x < x0$2) x0$2 = x;
8643     if (x > x1) x1 = x;
8644     if (y < y0$2) y0$2 = y;
8645     if (y > y1) y1 = y;
8646   }
8647
8648   // TODO Enforce positive area for exterior, negative area for interior?
8649
8650   var X0$1 = 0,
8651       Y0$1 = 0,
8652       Z0$1 = 0,
8653       X1$1 = 0,
8654       Y1$1 = 0,
8655       Z1$1 = 0,
8656       X2$1 = 0,
8657       Y2$1 = 0,
8658       Z2$1 = 0,
8659       x00$1,
8660       y00$1,
8661       x0$3,
8662       y0$3;
8663
8664   var centroidStream$1 = {
8665     point: centroidPoint$1,
8666     lineStart: centroidLineStart$1,
8667     lineEnd: centroidLineEnd$1,
8668     polygonStart: function() {
8669       centroidStream$1.lineStart = centroidRingStart$1;
8670       centroidStream$1.lineEnd = centroidRingEnd$1;
8671     },
8672     polygonEnd: function() {
8673       centroidStream$1.point = centroidPoint$1;
8674       centroidStream$1.lineStart = centroidLineStart$1;
8675       centroidStream$1.lineEnd = centroidLineEnd$1;
8676     },
8677     result: function() {
8678       var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1]
8679           : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1]
8680           : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1]
8681           : [NaN, NaN];
8682       X0$1 = Y0$1 = Z0$1 =
8683       X1$1 = Y1$1 = Z1$1 =
8684       X2$1 = Y2$1 = Z2$1 = 0;
8685       return centroid;
8686     }
8687   };
8688
8689   function centroidPoint$1(x, y) {
8690     X0$1 += x;
8691     Y0$1 += y;
8692     ++Z0$1;
8693   }
8694
8695   function centroidLineStart$1() {
8696     centroidStream$1.point = centroidPointFirstLine;
8697   }
8698
8699   function centroidPointFirstLine(x, y) {
8700     centroidStream$1.point = centroidPointLine;
8701     centroidPoint$1(x0$3 = x, y0$3 = y);
8702   }
8703
8704   function centroidPointLine(x, y) {
8705     var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy);
8706     X1$1 += z * (x0$3 + x) / 2;
8707     Y1$1 += z * (y0$3 + y) / 2;
8708     Z1$1 += z;
8709     centroidPoint$1(x0$3 = x, y0$3 = y);
8710   }
8711
8712   function centroidLineEnd$1() {
8713     centroidStream$1.point = centroidPoint$1;
8714   }
8715
8716   function centroidRingStart$1() {
8717     centroidStream$1.point = centroidPointFirstRing;
8718   }
8719
8720   function centroidRingEnd$1() {
8721     centroidPointRing(x00$1, y00$1);
8722   }
8723
8724   function centroidPointFirstRing(x, y) {
8725     centroidStream$1.point = centroidPointRing;
8726     centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
8727   }
8728
8729   function centroidPointRing(x, y) {
8730     var dx = x - x0$3,
8731         dy = y - y0$3,
8732         z = sqrt(dx * dx + dy * dy);
8733
8734     X1$1 += z * (x0$3 + x) / 2;
8735     Y1$1 += z * (y0$3 + y) / 2;
8736     Z1$1 += z;
8737
8738     z = y0$3 * x - x0$3 * y;
8739     X2$1 += z * (x0$3 + x);
8740     Y2$1 += z * (y0$3 + y);
8741     Z2$1 += z * 3;
8742     centroidPoint$1(x0$3 = x, y0$3 = y);
8743   }
8744
8745   function PathContext(context) {
8746     this._context = context;
8747   }
8748
8749   PathContext.prototype = {
8750     _radius: 4.5,
8751     pointRadius: function(_) {
8752       return this._radius = _, this;
8753     },
8754     polygonStart: function() {
8755       this._line = 0;
8756     },
8757     polygonEnd: function() {
8758       this._line = NaN;
8759     },
8760     lineStart: function() {
8761       this._point = 0;
8762     },
8763     lineEnd: function() {
8764       if (this._line === 0) this._context.closePath();
8765       this._point = NaN;
8766     },
8767     point: function(x, y) {
8768       switch (this._point) {
8769         case 0: {
8770           this._context.moveTo(x, y);
8771           this._point = 1;
8772           break;
8773         }
8774         case 1: {
8775           this._context.lineTo(x, y);
8776           break;
8777         }
8778         default: {
8779           this._context.moveTo(x + this._radius, y);
8780           this._context.arc(x, y, this._radius, 0, tau$3);
8781           break;
8782         }
8783       }
8784     },
8785     result: noop$1
8786   };
8787
8788   var lengthSum$1 = adder(),
8789       lengthRing,
8790       x00$2,
8791       y00$2,
8792       x0$4,
8793       y0$4;
8794
8795   var lengthStream$1 = {
8796     point: noop$1,
8797     lineStart: function() {
8798       lengthStream$1.point = lengthPointFirst$1;
8799     },
8800     lineEnd: function() {
8801       if (lengthRing) lengthPoint$1(x00$2, y00$2);
8802       lengthStream$1.point = noop$1;
8803     },
8804     polygonStart: function() {
8805       lengthRing = true;
8806     },
8807     polygonEnd: function() {
8808       lengthRing = null;
8809     },
8810     result: function() {
8811       var length = +lengthSum$1;
8812       lengthSum$1.reset();
8813       return length;
8814     }
8815   };
8816
8817   function lengthPointFirst$1(x, y) {
8818     lengthStream$1.point = lengthPoint$1;
8819     x00$2 = x0$4 = x, y00$2 = y0$4 = y;
8820   }
8821
8822   function lengthPoint$1(x, y) {
8823     x0$4 -= x, y0$4 -= y;
8824     lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4));
8825     x0$4 = x, y0$4 = y;
8826   }
8827
8828   function PathString() {
8829     this._string = [];
8830   }
8831
8832   PathString.prototype = {
8833     _radius: 4.5,
8834     _circle: circle$1(4.5),
8835     pointRadius: function(_) {
8836       if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
8837       return this;
8838     },
8839     polygonStart: function() {
8840       this._line = 0;
8841     },
8842     polygonEnd: function() {
8843       this._line = NaN;
8844     },
8845     lineStart: function() {
8846       this._point = 0;
8847     },
8848     lineEnd: function() {
8849       if (this._line === 0) this._string.push("Z");
8850       this._point = NaN;
8851     },
8852     point: function(x, y) {
8853       switch (this._point) {
8854         case 0: {
8855           this._string.push("M", x, ",", y);
8856           this._point = 1;
8857           break;
8858         }
8859         case 1: {
8860           this._string.push("L", x, ",", y);
8861           break;
8862         }
8863         default: {
8864           if (this._circle == null) this._circle = circle$1(this._radius);
8865           this._string.push("M", x, ",", y, this._circle);
8866           break;
8867         }
8868       }
8869     },
8870     result: function() {
8871       if (this._string.length) {
8872         var result = this._string.join("");
8873         this._string = [];
8874         return result;
8875       } else {
8876         return null;
8877       }
8878     }
8879   };
8880
8881   function circle$1(radius) {
8882     return "m0," + radius
8883         + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius
8884         + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius
8885         + "z";
8886   }
8887
8888   function d3_geoPath(projection, context) {
8889     var pointRadius = 4.5,
8890         projectionStream,
8891         contextStream;
8892
8893     function path(object) {
8894       if (object) {
8895         if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
8896         geoStream(object, projectionStream(contextStream));
8897       }
8898       return contextStream.result();
8899     }
8900
8901     path.area = function(object) {
8902       geoStream(object, projectionStream(areaStream$1));
8903       return areaStream$1.result();
8904     };
8905
8906     path.measure = function(object) {
8907       geoStream(object, projectionStream(lengthStream$1));
8908       return lengthStream$1.result();
8909     };
8910
8911     path.bounds = function(object) {
8912       geoStream(object, projectionStream(boundsStream$1));
8913       return boundsStream$1.result();
8914     };
8915
8916     path.centroid = function(object) {
8917       geoStream(object, projectionStream(centroidStream$1));
8918       return centroidStream$1.result();
8919     };
8920
8921     path.projection = function(_) {
8922       return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
8923     };
8924
8925     path.context = function(_) {
8926       if (!arguments.length) return context;
8927       contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);
8928       if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
8929       return path;
8930     };
8931
8932     path.pointRadius = function(_) {
8933       if (!arguments.length) return pointRadius;
8934       pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
8935       return path;
8936     };
8937
8938     return path.projection(projection).context(context);
8939   }
8940
8941   function d3_geoTransform(methods) {
8942     return {
8943       stream: transformer(methods)
8944     };
8945   }
8946
8947   function transformer(methods) {
8948     return function(stream) {
8949       var s = new TransformStream;
8950       for (var key in methods) s[key] = methods[key];
8951       s.stream = stream;
8952       return s;
8953     };
8954   }
8955
8956   function TransformStream() {}
8957
8958   TransformStream.prototype = {
8959     constructor: TransformStream,
8960     point: function(x, y) { this.stream.point(x, y); },
8961     sphere: function() { this.stream.sphere(); },
8962     lineStart: function() { this.stream.lineStart(); },
8963     lineEnd: function() { this.stream.lineEnd(); },
8964     polygonStart: function() { this.stream.polygonStart(); },
8965     polygonEnd: function() { this.stream.polygonEnd(); }
8966   };
8967
8968   function fit(projection, fitBounds, object) {
8969     var clip = projection.clipExtent && projection.clipExtent();
8970     projection.scale(150).translate([0, 0]);
8971     if (clip != null) projection.clipExtent(null);
8972     geoStream(object, projection.stream(boundsStream$1));
8973     fitBounds(boundsStream$1.result());
8974     if (clip != null) projection.clipExtent(clip);
8975     return projection;
8976   }
8977
8978   function fitExtent(projection, extent, object) {
8979     return fit(projection, function(b) {
8980       var w = extent[1][0] - extent[0][0],
8981           h = extent[1][1] - extent[0][1],
8982           k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
8983           x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
8984           y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
8985       projection.scale(150 * k).translate([x, y]);
8986     }, object);
8987   }
8988
8989   function fitSize(projection, size, object) {
8990     return fitExtent(projection, [[0, 0], size], object);
8991   }
8992
8993   function fitWidth(projection, width, object) {
8994     return fit(projection, function(b) {
8995       var w = +width,
8996           k = w / (b[1][0] - b[0][0]),
8997           x = (w - k * (b[1][0] + b[0][0])) / 2,
8998           y = -k * b[0][1];
8999       projection.scale(150 * k).translate([x, y]);
9000     }, object);
9001   }
9002
9003   function fitHeight(projection, height, object) {
9004     return fit(projection, function(b) {
9005       var h = +height,
9006           k = h / (b[1][1] - b[0][1]),
9007           x = -k * b[0][0],
9008           y = (h - k * (b[1][1] + b[0][1])) / 2;
9009       projection.scale(150 * k).translate([x, y]);
9010     }, object);
9011   }
9012
9013   var maxDepth = 16, // maximum depth of subdivision
9014       cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance)
9015
9016   function resample(project, delta2) {
9017     return +delta2 ? resample$1(project, delta2) : resampleNone(project);
9018   }
9019
9020   function resampleNone(project) {
9021     return transformer({
9022       point: function(x, y) {
9023         x = project(x, y);
9024         this.stream.point(x[0], x[1]);
9025       }
9026     });
9027   }
9028
9029   function resample$1(project, delta2) {
9030
9031     function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
9032       var dx = x1 - x0,
9033           dy = y1 - y0,
9034           d2 = dx * dx + dy * dy;
9035       if (d2 > 4 * delta2 && depth--) {
9036         var a = a0 + a1,
9037             b = b0 + b1,
9038             c = c0 + c1,
9039             m = sqrt(a * a + b * b + c * c),
9040             phi2 = asin(c /= m),
9041             lambda2 = abs(abs(c) - 1) < epsilon$2 || abs(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a),
9042             p = project(lambda2, phi2),
9043             x2 = p[0],
9044             y2 = p[1],
9045             dx2 = x2 - x0,
9046             dy2 = y2 - y0,
9047             dz = dy * dx2 - dx * dy2;
9048         if (dz * dz / d2 > delta2 // perpendicular projected distance
9049             || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end
9050             || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance
9051           resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);
9052           stream.point(x2, y2);
9053           resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);
9054         }
9055       }
9056     }
9057     return function(stream) {
9058       var lambda00, x00, y00, a00, b00, c00, // first point
9059           lambda0, x0, y0, a0, b0, c0; // previous point
9060
9061       var resampleStream = {
9062         point: point,
9063         lineStart: lineStart,
9064         lineEnd: lineEnd,
9065         polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },
9066         polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }
9067       };
9068
9069       function point(x, y) {
9070         x = project(x, y);
9071         stream.point(x[0], x[1]);
9072       }
9073
9074       function lineStart() {
9075         x0 = NaN;
9076         resampleStream.point = linePoint;
9077         stream.lineStart();
9078       }
9079
9080       function linePoint(lambda, phi) {
9081         var c = cartesian([lambda, phi]), p = project(lambda, phi);
9082         resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
9083         stream.point(x0, y0);
9084       }
9085
9086       function lineEnd() {
9087         resampleStream.point = point;
9088         stream.lineEnd();
9089       }
9090
9091       function ringStart() {
9092         lineStart();
9093         resampleStream.point = ringPoint;
9094         resampleStream.lineEnd = ringEnd;
9095       }
9096
9097       function ringPoint(lambda, phi) {
9098         linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
9099         resampleStream.point = linePoint;
9100       }
9101
9102       function ringEnd() {
9103         resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
9104         resampleStream.lineEnd = lineEnd;
9105         lineEnd();
9106       }
9107
9108       return resampleStream;
9109     };
9110   }
9111
9112   var transformRadians = transformer({
9113     point: function(x, y) {
9114       this.stream.point(x * radians, y * radians);
9115     }
9116   });
9117
9118   function transformRotate(rotate) {
9119     return transformer({
9120       point: function(x, y) {
9121         var r = rotate(x, y);
9122         return this.stream.point(r[0], r[1]);
9123       }
9124     });
9125   }
9126
9127   function projection(project) {
9128     return projectionMutator(function() { return project; })();
9129   }
9130
9131   function projectionMutator(projectAt) {
9132     var project,
9133         k = 150, // scale
9134         x = 480, y = 250, // translate
9135         dx, dy, lambda = 0, phi = 0, // center
9136         deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, projectRotate, // rotate
9137         theta = null, preclip = clipAntimeridian, // clip angle
9138         x0 = null, y0, x1, y1, postclip = identity$4, // clip extent
9139         delta2 = 0.5, projectResample = resample(projectTransform, delta2), // precision
9140         cache,
9141         cacheStream;
9142
9143     function projection(point) {
9144       point = projectRotate(point[0] * radians, point[1] * radians);
9145       return [point[0] * k + dx, dy - point[1] * k];
9146     }
9147
9148     function invert(point) {
9149       point = projectRotate.invert((point[0] - dx) / k, (dy - point[1]) / k);
9150       return point && [point[0] * degrees$1, point[1] * degrees$1];
9151     }
9152
9153     function projectTransform(x, y) {
9154       return x = project(x, y), [x[0] * k + dx, dy - x[1] * k];
9155     }
9156
9157     projection.stream = function(stream) {
9158       return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
9159     };
9160
9161     projection.preclip = function(_) {
9162       return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;
9163     };
9164
9165     projection.postclip = function(_) {
9166       return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9167     };
9168
9169     projection.clipAngle = function(_) {
9170       return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
9171     };
9172
9173     projection.clipExtent = function(_) {
9174       return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
9175     };
9176
9177     projection.scale = function(_) {
9178       return arguments.length ? (k = +_, recenter()) : k;
9179     };
9180
9181     projection.translate = function(_) {
9182       return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
9183     };
9184
9185     projection.center = function(_) {
9186       return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
9187     };
9188
9189     projection.rotate = function(_) {
9190       return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees$1, deltaPhi * degrees$1, deltaGamma * degrees$1];
9191     };
9192
9193     projection.precision = function(_) {
9194       return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
9195     };
9196
9197     projection.fitExtent = function(extent, object) {
9198       return fitExtent(projection, extent, object);
9199     };
9200
9201     projection.fitSize = function(size, object) {
9202       return fitSize(projection, size, object);
9203     };
9204
9205     projection.fitWidth = function(width, object) {
9206       return fitWidth(projection, width, object);
9207     };
9208
9209     projection.fitHeight = function(height, object) {
9210       return fitHeight(projection, height, object);
9211     };
9212
9213     function recenter() {
9214       projectRotate = compose(rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma), project);
9215       var center = project(lambda, phi);
9216       dx = x - center[0] * k;
9217       dy = y + center[1] * k;
9218       return reset();
9219     }
9220
9221     function reset() {
9222       cache = cacheStream = null;
9223       return projection;
9224     }
9225
9226     return function() {
9227       project = projectAt.apply(this, arguments);
9228       projection.invert = project.invert && invert;
9229       return recenter();
9230     };
9231   }
9232
9233   function conicProjection(projectAt) {
9234     var phi0 = 0,
9235         phi1 = pi$3 / 3,
9236         m = projectionMutator(projectAt),
9237         p = m(phi0, phi1);
9238
9239     p.parallels = function(_) {
9240       return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1];
9241     };
9242
9243     return p;
9244   }
9245
9246   function cylindricalEqualAreaRaw(phi0) {
9247     var cosPhi0 = cos$1(phi0);
9248
9249     function forward(lambda, phi) {
9250       return [lambda * cosPhi0, sin$1(phi) / cosPhi0];
9251     }
9252
9253     forward.invert = function(x, y) {
9254       return [x / cosPhi0, asin(y * cosPhi0)];
9255     };
9256
9257     return forward;
9258   }
9259
9260   function conicEqualAreaRaw(y0, y1) {
9261     var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2;
9262
9263     // Are the parallels symmetrical around the Equator?
9264     if (abs(n) < epsilon$2) return cylindricalEqualAreaRaw(y0);
9265
9266     var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;
9267
9268     function project(x, y) {
9269       var r = sqrt(c - 2 * n * sin$1(y)) / n;
9270       return [r * sin$1(x *= n), r0 - r * cos$1(x)];
9271     }
9272
9273     project.invert = function(x, y) {
9274       var r0y = r0 - y;
9275       return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];
9276     };
9277
9278     return project;
9279   }
9280
9281   function conicEqualArea() {
9282     return conicProjection(conicEqualAreaRaw)
9283         .scale(155.424)
9284         .center([0, 33.6442]);
9285   }
9286
9287   function albers() {
9288     return conicEqualArea()
9289         .parallels([29.5, 45.5])
9290         .scale(1070)
9291         .translate([480, 250])
9292         .rotate([96, 0])
9293         .center([-0.6, 38.7]);
9294   }
9295
9296   // The projections must have mutually exclusive clip regions on the sphere,
9297   // as this will avoid emitting interleaving lines and polygons.
9298   function multiplex(streams) {
9299     var n = streams.length;
9300     return {
9301       point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },
9302       sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },
9303       lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },
9304       lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },
9305       polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },
9306       polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }
9307     };
9308   }
9309
9310   // A composite projection for the United States, configured by default for
9311   // 960×500. The projection also works quite well at 960×600 if you change the
9312   // scale to 1285 and adjust the translate accordingly. The set of standard
9313   // parallels for each region comes from USGS, which is published here:
9314   // http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
9315   function albersUsa() {
9316     var cache,
9317         cacheStream,
9318         lower48 = albers(), lower48Point,
9319         alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338
9320         hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007
9321         point, pointStream = {point: function(x, y) { point = [x, y]; }};
9322
9323     function albersUsa(coordinates) {
9324       var x = coordinates[0], y = coordinates[1];
9325       return point = null,
9326           (lower48Point.point(x, y), point)
9327           || (alaskaPoint.point(x, y), point)
9328           || (hawaiiPoint.point(x, y), point);
9329     }
9330
9331     albersUsa.invert = function(coordinates) {
9332       var k = lower48.scale(),
9333           t = lower48.translate(),
9334           x = (coordinates[0] - t[0]) / k,
9335           y = (coordinates[1] - t[1]) / k;
9336       return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
9337           : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
9338           : lower48).invert(coordinates);
9339     };
9340
9341     albersUsa.stream = function(stream) {
9342       return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
9343     };
9344
9345     albersUsa.precision = function(_) {
9346       if (!arguments.length) return lower48.precision();
9347       lower48.precision(_), alaska.precision(_), hawaii.precision(_);
9348       return reset();
9349     };
9350
9351     albersUsa.scale = function(_) {
9352       if (!arguments.length) return lower48.scale();
9353       lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
9354       return albersUsa.translate(lower48.translate());
9355     };
9356
9357     albersUsa.translate = function(_) {
9358       if (!arguments.length) return lower48.translate();
9359       var k = lower48.scale(), x = +_[0], y = +_[1];
9360
9361       lower48Point = lower48
9362           .translate(_)
9363           .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
9364           .stream(pointStream);
9365
9366       alaskaPoint = alaska
9367           .translate([x - 0.307 * k, y + 0.201 * k])
9368           .clipExtent([[x - 0.425 * k + epsilon$2, y + 0.120 * k + epsilon$2], [x - 0.214 * k - epsilon$2, y + 0.234 * k - epsilon$2]])
9369           .stream(pointStream);
9370
9371       hawaiiPoint = hawaii
9372           .translate([x - 0.205 * k, y + 0.212 * k])
9373           .clipExtent([[x - 0.214 * k + epsilon$2, y + 0.166 * k + epsilon$2], [x - 0.115 * k - epsilon$2, y + 0.234 * k - epsilon$2]])
9374           .stream(pointStream);
9375
9376       return reset();
9377     };
9378
9379     albersUsa.fitExtent = function(extent, object) {
9380       return fitExtent(albersUsa, extent, object);
9381     };
9382
9383     albersUsa.fitSize = function(size, object) {
9384       return fitSize(albersUsa, size, object);
9385     };
9386
9387     albersUsa.fitWidth = function(width, object) {
9388       return fitWidth(albersUsa, width, object);
9389     };
9390
9391     albersUsa.fitHeight = function(height, object) {
9392       return fitHeight(albersUsa, height, object);
9393     };
9394
9395     function reset() {
9396       cache = cacheStream = null;
9397       return albersUsa;
9398     }
9399
9400     return albersUsa.scale(1070);
9401   }
9402
9403   function azimuthalRaw(scale) {
9404     return function(x, y) {
9405       var cx = cos$1(x),
9406           cy = cos$1(y),
9407           k = scale(cx * cy);
9408       return [
9409         k * cy * sin$1(x),
9410         k * sin$1(y)
9411       ];
9412     }
9413   }
9414
9415   function azimuthalInvert(angle) {
9416     return function(x, y) {
9417       var z = sqrt(x * x + y * y),
9418           c = angle(z),
9419           sc = sin$1(c),
9420           cc = cos$1(c);
9421       return [
9422         atan2(x * sc, z * cc),
9423         asin(z && y * sc / z)
9424       ];
9425     }
9426   }
9427
9428   var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
9429     return sqrt(2 / (1 + cxcy));
9430   });
9431
9432   azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
9433     return 2 * asin(z / 2);
9434   });
9435
9436   function azimuthalEqualArea() {
9437     return projection(azimuthalEqualAreaRaw)
9438         .scale(124.75)
9439         .clipAngle(180 - 1e-3);
9440   }
9441
9442   var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
9443     return (c = acos(c)) && c / sin$1(c);
9444   });
9445
9446   azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
9447     return z;
9448   });
9449
9450   function azimuthalEquidistant() {
9451     return projection(azimuthalEquidistantRaw)
9452         .scale(79.4188)
9453         .clipAngle(180 - 1e-3);
9454   }
9455
9456   function mercatorRaw(lambda, phi) {
9457     return [lambda, log(tan((halfPi$2 + phi) / 2))];
9458   }
9459
9460   mercatorRaw.invert = function(x, y) {
9461     return [x, 2 * atan(exp(y)) - halfPi$2];
9462   };
9463
9464   function mercator() {
9465     return mercatorProjection(mercatorRaw)
9466         .scale(961 / tau$3);
9467   }
9468
9469   function mercatorProjection(project) {
9470     var m = projection(project),
9471         center = m.center,
9472         scale = m.scale,
9473         translate = m.translate,
9474         clipExtent = m.clipExtent,
9475         x0 = null, y0, x1, y1; // clip extent
9476
9477     m.scale = function(_) {
9478       return arguments.length ? (scale(_), reclip()) : scale();
9479     };
9480
9481     m.translate = function(_) {
9482       return arguments.length ? (translate(_), reclip()) : translate();
9483     };
9484
9485     m.center = function(_) {
9486       return arguments.length ? (center(_), reclip()) : center();
9487     };
9488
9489     m.clipExtent = function(_) {
9490       return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]];
9491     };
9492
9493     function reclip() {
9494       var k = pi$3 * scale(),
9495           t = m(rotation(m.rotate()).invert([0, 0]));
9496       return clipExtent(x0 == null
9497           ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
9498           ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
9499           : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
9500     }
9501
9502     return reclip();
9503   }
9504
9505   function tany(y) {
9506     return tan((halfPi$2 + y) / 2);
9507   }
9508
9509   function conicConformalRaw(y0, y1) {
9510     var cy0 = cos$1(y0),
9511         n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)),
9512         f = cy0 * pow(tany(y0), n) / n;
9513
9514     if (!n) return mercatorRaw;
9515
9516     function project(x, y) {
9517       if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; }
9518       else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; }
9519       var r = f / pow(tany(y), n);
9520       return [r * sin$1(n * x), f - r * cos$1(n * x)];
9521     }
9522
9523     project.invert = function(x, y) {
9524       var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy);
9525       return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2];
9526     };
9527
9528     return project;
9529   }
9530
9531   function conicConformal() {
9532     return conicProjection(conicConformalRaw)
9533         .scale(109.5)
9534         .parallels([30, 30]);
9535   }
9536
9537   function equirectangularRaw(lambda, phi) {
9538     return [lambda, phi];
9539   }
9540
9541   equirectangularRaw.invert = equirectangularRaw;
9542
9543   function equirectangular() {
9544     return projection(equirectangularRaw)
9545         .scale(152.63);
9546   }
9547
9548   function conicEquidistantRaw(y0, y1) {
9549     var cy0 = cos$1(y0),
9550         n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
9551         g = cy0 / n + y0;
9552
9553     if (abs(n) < epsilon$2) return equirectangularRaw;
9554
9555     function project(x, y) {
9556       var gy = g - y, nx = n * x;
9557       return [gy * sin$1(nx), g - gy * cos$1(nx)];
9558     }
9559
9560     project.invert = function(x, y) {
9561       var gy = g - y;
9562       return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)];
9563     };
9564
9565     return project;
9566   }
9567
9568   function conicEquidistant() {
9569     return conicProjection(conicEquidistantRaw)
9570         .scale(131.154)
9571         .center([0, 13.9389]);
9572   }
9573
9574   function gnomonicRaw(x, y) {
9575     var cy = cos$1(y), k = cos$1(x) * cy;
9576     return [cy * sin$1(x) / k, sin$1(y) / k];
9577   }
9578
9579   gnomonicRaw.invert = azimuthalInvert(atan);
9580
9581   function gnomonic() {
9582     return projection(gnomonicRaw)
9583         .scale(144.049)
9584         .clipAngle(60);
9585   }
9586
9587   function scaleTranslate(kx, ky, tx, ty) {
9588     return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({
9589       point: function(x, y) {
9590         this.stream.point(x * kx + tx, y * ky + ty);
9591       }
9592     });
9593   }
9594
9595   function d3_geoIdentity() {
9596     var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect
9597         x0 = null, y0, x1, y1, // clip extent
9598         postclip = identity$4,
9599         cache,
9600         cacheStream,
9601         projection;
9602
9603     function reset() {
9604       cache = cacheStream = null;
9605       return projection;
9606     }
9607
9608     return projection = {
9609       stream: function(stream) {
9610         return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
9611       },
9612       postclip: function(_) {
9613         return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9614       },
9615       clipExtent: function(_) {
9616         return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
9617       },
9618       scale: function(_) {
9619         return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;
9620       },
9621       translate: function(_) {
9622         return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
9623       },
9624       reflectX: function(_) {
9625         return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
9626       },
9627       reflectY: function(_) {
9628         return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
9629       },
9630       fitExtent: function(extent, object) {
9631         return fitExtent(projection, extent, object);
9632       },
9633       fitSize: function(size, object) {
9634         return fitSize(projection, size, object);
9635       },
9636       fitWidth: function(width, object) {
9637         return fitWidth(projection, width, object);
9638       },
9639       fitHeight: function(height, object) {
9640         return fitHeight(projection, height, object);
9641       }
9642     };
9643   }
9644
9645   function naturalEarth1Raw(lambda, phi) {
9646     var phi2 = phi * phi, phi4 = phi2 * phi2;
9647     return [
9648       lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
9649       phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
9650     ];
9651   }
9652
9653   naturalEarth1Raw.invert = function(x, y) {
9654     var phi = y, i = 25, delta;
9655     do {
9656       var phi2 = phi * phi, phi4 = phi2 * phi2;
9657       phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /
9658           (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));
9659     } while (abs(delta) > epsilon$2 && --i > 0);
9660     return [
9661       x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
9662       phi
9663     ];
9664   };
9665
9666   function naturalEarth1() {
9667     return projection(naturalEarth1Raw)
9668         .scale(175.295);
9669   }
9670
9671   function orthographicRaw(x, y) {
9672     return [cos$1(y) * sin$1(x), sin$1(y)];
9673   }
9674
9675   orthographicRaw.invert = azimuthalInvert(asin);
9676
9677   function orthographic() {
9678     return projection(orthographicRaw)
9679         .scale(249.5)
9680         .clipAngle(90 + epsilon$2);
9681   }
9682
9683   function stereographicRaw(x, y) {
9684     var cy = cos$1(y), k = 1 + cos$1(x) * cy;
9685     return [cy * sin$1(x) / k, sin$1(y) / k];
9686   }
9687
9688   stereographicRaw.invert = azimuthalInvert(function(z) {
9689     return 2 * atan(z);
9690   });
9691
9692   function stereographic() {
9693     return projection(stereographicRaw)
9694         .scale(250)
9695         .clipAngle(142);
9696   }
9697
9698   function transverseMercatorRaw(lambda, phi) {
9699     return [log(tan((halfPi$2 + phi) / 2)), -lambda];
9700   }
9701
9702   transverseMercatorRaw.invert = function(x, y) {
9703     return [-y, 2 * atan(exp(x)) - halfPi$2];
9704   };
9705
9706   function transverseMercator() {
9707     var m = mercatorProjection(transverseMercatorRaw),
9708         center = m.center,
9709         rotate = m.rotate;
9710
9711     m.center = function(_) {
9712       return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
9713     };
9714
9715     m.rotate = function(_) {
9716       return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
9717     };
9718
9719     return rotate([0, 0, 90])
9720         .scale(159.155);
9721   }
9722
9723   function defaultSeparation(a, b) {
9724     return a.parent === b.parent ? 1 : 2;
9725   }
9726
9727   function meanX(children) {
9728     return children.reduce(meanXReduce, 0) / children.length;
9729   }
9730
9731   function meanXReduce(x, c) {
9732     return x + c.x;
9733   }
9734
9735   function maxY(children) {
9736     return 1 + children.reduce(maxYReduce, 0);
9737   }
9738
9739   function maxYReduce(y, c) {
9740     return Math.max(y, c.y);
9741   }
9742
9743   function leafLeft(node) {
9744     var children;
9745     while (children = node.children) node = children[0];
9746     return node;
9747   }
9748
9749   function leafRight(node) {
9750     var children;
9751     while (children = node.children) node = children[children.length - 1];
9752     return node;
9753   }
9754
9755   function cluster() {
9756     var separation = defaultSeparation,
9757         dx = 1,
9758         dy = 1,
9759         nodeSize = false;
9760
9761     function cluster(root) {
9762       var previousNode,
9763           x = 0;
9764
9765       // First walk, computing the initial x & y values.
9766       root.eachAfter(function(node) {
9767         var children = node.children;
9768         if (children) {
9769           node.x = meanX(children);
9770           node.y = maxY(children);
9771         } else {
9772           node.x = previousNode ? x += separation(node, previousNode) : 0;
9773           node.y = 0;
9774           previousNode = node;
9775         }
9776       });
9777
9778       var left = leafLeft(root),
9779           right = leafRight(root),
9780           x0 = left.x - separation(left, right) / 2,
9781           x1 = right.x + separation(right, left) / 2;
9782
9783       // Second walk, normalizing x & y to the desired size.
9784       return root.eachAfter(nodeSize ? function(node) {
9785         node.x = (node.x - root.x) * dx;
9786         node.y = (root.y - node.y) * dy;
9787       } : function(node) {
9788         node.x = (node.x - x0) / (x1 - x0) * dx;
9789         node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
9790       });
9791     }
9792
9793     cluster.separation = function(x) {
9794       return arguments.length ? (separation = x, cluster) : separation;
9795     };
9796
9797     cluster.size = function(x) {
9798       return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
9799     };
9800
9801     cluster.nodeSize = function(x) {
9802       return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
9803     };
9804
9805     return cluster;
9806   }
9807
9808   function count(node) {
9809     var sum = 0,
9810         children = node.children,
9811         i = children && children.length;
9812     if (!i) sum = 1;
9813     else while (--i >= 0) sum += children[i].value;
9814     node.value = sum;
9815   }
9816
9817   function node_count() {
9818     return this.eachAfter(count);
9819   }
9820
9821   function node_each(callback) {
9822     var node = this, current, next = [node], children, i, n;
9823     do {
9824       current = next.reverse(), next = [];
9825       while (node = current.pop()) {
9826         callback(node), children = node.children;
9827         if (children) for (i = 0, n = children.length; i < n; ++i) {
9828           next.push(children[i]);
9829         }
9830       }
9831     } while (next.length);
9832     return this;
9833   }
9834
9835   function node_eachBefore(callback) {
9836     var node = this, nodes = [node], children, i;
9837     while (node = nodes.pop()) {
9838       callback(node), children = node.children;
9839       if (children) for (i = children.length - 1; i >= 0; --i) {
9840         nodes.push(children[i]);
9841       }
9842     }
9843     return this;
9844   }
9845
9846   function node_eachAfter(callback) {
9847     var node = this, nodes = [node], next = [], children, i, n;
9848     while (node = nodes.pop()) {
9849       next.push(node), children = node.children;
9850       if (children) for (i = 0, n = children.length; i < n; ++i) {
9851         nodes.push(children[i]);
9852       }
9853     }
9854     while (node = next.pop()) {
9855       callback(node);
9856     }
9857     return this;
9858   }
9859
9860   function node_sum(value) {
9861     return this.eachAfter(function(node) {
9862       var sum = +value(node.data) || 0,
9863           children = node.children,
9864           i = children && children.length;
9865       while (--i >= 0) sum += children[i].value;
9866       node.value = sum;
9867     });
9868   }
9869
9870   function node_sort(compare) {
9871     return this.eachBefore(function(node) {
9872       if (node.children) {
9873         node.children.sort(compare);
9874       }
9875     });
9876   }
9877
9878   function node_path(end) {
9879     var start = this,
9880         ancestor = leastCommonAncestor(start, end),
9881         nodes = [start];
9882     while (start !== ancestor) {
9883       start = start.parent;
9884       nodes.push(start);
9885     }
9886     var k = nodes.length;
9887     while (end !== ancestor) {
9888       nodes.splice(k, 0, end);
9889       end = end.parent;
9890     }
9891     return nodes;
9892   }
9893
9894   function leastCommonAncestor(a, b) {
9895     if (a === b) return a;
9896     var aNodes = a.ancestors(),
9897         bNodes = b.ancestors(),
9898         c = null;
9899     a = aNodes.pop();
9900     b = bNodes.pop();
9901     while (a === b) {
9902       c = a;
9903       a = aNodes.pop();
9904       b = bNodes.pop();
9905     }
9906     return c;
9907   }
9908
9909   function node_ancestors() {
9910     var node = this, nodes = [node];
9911     while (node = node.parent) {
9912       nodes.push(node);
9913     }
9914     return nodes;
9915   }
9916
9917   function node_descendants() {
9918     var nodes = [];
9919     this.each(function(node) {
9920       nodes.push(node);
9921     });
9922     return nodes;
9923   }
9924
9925   function node_leaves() {
9926     var leaves = [];
9927     this.eachBefore(function(node) {
9928       if (!node.children) {
9929         leaves.push(node);
9930       }
9931     });
9932     return leaves;
9933   }
9934
9935   function node_links() {
9936     var root = this, links = [];
9937     root.each(function(node) {
9938       if (node !== root) { // Don’t include the root’s parent, if any.
9939         links.push({source: node.parent, target: node});
9940       }
9941     });
9942     return links;
9943   }
9944
9945   function hierarchy(data, children) {
9946     var root = new Node(data),
9947         valued = +data.value && (root.value = data.value),
9948         node,
9949         nodes = [root],
9950         child,
9951         childs,
9952         i,
9953         n;
9954
9955     if (children == null) children = defaultChildren;
9956
9957     while (node = nodes.pop()) {
9958       if (valued) node.value = +node.data.value;
9959       if ((childs = children(node.data)) && (n = childs.length)) {
9960         node.children = new Array(n);
9961         for (i = n - 1; i >= 0; --i) {
9962           nodes.push(child = node.children[i] = new Node(childs[i]));
9963           child.parent = node;
9964           child.depth = node.depth + 1;
9965         }
9966       }
9967     }
9968
9969     return root.eachBefore(computeHeight);
9970   }
9971
9972   function node_copy() {
9973     return hierarchy(this).eachBefore(copyData);
9974   }
9975
9976   function defaultChildren(d) {
9977     return d.children;
9978   }
9979
9980   function copyData(node) {
9981     node.data = node.data.data;
9982   }
9983
9984   function computeHeight(node) {
9985     var height = 0;
9986     do node.height = height;
9987     while ((node = node.parent) && (node.height < ++height));
9988   }
9989
9990   function Node(data) {
9991     this.data = data;
9992     this.depth =
9993     this.height = 0;
9994     this.parent = null;
9995   }
9996
9997   Node.prototype = hierarchy.prototype = {
9998     constructor: Node,
9999     count: node_count,
10000     each: node_each,
10001     eachAfter: node_eachAfter,
10002     eachBefore: node_eachBefore,
10003     sum: node_sum,
10004     sort: node_sort,
10005     path: node_path,
10006     ancestors: node_ancestors,
10007     descendants: node_descendants,
10008     leaves: node_leaves,
10009     links: node_links,
10010     copy: node_copy
10011   };
10012
10013   var slice$3 = Array.prototype.slice;
10014
10015   function shuffle$1(array) {
10016     var m = array.length,
10017         t,
10018         i;
10019
10020     while (m) {
10021       i = Math.random() * m-- | 0;
10022       t = array[m];
10023       array[m] = array[i];
10024       array[i] = t;
10025     }
10026
10027     return array;
10028   }
10029
10030   function enclose(circles) {
10031     var i = 0, n = (circles = shuffle$1(slice$3.call(circles))).length, B = [], p, e;
10032
10033     while (i < n) {
10034       p = circles[i];
10035       if (e && enclosesWeak(e, p)) ++i;
10036       else e = encloseBasis(B = extendBasis(B, p)), i = 0;
10037     }
10038
10039     return e;
10040   }
10041
10042   function extendBasis(B, p) {
10043     var i, j;
10044
10045     if (enclosesWeakAll(p, B)) return [p];
10046
10047     // If we get here then B must have at least one element.
10048     for (i = 0; i < B.length; ++i) {
10049       if (enclosesNot(p, B[i])
10050           && enclosesWeakAll(encloseBasis2(B[i], p), B)) {
10051         return [B[i], p];
10052       }
10053     }
10054
10055     // If we get here then B must have at least two elements.
10056     for (i = 0; i < B.length - 1; ++i) {
10057       for (j = i + 1; j < B.length; ++j) {
10058         if (enclosesNot(encloseBasis2(B[i], B[j]), p)
10059             && enclosesNot(encloseBasis2(B[i], p), B[j])
10060             && enclosesNot(encloseBasis2(B[j], p), B[i])
10061             && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
10062           return [B[i], B[j], p];
10063         }
10064       }
10065     }
10066
10067     // If we get here then something is very wrong.
10068     throw new Error;
10069   }
10070
10071   function enclosesNot(a, b) {
10072     var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
10073     return dr < 0 || dr * dr < dx * dx + dy * dy;
10074   }
10075
10076   function enclosesWeak(a, b) {
10077     var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
10078     return dr > 0 && dr * dr > dx * dx + dy * dy;
10079   }
10080
10081   function enclosesWeakAll(a, B) {
10082     for (var i = 0; i < B.length; ++i) {
10083       if (!enclosesWeak(a, B[i])) {
10084         return false;
10085       }
10086     }
10087     return true;
10088   }
10089
10090   function encloseBasis(B) {
10091     switch (B.length) {
10092       case 1: return encloseBasis1(B[0]);
10093       case 2: return encloseBasis2(B[0], B[1]);
10094       case 3: return encloseBasis3(B[0], B[1], B[2]);
10095     }
10096   }
10097
10098   function encloseBasis1(a) {
10099     return {
10100       x: a.x,
10101       y: a.y,
10102       r: a.r
10103     };
10104   }
10105
10106   function encloseBasis2(a, b) {
10107     var x1 = a.x, y1 = a.y, r1 = a.r,
10108         x2 = b.x, y2 = b.y, r2 = b.r,
10109         x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
10110         l = Math.sqrt(x21 * x21 + y21 * y21);
10111     return {
10112       x: (x1 + x2 + x21 / l * r21) / 2,
10113       y: (y1 + y2 + y21 / l * r21) / 2,
10114       r: (l + r1 + r2) / 2
10115     };
10116   }
10117
10118   function encloseBasis3(a, b, c) {
10119     var x1 = a.x, y1 = a.y, r1 = a.r,
10120         x2 = b.x, y2 = b.y, r2 = b.r,
10121         x3 = c.x, y3 = c.y, r3 = c.r,
10122         a2 = x1 - x2,
10123         a3 = x1 - x3,
10124         b2 = y1 - y2,
10125         b3 = y1 - y3,
10126         c2 = r2 - r1,
10127         c3 = r3 - r1,
10128         d1 = x1 * x1 + y1 * y1 - r1 * r1,
10129         d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
10130         d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
10131         ab = a3 * b2 - a2 * b3,
10132         xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
10133         xb = (b3 * c2 - b2 * c3) / ab,
10134         ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
10135         yb = (a2 * c3 - a3 * c2) / ab,
10136         A = xb * xb + yb * yb - 1,
10137         B = 2 * (r1 + xa * xb + ya * yb),
10138         C = xa * xa + ya * ya - r1 * r1,
10139         r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
10140     return {
10141       x: x1 + xa + xb * r,
10142       y: y1 + ya + yb * r,
10143       r: r
10144     };
10145   }
10146
10147   function place(a, b, c) {
10148     var ax = a.x,
10149         ay = a.y,
10150         da = b.r + c.r,
10151         db = a.r + c.r,
10152         dx = b.x - ax,
10153         dy = b.y - ay,
10154         dc = dx * dx + dy * dy;
10155     if (dc) {
10156       var x = 0.5 + ((db *= db) - (da *= da)) / (2 * dc),
10157           y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
10158       c.x = ax + x * dx + y * dy;
10159       c.y = ay + x * dy - y * dx;
10160     } else {
10161       c.x = ax + db;
10162       c.y = ay;
10163     }
10164   }
10165
10166   function intersects(a, b) {
10167     var dx = b.x - a.x,
10168         dy = b.y - a.y,
10169         dr = a.r + b.r;
10170     return dr * dr - 1e-6 > dx * dx + dy * dy;
10171   }
10172
10173   function score(node) {
10174     var a = node._,
10175         b = node.next._,
10176         ab = a.r + b.r,
10177         dx = (a.x * b.r + b.x * a.r) / ab,
10178         dy = (a.y * b.r + b.y * a.r) / ab;
10179     return dx * dx + dy * dy;
10180   }
10181
10182   function Node$1(circle) {
10183     this._ = circle;
10184     this.next = null;
10185     this.previous = null;
10186   }
10187
10188   function packEnclose(circles) {
10189     if (!(n = circles.length)) return 0;
10190
10191     var a, b, c, n, aa, ca, i, j, k, sj, sk;
10192
10193     // Place the first circle.
10194     a = circles[0], a.x = 0, a.y = 0;
10195     if (!(n > 1)) return a.r;
10196
10197     // Place the second circle.
10198     b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
10199     if (!(n > 2)) return a.r + b.r;
10200
10201     // Place the third circle.
10202     place(b, a, c = circles[2]);
10203
10204     // Initialize the front-chain using the first three circles a, b and c.
10205     a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
10206     a.next = c.previous = b;
10207     b.next = a.previous = c;
10208     c.next = b.previous = a;
10209
10210     // Attempt to place each remaining circle…
10211     pack: for (i = 3; i < n; ++i) {
10212       place(a._, b._, c = circles[i]), c = new Node$1(c);
10213
10214       // Find the closest intersecting circle on the front-chain, if any.
10215       // “Closeness” is determined by linear distance along the front-chain.
10216       // “Ahead” or “behind” is likewise determined by linear distance.
10217       j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
10218       do {
10219         if (sj <= sk) {
10220           if (intersects(j._, c._)) {
10221             b = j, a.next = b, b.previous = a, --i;
10222             continue pack;
10223           }
10224           sj += j._.r, j = j.next;
10225         } else {
10226           if (intersects(k._, c._)) {
10227             a = k, a.next = b, b.previous = a, --i;
10228             continue pack;
10229           }
10230           sk += k._.r, k = k.previous;
10231         }
10232       } while (j !== k.next);
10233
10234       // Success! Insert the new circle c between a and b.
10235       c.previous = a, c.next = b, a.next = b.previous = b = c;
10236
10237       // Compute the new closest circle pair to the centroid.
10238       aa = score(a);
10239       while ((c = c.next) !== b) {
10240         if ((ca = score(c)) < aa) {
10241           a = c, aa = ca;
10242         }
10243       }
10244       b = a.next;
10245     }
10246
10247     // Compute the enclosing circle of the front chain.
10248     a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
10249
10250     // Translate the circles to put the enclosing circle around the origin.
10251     for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
10252
10253     return c.r;
10254   }
10255
10256   function siblings(circles) {
10257     packEnclose(circles);
10258     return circles;
10259   }
10260
10261   function optional(f) {
10262     return f == null ? null : required(f);
10263   }
10264
10265   function required(f) {
10266     if (typeof f !== "function") throw new Error;
10267     return f;
10268   }
10269
10270   function constantZero() {
10271     return 0;
10272   }
10273
10274   function constant$8(x) {
10275     return function() {
10276       return x;
10277     };
10278   }
10279
10280   function defaultRadius$1(d) {
10281     return Math.sqrt(d.value);
10282   }
10283
10284   function index$1() {
10285     var radius = null,
10286         dx = 1,
10287         dy = 1,
10288         padding = constantZero;
10289
10290     function pack(root) {
10291       root.x = dx / 2, root.y = dy / 2;
10292       if (radius) {
10293         root.eachBefore(radiusLeaf(radius))
10294             .eachAfter(packChildren(padding, 0.5))
10295             .eachBefore(translateChild(1));
10296       } else {
10297         root.eachBefore(radiusLeaf(defaultRadius$1))
10298             .eachAfter(packChildren(constantZero, 1))
10299             .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
10300             .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
10301       }
10302       return root;
10303     }
10304
10305     pack.radius = function(x) {
10306       return arguments.length ? (radius = optional(x), pack) : radius;
10307     };
10308
10309     pack.size = function(x) {
10310       return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
10311     };
10312
10313     pack.padding = function(x) {
10314       return arguments.length ? (padding = typeof x === "function" ? x : constant$8(+x), pack) : padding;
10315     };
10316
10317     return pack;
10318   }
10319
10320   function radiusLeaf(radius) {
10321     return function(node) {
10322       if (!node.children) {
10323         node.r = Math.max(0, +radius(node) || 0);
10324       }
10325     };
10326   }
10327
10328   function packChildren(padding, k) {
10329     return function(node) {
10330       if (children = node.children) {
10331         var children,
10332             i,
10333             n = children.length,
10334             r = padding(node) * k || 0,
10335             e;
10336
10337         if (r) for (i = 0; i < n; ++i) children[i].r += r;
10338         e = packEnclose(children);
10339         if (r) for (i = 0; i < n; ++i) children[i].r -= r;
10340         node.r = e + r;
10341       }
10342     };
10343   }
10344
10345   function translateChild(k) {
10346     return function(node) {
10347       var parent = node.parent;
10348       node.r *= k;
10349       if (parent) {
10350         node.x = parent.x + k * node.x;
10351         node.y = parent.y + k * node.y;
10352       }
10353     };
10354   }
10355
10356   function roundNode(node) {
10357     node.x0 = Math.round(node.x0);
10358     node.y0 = Math.round(node.y0);
10359     node.x1 = Math.round(node.x1);
10360     node.y1 = Math.round(node.y1);
10361   }
10362
10363   function treemapDice(parent, x0, y0, x1, y1) {
10364     var nodes = parent.children,
10365         node,
10366         i = -1,
10367         n = nodes.length,
10368         k = parent.value && (x1 - x0) / parent.value;
10369
10370     while (++i < n) {
10371       node = nodes[i], node.y0 = y0, node.y1 = y1;
10372       node.x0 = x0, node.x1 = x0 += node.value * k;
10373     }
10374   }
10375
10376   function partition() {
10377     var dx = 1,
10378         dy = 1,
10379         padding = 0,
10380         round = false;
10381
10382     function partition(root) {
10383       var n = root.height + 1;
10384       root.x0 =
10385       root.y0 = padding;
10386       root.x1 = dx;
10387       root.y1 = dy / n;
10388       root.eachBefore(positionNode(dy, n));
10389       if (round) root.eachBefore(roundNode);
10390       return root;
10391     }
10392
10393     function positionNode(dy, n) {
10394       return function(node) {
10395         if (node.children) {
10396           treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
10397         }
10398         var x0 = node.x0,
10399             y0 = node.y0,
10400             x1 = node.x1 - padding,
10401             y1 = node.y1 - padding;
10402         if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10403         if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10404         node.x0 = x0;
10405         node.y0 = y0;
10406         node.x1 = x1;
10407         node.y1 = y1;
10408       };
10409     }
10410
10411     partition.round = function(x) {
10412       return arguments.length ? (round = !!x, partition) : round;
10413     };
10414
10415     partition.size = function(x) {
10416       return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
10417     };
10418
10419     partition.padding = function(x) {
10420       return arguments.length ? (padding = +x, partition) : padding;
10421     };
10422
10423     return partition;
10424   }
10425
10426   var keyPrefix$1 = "$", // Protect against keys like “__proto__”.
10427       preroot = {depth: -1},
10428       ambiguous = {};
10429
10430   function defaultId(d) {
10431     return d.id;
10432   }
10433
10434   function defaultParentId(d) {
10435     return d.parentId;
10436   }
10437
10438   function stratify() {
10439     var id = defaultId,
10440         parentId = defaultParentId;
10441
10442     function stratify(data) {
10443       var d,
10444           i,
10445           n = data.length,
10446           root,
10447           parent,
10448           node,
10449           nodes = new Array(n),
10450           nodeId,
10451           nodeKey,
10452           nodeByKey = {};
10453
10454       for (i = 0; i < n; ++i) {
10455         d = data[i], node = nodes[i] = new Node(d);
10456         if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
10457           nodeKey = keyPrefix$1 + (node.id = nodeId);
10458           nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
10459         }
10460       }
10461
10462       for (i = 0; i < n; ++i) {
10463         node = nodes[i], nodeId = parentId(data[i], i, data);
10464         if (nodeId == null || !(nodeId += "")) {
10465           if (root) throw new Error("multiple roots");
10466           root = node;
10467         } else {
10468           parent = nodeByKey[keyPrefix$1 + nodeId];
10469           if (!parent) throw new Error("missing: " + nodeId);
10470           if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
10471           if (parent.children) parent.children.push(node);
10472           else parent.children = [node];
10473           node.parent = parent;
10474         }
10475       }
10476
10477       if (!root) throw new Error("no root");
10478       root.parent = preroot;
10479       root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
10480       root.parent = null;
10481       if (n > 0) throw new Error("cycle");
10482
10483       return root;
10484     }
10485
10486     stratify.id = function(x) {
10487       return arguments.length ? (id = required(x), stratify) : id;
10488     };
10489
10490     stratify.parentId = function(x) {
10491       return arguments.length ? (parentId = required(x), stratify) : parentId;
10492     };
10493
10494     return stratify;
10495   }
10496
10497   function defaultSeparation$1(a, b) {
10498     return a.parent === b.parent ? 1 : 2;
10499   }
10500
10501   // function radialSeparation(a, b) {
10502   //   return (a.parent === b.parent ? 1 : 2) / a.depth;
10503   // }
10504
10505   // This function is used to traverse the left contour of a subtree (or
10506   // subforest). It returns the successor of v on this contour. This successor is
10507   // either given by the leftmost child of v or by the thread of v. The function
10508   // returns null if and only if v is on the highest level of its subtree.
10509   function nextLeft(v) {
10510     var children = v.children;
10511     return children ? children[0] : v.t;
10512   }
10513
10514   // This function works analogously to nextLeft.
10515   function nextRight(v) {
10516     var children = v.children;
10517     return children ? children[children.length - 1] : v.t;
10518   }
10519
10520   // Shifts the current subtree rooted at w+. This is done by increasing
10521   // prelim(w+) and mod(w+) by shift.
10522   function moveSubtree(wm, wp, shift) {
10523     var change = shift / (wp.i - wm.i);
10524     wp.c -= change;
10525     wp.s += shift;
10526     wm.c += change;
10527     wp.z += shift;
10528     wp.m += shift;
10529   }
10530
10531   // All other shifts, applied to the smaller subtrees between w- and w+, are
10532   // performed by this function. To prepare the shifts, we have to adjust
10533   // change(w+), shift(w+), and change(w-).
10534   function executeShifts(v) {
10535     var shift = 0,
10536         change = 0,
10537         children = v.children,
10538         i = children.length,
10539         w;
10540     while (--i >= 0) {
10541       w = children[i];
10542       w.z += shift;
10543       w.m += shift;
10544       shift += w.s + (change += w.c);
10545     }
10546   }
10547
10548   // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
10549   // returns the specified (default) ancestor.
10550   function nextAncestor(vim, v, ancestor) {
10551     return vim.a.parent === v.parent ? vim.a : ancestor;
10552   }
10553
10554   function TreeNode(node, i) {
10555     this._ = node;
10556     this.parent = null;
10557     this.children = null;
10558     this.A = null; // default ancestor
10559     this.a = this; // ancestor
10560     this.z = 0; // prelim
10561     this.m = 0; // mod
10562     this.c = 0; // change
10563     this.s = 0; // shift
10564     this.t = null; // thread
10565     this.i = i; // number
10566   }
10567
10568   TreeNode.prototype = Object.create(Node.prototype);
10569
10570   function treeRoot(root) {
10571     var tree = new TreeNode(root, 0),
10572         node,
10573         nodes = [tree],
10574         child,
10575         children,
10576         i,
10577         n;
10578
10579     while (node = nodes.pop()) {
10580       if (children = node._.children) {
10581         node.children = new Array(n = children.length);
10582         for (i = n - 1; i >= 0; --i) {
10583           nodes.push(child = node.children[i] = new TreeNode(children[i], i));
10584           child.parent = node;
10585         }
10586       }
10587     }
10588
10589     (tree.parent = new TreeNode(null, 0)).children = [tree];
10590     return tree;
10591   }
10592
10593   // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
10594   function tree() {
10595     var separation = defaultSeparation$1,
10596         dx = 1,
10597         dy = 1,
10598         nodeSize = null;
10599
10600     function tree(root) {
10601       var t = treeRoot(root);
10602
10603       // Compute the layout using Buchheim et al.’s algorithm.
10604       t.eachAfter(firstWalk), t.parent.m = -t.z;
10605       t.eachBefore(secondWalk);
10606
10607       // If a fixed node size is specified, scale x and y.
10608       if (nodeSize) root.eachBefore(sizeNode);
10609
10610       // If a fixed tree size is specified, scale x and y based on the extent.
10611       // Compute the left-most, right-most, and depth-most nodes for extents.
10612       else {
10613         var left = root,
10614             right = root,
10615             bottom = root;
10616         root.eachBefore(function(node) {
10617           if (node.x < left.x) left = node;
10618           if (node.x > right.x) right = node;
10619           if (node.depth > bottom.depth) bottom = node;
10620         });
10621         var s = left === right ? 1 : separation(left, right) / 2,
10622             tx = s - left.x,
10623             kx = dx / (right.x + s + tx),
10624             ky = dy / (bottom.depth || 1);
10625         root.eachBefore(function(node) {
10626           node.x = (node.x + tx) * kx;
10627           node.y = node.depth * ky;
10628         });
10629       }
10630
10631       return root;
10632     }
10633
10634     // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
10635     // applied recursively to the children of v, as well as the function
10636     // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
10637     // node v is placed to the midpoint of its outermost children.
10638     function firstWalk(v) {
10639       var children = v.children,
10640           siblings = v.parent.children,
10641           w = v.i ? siblings[v.i - 1] : null;
10642       if (children) {
10643         executeShifts(v);
10644         var midpoint = (children[0].z + children[children.length - 1].z) / 2;
10645         if (w) {
10646           v.z = w.z + separation(v._, w._);
10647           v.m = v.z - midpoint;
10648         } else {
10649           v.z = midpoint;
10650         }
10651       } else if (w) {
10652         v.z = w.z + separation(v._, w._);
10653       }
10654       v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
10655     }
10656
10657     // Computes all real x-coordinates by summing up the modifiers recursively.
10658     function secondWalk(v) {
10659       v._.x = v.z + v.parent.m;
10660       v.m += v.parent.m;
10661     }
10662
10663     // The core of the algorithm. Here, a new subtree is combined with the
10664     // previous subtrees. Threads are used to traverse the inside and outside
10665     // contours of the left and right subtree up to the highest common level. The
10666     // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
10667     // superscript o means outside and i means inside, the subscript - means left
10668     // subtree and + means right subtree. For summing up the modifiers along the
10669     // contour, we use respective variables si+, si-, so-, and so+. Whenever two
10670     // nodes of the inside contours conflict, we compute the left one of the
10671     // greatest uncommon ancestors using the function ANCESTOR and call MOVE
10672     // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
10673     // Finally, we add a new thread (if necessary).
10674     function apportion(v, w, ancestor) {
10675       if (w) {
10676         var vip = v,
10677             vop = v,
10678             vim = w,
10679             vom = vip.parent.children[0],
10680             sip = vip.m,
10681             sop = vop.m,
10682             sim = vim.m,
10683             som = vom.m,
10684             shift;
10685         while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
10686           vom = nextLeft(vom);
10687           vop = nextRight(vop);
10688           vop.a = v;
10689           shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
10690           if (shift > 0) {
10691             moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
10692             sip += shift;
10693             sop += shift;
10694           }
10695           sim += vim.m;
10696           sip += vip.m;
10697           som += vom.m;
10698           sop += vop.m;
10699         }
10700         if (vim && !nextRight(vop)) {
10701           vop.t = vim;
10702           vop.m += sim - sop;
10703         }
10704         if (vip && !nextLeft(vom)) {
10705           vom.t = vip;
10706           vom.m += sip - som;
10707           ancestor = v;
10708         }
10709       }
10710       return ancestor;
10711     }
10712
10713     function sizeNode(node) {
10714       node.x *= dx;
10715       node.y = node.depth * dy;
10716     }
10717
10718     tree.separation = function(x) {
10719       return arguments.length ? (separation = x, tree) : separation;
10720     };
10721
10722     tree.size = function(x) {
10723       return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
10724     };
10725
10726     tree.nodeSize = function(x) {
10727       return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
10728     };
10729
10730     return tree;
10731   }
10732
10733   function treemapSlice(parent, x0, y0, x1, y1) {
10734     var nodes = parent.children,
10735         node,
10736         i = -1,
10737         n = nodes.length,
10738         k = parent.value && (y1 - y0) / parent.value;
10739
10740     while (++i < n) {
10741       node = nodes[i], node.x0 = x0, node.x1 = x1;
10742       node.y0 = y0, node.y1 = y0 += node.value * k;
10743     }
10744   }
10745
10746   var phi = (1 + Math.sqrt(5)) / 2;
10747
10748   function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
10749     var rows = [],
10750         nodes = parent.children,
10751         row,
10752         nodeValue,
10753         i0 = 0,
10754         i1 = 0,
10755         n = nodes.length,
10756         dx, dy,
10757         value = parent.value,
10758         sumValue,
10759         minValue,
10760         maxValue,
10761         newRatio,
10762         minRatio,
10763         alpha,
10764         beta;
10765
10766     while (i0 < n) {
10767       dx = x1 - x0, dy = y1 - y0;
10768
10769       // Find the next non-empty node.
10770       do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
10771       minValue = maxValue = sumValue;
10772       alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
10773       beta = sumValue * sumValue * alpha;
10774       minRatio = Math.max(maxValue / beta, beta / minValue);
10775
10776       // Keep adding nodes while the aspect ratio maintains or improves.
10777       for (; i1 < n; ++i1) {
10778         sumValue += nodeValue = nodes[i1].value;
10779         if (nodeValue < minValue) minValue = nodeValue;
10780         if (nodeValue > maxValue) maxValue = nodeValue;
10781         beta = sumValue * sumValue * alpha;
10782         newRatio = Math.max(maxValue / beta, beta / minValue);
10783         if (newRatio > minRatio) { sumValue -= nodeValue; break; }
10784         minRatio = newRatio;
10785       }
10786
10787       // Position and record the row orientation.
10788       rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
10789       if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
10790       else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
10791       value -= sumValue, i0 = i1;
10792     }
10793
10794     return rows;
10795   }
10796
10797   var squarify = (function custom(ratio) {
10798
10799     function squarify(parent, x0, y0, x1, y1) {
10800       squarifyRatio(ratio, parent, x0, y0, x1, y1);
10801     }
10802
10803     squarify.ratio = function(x) {
10804       return custom((x = +x) > 1 ? x : 1);
10805     };
10806
10807     return squarify;
10808   })(phi);
10809
10810   function index$2() {
10811     var tile = squarify,
10812         round = false,
10813         dx = 1,
10814         dy = 1,
10815         paddingStack = [0],
10816         paddingInner = constantZero,
10817         paddingTop = constantZero,
10818         paddingRight = constantZero,
10819         paddingBottom = constantZero,
10820         paddingLeft = constantZero;
10821
10822     function treemap(root) {
10823       root.x0 =
10824       root.y0 = 0;
10825       root.x1 = dx;
10826       root.y1 = dy;
10827       root.eachBefore(positionNode);
10828       paddingStack = [0];
10829       if (round) root.eachBefore(roundNode);
10830       return root;
10831     }
10832
10833     function positionNode(node) {
10834       var p = paddingStack[node.depth],
10835           x0 = node.x0 + p,
10836           y0 = node.y0 + p,
10837           x1 = node.x1 - p,
10838           y1 = node.y1 - p;
10839       if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10840       if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10841       node.x0 = x0;
10842       node.y0 = y0;
10843       node.x1 = x1;
10844       node.y1 = y1;
10845       if (node.children) {
10846         p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
10847         x0 += paddingLeft(node) - p;
10848         y0 += paddingTop(node) - p;
10849         x1 -= paddingRight(node) - p;
10850         y1 -= paddingBottom(node) - p;
10851         if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10852         if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10853         tile(node, x0, y0, x1, y1);
10854       }
10855     }
10856
10857     treemap.round = function(x) {
10858       return arguments.length ? (round = !!x, treemap) : round;
10859     };
10860
10861     treemap.size = function(x) {
10862       return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
10863     };
10864
10865     treemap.tile = function(x) {
10866       return arguments.length ? (tile = required(x), treemap) : tile;
10867     };
10868
10869     treemap.padding = function(x) {
10870       return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
10871     };
10872
10873     treemap.paddingInner = function(x) {
10874       return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$8(+x), treemap) : paddingInner;
10875     };
10876
10877     treemap.paddingOuter = function(x) {
10878       return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
10879     };
10880
10881     treemap.paddingTop = function(x) {
10882       return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$8(+x), treemap) : paddingTop;
10883     };
10884
10885     treemap.paddingRight = function(x) {
10886       return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$8(+x), treemap) : paddingRight;
10887     };
10888
10889     treemap.paddingBottom = function(x) {
10890       return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$8(+x), treemap) : paddingBottom;
10891     };
10892
10893     treemap.paddingLeft = function(x) {
10894       return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$8(+x), treemap) : paddingLeft;
10895     };
10896
10897     return treemap;
10898   }
10899
10900   function binary(parent, x0, y0, x1, y1) {
10901     var nodes = parent.children,
10902         i, n = nodes.length,
10903         sum, sums = new Array(n + 1);
10904
10905     for (sums[0] = sum = i = 0; i < n; ++i) {
10906       sums[i + 1] = sum += nodes[i].value;
10907     }
10908
10909     partition(0, n, parent.value, x0, y0, x1, y1);
10910
10911     function partition(i, j, value, x0, y0, x1, y1) {
10912       if (i >= j - 1) {
10913         var node = nodes[i];
10914         node.x0 = x0, node.y0 = y0;
10915         node.x1 = x1, node.y1 = y1;
10916         return;
10917       }
10918
10919       var valueOffset = sums[i],
10920           valueTarget = (value / 2) + valueOffset,
10921           k = i + 1,
10922           hi = j - 1;
10923
10924       while (k < hi) {
10925         var mid = k + hi >>> 1;
10926         if (sums[mid] < valueTarget) k = mid + 1;
10927         else hi = mid;
10928       }
10929
10930       if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
10931
10932       var valueLeft = sums[k] - valueOffset,
10933           valueRight = value - valueLeft;
10934
10935       if ((x1 - x0) > (y1 - y0)) {
10936         var xk = (x0 * valueRight + x1 * valueLeft) / value;
10937         partition(i, k, valueLeft, x0, y0, xk, y1);
10938         partition(k, j, valueRight, xk, y0, x1, y1);
10939       } else {
10940         var yk = (y0 * valueRight + y1 * valueLeft) / value;
10941         partition(i, k, valueLeft, x0, y0, x1, yk);
10942         partition(k, j, valueRight, x0, yk, x1, y1);
10943       }
10944     }
10945   }
10946
10947   function sliceDice(parent, x0, y0, x1, y1) {
10948     (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
10949   }
10950
10951   var resquarify = (function custom(ratio) {
10952
10953     function resquarify(parent, x0, y0, x1, y1) {
10954       if ((rows = parent._squarify) && (rows.ratio === ratio)) {
10955         var rows,
10956             row,
10957             nodes,
10958             i,
10959             j = -1,
10960             n,
10961             m = rows.length,
10962             value = parent.value;
10963
10964         while (++j < m) {
10965           row = rows[j], nodes = row.children;
10966           for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
10967           if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
10968           else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
10969           value -= row.value;
10970         }
10971       } else {
10972         parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
10973         rows.ratio = ratio;
10974       }
10975     }
10976
10977     resquarify.ratio = function(x) {
10978       return custom((x = +x) > 1 ? x : 1);
10979     };
10980
10981     return resquarify;
10982   })(phi);
10983
10984   function d3_polygonArea(polygon) {
10985     var i = -1,
10986         n = polygon.length,
10987         a,
10988         b = polygon[n - 1],
10989         area = 0;
10990
10991     while (++i < n) {
10992       a = b;
10993       b = polygon[i];
10994       area += a[1] * b[0] - a[0] * b[1];
10995     }
10996
10997     return area / 2;
10998   }
10999
11000   function d3_polygonCentroid(polygon) {
11001     var i = -1,
11002         n = polygon.length,
11003         x = 0,
11004         y = 0,
11005         a,
11006         b = polygon[n - 1],
11007         c,
11008         k = 0;
11009
11010     while (++i < n) {
11011       a = b;
11012       b = polygon[i];
11013       k += c = a[0] * b[1] - b[0] * a[1];
11014       x += (a[0] + b[0]) * c;
11015       y += (a[1] + b[1]) * c;
11016     }
11017
11018     return k *= 3, [x / k, y / k];
11019   }
11020
11021   // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
11022   // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
11023   // right, +y is up). Returns a positive value if ABC is counter-clockwise,
11024   // negative if clockwise, and zero if the points are collinear.
11025   function cross$1(a, b, c) {
11026     return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
11027   }
11028
11029   function lexicographicOrder(a, b) {
11030     return a[0] - b[0] || a[1] - b[1];
11031   }
11032
11033   // Computes the upper convex hull per the monotone chain algorithm.
11034   // Assumes points.length >= 3, is sorted by x, unique in y.
11035   // Returns an array of indices into points in left-to-right order.
11036   function computeUpperHullIndexes(points) {
11037     var n = points.length,
11038         indexes = [0, 1],
11039         size = 2;
11040
11041     for (var i = 2; i < n; ++i) {
11042       while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
11043       indexes[size++] = i;
11044     }
11045
11046     return indexes.slice(0, size); // remove popped points
11047   }
11048
11049   function d3_polygonHull(points) {
11050     if ((n = points.length) < 3) return null;
11051
11052     var i,
11053         n,
11054         sortedPoints = new Array(n),
11055         flippedPoints = new Array(n);
11056
11057     for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
11058     sortedPoints.sort(lexicographicOrder);
11059     for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
11060
11061     var upperIndexes = computeUpperHullIndexes(sortedPoints),
11062         lowerIndexes = computeUpperHullIndexes(flippedPoints);
11063
11064     // Construct the hull polygon, removing possible duplicate endpoints.
11065     var skipLeft = lowerIndexes[0] === upperIndexes[0],
11066         skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
11067         hull = [];
11068
11069     // Add upper hull in right-to-l order.
11070     // Then add lower hull in left-to-right order.
11071     for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
11072     for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
11073
11074     return hull;
11075   }
11076
11077   function contains$1(polygon, point) {
11078     var n = polygon.length,
11079         p = polygon[n - 1],
11080         x = point[0], y = point[1],
11081         x0 = p[0], y0 = p[1],
11082         x1, y1,
11083         inside = false;
11084
11085     for (var i = 0; i < n; ++i) {
11086       p = polygon[i], x1 = p[0], y1 = p[1];
11087       if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
11088       x0 = x1, y0 = y1;
11089     }
11090
11091     return inside;
11092   }
11093
11094   function length$2(polygon) {
11095     var i = -1,
11096         n = polygon.length,
11097         b = polygon[n - 1],
11098         xa,
11099         ya,
11100         xb = b[0],
11101         yb = b[1],
11102         perimeter = 0;
11103
11104     while (++i < n) {
11105       xa = xb;
11106       ya = yb;
11107       b = polygon[i];
11108       xb = b[0];
11109       yb = b[1];
11110       xa -= xb;
11111       ya -= yb;
11112       perimeter += Math.sqrt(xa * xa + ya * ya);
11113     }
11114
11115     return perimeter;
11116   }
11117
11118   var slice$4 = [].slice;
11119
11120   var noabort = {};
11121
11122   function Queue(size) {
11123     this._size = size;
11124     this._call =
11125     this._error = null;
11126     this._tasks = [];
11127     this._data = [];
11128     this._waiting =
11129     this._active =
11130     this._ended =
11131     this._start = 0; // inside a synchronous task callback?
11132   }
11133
11134   Queue.prototype = queue.prototype = {
11135     constructor: Queue,
11136     defer: function(callback) {
11137       if (typeof callback !== "function") throw new Error("invalid callback");
11138       if (this._call) throw new Error("defer after await");
11139       if (this._error != null) return this;
11140       var t = slice$4.call(arguments, 1);
11141       t.push(callback);
11142       ++this._waiting, this._tasks.push(t);
11143       poke$1(this);
11144       return this;
11145     },
11146     abort: function() {
11147       if (this._error == null) abort(this, new Error("abort"));
11148       return this;
11149     },
11150     await: function(callback) {
11151       if (typeof callback !== "function") throw new Error("invalid callback");
11152       if (this._call) throw new Error("multiple await");
11153       this._call = function(error, results) { callback.apply(null, [error].concat(results)); };
11154       maybeNotify(this);
11155       return this;
11156     },
11157     awaitAll: function(callback) {
11158       if (typeof callback !== "function") throw new Error("invalid callback");
11159       if (this._call) throw new Error("multiple await");
11160       this._call = callback;
11161       maybeNotify(this);
11162       return this;
11163     }
11164   };
11165
11166   function poke$1(q) {
11167     if (!q._start) {
11168       try { start$1(q); } // let the current task complete
11169       catch (e) {
11170         if (q._tasks[q._ended + q._active - 1]) abort(q, e); // task errored synchronously
11171         else if (!q._data) throw e; // await callback errored synchronously
11172       }
11173     }
11174   }
11175
11176   function start$1(q) {
11177     while (q._start = q._waiting && q._active < q._size) {
11178       var i = q._ended + q._active,
11179           t = q._tasks[i],
11180           j = t.length - 1,
11181           c = t[j];
11182       t[j] = end(q, i);
11183       --q._waiting, ++q._active;
11184       t = c.apply(null, t);
11185       if (!q._tasks[i]) continue; // task finished synchronously
11186       q._tasks[i] = t || noabort;
11187     }
11188   }
11189
11190   function end(q, i) {
11191     return function(e, r) {
11192       if (!q._tasks[i]) return; // ignore multiple callbacks
11193       --q._active, ++q._ended;
11194       q._tasks[i] = null;
11195       if (q._error != null) return; // ignore secondary errors
11196       if (e != null) {
11197         abort(q, e);
11198       } else {
11199         q._data[i] = r;
11200         if (q._waiting) poke$1(q);
11201         else maybeNotify(q);
11202       }
11203     };
11204   }
11205
11206   function abort(q, e) {
11207     var i = q._tasks.length, t;
11208     q._error = e; // ignore active callbacks
11209     q._data = undefined; // allow gc
11210     q._waiting = NaN; // prevent starting
11211
11212     while (--i >= 0) {
11213       if (t = q._tasks[i]) {
11214         q._tasks[i] = null;
11215         if (t.abort) {
11216           try { t.abort(); }
11217           catch (e) { /* ignore */ }
11218         }
11219       }
11220     }
11221
11222     q._active = NaN; // allow notification
11223     maybeNotify(q);
11224   }
11225
11226   function maybeNotify(q) {
11227     if (!q._active && q._call) {
11228       var d = q._data;
11229       q._data = undefined; // allow gc
11230       q._call(q._error, d);
11231     }
11232   }
11233
11234   function queue(concurrency) {
11235     if (concurrency == null) concurrency = Infinity;
11236     else if (!((concurrency = +concurrency) >= 1)) throw new Error("invalid concurrency");
11237     return new Queue(concurrency);
11238   }
11239
11240   function defaultSource$1() {
11241     return Math.random();
11242   }
11243
11244   var uniform = (function sourceRandomUniform(source) {
11245     function randomUniform(min, max) {
11246       min = min == null ? 0 : +min;
11247       max = max == null ? 1 : +max;
11248       if (arguments.length === 1) max = min, min = 0;
11249       else max -= min;
11250       return function() {
11251         return source() * max + min;
11252       };
11253     }
11254
11255     randomUniform.source = sourceRandomUniform;
11256
11257     return randomUniform;
11258   })(defaultSource$1);
11259
11260   var normal = (function sourceRandomNormal(source) {
11261     function randomNormal(mu, sigma) {
11262       var x, r;
11263       mu = mu == null ? 0 : +mu;
11264       sigma = sigma == null ? 1 : +sigma;
11265       return function() {
11266         var y;
11267
11268         // If available, use the second previously-generated uniform random.
11269         if (x != null) y = x, x = null;
11270
11271         // Otherwise, generate a new x and y.
11272         else do {
11273           x = source() * 2 - 1;
11274           y = source() * 2 - 1;
11275           r = x * x + y * y;
11276         } while (!r || r > 1);
11277
11278         return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
11279       };
11280     }
11281
11282     randomNormal.source = sourceRandomNormal;
11283
11284     return randomNormal;
11285   })(defaultSource$1);
11286
11287   var logNormal = (function sourceRandomLogNormal(source) {
11288     function randomLogNormal() {
11289       var randomNormal = normal.source(source).apply(this, arguments);
11290       return function() {
11291         return Math.exp(randomNormal());
11292       };
11293     }
11294
11295     randomLogNormal.source = sourceRandomLogNormal;
11296
11297     return randomLogNormal;
11298   })(defaultSource$1);
11299
11300   var irwinHall = (function sourceRandomIrwinHall(source) {
11301     function randomIrwinHall(n) {
11302       return function() {
11303         for (var sum = 0, i = 0; i < n; ++i) sum += source();
11304         return sum;
11305       };
11306     }
11307
11308     randomIrwinHall.source = sourceRandomIrwinHall;
11309
11310     return randomIrwinHall;
11311   })(defaultSource$1);
11312
11313   var bates = (function sourceRandomBates(source) {
11314     function randomBates(n) {
11315       var randomIrwinHall = irwinHall.source(source)(n);
11316       return function() {
11317         return randomIrwinHall() / n;
11318       };
11319     }
11320
11321     randomBates.source = sourceRandomBates;
11322
11323     return randomBates;
11324   })(defaultSource$1);
11325
11326   var exponential$1 = (function sourceRandomExponential(source) {
11327     function randomExponential(lambda) {
11328       return function() {
11329         return -Math.log(1 - source()) / lambda;
11330       };
11331     }
11332
11333     randomExponential.source = sourceRandomExponential;
11334
11335     return randomExponential;
11336   })(defaultSource$1);
11337
11338   function request(url, callback) {
11339     var request,
11340         event = dispatch("beforesend", "progress", "load", "error"),
11341         mimeType,
11342         headers = map$1(),
11343         xhr = new XMLHttpRequest,
11344         user = null,
11345         password = null,
11346         response,
11347         responseType,
11348         timeout = 0;
11349
11350     // If IE does not support CORS, use XDomainRequest.
11351     if (typeof XDomainRequest !== "undefined"
11352         && !("withCredentials" in xhr)
11353         && /^(http(s)?:)?\/\//.test(url)) xhr = new XDomainRequest;
11354
11355     "onload" in xhr
11356         ? xhr.onload = xhr.onerror = xhr.ontimeout = respond
11357         : xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); };
11358
11359     function respond(o) {
11360       var status = xhr.status, result;
11361       if (!status && hasResponse(xhr)
11362           || status >= 200 && status < 300
11363           || status === 304) {
11364         if (response) {
11365           try {
11366             result = response.call(request, xhr);
11367           } catch (e) {
11368             event.call("error", request, e);
11369             return;
11370           }
11371         } else {
11372           result = xhr;
11373         }
11374         event.call("load", request, result);
11375       } else {
11376         event.call("error", request, o);
11377       }
11378     }
11379
11380     xhr.onprogress = function(e) {
11381       event.call("progress", request, e);
11382     };
11383
11384     request = {
11385       header: function(name, value) {
11386         name = (name + "").toLowerCase();
11387         if (arguments.length < 2) return headers.get(name);
11388         if (value == null) headers.remove(name);
11389         else headers.set(name, value + "");
11390         return request;
11391       },
11392
11393       // If mimeType is non-null and no Accept header is set, a default is used.
11394       mimeType: function(value) {
11395         if (!arguments.length) return mimeType;
11396         mimeType = value == null ? null : value + "";
11397         return request;
11398       },
11399
11400       // Specifies what type the response value should take;
11401       // for instance, arraybuffer, blob, document, or text.
11402       responseType: function(value) {
11403         if (!arguments.length) return responseType;
11404         responseType = value;
11405         return request;
11406       },
11407
11408       timeout: function(value) {
11409         if (!arguments.length) return timeout;
11410         timeout = +value;
11411         return request;
11412       },
11413
11414       user: function(value) {
11415         return arguments.length < 1 ? user : (user = value == null ? null : value + "", request);
11416       },
11417
11418       password: function(value) {
11419         return arguments.length < 1 ? password : (password = value == null ? null : value + "", request);
11420       },
11421
11422       // Specify how to convert the response content to a specific type;
11423       // changes the callback value on "load" events.
11424       response: function(value) {
11425         response = value;
11426         return request;
11427       },
11428
11429       // Alias for send("GET", …).
11430       get: function(data, callback) {
11431         return request.send("GET", data, callback);
11432       },
11433
11434       // Alias for send("POST", …).
11435       post: function(data, callback) {
11436         return request.send("POST", data, callback);
11437       },
11438
11439       // If callback is non-null, it will be used for error and load events.
11440       send: function(method, data, callback) {
11441         xhr.open(method, url, true, user, password);
11442         if (mimeType != null && !headers.has("accept")) headers.set("accept", mimeType + ",*/*");
11443         if (xhr.setRequestHeader) headers.each(function(value, name) { xhr.setRequestHeader(name, value); });
11444         if (mimeType != null && xhr.overrideMimeType) xhr.overrideMimeType(mimeType);
11445         if (responseType != null) xhr.responseType = responseType;
11446         if (timeout > 0) xhr.timeout = timeout;
11447         if (callback == null && typeof data === "function") callback = data, data = null;
11448         if (callback != null && callback.length === 1) callback = fixCallback(callback);
11449         if (callback != null) request.on("error", callback).on("load", function(xhr) { callback(null, xhr); });
11450         event.call("beforesend", request, xhr);
11451         xhr.send(data == null ? null : data);
11452         return request;
11453       },
11454
11455       abort: function() {
11456         xhr.abort();
11457         return request;
11458       },
11459
11460       on: function() {
11461         var value = event.on.apply(event, arguments);
11462         return value === event ? request : value;
11463       }
11464     };
11465
11466     if (callback != null) {
11467       if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11468       return request.get(callback);
11469     }
11470
11471     return request;
11472   }
11473
11474   function fixCallback(callback) {
11475     return function(error, xhr) {
11476       callback(error == null ? xhr : null);
11477     };
11478   }
11479
11480   function hasResponse(xhr) {
11481     var type = xhr.responseType;
11482     return type && type !== "text"
11483         ? xhr.response // null on error
11484         : xhr.responseText; // "" on error
11485   }
11486
11487   function type$1(defaultMimeType, response) {
11488     return function(url, callback) {
11489       var r = request(url).mimeType(defaultMimeType).response(response);
11490       if (callback != null) {
11491         if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11492         return r.get(callback);
11493       }
11494       return r;
11495     };
11496   }
11497
11498   var html = type$1("text/html", function(xhr) {
11499     return document.createRange().createContextualFragment(xhr.responseText);
11500   });
11501
11502   var d3_json = type$1("application/json", function(xhr) {
11503     return JSON.parse(xhr.responseText);
11504   });
11505
11506   var d3_text = type$1("text/plain", function(xhr) {
11507     return xhr.responseText;
11508   });
11509
11510   var d3_xml = type$1("application/xml", function(xhr) {
11511     var xml = xhr.responseXML;
11512     if (!xml) throw new Error("parse error");
11513     return xml;
11514   });
11515
11516   function dsv$1(defaultMimeType, parse) {
11517     return function(url, row, callback) {
11518       if (arguments.length < 3) callback = row, row = null;
11519       var r = request(url).mimeType(defaultMimeType);
11520       r.row = function(_) { return arguments.length ? r.response(responseOf(parse, row = _)) : row; };
11521       r.row(row);
11522       return callback ? r.get(callback) : r;
11523     };
11524   }
11525
11526   function responseOf(parse, row) {
11527     return function(request$$1) {
11528       return parse(request$$1.responseText, row);
11529     };
11530   }
11531
11532   var csv$1 = dsv$1("text/csv", csvParse);
11533
11534   var tsv$1 = dsv$1("text/tab-separated-values", tsvParse);
11535
11536   var array$2 = Array.prototype;
11537
11538   var map$2 = array$2.map;
11539   var slice$5 = array$2.slice;
11540
11541   var implicit = {name: "implicit"};
11542
11543   function ordinal(range) {
11544     var index = map$1(),
11545         domain = [],
11546         unknown = implicit;
11547
11548     range = range == null ? [] : slice$5.call(range);
11549
11550     function scale(d) {
11551       var key = d + "", i = index.get(key);
11552       if (!i) {
11553         if (unknown !== implicit) return unknown;
11554         index.set(key, i = domain.push(d));
11555       }
11556       return range[(i - 1) % range.length];
11557     }
11558
11559     scale.domain = function(_) {
11560       if (!arguments.length) return domain.slice();
11561       domain = [], index = map$1();
11562       var i = -1, n = _.length, d, key;
11563       while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
11564       return scale;
11565     };
11566
11567     scale.range = function(_) {
11568       return arguments.length ? (range = slice$5.call(_), scale) : range.slice();
11569     };
11570
11571     scale.unknown = function(_) {
11572       return arguments.length ? (unknown = _, scale) : unknown;
11573     };
11574
11575     scale.copy = function() {
11576       return ordinal()
11577           .domain(domain)
11578           .range(range)
11579           .unknown(unknown);
11580     };
11581
11582     return scale;
11583   }
11584
11585   function band() {
11586     var scale = ordinal().unknown(undefined),
11587         domain = scale.domain,
11588         ordinalRange = scale.range,
11589         range$$1 = [0, 1],
11590         step,
11591         bandwidth,
11592         round = false,
11593         paddingInner = 0,
11594         paddingOuter = 0,
11595         align = 0.5;
11596
11597     delete scale.unknown;
11598
11599     function rescale() {
11600       var n = domain().length,
11601           reverse = range$$1[1] < range$$1[0],
11602           start = range$$1[reverse - 0],
11603           stop = range$$1[1 - reverse];
11604       step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
11605       if (round) step = Math.floor(step);
11606       start += (stop - start - step * (n - paddingInner)) * align;
11607       bandwidth = step * (1 - paddingInner);
11608       if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
11609       var values = range(n).map(function(i) { return start + step * i; });
11610       return ordinalRange(reverse ? values.reverse() : values);
11611     }
11612
11613     scale.domain = function(_) {
11614       return arguments.length ? (domain(_), rescale()) : domain();
11615     };
11616
11617     scale.range = function(_) {
11618       return arguments.length ? (range$$1 = [+_[0], +_[1]], rescale()) : range$$1.slice();
11619     };
11620
11621     scale.rangeRound = function(_) {
11622       return range$$1 = [+_[0], +_[1]], round = true, rescale();
11623     };
11624
11625     scale.bandwidth = function() {
11626       return bandwidth;
11627     };
11628
11629     scale.step = function() {
11630       return step;
11631     };
11632
11633     scale.round = function(_) {
11634       return arguments.length ? (round = !!_, rescale()) : round;
11635     };
11636
11637     scale.padding = function(_) {
11638       return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11639     };
11640
11641     scale.paddingInner = function(_) {
11642       return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11643     };
11644
11645     scale.paddingOuter = function(_) {
11646       return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
11647     };
11648
11649     scale.align = function(_) {
11650       return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
11651     };
11652
11653     scale.copy = function() {
11654       return band()
11655           .domain(domain())
11656           .range(range$$1)
11657           .round(round)
11658           .paddingInner(paddingInner)
11659           .paddingOuter(paddingOuter)
11660           .align(align);
11661     };
11662
11663     return rescale();
11664   }
11665
11666   function pointish(scale) {
11667     var copy = scale.copy;
11668
11669     scale.padding = scale.paddingOuter;
11670     delete scale.paddingInner;
11671     delete scale.paddingOuter;
11672
11673     scale.copy = function() {
11674       return pointish(copy());
11675     };
11676
11677     return scale;
11678   }
11679
11680   function point$1() {
11681     return pointish(band().paddingInner(1));
11682   }
11683
11684   function constant$9(x) {
11685     return function() {
11686       return x;
11687     };
11688   }
11689
11690   function number$2(x) {
11691     return +x;
11692   }
11693
11694   var unit = [0, 1];
11695
11696   function deinterpolateLinear(a, b) {
11697     return (b -= (a = +a))
11698         ? function(x) { return (x - a) / b; }
11699         : constant$9(b);
11700   }
11701
11702   function deinterpolateClamp(deinterpolate) {
11703     return function(a, b) {
11704       var d = deinterpolate(a = +a, b = +b);
11705       return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };
11706     };
11707   }
11708
11709   function reinterpolateClamp(reinterpolate) {
11710     return function(a, b) {
11711       var r = reinterpolate(a = +a, b = +b);
11712       return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };
11713     };
11714   }
11715
11716   function bimap(domain, range$$1, deinterpolate, reinterpolate) {
11717     var d0 = domain[0], d1 = domain[1], r0 = range$$1[0], r1 = range$$1[1];
11718     if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);
11719     else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);
11720     return function(x) { return r0(d0(x)); };
11721   }
11722
11723   function polymap(domain, range$$1, deinterpolate, reinterpolate) {
11724     var j = Math.min(domain.length, range$$1.length) - 1,
11725         d = new Array(j),
11726         r = new Array(j),
11727         i = -1;
11728
11729     // Reverse descending domains.
11730     if (domain[j] < domain[0]) {
11731       domain = domain.slice().reverse();
11732       range$$1 = range$$1.slice().reverse();
11733     }
11734
11735     while (++i < j) {
11736       d[i] = deinterpolate(domain[i], domain[i + 1]);
11737       r[i] = reinterpolate(range$$1[i], range$$1[i + 1]);
11738     }
11739
11740     return function(x) {
11741       var i = bisectRight(domain, x, 1, j) - 1;
11742       return r[i](d[i](x));
11743     };
11744   }
11745
11746   function copy(source, target) {
11747     return target
11748         .domain(source.domain())
11749         .range(source.range())
11750         .interpolate(source.interpolate())
11751         .clamp(source.clamp());
11752   }
11753
11754   // deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
11755   // reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].
11756   function continuous(deinterpolate, reinterpolate) {
11757     var domain = unit,
11758         range$$1 = unit,
11759         interpolate$$1 = interpolate,
11760         clamp = false,
11761         piecewise,
11762         output,
11763         input;
11764
11765     function rescale() {
11766       piecewise = Math.min(domain.length, range$$1.length) > 2 ? polymap : bimap;
11767       output = input = null;
11768       return scale;
11769     }
11770
11771     function scale(x) {
11772       return (output || (output = piecewise(domain, range$$1, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate$$1)))(+x);
11773     }
11774
11775     scale.invert = function(y) {
11776       return (input || (input = piecewise(range$$1, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);
11777     };
11778
11779     scale.domain = function(_) {
11780       return arguments.length ? (domain = map$2.call(_, number$2), rescale()) : domain.slice();
11781     };
11782
11783     scale.range = function(_) {
11784       return arguments.length ? (range$$1 = slice$5.call(_), rescale()) : range$$1.slice();
11785     };
11786
11787     scale.rangeRound = function(_) {
11788       return range$$1 = slice$5.call(_), interpolate$$1 = interpolateRound, rescale();
11789     };
11790
11791     scale.clamp = function(_) {
11792       return arguments.length ? (clamp = !!_, rescale()) : clamp;
11793     };
11794
11795     scale.interpolate = function(_) {
11796       return arguments.length ? (interpolate$$1 = _, rescale()) : interpolate$$1;
11797     };
11798
11799     return rescale();
11800   }
11801
11802   function tickFormat(domain, count, specifier) {
11803     var start = domain[0],
11804         stop = domain[domain.length - 1],
11805         step = tickStep(start, stop, count == null ? 10 : count),
11806         precision;
11807     specifier = formatSpecifier(specifier == null ? ",f" : specifier);
11808     switch (specifier.type) {
11809       case "s": {
11810         var value = Math.max(Math.abs(start), Math.abs(stop));
11811         if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
11812         return formatPrefix(specifier, value);
11813       }
11814       case "":
11815       case "e":
11816       case "g":
11817       case "p":
11818       case "r": {
11819         if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
11820         break;
11821       }
11822       case "f":
11823       case "%": {
11824         if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
11825         break;
11826       }
11827     }
11828     return format(specifier);
11829   }
11830
11831   function linearish(scale) {
11832     var domain = scale.domain;
11833
11834     scale.ticks = function(count) {
11835       var d = domain();
11836       return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
11837     };
11838
11839     scale.tickFormat = function(count, specifier) {
11840       return tickFormat(domain(), count, specifier);
11841     };
11842
11843     scale.nice = function(count) {
11844       if (count == null) count = 10;
11845
11846       var d = domain(),
11847           i0 = 0,
11848           i1 = d.length - 1,
11849           start = d[i0],
11850           stop = d[i1],
11851           step;
11852
11853       if (stop < start) {
11854         step = start, start = stop, stop = step;
11855         step = i0, i0 = i1, i1 = step;
11856       }
11857
11858       step = tickIncrement(start, stop, count);
11859
11860       if (step > 0) {
11861         start = Math.floor(start / step) * step;
11862         stop = Math.ceil(stop / step) * step;
11863         step = tickIncrement(start, stop, count);
11864       } else if (step < 0) {
11865         start = Math.ceil(start * step) / step;
11866         stop = Math.floor(stop * step) / step;
11867         step = tickIncrement(start, stop, count);
11868       }
11869
11870       if (step > 0) {
11871         d[i0] = Math.floor(start / step) * step;
11872         d[i1] = Math.ceil(stop / step) * step;
11873         domain(d);
11874       } else if (step < 0) {
11875         d[i0] = Math.ceil(start * step) / step;
11876         d[i1] = Math.floor(stop * step) / step;
11877         domain(d);
11878       }
11879
11880       return scale;
11881     };
11882
11883     return scale;
11884   }
11885
11886   function linear$2() {
11887     var scale = continuous(deinterpolateLinear, interpolateNumber);
11888
11889     scale.copy = function() {
11890       return copy(scale, linear$2());
11891     };
11892
11893     return linearish(scale);
11894   }
11895
11896   function identity$5() {
11897     var domain = [0, 1];
11898
11899     function scale(x) {
11900       return +x;
11901     }
11902
11903     scale.invert = scale;
11904
11905     scale.domain = scale.range = function(_) {
11906       return arguments.length ? (domain = map$2.call(_, number$2), scale) : domain.slice();
11907     };
11908
11909     scale.copy = function() {
11910       return identity$5().domain(domain);
11911     };
11912
11913     return linearish(scale);
11914   }
11915
11916   function nice(domain, interval) {
11917     domain = domain.slice();
11918
11919     var i0 = 0,
11920         i1 = domain.length - 1,
11921         x0 = domain[i0],
11922         x1 = domain[i1],
11923         t;
11924
11925     if (x1 < x0) {
11926       t = i0, i0 = i1, i1 = t;
11927       t = x0, x0 = x1, x1 = t;
11928     }
11929
11930     domain[i0] = interval.floor(x0);
11931     domain[i1] = interval.ceil(x1);
11932     return domain;
11933   }
11934
11935   function deinterpolate(a, b) {
11936     return (b = Math.log(b / a))
11937         ? function(x) { return Math.log(x / a) / b; }
11938         : constant$9(b);
11939   }
11940
11941   function reinterpolate(a, b) {
11942     return a < 0
11943         ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }
11944         : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };
11945   }
11946
11947   function pow10(x) {
11948     return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
11949   }
11950
11951   function powp(base) {
11952     return base === 10 ? pow10
11953         : base === Math.E ? Math.exp
11954         : function(x) { return Math.pow(base, x); };
11955   }
11956
11957   function logp(base) {
11958     return base === Math.E ? Math.log
11959         : base === 10 && Math.log10
11960         || base === 2 && Math.log2
11961         || (base = Math.log(base), function(x) { return Math.log(x) / base; });
11962   }
11963
11964   function reflect(f) {
11965     return function(x) {
11966       return -f(-x);
11967     };
11968   }
11969
11970   function log$1() {
11971     var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),
11972         domain = scale.domain,
11973         base = 10,
11974         logs = logp(10),
11975         pows = powp(10);
11976
11977     function rescale() {
11978       logs = logp(base), pows = powp(base);
11979       if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);
11980       return scale;
11981     }
11982
11983     scale.base = function(_) {
11984       return arguments.length ? (base = +_, rescale()) : base;
11985     };
11986
11987     scale.domain = function(_) {
11988       return arguments.length ? (domain(_), rescale()) : domain();
11989     };
11990
11991     scale.ticks = function(count) {
11992       var d = domain(),
11993           u = d[0],
11994           v = d[d.length - 1],
11995           r;
11996
11997       if (r = v < u) i = u, u = v, v = i;
11998
11999       var i = logs(u),
12000           j = logs(v),
12001           p,
12002           k,
12003           t,
12004           n = count == null ? 10 : +count,
12005           z = [];
12006
12007       if (!(base % 1) && j - i < n) {
12008         i = Math.round(i) - 1, j = Math.round(j) + 1;
12009         if (u > 0) for (; i < j; ++i) {
12010           for (k = 1, p = pows(i); k < base; ++k) {
12011             t = p * k;
12012             if (t < u) continue;
12013             if (t > v) break;
12014             z.push(t);
12015           }
12016         } else for (; i < j; ++i) {
12017           for (k = base - 1, p = pows(i); k >= 1; --k) {
12018             t = p * k;
12019             if (t < u) continue;
12020             if (t > v) break;
12021             z.push(t);
12022           }
12023         }
12024       } else {
12025         z = ticks(i, j, Math.min(j - i, n)).map(pows);
12026       }
12027
12028       return r ? z.reverse() : z;
12029     };
12030
12031     scale.tickFormat = function(count, specifier) {
12032       if (specifier == null) specifier = base === 10 ? ".0e" : ",";
12033       if (typeof specifier !== "function") specifier = format(specifier);
12034       if (count === Infinity) return specifier;
12035       if (count == null) count = 10;
12036       var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
12037       return function(d) {
12038         var i = d / pows(Math.round(logs(d)));
12039         if (i * base < base - 0.5) i *= base;
12040         return i <= k ? specifier(d) : "";
12041       };
12042     };
12043
12044     scale.nice = function() {
12045       return domain(nice(domain(), {
12046         floor: function(x) { return pows(Math.floor(logs(x))); },
12047         ceil: function(x) { return pows(Math.ceil(logs(x))); }
12048       }));
12049     };
12050
12051     scale.copy = function() {
12052       return copy(scale, log$1().base(base));
12053     };
12054
12055     return scale;
12056   }
12057
12058   function raise$1(x, exponent) {
12059     return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
12060   }
12061
12062   function pow$1() {
12063     var exponent = 1,
12064         scale = continuous(deinterpolate, reinterpolate),
12065         domain = scale.domain;
12066
12067     function deinterpolate(a, b) {
12068       return (b = raise$1(b, exponent) - (a = raise$1(a, exponent)))
12069           ? function(x) { return (raise$1(x, exponent) - a) / b; }
12070           : constant$9(b);
12071     }
12072
12073     function reinterpolate(a, b) {
12074       b = raise$1(b, exponent) - (a = raise$1(a, exponent));
12075       return function(t) { return raise$1(a + b * t, 1 / exponent); };
12076     }
12077
12078     scale.exponent = function(_) {
12079       return arguments.length ? (exponent = +_, domain(domain())) : exponent;
12080     };
12081
12082     scale.copy = function() {
12083       return copy(scale, pow$1().exponent(exponent));
12084     };
12085
12086     return linearish(scale);
12087   }
12088
12089   function sqrt$1() {
12090     return pow$1().exponent(0.5);
12091   }
12092
12093   function quantile$1() {
12094     var domain = [],
12095         range$$1 = [],
12096         thresholds = [];
12097
12098     function rescale() {
12099       var i = 0, n = Math.max(1, range$$1.length);
12100       thresholds = new Array(n - 1);
12101       while (++i < n) thresholds[i - 1] = quantile(domain, i / n);
12102       return scale;
12103     }
12104
12105     function scale(x) {
12106       if (!isNaN(x = +x)) return range$$1[bisectRight(thresholds, x)];
12107     }
12108
12109     scale.invertExtent = function(y) {
12110       var i = range$$1.indexOf(y);
12111       return i < 0 ? [NaN, NaN] : [
12112         i > 0 ? thresholds[i - 1] : domain[0],
12113         i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
12114       ];
12115     };
12116
12117     scale.domain = function(_) {
12118       if (!arguments.length) return domain.slice();
12119       domain = [];
12120       for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
12121       domain.sort(ascending);
12122       return rescale();
12123     };
12124
12125     scale.range = function(_) {
12126       return arguments.length ? (range$$1 = slice$5.call(_), rescale()) : range$$1.slice();
12127     };
12128
12129     scale.quantiles = function() {
12130       return thresholds.slice();
12131     };
12132
12133     scale.copy = function() {
12134       return quantile$1()
12135           .domain(domain)
12136           .range(range$$1);
12137     };
12138
12139     return scale;
12140   }
12141
12142   function quantize() {
12143     var x0 = 0,
12144         x1 = 1,
12145         n = 1,
12146         domain = [0.5],
12147         range$$1 = [0, 1];
12148
12149     function scale(x) {
12150       if (x <= x) return range$$1[bisectRight(domain, x, 0, n)];
12151     }
12152
12153     function rescale() {
12154       var i = -1;
12155       domain = new Array(n);
12156       while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
12157       return scale;
12158     }
12159
12160     scale.domain = function(_) {
12161       return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
12162     };
12163
12164     scale.range = function(_) {
12165       return arguments.length ? (n = (range$$1 = slice$5.call(_)).length - 1, rescale()) : range$$1.slice();
12166     };
12167
12168     scale.invertExtent = function(y) {
12169       var i = range$$1.indexOf(y);
12170       return i < 0 ? [NaN, NaN]
12171           : i < 1 ? [x0, domain[0]]
12172           : i >= n ? [domain[n - 1], x1]
12173           : [domain[i - 1], domain[i]];
12174     };
12175
12176     scale.copy = function() {
12177       return quantize()
12178           .domain([x0, x1])
12179           .range(range$$1);
12180     };
12181
12182     return linearish(scale);
12183   }
12184
12185   function threshold() {
12186     var domain = [0.5],
12187         range$$1 = [0, 1],
12188         n = 1;
12189
12190     function scale(x) {
12191       if (x <= x) return range$$1[bisectRight(domain, x, 0, n)];
12192     }
12193
12194     scale.domain = function(_) {
12195       return arguments.length ? (domain = slice$5.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : domain.slice();
12196     };
12197
12198     scale.range = function(_) {
12199       return arguments.length ? (range$$1 = slice$5.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : range$$1.slice();
12200     };
12201
12202     scale.invertExtent = function(y) {
12203       var i = range$$1.indexOf(y);
12204       return [domain[i - 1], domain[i]];
12205     };
12206
12207     scale.copy = function() {
12208       return threshold()
12209           .domain(domain)
12210           .range(range$$1);
12211     };
12212
12213     return scale;
12214   }
12215
12216   var t0$1 = new Date,
12217       t1$1 = new Date;
12218
12219   function newInterval(floori, offseti, count, field) {
12220
12221     function interval(date) {
12222       return floori(date = new Date(+date)), date;
12223     }
12224
12225     interval.floor = interval;
12226
12227     interval.ceil = function(date) {
12228       return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
12229     };
12230
12231     interval.round = function(date) {
12232       var d0 = interval(date),
12233           d1 = interval.ceil(date);
12234       return date - d0 < d1 - date ? d0 : d1;
12235     };
12236
12237     interval.offset = function(date, step) {
12238       return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
12239     };
12240
12241     interval.range = function(start, stop, step) {
12242       var range = [], previous;
12243       start = interval.ceil(start);
12244       step = step == null ? 1 : Math.floor(step);
12245       if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
12246       do range.push(previous = new Date(+start)), offseti(start, step), floori(start);
12247       while (previous < start && start < stop);
12248       return range;
12249     };
12250
12251     interval.filter = function(test) {
12252       return newInterval(function(date) {
12253         if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
12254       }, function(date, step) {
12255         if (date >= date) {
12256           if (step < 0) while (++step <= 0) {
12257             while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
12258           } else while (--step >= 0) {
12259             while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
12260           }
12261         }
12262       });
12263     };
12264
12265     if (count) {
12266       interval.count = function(start, end) {
12267         t0$1.setTime(+start), t1$1.setTime(+end);
12268         floori(t0$1), floori(t1$1);
12269         return Math.floor(count(t0$1, t1$1));
12270       };
12271
12272       interval.every = function(step) {
12273         step = Math.floor(step);
12274         return !isFinite(step) || !(step > 0) ? null
12275             : !(step > 1) ? interval
12276             : interval.filter(field
12277                 ? function(d) { return field(d) % step === 0; }
12278                 : function(d) { return interval.count(0, d) % step === 0; });
12279       };
12280     }
12281
12282     return interval;
12283   }
12284
12285   var millisecond = newInterval(function() {
12286     // noop
12287   }, function(date, step) {
12288     date.setTime(+date + step);
12289   }, function(start, end) {
12290     return end - start;
12291   });
12292
12293   // An optimized implementation for this simple case.
12294   millisecond.every = function(k) {
12295     k = Math.floor(k);
12296     if (!isFinite(k) || !(k > 0)) return null;
12297     if (!(k > 1)) return millisecond;
12298     return newInterval(function(date) {
12299       date.setTime(Math.floor(date / k) * k);
12300     }, function(date, step) {
12301       date.setTime(+date + step * k);
12302     }, function(start, end) {
12303       return (end - start) / k;
12304     });
12305   };
12306   var milliseconds = millisecond.range;
12307
12308   var durationSecond = 1e3;
12309   var durationMinute = 6e4;
12310   var durationHour = 36e5;
12311   var durationDay = 864e5;
12312   var durationWeek = 6048e5;
12313
12314   var second = newInterval(function(date) {
12315     date.setTime(Math.floor(date / durationSecond) * durationSecond);
12316   }, function(date, step) {
12317     date.setTime(+date + step * durationSecond);
12318   }, function(start, end) {
12319     return (end - start) / durationSecond;
12320   }, function(date) {
12321     return date.getUTCSeconds();
12322   });
12323   var seconds = second.range;
12324
12325   var minute = newInterval(function(date) {
12326     date.setTime(Math.floor(date / durationMinute) * durationMinute);
12327   }, function(date, step) {
12328     date.setTime(+date + step * durationMinute);
12329   }, function(start, end) {
12330     return (end - start) / durationMinute;
12331   }, function(date) {
12332     return date.getMinutes();
12333   });
12334   var minutes = minute.range;
12335
12336   var hour = newInterval(function(date) {
12337     var offset = date.getTimezoneOffset() * durationMinute % durationHour;
12338     if (offset < 0) offset += durationHour;
12339     date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset);
12340   }, function(date, step) {
12341     date.setTime(+date + step * durationHour);
12342   }, function(start, end) {
12343     return (end - start) / durationHour;
12344   }, function(date) {
12345     return date.getHours();
12346   });
12347   var hours = hour.range;
12348
12349   var day = newInterval(function(date) {
12350     date.setHours(0, 0, 0, 0);
12351   }, function(date, step) {
12352     date.setDate(date.getDate() + step);
12353   }, function(start, end) {
12354     return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;
12355   }, function(date) {
12356     return date.getDate() - 1;
12357   });
12358   var days = day.range;
12359
12360   function weekday(i) {
12361     return newInterval(function(date) {
12362       date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
12363       date.setHours(0, 0, 0, 0);
12364     }, function(date, step) {
12365       date.setDate(date.getDate() + step * 7);
12366     }, function(start, end) {
12367       return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
12368     });
12369   }
12370
12371   var sunday = weekday(0);
12372   var monday = weekday(1);
12373   var tuesday = weekday(2);
12374   var wednesday = weekday(3);
12375   var thursday = weekday(4);
12376   var friday = weekday(5);
12377   var saturday = weekday(6);
12378
12379   var sundays = sunday.range;
12380   var mondays = monday.range;
12381   var tuesdays = tuesday.range;
12382   var wednesdays = wednesday.range;
12383   var thursdays = thursday.range;
12384   var fridays = friday.range;
12385   var saturdays = saturday.range;
12386
12387   var month = newInterval(function(date) {
12388     date.setDate(1);
12389     date.setHours(0, 0, 0, 0);
12390   }, function(date, step) {
12391     date.setMonth(date.getMonth() + step);
12392   }, function(start, end) {
12393     return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
12394   }, function(date) {
12395     return date.getMonth();
12396   });
12397   var months = month.range;
12398
12399   var year = newInterval(function(date) {
12400     date.setMonth(0, 1);
12401     date.setHours(0, 0, 0, 0);
12402   }, function(date, step) {
12403     date.setFullYear(date.getFullYear() + step);
12404   }, function(start, end) {
12405     return end.getFullYear() - start.getFullYear();
12406   }, function(date) {
12407     return date.getFullYear();
12408   });
12409
12410   // An optimized implementation for this simple case.
12411   year.every = function(k) {
12412     return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12413       date.setFullYear(Math.floor(date.getFullYear() / k) * k);
12414       date.setMonth(0, 1);
12415       date.setHours(0, 0, 0, 0);
12416     }, function(date, step) {
12417       date.setFullYear(date.getFullYear() + step * k);
12418     });
12419   };
12420   var years = year.range;
12421
12422   var utcMinute = newInterval(function(date) {
12423     date.setUTCSeconds(0, 0);
12424   }, function(date, step) {
12425     date.setTime(+date + step * durationMinute);
12426   }, function(start, end) {
12427     return (end - start) / durationMinute;
12428   }, function(date) {
12429     return date.getUTCMinutes();
12430   });
12431   var utcMinutes = utcMinute.range;
12432
12433   var utcHour = newInterval(function(date) {
12434     date.setUTCMinutes(0, 0, 0);
12435   }, function(date, step) {
12436     date.setTime(+date + step * durationHour);
12437   }, function(start, end) {
12438     return (end - start) / durationHour;
12439   }, function(date) {
12440     return date.getUTCHours();
12441   });
12442   var utcHours = utcHour.range;
12443
12444   var utcDay = newInterval(function(date) {
12445     date.setUTCHours(0, 0, 0, 0);
12446   }, function(date, step) {
12447     date.setUTCDate(date.getUTCDate() + step);
12448   }, function(start, end) {
12449     return (end - start) / durationDay;
12450   }, function(date) {
12451     return date.getUTCDate() - 1;
12452   });
12453   var utcDays = utcDay.range;
12454
12455   function utcWeekday(i) {
12456     return newInterval(function(date) {
12457       date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
12458       date.setUTCHours(0, 0, 0, 0);
12459     }, function(date, step) {
12460       date.setUTCDate(date.getUTCDate() + step * 7);
12461     }, function(start, end) {
12462       return (end - start) / durationWeek;
12463     });
12464   }
12465
12466   var utcSunday = utcWeekday(0);
12467   var utcMonday = utcWeekday(1);
12468   var utcTuesday = utcWeekday(2);
12469   var utcWednesday = utcWeekday(3);
12470   var utcThursday = utcWeekday(4);
12471   var utcFriday = utcWeekday(5);
12472   var utcSaturday = utcWeekday(6);
12473
12474   var utcSundays = utcSunday.range;
12475   var utcMondays = utcMonday.range;
12476   var utcTuesdays = utcTuesday.range;
12477   var utcWednesdays = utcWednesday.range;
12478   var utcThursdays = utcThursday.range;
12479   var utcFridays = utcFriday.range;
12480   var utcSaturdays = utcSaturday.range;
12481
12482   var utcMonth = newInterval(function(date) {
12483     date.setUTCDate(1);
12484     date.setUTCHours(0, 0, 0, 0);
12485   }, function(date, step) {
12486     date.setUTCMonth(date.getUTCMonth() + step);
12487   }, function(start, end) {
12488     return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
12489   }, function(date) {
12490     return date.getUTCMonth();
12491   });
12492   var utcMonths = utcMonth.range;
12493
12494   var utcYear = newInterval(function(date) {
12495     date.setUTCMonth(0, 1);
12496     date.setUTCHours(0, 0, 0, 0);
12497   }, function(date, step) {
12498     date.setUTCFullYear(date.getUTCFullYear() + step);
12499   }, function(start, end) {
12500     return end.getUTCFullYear() - start.getUTCFullYear();
12501   }, function(date) {
12502     return date.getUTCFullYear();
12503   });
12504
12505   // An optimized implementation for this simple case.
12506   utcYear.every = function(k) {
12507     return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12508       date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
12509       date.setUTCMonth(0, 1);
12510       date.setUTCHours(0, 0, 0, 0);
12511     }, function(date, step) {
12512       date.setUTCFullYear(date.getUTCFullYear() + step * k);
12513     });
12514   };
12515   var utcYears = utcYear.range;
12516
12517   function localDate(d) {
12518     if (0 <= d.y && d.y < 100) {
12519       var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
12520       date.setFullYear(d.y);
12521       return date;
12522     }
12523     return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
12524   }
12525
12526   function utcDate(d) {
12527     if (0 <= d.y && d.y < 100) {
12528       var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
12529       date.setUTCFullYear(d.y);
12530       return date;
12531     }
12532     return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
12533   }
12534
12535   function newYear(y) {
12536     return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
12537   }
12538
12539   function formatLocale$1(locale) {
12540     var locale_dateTime = locale.dateTime,
12541         locale_date = locale.date,
12542         locale_time = locale.time,
12543         locale_periods = locale.periods,
12544         locale_weekdays = locale.days,
12545         locale_shortWeekdays = locale.shortDays,
12546         locale_months = locale.months,
12547         locale_shortMonths = locale.shortMonths;
12548
12549     var periodRe = formatRe(locale_periods),
12550         periodLookup = formatLookup(locale_periods),
12551         weekdayRe = formatRe(locale_weekdays),
12552         weekdayLookup = formatLookup(locale_weekdays),
12553         shortWeekdayRe = formatRe(locale_shortWeekdays),
12554         shortWeekdayLookup = formatLookup(locale_shortWeekdays),
12555         monthRe = formatRe(locale_months),
12556         monthLookup = formatLookup(locale_months),
12557         shortMonthRe = formatRe(locale_shortMonths),
12558         shortMonthLookup = formatLookup(locale_shortMonths);
12559
12560     var formats = {
12561       "a": formatShortWeekday,
12562       "A": formatWeekday,
12563       "b": formatShortMonth,
12564       "B": formatMonth,
12565       "c": null,
12566       "d": formatDayOfMonth,
12567       "e": formatDayOfMonth,
12568       "f": formatMicroseconds,
12569       "H": formatHour24,
12570       "I": formatHour12,
12571       "j": formatDayOfYear,
12572       "L": formatMilliseconds,
12573       "m": formatMonthNumber,
12574       "M": formatMinutes,
12575       "p": formatPeriod,
12576       "Q": formatUnixTimestamp,
12577       "s": formatUnixTimestampSeconds,
12578       "S": formatSeconds,
12579       "u": formatWeekdayNumberMonday,
12580       "U": formatWeekNumberSunday,
12581       "V": formatWeekNumberISO,
12582       "w": formatWeekdayNumberSunday,
12583       "W": formatWeekNumberMonday,
12584       "x": null,
12585       "X": null,
12586       "y": formatYear,
12587       "Y": formatFullYear,
12588       "Z": formatZone,
12589       "%": formatLiteralPercent
12590     };
12591
12592     var utcFormats = {
12593       "a": formatUTCShortWeekday,
12594       "A": formatUTCWeekday,
12595       "b": formatUTCShortMonth,
12596       "B": formatUTCMonth,
12597       "c": null,
12598       "d": formatUTCDayOfMonth,
12599       "e": formatUTCDayOfMonth,
12600       "f": formatUTCMicroseconds,
12601       "H": formatUTCHour24,
12602       "I": formatUTCHour12,
12603       "j": formatUTCDayOfYear,
12604       "L": formatUTCMilliseconds,
12605       "m": formatUTCMonthNumber,
12606       "M": formatUTCMinutes,
12607       "p": formatUTCPeriod,
12608       "Q": formatUnixTimestamp,
12609       "s": formatUnixTimestampSeconds,
12610       "S": formatUTCSeconds,
12611       "u": formatUTCWeekdayNumberMonday,
12612       "U": formatUTCWeekNumberSunday,
12613       "V": formatUTCWeekNumberISO,
12614       "w": formatUTCWeekdayNumberSunday,
12615       "W": formatUTCWeekNumberMonday,
12616       "x": null,
12617       "X": null,
12618       "y": formatUTCYear,
12619       "Y": formatUTCFullYear,
12620       "Z": formatUTCZone,
12621       "%": formatLiteralPercent
12622     };
12623
12624     var parses = {
12625       "a": parseShortWeekday,
12626       "A": parseWeekday,
12627       "b": parseShortMonth,
12628       "B": parseMonth,
12629       "c": parseLocaleDateTime,
12630       "d": parseDayOfMonth,
12631       "e": parseDayOfMonth,
12632       "f": parseMicroseconds,
12633       "H": parseHour24,
12634       "I": parseHour24,
12635       "j": parseDayOfYear,
12636       "L": parseMilliseconds,
12637       "m": parseMonthNumber,
12638       "M": parseMinutes,
12639       "p": parsePeriod,
12640       "Q": parseUnixTimestamp,
12641       "s": parseUnixTimestampSeconds,
12642       "S": parseSeconds,
12643       "u": parseWeekdayNumberMonday,
12644       "U": parseWeekNumberSunday,
12645       "V": parseWeekNumberISO,
12646       "w": parseWeekdayNumberSunday,
12647       "W": parseWeekNumberMonday,
12648       "x": parseLocaleDate,
12649       "X": parseLocaleTime,
12650       "y": parseYear,
12651       "Y": parseFullYear,
12652       "Z": parseZone,
12653       "%": parseLiteralPercent
12654     };
12655
12656     // These recursive directive definitions must be deferred.
12657     formats.x = newFormat(locale_date, formats);
12658     formats.X = newFormat(locale_time, formats);
12659     formats.c = newFormat(locale_dateTime, formats);
12660     utcFormats.x = newFormat(locale_date, utcFormats);
12661     utcFormats.X = newFormat(locale_time, utcFormats);
12662     utcFormats.c = newFormat(locale_dateTime, utcFormats);
12663
12664     function newFormat(specifier, formats) {
12665       return function(date) {
12666         var string = [],
12667             i = -1,
12668             j = 0,
12669             n = specifier.length,
12670             c,
12671             pad,
12672             format;
12673
12674         if (!(date instanceof Date)) date = new Date(+date);
12675
12676         while (++i < n) {
12677           if (specifier.charCodeAt(i) === 37) {
12678             string.push(specifier.slice(j, i));
12679             if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
12680             else pad = c === "e" ? " " : "0";
12681             if (format = formats[c]) c = format(date, pad);
12682             string.push(c);
12683             j = i + 1;
12684           }
12685         }
12686
12687         string.push(specifier.slice(j, i));
12688         return string.join("");
12689       };
12690     }
12691
12692     function newParse(specifier, newDate) {
12693       return function(string) {
12694         var d = newYear(1900),
12695             i = parseSpecifier(d, specifier, string += "", 0),
12696             week, day$$1;
12697         if (i != string.length) return null;
12698
12699         // If a UNIX timestamp is specified, return it.
12700         if ("Q" in d) return new Date(d.Q);
12701
12702         // The am-pm flag is 0 for AM, and 1 for PM.
12703         if ("p" in d) d.H = d.H % 12 + d.p * 12;
12704
12705         // Convert day-of-week and week-of-year to day-of-year.
12706         if ("V" in d) {
12707           if (d.V < 1 || d.V > 53) return null;
12708           if (!("w" in d)) d.w = 1;
12709           if ("Z" in d) {
12710             week = utcDate(newYear(d.y)), day$$1 = week.getUTCDay();
12711             week = day$$1 > 4 || day$$1 === 0 ? utcMonday.ceil(week) : utcMonday(week);
12712             week = utcDay.offset(week, (d.V - 1) * 7);
12713             d.y = week.getUTCFullYear();
12714             d.m = week.getUTCMonth();
12715             d.d = week.getUTCDate() + (d.w + 6) % 7;
12716           } else {
12717             week = newDate(newYear(d.y)), day$$1 = week.getDay();
12718             week = day$$1 > 4 || day$$1 === 0 ? monday.ceil(week) : monday(week);
12719             week = day.offset(week, (d.V - 1) * 7);
12720             d.y = week.getFullYear();
12721             d.m = week.getMonth();
12722             d.d = week.getDate() + (d.w + 6) % 7;
12723           }
12724         } else if ("W" in d || "U" in d) {
12725           if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;
12726           day$$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
12727           d.m = 0;
12728           d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day$$1 + 5) % 7 : d.w + d.U * 7 - (day$$1 + 6) % 7;
12729         }
12730
12731         // If a time zone is specified, all fields are interpreted as UTC and then
12732         // offset according to the specified time zone.
12733         if ("Z" in d) {
12734           d.H += d.Z / 100 | 0;
12735           d.M += d.Z % 100;
12736           return utcDate(d);
12737         }
12738
12739         // Otherwise, all fields are in local time.
12740         return newDate(d);
12741       };
12742     }
12743
12744     function parseSpecifier(d, specifier, string, j) {
12745       var i = 0,
12746           n = specifier.length,
12747           m = string.length,
12748           c,
12749           parse;
12750
12751       while (i < n) {
12752         if (j >= m) return -1;
12753         c = specifier.charCodeAt(i++);
12754         if (c === 37) {
12755           c = specifier.charAt(i++);
12756           parse = parses[c in pads ? specifier.charAt(i++) : c];
12757           if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
12758         } else if (c != string.charCodeAt(j++)) {
12759           return -1;
12760         }
12761       }
12762
12763       return j;
12764     }
12765
12766     function parsePeriod(d, string, i) {
12767       var n = periodRe.exec(string.slice(i));
12768       return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12769     }
12770
12771     function parseShortWeekday(d, string, i) {
12772       var n = shortWeekdayRe.exec(string.slice(i));
12773       return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12774     }
12775
12776     function parseWeekday(d, string, i) {
12777       var n = weekdayRe.exec(string.slice(i));
12778       return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12779     }
12780
12781     function parseShortMonth(d, string, i) {
12782       var n = shortMonthRe.exec(string.slice(i));
12783       return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12784     }
12785
12786     function parseMonth(d, string, i) {
12787       var n = monthRe.exec(string.slice(i));
12788       return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12789     }
12790
12791     function parseLocaleDateTime(d, string, i) {
12792       return parseSpecifier(d, locale_dateTime, string, i);
12793     }
12794
12795     function parseLocaleDate(d, string, i) {
12796       return parseSpecifier(d, locale_date, string, i);
12797     }
12798
12799     function parseLocaleTime(d, string, i) {
12800       return parseSpecifier(d, locale_time, string, i);
12801     }
12802
12803     function formatShortWeekday(d) {
12804       return locale_shortWeekdays[d.getDay()];
12805     }
12806
12807     function formatWeekday(d) {
12808       return locale_weekdays[d.getDay()];
12809     }
12810
12811     function formatShortMonth(d) {
12812       return locale_shortMonths[d.getMonth()];
12813     }
12814
12815     function formatMonth(d) {
12816       return locale_months[d.getMonth()];
12817     }
12818
12819     function formatPeriod(d) {
12820       return locale_periods[+(d.getHours() >= 12)];
12821     }
12822
12823     function formatUTCShortWeekday(d) {
12824       return locale_shortWeekdays[d.getUTCDay()];
12825     }
12826
12827     function formatUTCWeekday(d) {
12828       return locale_weekdays[d.getUTCDay()];
12829     }
12830
12831     function formatUTCShortMonth(d) {
12832       return locale_shortMonths[d.getUTCMonth()];
12833     }
12834
12835     function formatUTCMonth(d) {
12836       return locale_months[d.getUTCMonth()];
12837     }
12838
12839     function formatUTCPeriod(d) {
12840       return locale_periods[+(d.getUTCHours() >= 12)];
12841     }
12842
12843     return {
12844       format: function(specifier) {
12845         var f = newFormat(specifier += "", formats);
12846         f.toString = function() { return specifier; };
12847         return f;
12848       },
12849       parse: function(specifier) {
12850         var p = newParse(specifier += "", localDate);
12851         p.toString = function() { return specifier; };
12852         return p;
12853       },
12854       utcFormat: function(specifier) {
12855         var f = newFormat(specifier += "", utcFormats);
12856         f.toString = function() { return specifier; };
12857         return f;
12858       },
12859       utcParse: function(specifier) {
12860         var p = newParse(specifier, utcDate);
12861         p.toString = function() { return specifier; };
12862         return p;
12863       }
12864     };
12865   }
12866
12867   var pads = {"-": "", "_": " ", "0": "0"},
12868       numberRe = /^\s*\d+/, // note: ignores next directive
12869       percentRe = /^%/,
12870       requoteRe = /[\\^$*+?|[\]().{}]/g;
12871
12872   function pad(value, fill, width) {
12873     var sign = value < 0 ? "-" : "",
12874         string = (sign ? -value : value) + "",
12875         length = string.length;
12876     return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
12877   }
12878
12879   function requote(s) {
12880     return s.replace(requoteRe, "\\$&");
12881   }
12882
12883   function formatRe(names) {
12884     return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
12885   }
12886
12887   function formatLookup(names) {
12888     var map = {}, i = -1, n = names.length;
12889     while (++i < n) map[names[i].toLowerCase()] = i;
12890     return map;
12891   }
12892
12893   function parseWeekdayNumberSunday(d, string, i) {
12894     var n = numberRe.exec(string.slice(i, i + 1));
12895     return n ? (d.w = +n[0], i + n[0].length) : -1;
12896   }
12897
12898   function parseWeekdayNumberMonday(d, string, i) {
12899     var n = numberRe.exec(string.slice(i, i + 1));
12900     return n ? (d.u = +n[0], i + n[0].length) : -1;
12901   }
12902
12903   function parseWeekNumberSunday(d, string, i) {
12904     var n = numberRe.exec(string.slice(i, i + 2));
12905     return n ? (d.U = +n[0], i + n[0].length) : -1;
12906   }
12907
12908   function parseWeekNumberISO(d, string, i) {
12909     var n = numberRe.exec(string.slice(i, i + 2));
12910     return n ? (d.V = +n[0], i + n[0].length) : -1;
12911   }
12912
12913   function parseWeekNumberMonday(d, string, i) {
12914     var n = numberRe.exec(string.slice(i, i + 2));
12915     return n ? (d.W = +n[0], i + n[0].length) : -1;
12916   }
12917
12918   function parseFullYear(d, string, i) {
12919     var n = numberRe.exec(string.slice(i, i + 4));
12920     return n ? (d.y = +n[0], i + n[0].length) : -1;
12921   }
12922
12923   function parseYear(d, string, i) {
12924     var n = numberRe.exec(string.slice(i, i + 2));
12925     return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
12926   }
12927
12928   function parseZone(d, string, i) {
12929     var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
12930     return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
12931   }
12932
12933   function parseMonthNumber(d, string, i) {
12934     var n = numberRe.exec(string.slice(i, i + 2));
12935     return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
12936   }
12937
12938   function parseDayOfMonth(d, string, i) {
12939     var n = numberRe.exec(string.slice(i, i + 2));
12940     return n ? (d.d = +n[0], i + n[0].length) : -1;
12941   }
12942
12943   function parseDayOfYear(d, string, i) {
12944     var n = numberRe.exec(string.slice(i, i + 3));
12945     return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
12946   }
12947
12948   function parseHour24(d, string, i) {
12949     var n = numberRe.exec(string.slice(i, i + 2));
12950     return n ? (d.H = +n[0], i + n[0].length) : -1;
12951   }
12952
12953   function parseMinutes(d, string, i) {
12954     var n = numberRe.exec(string.slice(i, i + 2));
12955     return n ? (d.M = +n[0], i + n[0].length) : -1;
12956   }
12957
12958   function parseSeconds(d, string, i) {
12959     var n = numberRe.exec(string.slice(i, i + 2));
12960     return n ? (d.S = +n[0], i + n[0].length) : -1;
12961   }
12962
12963   function parseMilliseconds(d, string, i) {
12964     var n = numberRe.exec(string.slice(i, i + 3));
12965     return n ? (d.L = +n[0], i + n[0].length) : -1;
12966   }
12967
12968   function parseMicroseconds(d, string, i) {
12969     var n = numberRe.exec(string.slice(i, i + 6));
12970     return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;
12971   }
12972
12973   function parseLiteralPercent(d, string, i) {
12974     var n = percentRe.exec(string.slice(i, i + 1));
12975     return n ? i + n[0].length : -1;
12976   }
12977
12978   function parseUnixTimestamp(d, string, i) {
12979     var n = numberRe.exec(string.slice(i));
12980     return n ? (d.Q = +n[0], i + n[0].length) : -1;
12981   }
12982
12983   function parseUnixTimestampSeconds(d, string, i) {
12984     var n = numberRe.exec(string.slice(i));
12985     return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;
12986   }
12987
12988   function formatDayOfMonth(d, p) {
12989     return pad(d.getDate(), p, 2);
12990   }
12991
12992   function formatHour24(d, p) {
12993     return pad(d.getHours(), p, 2);
12994   }
12995
12996   function formatHour12(d, p) {
12997     return pad(d.getHours() % 12 || 12, p, 2);
12998   }
12999
13000   function formatDayOfYear(d, p) {
13001     return pad(1 + day.count(year(d), d), p, 3);
13002   }
13003
13004   function formatMilliseconds(d, p) {
13005     return pad(d.getMilliseconds(), p, 3);
13006   }
13007
13008   function formatMicroseconds(d, p) {
13009     return formatMilliseconds(d, p) + "000";
13010   }
13011
13012   function formatMonthNumber(d, p) {
13013     return pad(d.getMonth() + 1, p, 2);
13014   }
13015
13016   function formatMinutes(d, p) {
13017     return pad(d.getMinutes(), p, 2);
13018   }
13019
13020   function formatSeconds(d, p) {
13021     return pad(d.getSeconds(), p, 2);
13022   }
13023
13024   function formatWeekdayNumberMonday(d) {
13025     var day$$1 = d.getDay();
13026     return day$$1 === 0 ? 7 : day$$1;
13027   }
13028
13029   function formatWeekNumberSunday(d, p) {
13030     return pad(sunday.count(year(d), d), p, 2);
13031   }
13032
13033   function formatWeekNumberISO(d, p) {
13034     var day$$1 = d.getDay();
13035     d = (day$$1 >= 4 || day$$1 === 0) ? thursday(d) : thursday.ceil(d);
13036     return pad(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2);
13037   }
13038
13039   function formatWeekdayNumberSunday(d) {
13040     return d.getDay();
13041   }
13042
13043   function formatWeekNumberMonday(d, p) {
13044     return pad(monday.count(year(d), d), p, 2);
13045   }
13046
13047   function formatYear(d, p) {
13048     return pad(d.getFullYear() % 100, p, 2);
13049   }
13050
13051   function formatFullYear(d, p) {
13052     return pad(d.getFullYear() % 10000, p, 4);
13053   }
13054
13055   function formatZone(d) {
13056     var z = d.getTimezoneOffset();
13057     return (z > 0 ? "-" : (z *= -1, "+"))
13058         + pad(z / 60 | 0, "0", 2)
13059         + pad(z % 60, "0", 2);
13060   }
13061
13062   function formatUTCDayOfMonth(d, p) {
13063     return pad(d.getUTCDate(), p, 2);
13064   }
13065
13066   function formatUTCHour24(d, p) {
13067     return pad(d.getUTCHours(), p, 2);
13068   }
13069
13070   function formatUTCHour12(d, p) {
13071     return pad(d.getUTCHours() % 12 || 12, p, 2);
13072   }
13073
13074   function formatUTCDayOfYear(d, p) {
13075     return pad(1 + utcDay.count(utcYear(d), d), p, 3);
13076   }
13077
13078   function formatUTCMilliseconds(d, p) {
13079     return pad(d.getUTCMilliseconds(), p, 3);
13080   }
13081
13082   function formatUTCMicroseconds(d, p) {
13083     return formatUTCMilliseconds(d, p) + "000";
13084   }
13085
13086   function formatUTCMonthNumber(d, p) {
13087     return pad(d.getUTCMonth() + 1, p, 2);
13088   }
13089
13090   function formatUTCMinutes(d, p) {
13091     return pad(d.getUTCMinutes(), p, 2);
13092   }
13093
13094   function formatUTCSeconds(d, p) {
13095     return pad(d.getUTCSeconds(), p, 2);
13096   }
13097
13098   function formatUTCWeekdayNumberMonday(d) {
13099     var dow = d.getUTCDay();
13100     return dow === 0 ? 7 : dow;
13101   }
13102
13103   function formatUTCWeekNumberSunday(d, p) {
13104     return pad(utcSunday.count(utcYear(d), d), p, 2);
13105   }
13106
13107   function formatUTCWeekNumberISO(d, p) {
13108     var day$$1 = d.getUTCDay();
13109     d = (day$$1 >= 4 || day$$1 === 0) ? utcThursday(d) : utcThursday.ceil(d);
13110     return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);
13111   }
13112
13113   function formatUTCWeekdayNumberSunday(d) {
13114     return d.getUTCDay();
13115   }
13116
13117   function formatUTCWeekNumberMonday(d, p) {
13118     return pad(utcMonday.count(utcYear(d), d), p, 2);
13119   }
13120
13121   function formatUTCYear(d, p) {
13122     return pad(d.getUTCFullYear() % 100, p, 2);
13123   }
13124
13125   function formatUTCFullYear(d, p) {
13126     return pad(d.getUTCFullYear() % 10000, p, 4);
13127   }
13128
13129   function formatUTCZone() {
13130     return "+0000";
13131   }
13132
13133   function formatLiteralPercent() {
13134     return "%";
13135   }
13136
13137   function formatUnixTimestamp(d) {
13138     return +d;
13139   }
13140
13141   function formatUnixTimestampSeconds(d) {
13142     return Math.floor(+d / 1000);
13143   }
13144
13145   var locale$1;
13146   var timeFormat;
13147   var timeParse;
13148   var utcFormat;
13149   var utcParse;
13150
13151   defaultLocale$1({
13152     dateTime: "%x, %X",
13153     date: "%-m/%-d/%Y",
13154     time: "%-I:%M:%S %p",
13155     periods: ["AM", "PM"],
13156     days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
13157     shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
13158     months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
13159     shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
13160   });
13161
13162   function defaultLocale$1(definition) {
13163     locale$1 = formatLocale$1(definition);
13164     timeFormat = locale$1.format;
13165     timeParse = locale$1.parse;
13166     utcFormat = locale$1.utcFormat;
13167     utcParse = locale$1.utcParse;
13168     return locale$1;
13169   }
13170
13171   var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
13172
13173   function formatIsoNative(date) {
13174     return date.toISOString();
13175   }
13176
13177   var formatIso = Date.prototype.toISOString
13178       ? formatIsoNative
13179       : utcFormat(isoSpecifier);
13180
13181   function parseIsoNative(string) {
13182     var date = new Date(string);
13183     return isNaN(date) ? null : date;
13184   }
13185
13186   var parseIso = +new Date("2000-01-01T00:00:00.000Z")
13187       ? parseIsoNative
13188       : utcParse(isoSpecifier);
13189
13190   var durationSecond$1 = 1000,
13191       durationMinute$1 = durationSecond$1 * 60,
13192       durationHour$1 = durationMinute$1 * 60,
13193       durationDay$1 = durationHour$1 * 24,
13194       durationWeek$1 = durationDay$1 * 7,
13195       durationMonth = durationDay$1 * 30,
13196       durationYear = durationDay$1 * 365;
13197
13198   function date$1(t) {
13199     return new Date(t);
13200   }
13201
13202   function number$3(t) {
13203     return t instanceof Date ? +t : +new Date(+t);
13204   }
13205
13206   function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format) {
13207     var scale = continuous(deinterpolateLinear, interpolateNumber),
13208         invert = scale.invert,
13209         domain = scale.domain;
13210
13211     var formatMillisecond = format(".%L"),
13212         formatSecond = format(":%S"),
13213         formatMinute = format("%I:%M"),
13214         formatHour = format("%I %p"),
13215         formatDay = format("%a %d"),
13216         formatWeek = format("%b %d"),
13217         formatMonth = format("%B"),
13218         formatYear = format("%Y");
13219
13220     var tickIntervals = [
13221       [second$$1,  1,      durationSecond$1],
13222       [second$$1,  5,  5 * durationSecond$1],
13223       [second$$1, 15, 15 * durationSecond$1],
13224       [second$$1, 30, 30 * durationSecond$1],
13225       [minute$$1,  1,      durationMinute$1],
13226       [minute$$1,  5,  5 * durationMinute$1],
13227       [minute$$1, 15, 15 * durationMinute$1],
13228       [minute$$1, 30, 30 * durationMinute$1],
13229       [  hour$$1,  1,      durationHour$1  ],
13230       [  hour$$1,  3,  3 * durationHour$1  ],
13231       [  hour$$1,  6,  6 * durationHour$1  ],
13232       [  hour$$1, 12, 12 * durationHour$1  ],
13233       [   day$$1,  1,      durationDay$1   ],
13234       [   day$$1,  2,  2 * durationDay$1   ],
13235       [  week,  1,      durationWeek$1  ],
13236       [ month$$1,  1,      durationMonth ],
13237       [ month$$1,  3,  3 * durationMonth ],
13238       [  year$$1,  1,      durationYear  ]
13239     ];
13240
13241     function tickFormat(date$$1) {
13242       return (second$$1(date$$1) < date$$1 ? formatMillisecond
13243           : minute$$1(date$$1) < date$$1 ? formatSecond
13244           : hour$$1(date$$1) < date$$1 ? formatMinute
13245           : day$$1(date$$1) < date$$1 ? formatHour
13246           : month$$1(date$$1) < date$$1 ? (week(date$$1) < date$$1 ? formatDay : formatWeek)
13247           : year$$1(date$$1) < date$$1 ? formatMonth
13248           : formatYear)(date$$1);
13249     }
13250
13251     function tickInterval(interval, start, stop, step) {
13252       if (interval == null) interval = 10;
13253
13254       // If a desired tick count is specified, pick a reasonable tick interval
13255       // based on the extent of the domain and a rough estimate of tick size.
13256       // Otherwise, assume interval is already a time interval and use it.
13257       if (typeof interval === "number") {
13258         var target = Math.abs(stop - start) / interval,
13259             i = bisector(function(i) { return i[2]; }).right(tickIntervals, target);
13260         if (i === tickIntervals.length) {
13261           step = tickStep(start / durationYear, stop / durationYear, interval);
13262           interval = year$$1;
13263         } else if (i) {
13264           i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
13265           step = i[1];
13266           interval = i[0];
13267         } else {
13268           step = Math.max(tickStep(start, stop, interval), 1);
13269           interval = millisecond$$1;
13270         }
13271       }
13272
13273       return step == null ? interval : interval.every(step);
13274     }
13275
13276     scale.invert = function(y) {
13277       return new Date(invert(y));
13278     };
13279
13280     scale.domain = function(_) {
13281       return arguments.length ? domain(map$2.call(_, number$3)) : domain().map(date$1);
13282     };
13283
13284     scale.ticks = function(interval, step) {
13285       var d = domain(),
13286           t0 = d[0],
13287           t1 = d[d.length - 1],
13288           r = t1 < t0,
13289           t;
13290       if (r) t = t0, t0 = t1, t1 = t;
13291       t = tickInterval(interval, t0, t1, step);
13292       t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
13293       return r ? t.reverse() : t;
13294     };
13295
13296     scale.tickFormat = function(count, specifier) {
13297       return specifier == null ? tickFormat : format(specifier);
13298     };
13299
13300     scale.nice = function(interval, step) {
13301       var d = domain();
13302       return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
13303           ? domain(nice(d, interval))
13304           : scale;
13305     };
13306
13307     scale.copy = function() {
13308       return copy(scale, calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format));
13309     };
13310
13311     return scale;
13312   }
13313
13314   function time() {
13315     return calendar(year, month, sunday, day, hour, minute, second, millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);
13316   }
13317
13318   function utcTime() {
13319     return calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);
13320   }
13321
13322   function colors(s) {
13323     return s.match(/.{6}/g).map(function(x) {
13324       return "#" + x;
13325     });
13326   }
13327
13328   var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
13329
13330   var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6");
13331
13332   var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9");
13333
13334   var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5");
13335
13336   var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
13337
13338   var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13339
13340   var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13341
13342   var rainbow = cubehelix();
13343
13344   function rainbow$1(t) {
13345     if (t < 0 || t > 1) t -= Math.floor(t);
13346     var ts = Math.abs(t - 0.5);
13347     rainbow.h = 360 * t - 100;
13348     rainbow.s = 1.5 - 1.5 * ts;
13349     rainbow.l = 0.8 - 0.9 * ts;
13350     return rainbow + "";
13351   }
13352
13353   function ramp(range) {
13354     var n = range.length;
13355     return function(t) {
13356       return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
13357     };
13358   }
13359
13360   var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
13361
13362   var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
13363
13364   var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
13365
13366   var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
13367
13368   function sequential(interpolator) {
13369     var x0 = 0,
13370         x1 = 1,
13371         clamp = false;
13372
13373     function scale(x) {
13374       var t = (x - x0) / (x1 - x0);
13375       return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
13376     }
13377
13378     scale.domain = function(_) {
13379       return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];
13380     };
13381
13382     scale.clamp = function(_) {
13383       return arguments.length ? (clamp = !!_, scale) : clamp;
13384     };
13385
13386     scale.interpolator = function(_) {
13387       return arguments.length ? (interpolator = _, scale) : interpolator;
13388     };
13389
13390     scale.copy = function() {
13391       return sequential(interpolator).domain([x0, x1]).clamp(clamp);
13392     };
13393
13394     return linearish(scale);
13395   }
13396
13397   function constant$a(x) {
13398     return function constant() {
13399       return x;
13400     };
13401   }
13402
13403   var abs$1 = Math.abs;
13404   var atan2$1 = Math.atan2;
13405   var cos$2 = Math.cos;
13406   var max$2 = Math.max;
13407   var min$1 = Math.min;
13408   var sin$2 = Math.sin;
13409   var sqrt$2 = Math.sqrt;
13410
13411   var epsilon$3 = 1e-12;
13412   var pi$4 = Math.PI;
13413   var halfPi$3 = pi$4 / 2;
13414   var tau$4 = 2 * pi$4;
13415
13416   function acos$1(x) {
13417     return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
13418   }
13419
13420   function asin$1(x) {
13421     return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
13422   }
13423
13424   function arcInnerRadius(d) {
13425     return d.innerRadius;
13426   }
13427
13428   function arcOuterRadius(d) {
13429     return d.outerRadius;
13430   }
13431
13432   function arcStartAngle(d) {
13433     return d.startAngle;
13434   }
13435
13436   function arcEndAngle(d) {
13437     return d.endAngle;
13438   }
13439
13440   function arcPadAngle(d) {
13441     return d && d.padAngle; // Note: optional!
13442   }
13443
13444   function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
13445     var x10 = x1 - x0, y10 = y1 - y0,
13446         x32 = x3 - x2, y32 = y3 - y2,
13447         t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10);
13448     return [x0 + t * x10, y0 + t * y10];
13449   }
13450
13451   // Compute perpendicular offset line of length rc.
13452   // http://mathworld.wolfram.com/Circle-LineIntersection.html
13453   function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
13454     var x01 = x0 - x1,
13455         y01 = y0 - y1,
13456         lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
13457         ox = lo * y01,
13458         oy = -lo * x01,
13459         x11 = x0 + ox,
13460         y11 = y0 + oy,
13461         x10 = x1 + ox,
13462         y10 = y1 + oy,
13463         x00 = (x11 + x10) / 2,
13464         y00 = (y11 + y10) / 2,
13465         dx = x10 - x11,
13466         dy = y10 - y11,
13467         d2 = dx * dx + dy * dy,
13468         r = r1 - rc,
13469         D = x11 * y10 - x10 * y11,
13470         d = (dy < 0 ? -1 : 1) * sqrt$2(max$2(0, r * r * d2 - D * D)),
13471         cx0 = (D * dy - dx * d) / d2,
13472         cy0 = (-D * dx - dy * d) / d2,
13473         cx1 = (D * dy + dx * d) / d2,
13474         cy1 = (-D * dx + dy * d) / d2,
13475         dx0 = cx0 - x00,
13476         dy0 = cy0 - y00,
13477         dx1 = cx1 - x00,
13478         dy1 = cy1 - y00;
13479
13480     // Pick the closer of the two intersection points.
13481     // TODO Is there a faster way to determine which intersection to use?
13482     if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
13483
13484     return {
13485       cx: cx0,
13486       cy: cy0,
13487       x01: -ox,
13488       y01: -oy,
13489       x11: cx0 * (r1 / r - 1),
13490       y11: cy0 * (r1 / r - 1)
13491     };
13492   }
13493
13494   function arc() {
13495     var innerRadius = arcInnerRadius,
13496         outerRadius = arcOuterRadius,
13497         cornerRadius = constant$a(0),
13498         padRadius = null,
13499         startAngle = arcStartAngle,
13500         endAngle = arcEndAngle,
13501         padAngle = arcPadAngle,
13502         context = null;
13503
13504     function arc() {
13505       var buffer,
13506           r,
13507           r0 = +innerRadius.apply(this, arguments),
13508           r1 = +outerRadius.apply(this, arguments),
13509           a0 = startAngle.apply(this, arguments) - halfPi$3,
13510           a1 = endAngle.apply(this, arguments) - halfPi$3,
13511           da = abs$1(a1 - a0),
13512           cw = a1 > a0;
13513
13514       if (!context) context = buffer = path();
13515
13516       // Ensure that the outer radius is always larger than the inner radius.
13517       if (r1 < r0) r = r1, r1 = r0, r0 = r;
13518
13519       // Is it a point?
13520       if (!(r1 > epsilon$3)) context.moveTo(0, 0);
13521
13522       // Or is it a circle or annulus?
13523       else if (da > tau$4 - epsilon$3) {
13524         context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));
13525         context.arc(0, 0, r1, a0, a1, !cw);
13526         if (r0 > epsilon$3) {
13527           context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));
13528           context.arc(0, 0, r0, a1, a0, cw);
13529         }
13530       }
13531
13532       // Or is it a circular or annular sector?
13533       else {
13534         var a01 = a0,
13535             a11 = a1,
13536             a00 = a0,
13537             a10 = a1,
13538             da0 = da,
13539             da1 = da,
13540             ap = padAngle.apply(this, arguments) / 2,
13541             rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)),
13542             rc = min$1(abs$1(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
13543             rc0 = rc,
13544             rc1 = rc,
13545             t0,
13546             t1;
13547
13548         // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
13549         if (rp > epsilon$3) {
13550           var p0 = asin$1(rp / r0 * sin$2(ap)),
13551               p1 = asin$1(rp / r1 * sin$2(ap));
13552           if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
13553           else da0 = 0, a00 = a10 = (a0 + a1) / 2;
13554           if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
13555           else da1 = 0, a01 = a11 = (a0 + a1) / 2;
13556         }
13557
13558         var x01 = r1 * cos$2(a01),
13559             y01 = r1 * sin$2(a01),
13560             x10 = r0 * cos$2(a10),
13561             y10 = r0 * sin$2(a10);
13562
13563         // Apply rounded corners?
13564         if (rc > epsilon$3) {
13565           var x11 = r1 * cos$2(a11),
13566               y11 = r1 * sin$2(a11),
13567               x00 = r0 * cos$2(a00),
13568               y00 = r0 * sin$2(a00);
13569
13570           // Restrict the corner radius according to the sector angle.
13571           if (da < pi$4) {
13572             var oc = da0 > epsilon$3 ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],
13573                 ax = x01 - oc[0],
13574                 ay = y01 - oc[1],
13575                 bx = x11 - oc[0],
13576                 by = y11 - oc[1],
13577                 kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2),
13578                 lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);
13579             rc0 = min$1(rc, (r0 - lc) / (kc - 1));
13580             rc1 = min$1(rc, (r1 - lc) / (kc + 1));
13581           }
13582         }
13583
13584         // Is the sector collapsed to a line?
13585         if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
13586
13587         // Does the sector’s outer ring have rounded corners?
13588         else if (rc1 > epsilon$3) {
13589           t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
13590           t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
13591
13592           context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
13593
13594           // Have the corners merged?
13595           if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13596
13597           // Otherwise, draw the two corners and the ring.
13598           else {
13599             context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13600             context.arc(0, 0, r1, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), !cw);
13601             context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13602           }
13603         }
13604
13605         // Or is the outer ring just a circular arc?
13606         else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
13607
13608         // Is there no inner ring, and it’s a circular sector?
13609         // Or perhaps it’s an annular sector collapsed due to padding?
13610         if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10);
13611
13612         // Does the sector’s inner ring (or point) have rounded corners?
13613         else if (rc0 > epsilon$3) {
13614           t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
13615           t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
13616
13617           context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
13618
13619           // Have the corners merged?
13620           if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13621
13622           // Otherwise, draw the two corners and the ring.
13623           else {
13624             context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13625             context.arc(0, 0, r0, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), cw);
13626             context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13627           }
13628         }
13629
13630         // Or is the inner ring just a circular arc?
13631         else context.arc(0, 0, r0, a10, a00, cw);
13632       }
13633
13634       context.closePath();
13635
13636       if (buffer) return context = null, buffer + "" || null;
13637     }
13638
13639     arc.centroid = function() {
13640       var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
13641           a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2;
13642       return [cos$2(a) * r, sin$2(a) * r];
13643     };
13644
13645     arc.innerRadius = function(_) {
13646       return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : innerRadius;
13647     };
13648
13649     arc.outerRadius = function(_) {
13650       return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : outerRadius;
13651     };
13652
13653     arc.cornerRadius = function(_) {
13654       return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : cornerRadius;
13655     };
13656
13657     arc.padRadius = function(_) {
13658       return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), arc) : padRadius;
13659     };
13660
13661     arc.startAngle = function(_) {
13662       return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : startAngle;
13663     };
13664
13665     arc.endAngle = function(_) {
13666       return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : endAngle;
13667     };
13668
13669     arc.padAngle = function(_) {
13670       return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : padAngle;
13671     };
13672
13673     arc.context = function(_) {
13674       return arguments.length ? ((context = _ == null ? null : _), arc) : context;
13675     };
13676
13677     return arc;
13678   }
13679
13680   function Linear(context) {
13681     this._context = context;
13682   }
13683
13684   Linear.prototype = {
13685     areaStart: function() {
13686       this._line = 0;
13687     },
13688     areaEnd: function() {
13689       this._line = NaN;
13690     },
13691     lineStart: function() {
13692       this._point = 0;
13693     },
13694     lineEnd: function() {
13695       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
13696       this._line = 1 - this._line;
13697     },
13698     point: function(x, y) {
13699       x = +x, y = +y;
13700       switch (this._point) {
13701         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
13702         case 1: this._point = 2; // proceed
13703         default: this._context.lineTo(x, y); break;
13704       }
13705     }
13706   };
13707
13708   function curveLinear(context) {
13709     return new Linear(context);
13710   }
13711
13712   function x$3(p) {
13713     return p[0];
13714   }
13715
13716   function y$3(p) {
13717     return p[1];
13718   }
13719
13720   function line() {
13721     var x$$1 = x$3,
13722         y$$1 = y$3,
13723         defined = constant$a(true),
13724         context = null,
13725         curve = curveLinear,
13726         output = null;
13727
13728     function line(data) {
13729       var i,
13730           n = data.length,
13731           d,
13732           defined0 = false,
13733           buffer;
13734
13735       if (context == null) output = curve(buffer = path());
13736
13737       for (i = 0; i <= n; ++i) {
13738         if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13739           if (defined0 = !defined0) output.lineStart();
13740           else output.lineEnd();
13741         }
13742         if (defined0) output.point(+x$$1(d, i, data), +y$$1(d, i, data));
13743       }
13744
13745       if (buffer) return output = null, buffer + "" || null;
13746     }
13747
13748     line.x = function(_) {
13749       return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$a(+_), line) : x$$1;
13750     };
13751
13752     line.y = function(_) {
13753       return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$a(+_), line) : y$$1;
13754     };
13755
13756     line.defined = function(_) {
13757       return arguments.length ? (defined = typeof _ === "function" ? _ : constant$a(!!_), line) : defined;
13758     };
13759
13760     line.curve = function(_) {
13761       return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
13762     };
13763
13764     line.context = function(_) {
13765       return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
13766     };
13767
13768     return line;
13769   }
13770
13771   function area() {
13772     var x0 = x$3,
13773         x1 = null,
13774         y0 = constant$a(0),
13775         y1 = y$3,
13776         defined = constant$a(true),
13777         context = null,
13778         curve = curveLinear,
13779         output = null;
13780
13781     function area(data) {
13782       var i,
13783           j,
13784           k,
13785           n = data.length,
13786           d,
13787           defined0 = false,
13788           buffer,
13789           x0z = new Array(n),
13790           y0z = new Array(n);
13791
13792       if (context == null) output = curve(buffer = path());
13793
13794       for (i = 0; i <= n; ++i) {
13795         if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13796           if (defined0 = !defined0) {
13797             j = i;
13798             output.areaStart();
13799             output.lineStart();
13800           } else {
13801             output.lineEnd();
13802             output.lineStart();
13803             for (k = i - 1; k >= j; --k) {
13804               output.point(x0z[k], y0z[k]);
13805             }
13806             output.lineEnd();
13807             output.areaEnd();
13808           }
13809         }
13810         if (defined0) {
13811           x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
13812           output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
13813         }
13814       }
13815
13816       if (buffer) return output = null, buffer + "" || null;
13817     }
13818
13819     function arealine() {
13820       return line().defined(defined).curve(curve).context(context);
13821     }
13822
13823     area.x = function(_) {
13824       return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$a(+_), x1 = null, area) : x0;
13825     };
13826
13827     area.x0 = function(_) {
13828       return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$a(+_), area) : x0;
13829     };
13830
13831     area.x1 = function(_) {
13832       return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), area) : x1;
13833     };
13834
13835     area.y = function(_) {
13836       return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$a(+_), y1 = null, area) : y0;
13837     };
13838
13839     area.y0 = function(_) {
13840       return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$a(+_), area) : y0;
13841     };
13842
13843     area.y1 = function(_) {
13844       return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), area) : y1;
13845     };
13846
13847     area.lineX0 =
13848     area.lineY0 = function() {
13849       return arealine().x(x0).y(y0);
13850     };
13851
13852     area.lineY1 = function() {
13853       return arealine().x(x0).y(y1);
13854     };
13855
13856     area.lineX1 = function() {
13857       return arealine().x(x1).y(y0);
13858     };
13859
13860     area.defined = function(_) {
13861       return arguments.length ? (defined = typeof _ === "function" ? _ : constant$a(!!_), area) : defined;
13862     };
13863
13864     area.curve = function(_) {
13865       return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
13866     };
13867
13868     area.context = function(_) {
13869       return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
13870     };
13871
13872     return area;
13873   }
13874
13875   function descending(a, b) {
13876     return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
13877   }
13878
13879   function identity$6(d) {
13880     return d;
13881   }
13882
13883   function pie() {
13884     var value = identity$6,
13885         sortValues = descending,
13886         sort = null,
13887         startAngle = constant$a(0),
13888         endAngle = constant$a(tau$4),
13889         padAngle = constant$a(0);
13890
13891     function pie(data) {
13892       var i,
13893           n = data.length,
13894           j,
13895           k,
13896           sum = 0,
13897           index = new Array(n),
13898           arcs = new Array(n),
13899           a0 = +startAngle.apply(this, arguments),
13900           da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)),
13901           a1,
13902           p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
13903           pa = p * (da < 0 ? -1 : 1),
13904           v;
13905
13906       for (i = 0; i < n; ++i) {
13907         if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
13908           sum += v;
13909         }
13910       }
13911
13912       // Optionally sort the arcs by previously-computed values or by data.
13913       if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
13914       else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
13915
13916       // Compute the arcs! They are stored in the original data's order.
13917       for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
13918         j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
13919           data: data[j],
13920           index: i,
13921           value: v,
13922           startAngle: a0,
13923           endAngle: a1,
13924           padAngle: p
13925         };
13926       }
13927
13928       return arcs;
13929     }
13930
13931     pie.value = function(_) {
13932       return arguments.length ? (value = typeof _ === "function" ? _ : constant$a(+_), pie) : value;
13933     };
13934
13935     pie.sortValues = function(_) {
13936       return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
13937     };
13938
13939     pie.sort = function(_) {
13940       return arguments.length ? (sort = _, sortValues = null, pie) : sort;
13941     };
13942
13943     pie.startAngle = function(_) {
13944       return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : startAngle;
13945     };
13946
13947     pie.endAngle = function(_) {
13948       return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : endAngle;
13949     };
13950
13951     pie.padAngle = function(_) {
13952       return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : padAngle;
13953     };
13954
13955     return pie;
13956   }
13957
13958   var curveRadialLinear = curveRadial(curveLinear);
13959
13960   function Radial(curve) {
13961     this._curve = curve;
13962   }
13963
13964   Radial.prototype = {
13965     areaStart: function() {
13966       this._curve.areaStart();
13967     },
13968     areaEnd: function() {
13969       this._curve.areaEnd();
13970     },
13971     lineStart: function() {
13972       this._curve.lineStart();
13973     },
13974     lineEnd: function() {
13975       this._curve.lineEnd();
13976     },
13977     point: function(a, r) {
13978       this._curve.point(r * Math.sin(a), r * -Math.cos(a));
13979     }
13980   };
13981
13982   function curveRadial(curve) {
13983
13984     function radial(context) {
13985       return new Radial(curve(context));
13986     }
13987
13988     radial._curve = curve;
13989
13990     return radial;
13991   }
13992
13993   function lineRadial(l) {
13994     var c = l.curve;
13995
13996     l.angle = l.x, delete l.x;
13997     l.radius = l.y, delete l.y;
13998
13999     l.curve = function(_) {
14000       return arguments.length ? c(curveRadial(_)) : c()._curve;
14001     };
14002
14003     return l;
14004   }
14005
14006   function lineRadial$1() {
14007     return lineRadial(line().curve(curveRadialLinear));
14008   }
14009
14010   function areaRadial() {
14011     var a = area().curve(curveRadialLinear),
14012         c = a.curve,
14013         x0 = a.lineX0,
14014         x1 = a.lineX1,
14015         y0 = a.lineY0,
14016         y1 = a.lineY1;
14017
14018     a.angle = a.x, delete a.x;
14019     a.startAngle = a.x0, delete a.x0;
14020     a.endAngle = a.x1, delete a.x1;
14021     a.radius = a.y, delete a.y;
14022     a.innerRadius = a.y0, delete a.y0;
14023     a.outerRadius = a.y1, delete a.y1;
14024     a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;
14025     a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;
14026     a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;
14027     a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;
14028
14029     a.curve = function(_) {
14030       return arguments.length ? c(curveRadial(_)) : c()._curve;
14031     };
14032
14033     return a;
14034   }
14035
14036   function pointRadial(x, y) {
14037     return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
14038   }
14039
14040   var slice$6 = Array.prototype.slice;
14041
14042   function linkSource(d) {
14043     return d.source;
14044   }
14045
14046   function linkTarget(d) {
14047     return d.target;
14048   }
14049
14050   function link$2(curve) {
14051     var source = linkSource,
14052         target = linkTarget,
14053         x$$1 = x$3,
14054         y$$1 = y$3,
14055         context = null;
14056
14057     function link() {
14058       var buffer, argv = slice$6.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
14059       if (!context) context = buffer = path();
14060       curve(context, +x$$1.apply(this, (argv[0] = s, argv)), +y$$1.apply(this, argv), +x$$1.apply(this, (argv[0] = t, argv)), +y$$1.apply(this, argv));
14061       if (buffer) return context = null, buffer + "" || null;
14062     }
14063
14064     link.source = function(_) {
14065       return arguments.length ? (source = _, link) : source;
14066     };
14067
14068     link.target = function(_) {
14069       return arguments.length ? (target = _, link) : target;
14070     };
14071
14072     link.x = function(_) {
14073       return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$a(+_), link) : x$$1;
14074     };
14075
14076     link.y = function(_) {
14077       return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$a(+_), link) : y$$1;
14078     };
14079
14080     link.context = function(_) {
14081       return arguments.length ? ((context = _ == null ? null : _), link) : context;
14082     };
14083
14084     return link;
14085   }
14086
14087   function curveHorizontal(context, x0, y0, x1, y1) {
14088     context.moveTo(x0, y0);
14089     context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
14090   }
14091
14092   function curveVertical(context, x0, y0, x1, y1) {
14093     context.moveTo(x0, y0);
14094     context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
14095   }
14096
14097   function curveRadial$1(context, x0, y0, x1, y1) {
14098     var p0 = pointRadial(x0, y0),
14099         p1 = pointRadial(x0, y0 = (y0 + y1) / 2),
14100         p2 = pointRadial(x1, y0),
14101         p3 = pointRadial(x1, y1);
14102     context.moveTo(p0[0], p0[1]);
14103     context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
14104   }
14105
14106   function linkHorizontal() {
14107     return link$2(curveHorizontal);
14108   }
14109
14110   function linkVertical() {
14111     return link$2(curveVertical);
14112   }
14113
14114   function linkRadial() {
14115     var l = link$2(curveRadial$1);
14116     l.angle = l.x, delete l.x;
14117     l.radius = l.y, delete l.y;
14118     return l;
14119   }
14120
14121   var circle$2 = {
14122     draw: function(context, size) {
14123       var r = Math.sqrt(size / pi$4);
14124       context.moveTo(r, 0);
14125       context.arc(0, 0, r, 0, tau$4);
14126     }
14127   };
14128
14129   var cross$2 = {
14130     draw: function(context, size) {
14131       var r = Math.sqrt(size / 5) / 2;
14132       context.moveTo(-3 * r, -r);
14133       context.lineTo(-r, -r);
14134       context.lineTo(-r, -3 * r);
14135       context.lineTo(r, -3 * r);
14136       context.lineTo(r, -r);
14137       context.lineTo(3 * r, -r);
14138       context.lineTo(3 * r, r);
14139       context.lineTo(r, r);
14140       context.lineTo(r, 3 * r);
14141       context.lineTo(-r, 3 * r);
14142       context.lineTo(-r, r);
14143       context.lineTo(-3 * r, r);
14144       context.closePath();
14145     }
14146   };
14147
14148   var tan30 = Math.sqrt(1 / 3),
14149       tan30_2 = tan30 * 2;
14150
14151   var diamond = {
14152     draw: function(context, size) {
14153       var y = Math.sqrt(size / tan30_2),
14154           x = y * tan30;
14155       context.moveTo(0, -y);
14156       context.lineTo(x, 0);
14157       context.lineTo(0, y);
14158       context.lineTo(-x, 0);
14159       context.closePath();
14160     }
14161   };
14162
14163   var ka = 0.89081309152928522810,
14164       kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10),
14165       kx = Math.sin(tau$4 / 10) * kr,
14166       ky = -Math.cos(tau$4 / 10) * kr;
14167
14168   var star = {
14169     draw: function(context, size) {
14170       var r = Math.sqrt(size * ka),
14171           x = kx * r,
14172           y = ky * r;
14173       context.moveTo(0, -r);
14174       context.lineTo(x, y);
14175       for (var i = 1; i < 5; ++i) {
14176         var a = tau$4 * i / 5,
14177             c = Math.cos(a),
14178             s = Math.sin(a);
14179         context.lineTo(s * r, -c * r);
14180         context.lineTo(c * x - s * y, s * x + c * y);
14181       }
14182       context.closePath();
14183     }
14184   };
14185
14186   var square = {
14187     draw: function(context, size) {
14188       var w = Math.sqrt(size),
14189           x = -w / 2;
14190       context.rect(x, x, w, w);
14191     }
14192   };
14193
14194   var sqrt3 = Math.sqrt(3);
14195
14196   var triangle = {
14197     draw: function(context, size) {
14198       var y = -Math.sqrt(size / (sqrt3 * 3));
14199       context.moveTo(0, y * 2);
14200       context.lineTo(-sqrt3 * y, -y);
14201       context.lineTo(sqrt3 * y, -y);
14202       context.closePath();
14203     }
14204   };
14205
14206   var c = -0.5,
14207       s = Math.sqrt(3) / 2,
14208       k = 1 / Math.sqrt(12),
14209       a = (k / 2 + 1) * 3;
14210
14211   var wye = {
14212     draw: function(context, size) {
14213       var r = Math.sqrt(size / a),
14214           x0 = r / 2,
14215           y0 = r * k,
14216           x1 = x0,
14217           y1 = r * k + r,
14218           x2 = -x1,
14219           y2 = y1;
14220       context.moveTo(x0, y0);
14221       context.lineTo(x1, y1);
14222       context.lineTo(x2, y2);
14223       context.lineTo(c * x0 - s * y0, s * x0 + c * y0);
14224       context.lineTo(c * x1 - s * y1, s * x1 + c * y1);
14225       context.lineTo(c * x2 - s * y2, s * x2 + c * y2);
14226       context.lineTo(c * x0 + s * y0, c * y0 - s * x0);
14227       context.lineTo(c * x1 + s * y1, c * y1 - s * x1);
14228       context.lineTo(c * x2 + s * y2, c * y2 - s * x2);
14229       context.closePath();
14230     }
14231   };
14232
14233   var symbols = [
14234     circle$2,
14235     cross$2,
14236     diamond,
14237     square,
14238     star,
14239     triangle,
14240     wye
14241   ];
14242
14243   function symbol() {
14244     var type = constant$a(circle$2),
14245         size = constant$a(64),
14246         context = null;
14247
14248     function symbol() {
14249       var buffer;
14250       if (!context) context = buffer = path();
14251       type.apply(this, arguments).draw(context, +size.apply(this, arguments));
14252       if (buffer) return context = null, buffer + "" || null;
14253     }
14254
14255     symbol.type = function(_) {
14256       return arguments.length ? (type = typeof _ === "function" ? _ : constant$a(_), symbol) : type;
14257     };
14258
14259     symbol.size = function(_) {
14260       return arguments.length ? (size = typeof _ === "function" ? _ : constant$a(+_), symbol) : size;
14261     };
14262
14263     symbol.context = function(_) {
14264       return arguments.length ? (context = _ == null ? null : _, symbol) : context;
14265     };
14266
14267     return symbol;
14268   }
14269
14270   function noop$2() {}
14271
14272   function point$2(that, x, y) {
14273     that._context.bezierCurveTo(
14274       (2 * that._x0 + that._x1) / 3,
14275       (2 * that._y0 + that._y1) / 3,
14276       (that._x0 + 2 * that._x1) / 3,
14277       (that._y0 + 2 * that._y1) / 3,
14278       (that._x0 + 4 * that._x1 + x) / 6,
14279       (that._y0 + 4 * that._y1 + y) / 6
14280     );
14281   }
14282
14283   function Basis(context) {
14284     this._context = context;
14285   }
14286
14287   Basis.prototype = {
14288     areaStart: function() {
14289       this._line = 0;
14290     },
14291     areaEnd: function() {
14292       this._line = NaN;
14293     },
14294     lineStart: function() {
14295       this._x0 = this._x1 =
14296       this._y0 = this._y1 = NaN;
14297       this._point = 0;
14298     },
14299     lineEnd: function() {
14300       switch (this._point) {
14301         case 3: point$2(this, this._x1, this._y1); // proceed
14302         case 2: this._context.lineTo(this._x1, this._y1); break;
14303       }
14304       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14305       this._line = 1 - this._line;
14306     },
14307     point: function(x, y) {
14308       x = +x, y = +y;
14309       switch (this._point) {
14310         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14311         case 1: this._point = 2; break;
14312         case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
14313         default: point$2(this, x, y); break;
14314       }
14315       this._x0 = this._x1, this._x1 = x;
14316       this._y0 = this._y1, this._y1 = y;
14317     }
14318   };
14319
14320   function basis$2(context) {
14321     return new Basis(context);
14322   }
14323
14324   function BasisClosed(context) {
14325     this._context = context;
14326   }
14327
14328   BasisClosed.prototype = {
14329     areaStart: noop$2,
14330     areaEnd: noop$2,
14331     lineStart: function() {
14332       this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
14333       this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
14334       this._point = 0;
14335     },
14336     lineEnd: function() {
14337       switch (this._point) {
14338         case 1: {
14339           this._context.moveTo(this._x2, this._y2);
14340           this._context.closePath();
14341           break;
14342         }
14343         case 2: {
14344           this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
14345           this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
14346           this._context.closePath();
14347           break;
14348         }
14349         case 3: {
14350           this.point(this._x2, this._y2);
14351           this.point(this._x3, this._y3);
14352           this.point(this._x4, this._y4);
14353           break;
14354         }
14355       }
14356     },
14357     point: function(x, y) {
14358       x = +x, y = +y;
14359       switch (this._point) {
14360         case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
14361         case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
14362         case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;
14363         default: point$2(this, x, y); break;
14364       }
14365       this._x0 = this._x1, this._x1 = x;
14366       this._y0 = this._y1, this._y1 = y;
14367     }
14368   };
14369
14370   function basisClosed$1(context) {
14371     return new BasisClosed(context);
14372   }
14373
14374   function BasisOpen(context) {
14375     this._context = context;
14376   }
14377
14378   BasisOpen.prototype = {
14379     areaStart: function() {
14380       this._line = 0;
14381     },
14382     areaEnd: function() {
14383       this._line = NaN;
14384     },
14385     lineStart: function() {
14386       this._x0 = this._x1 =
14387       this._y0 = this._y1 = NaN;
14388       this._point = 0;
14389     },
14390     lineEnd: function() {
14391       if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14392       this._line = 1 - this._line;
14393     },
14394     point: function(x, y) {
14395       x = +x, y = +y;
14396       switch (this._point) {
14397         case 0: this._point = 1; break;
14398         case 1: this._point = 2; break;
14399         case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;
14400         case 3: this._point = 4; // proceed
14401         default: point$2(this, x, y); break;
14402       }
14403       this._x0 = this._x1, this._x1 = x;
14404       this._y0 = this._y1, this._y1 = y;
14405     }
14406   };
14407
14408   function basisOpen(context) {
14409     return new BasisOpen(context);
14410   }
14411
14412   function Bundle(context, beta) {
14413     this._basis = new Basis(context);
14414     this._beta = beta;
14415   }
14416
14417   Bundle.prototype = {
14418     lineStart: function() {
14419       this._x = [];
14420       this._y = [];
14421       this._basis.lineStart();
14422     },
14423     lineEnd: function() {
14424       var x = this._x,
14425           y = this._y,
14426           j = x.length - 1;
14427
14428       if (j > 0) {
14429         var x0 = x[0],
14430             y0 = y[0],
14431             dx = x[j] - x0,
14432             dy = y[j] - y0,
14433             i = -1,
14434             t;
14435
14436         while (++i <= j) {
14437           t = i / j;
14438           this._basis.point(
14439             this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
14440             this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
14441           );
14442         }
14443       }
14444
14445       this._x = this._y = null;
14446       this._basis.lineEnd();
14447     },
14448     point: function(x, y) {
14449       this._x.push(+x);
14450       this._y.push(+y);
14451     }
14452   };
14453
14454   var bundle = (function custom(beta) {
14455
14456     function bundle(context) {
14457       return beta === 1 ? new Basis(context) : new Bundle(context, beta);
14458     }
14459
14460     bundle.beta = function(beta) {
14461       return custom(+beta);
14462     };
14463
14464     return bundle;
14465   })(0.85);
14466
14467   function point$3(that, x, y) {
14468     that._context.bezierCurveTo(
14469       that._x1 + that._k * (that._x2 - that._x0),
14470       that._y1 + that._k * (that._y2 - that._y0),
14471       that._x2 + that._k * (that._x1 - x),
14472       that._y2 + that._k * (that._y1 - y),
14473       that._x2,
14474       that._y2
14475     );
14476   }
14477
14478   function Cardinal(context, tension) {
14479     this._context = context;
14480     this._k = (1 - tension) / 6;
14481   }
14482
14483   Cardinal.prototype = {
14484     areaStart: function() {
14485       this._line = 0;
14486     },
14487     areaEnd: function() {
14488       this._line = NaN;
14489     },
14490     lineStart: function() {
14491       this._x0 = this._x1 = this._x2 =
14492       this._y0 = this._y1 = this._y2 = NaN;
14493       this._point = 0;
14494     },
14495     lineEnd: function() {
14496       switch (this._point) {
14497         case 2: this._context.lineTo(this._x2, this._y2); break;
14498         case 3: point$3(this, this._x1, this._y1); break;
14499       }
14500       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14501       this._line = 1 - this._line;
14502     },
14503     point: function(x, y) {
14504       x = +x, y = +y;
14505       switch (this._point) {
14506         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14507         case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
14508         case 2: this._point = 3; // proceed
14509         default: point$3(this, x, y); break;
14510       }
14511       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14512       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14513     }
14514   };
14515
14516   var cardinal = (function custom(tension) {
14517
14518     function cardinal(context) {
14519       return new Cardinal(context, tension);
14520     }
14521
14522     cardinal.tension = function(tension) {
14523       return custom(+tension);
14524     };
14525
14526     return cardinal;
14527   })(0);
14528
14529   function CardinalClosed(context, tension) {
14530     this._context = context;
14531     this._k = (1 - tension) / 6;
14532   }
14533
14534   CardinalClosed.prototype = {
14535     areaStart: noop$2,
14536     areaEnd: noop$2,
14537     lineStart: function() {
14538       this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14539       this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14540       this._point = 0;
14541     },
14542     lineEnd: function() {
14543       switch (this._point) {
14544         case 1: {
14545           this._context.moveTo(this._x3, this._y3);
14546           this._context.closePath();
14547           break;
14548         }
14549         case 2: {
14550           this._context.lineTo(this._x3, this._y3);
14551           this._context.closePath();
14552           break;
14553         }
14554         case 3: {
14555           this.point(this._x3, this._y3);
14556           this.point(this._x4, this._y4);
14557           this.point(this._x5, this._y5);
14558           break;
14559         }
14560       }
14561     },
14562     point: function(x, y) {
14563       x = +x, y = +y;
14564       switch (this._point) {
14565         case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14566         case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14567         case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14568         default: point$3(this, x, y); break;
14569       }
14570       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14571       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14572     }
14573   };
14574
14575   var cardinalClosed = (function custom(tension) {
14576
14577     function cardinal$$1(context) {
14578       return new CardinalClosed(context, tension);
14579     }
14580
14581     cardinal$$1.tension = function(tension) {
14582       return custom(+tension);
14583     };
14584
14585     return cardinal$$1;
14586   })(0);
14587
14588   function CardinalOpen(context, tension) {
14589     this._context = context;
14590     this._k = (1 - tension) / 6;
14591   }
14592
14593   CardinalOpen.prototype = {
14594     areaStart: function() {
14595       this._line = 0;
14596     },
14597     areaEnd: function() {
14598       this._line = NaN;
14599     },
14600     lineStart: function() {
14601       this._x0 = this._x1 = this._x2 =
14602       this._y0 = this._y1 = this._y2 = NaN;
14603       this._point = 0;
14604     },
14605     lineEnd: function() {
14606       if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14607       this._line = 1 - this._line;
14608     },
14609     point: function(x, y) {
14610       x = +x, y = +y;
14611       switch (this._point) {
14612         case 0: this._point = 1; break;
14613         case 1: this._point = 2; break;
14614         case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14615         case 3: this._point = 4; // proceed
14616         default: point$3(this, x, y); break;
14617       }
14618       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14619       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14620     }
14621   };
14622
14623   var cardinalOpen = (function custom(tension) {
14624
14625     function cardinal$$1(context) {
14626       return new CardinalOpen(context, tension);
14627     }
14628
14629     cardinal$$1.tension = function(tension) {
14630       return custom(+tension);
14631     };
14632
14633     return cardinal$$1;
14634   })(0);
14635
14636   function point$4(that, x, y) {
14637     var x1 = that._x1,
14638         y1 = that._y1,
14639         x2 = that._x2,
14640         y2 = that._y2;
14641
14642     if (that._l01_a > epsilon$3) {
14643       var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
14644           n = 3 * that._l01_a * (that._l01_a + that._l12_a);
14645       x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
14646       y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
14647     }
14648
14649     if (that._l23_a > epsilon$3) {
14650       var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
14651           m = 3 * that._l23_a * (that._l23_a + that._l12_a);
14652       x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
14653       y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
14654     }
14655
14656     that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
14657   }
14658
14659   function CatmullRom(context, alpha) {
14660     this._context = context;
14661     this._alpha = alpha;
14662   }
14663
14664   CatmullRom.prototype = {
14665     areaStart: function() {
14666       this._line = 0;
14667     },
14668     areaEnd: function() {
14669       this._line = NaN;
14670     },
14671     lineStart: function() {
14672       this._x0 = this._x1 = this._x2 =
14673       this._y0 = this._y1 = this._y2 = NaN;
14674       this._l01_a = this._l12_a = this._l23_a =
14675       this._l01_2a = this._l12_2a = this._l23_2a =
14676       this._point = 0;
14677     },
14678     lineEnd: function() {
14679       switch (this._point) {
14680         case 2: this._context.lineTo(this._x2, this._y2); break;
14681         case 3: this.point(this._x2, this._y2); break;
14682       }
14683       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14684       this._line = 1 - this._line;
14685     },
14686     point: function(x, y) {
14687       x = +x, y = +y;
14688
14689       if (this._point) {
14690         var x23 = this._x2 - x,
14691             y23 = this._y2 - y;
14692         this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14693       }
14694
14695       switch (this._point) {
14696         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14697         case 1: this._point = 2; break;
14698         case 2: this._point = 3; // proceed
14699         default: point$4(this, x, y); break;
14700       }
14701
14702       this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14703       this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14704       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14705       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14706     }
14707   };
14708
14709   var catmullRom = (function custom(alpha) {
14710
14711     function catmullRom(context) {
14712       return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
14713     }
14714
14715     catmullRom.alpha = function(alpha) {
14716       return custom(+alpha);
14717     };
14718
14719     return catmullRom;
14720   })(0.5);
14721
14722   function CatmullRomClosed(context, alpha) {
14723     this._context = context;
14724     this._alpha = alpha;
14725   }
14726
14727   CatmullRomClosed.prototype = {
14728     areaStart: noop$2,
14729     areaEnd: noop$2,
14730     lineStart: function() {
14731       this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14732       this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14733       this._l01_a = this._l12_a = this._l23_a =
14734       this._l01_2a = this._l12_2a = this._l23_2a =
14735       this._point = 0;
14736     },
14737     lineEnd: function() {
14738       switch (this._point) {
14739         case 1: {
14740           this._context.moveTo(this._x3, this._y3);
14741           this._context.closePath();
14742           break;
14743         }
14744         case 2: {
14745           this._context.lineTo(this._x3, this._y3);
14746           this._context.closePath();
14747           break;
14748         }
14749         case 3: {
14750           this.point(this._x3, this._y3);
14751           this.point(this._x4, this._y4);
14752           this.point(this._x5, this._y5);
14753           break;
14754         }
14755       }
14756     },
14757     point: function(x, y) {
14758       x = +x, y = +y;
14759
14760       if (this._point) {
14761         var x23 = this._x2 - x,
14762             y23 = this._y2 - y;
14763         this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14764       }
14765
14766       switch (this._point) {
14767         case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14768         case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14769         case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14770         default: point$4(this, x, y); break;
14771       }
14772
14773       this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14774       this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14775       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14776       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14777     }
14778   };
14779
14780   var catmullRomClosed = (function custom(alpha) {
14781
14782     function catmullRom$$1(context) {
14783       return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
14784     }
14785
14786     catmullRom$$1.alpha = function(alpha) {
14787       return custom(+alpha);
14788     };
14789
14790     return catmullRom$$1;
14791   })(0.5);
14792
14793   function CatmullRomOpen(context, alpha) {
14794     this._context = context;
14795     this._alpha = alpha;
14796   }
14797
14798   CatmullRomOpen.prototype = {
14799     areaStart: function() {
14800       this._line = 0;
14801     },
14802     areaEnd: function() {
14803       this._line = NaN;
14804     },
14805     lineStart: function() {
14806       this._x0 = this._x1 = this._x2 =
14807       this._y0 = this._y1 = this._y2 = NaN;
14808       this._l01_a = this._l12_a = this._l23_a =
14809       this._l01_2a = this._l12_2a = this._l23_2a =
14810       this._point = 0;
14811     },
14812     lineEnd: function() {
14813       if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14814       this._line = 1 - this._line;
14815     },
14816     point: function(x, y) {
14817       x = +x, y = +y;
14818
14819       if (this._point) {
14820         var x23 = this._x2 - x,
14821             y23 = this._y2 - y;
14822         this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14823       }
14824
14825       switch (this._point) {
14826         case 0: this._point = 1; break;
14827         case 1: this._point = 2; break;
14828         case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14829         case 3: this._point = 4; // proceed
14830         default: point$4(this, x, y); break;
14831       }
14832
14833       this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14834       this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14835       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14836       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14837     }
14838   };
14839
14840   var catmullRomOpen = (function custom(alpha) {
14841
14842     function catmullRom$$1(context) {
14843       return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
14844     }
14845
14846     catmullRom$$1.alpha = function(alpha) {
14847       return custom(+alpha);
14848     };
14849
14850     return catmullRom$$1;
14851   })(0.5);
14852
14853   function LinearClosed(context) {
14854     this._context = context;
14855   }
14856
14857   LinearClosed.prototype = {
14858     areaStart: noop$2,
14859     areaEnd: noop$2,
14860     lineStart: function() {
14861       this._point = 0;
14862     },
14863     lineEnd: function() {
14864       if (this._point) this._context.closePath();
14865     },
14866     point: function(x, y) {
14867       x = +x, y = +y;
14868       if (this._point) this._context.lineTo(x, y);
14869       else this._point = 1, this._context.moveTo(x, y);
14870     }
14871   };
14872
14873   function linearClosed(context) {
14874     return new LinearClosed(context);
14875   }
14876
14877   function sign$1(x) {
14878     return x < 0 ? -1 : 1;
14879   }
14880
14881   // Calculate the slopes of the tangents (Hermite-type interpolation) based on
14882   // the following paper: Steffen, M. 1990. A Simple Method for Monotonic
14883   // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
14884   // NOV(II), P. 443, 1990.
14885   function slope3(that, x2, y2) {
14886     var h0 = that._x1 - that._x0,
14887         h1 = x2 - that._x1,
14888         s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
14889         s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
14890         p = (s0 * h1 + s1 * h0) / (h0 + h1);
14891     return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
14892   }
14893
14894   // Calculate a one-sided slope.
14895   function slope2(that, t) {
14896     var h = that._x1 - that._x0;
14897     return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
14898   }
14899
14900   // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
14901   // "you can express cubic Hermite interpolation in terms of cubic Bézier curves
14902   // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
14903   function point$5(that, t0, t1) {
14904     var x0 = that._x0,
14905         y0 = that._y0,
14906         x1 = that._x1,
14907         y1 = that._y1,
14908         dx = (x1 - x0) / 3;
14909     that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
14910   }
14911
14912   function MonotoneX(context) {
14913     this._context = context;
14914   }
14915
14916   MonotoneX.prototype = {
14917     areaStart: function() {
14918       this._line = 0;
14919     },
14920     areaEnd: function() {
14921       this._line = NaN;
14922     },
14923     lineStart: function() {
14924       this._x0 = this._x1 =
14925       this._y0 = this._y1 =
14926       this._t0 = NaN;
14927       this._point = 0;
14928     },
14929     lineEnd: function() {
14930       switch (this._point) {
14931         case 2: this._context.lineTo(this._x1, this._y1); break;
14932         case 3: point$5(this, this._t0, slope2(this, this._t0)); break;
14933       }
14934       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14935       this._line = 1 - this._line;
14936     },
14937     point: function(x, y) {
14938       var t1 = NaN;
14939
14940       x = +x, y = +y;
14941       if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
14942       switch (this._point) {
14943         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14944         case 1: this._point = 2; break;
14945         case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
14946         default: point$5(this, this._t0, t1 = slope3(this, x, y)); break;
14947       }
14948
14949       this._x0 = this._x1, this._x1 = x;
14950       this._y0 = this._y1, this._y1 = y;
14951       this._t0 = t1;
14952     }
14953   };
14954
14955   function MonotoneY(context) {
14956     this._context = new ReflectContext(context);
14957   }
14958
14959   (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
14960     MonotoneX.prototype.point.call(this, y, x);
14961   };
14962
14963   function ReflectContext(context) {
14964     this._context = context;
14965   }
14966
14967   ReflectContext.prototype = {
14968     moveTo: function(x, y) { this._context.moveTo(y, x); },
14969     closePath: function() { this._context.closePath(); },
14970     lineTo: function(x, y) { this._context.lineTo(y, x); },
14971     bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
14972   };
14973
14974   function monotoneX(context) {
14975     return new MonotoneX(context);
14976   }
14977
14978   function monotoneY(context) {
14979     return new MonotoneY(context);
14980   }
14981
14982   function Natural(context) {
14983     this._context = context;
14984   }
14985
14986   Natural.prototype = {
14987     areaStart: function() {
14988       this._line = 0;
14989     },
14990     areaEnd: function() {
14991       this._line = NaN;
14992     },
14993     lineStart: function() {
14994       this._x = [];
14995       this._y = [];
14996     },
14997     lineEnd: function() {
14998       var x = this._x,
14999           y = this._y,
15000           n = x.length;
15001
15002       if (n) {
15003         this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
15004         if (n === 2) {
15005           this._context.lineTo(x[1], y[1]);
15006         } else {
15007           var px = controlPoints(x),
15008               py = controlPoints(y);
15009           for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
15010             this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
15011           }
15012         }
15013       }
15014
15015       if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
15016       this._line = 1 - this._line;
15017       this._x = this._y = null;
15018     },
15019     point: function(x, y) {
15020       this._x.push(+x);
15021       this._y.push(+y);
15022     }
15023   };
15024
15025   // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
15026   function controlPoints(x) {
15027     var i,
15028         n = x.length - 1,
15029         m,
15030         a = new Array(n),
15031         b = new Array(n),
15032         r = new Array(n);
15033     a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
15034     for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
15035     a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
15036     for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
15037     a[n - 1] = r[n - 1] / b[n - 1];
15038     for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
15039     b[n - 1] = (x[n] + a[n - 1]) / 2;
15040     for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
15041     return [a, b];
15042   }
15043
15044   function natural(context) {
15045     return new Natural(context);
15046   }
15047
15048   function Step(context, t) {
15049     this._context = context;
15050     this._t = t;
15051   }
15052
15053   Step.prototype = {
15054     areaStart: function() {
15055       this._line = 0;
15056     },
15057     areaEnd: function() {
15058       this._line = NaN;
15059     },
15060     lineStart: function() {
15061       this._x = this._y = NaN;
15062       this._point = 0;
15063     },
15064     lineEnd: function() {
15065       if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
15066       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
15067       if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
15068     },
15069     point: function(x, y) {
15070       x = +x, y = +y;
15071       switch (this._point) {
15072         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
15073         case 1: this._point = 2; // proceed
15074         default: {
15075           if (this._t <= 0) {
15076             this._context.lineTo(this._x, y);
15077             this._context.lineTo(x, y);
15078           } else {
15079             var x1 = this._x * (1 - this._t) + x * this._t;
15080             this._context.lineTo(x1, this._y);
15081             this._context.lineTo(x1, y);
15082           }
15083           break;
15084         }
15085       }
15086       this._x = x, this._y = y;
15087     }
15088   };
15089
15090   function step(context) {
15091     return new Step(context, 0.5);
15092   }
15093
15094   function stepBefore(context) {
15095     return new Step(context, 0);
15096   }
15097
15098   function stepAfter(context) {
15099     return new Step(context, 1);
15100   }
15101
15102   function none$1(series, order) {
15103     if (!((n = series.length) > 1)) return;
15104     for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
15105       s0 = s1, s1 = series[order[i]];
15106       for (j = 0; j < m; ++j) {
15107         s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
15108       }
15109     }
15110   }
15111
15112   function none$2(series) {
15113     var n = series.length, o = new Array(n);
15114     while (--n >= 0) o[n] = n;
15115     return o;
15116   }
15117
15118   function stackValue(d, key) {
15119     return d[key];
15120   }
15121
15122   function stack() {
15123     var keys = constant$a([]),
15124         order = none$2,
15125         offset = none$1,
15126         value = stackValue;
15127
15128     function stack(data) {
15129       var kz = keys.apply(this, arguments),
15130           i,
15131           m = data.length,
15132           n = kz.length,
15133           sz = new Array(n),
15134           oz;
15135
15136       for (i = 0; i < n; ++i) {
15137         for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
15138           si[j] = sij = [0, +value(data[j], ki, j, data)];
15139           sij.data = data[j];
15140         }
15141         si.key = ki;
15142       }
15143
15144       for (i = 0, oz = order(sz); i < n; ++i) {
15145         sz[oz[i]].index = i;
15146       }
15147
15148       offset(sz, oz);
15149       return sz;
15150     }
15151
15152     stack.keys = function(_) {
15153       return arguments.length ? (keys = typeof _ === "function" ? _ : constant$a(slice$6.call(_)), stack) : keys;
15154     };
15155
15156     stack.value = function(_) {
15157       return arguments.length ? (value = typeof _ === "function" ? _ : constant$a(+_), stack) : value;
15158     };
15159
15160     stack.order = function(_) {
15161       return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$a(slice$6.call(_)), stack) : order;
15162     };
15163
15164     stack.offset = function(_) {
15165       return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
15166     };
15167
15168     return stack;
15169   }
15170
15171   function expand(series, order) {
15172     if (!((n = series.length) > 0)) return;
15173     for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
15174       for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
15175       if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
15176     }
15177     none$1(series, order);
15178   }
15179
15180   function diverging(series, order) {
15181     if (!((n = series.length) > 1)) return;
15182     for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
15183       for (yp = yn = 0, i = 0; i < n; ++i) {
15184         if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {
15185           d[0] = yp, d[1] = yp += dy;
15186         } else if (dy < 0) {
15187           d[1] = yn, d[0] = yn += dy;
15188         } else {
15189           d[0] = yp;
15190         }
15191       }
15192     }
15193   }
15194
15195   function silhouette(series, order) {
15196     if (!((n = series.length) > 0)) return;
15197     for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
15198       for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
15199       s0[j][1] += s0[j][0] = -y / 2;
15200     }
15201     none$1(series, order);
15202   }
15203
15204   function wiggle(series, order) {
15205     if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
15206     for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
15207       for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
15208         var si = series[order[i]],
15209             sij0 = si[j][1] || 0,
15210             sij1 = si[j - 1][1] || 0,
15211             s3 = (sij0 - sij1) / 2;
15212         for (var k = 0; k < i; ++k) {
15213           var sk = series[order[k]],
15214               skj0 = sk[j][1] || 0,
15215               skj1 = sk[j - 1][1] || 0;
15216           s3 += skj0 - skj1;
15217         }
15218         s1 += sij0, s2 += s3 * sij0;
15219       }
15220       s0[j - 1][1] += s0[j - 1][0] = y;
15221       if (s1) y -= s2 / s1;
15222     }
15223     s0[j - 1][1] += s0[j - 1][0] = y;
15224     none$1(series, order);
15225   }
15226
15227   function ascending$2(series) {
15228     var sums = series.map(sum$2);
15229     return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; });
15230   }
15231
15232   function sum$2(series) {
15233     var s = 0, i = -1, n = series.length, v;
15234     while (++i < n) if (v = +series[i][1]) s += v;
15235     return s;
15236   }
15237
15238   function descending$1(series) {
15239     return ascending$2(series).reverse();
15240   }
15241
15242   function insideOut(series) {
15243     var n = series.length,
15244         i,
15245         j,
15246         sums = series.map(sum$2),
15247         order = none$2(series).sort(function(a, b) { return sums[b] - sums[a]; }),
15248         top = 0,
15249         bottom = 0,
15250         tops = [],
15251         bottoms = [];
15252
15253     for (i = 0; i < n; ++i) {
15254       j = order[i];
15255       if (top < bottom) {
15256         top += sums[j];
15257         tops.push(j);
15258       } else {
15259         bottom += sums[j];
15260         bottoms.push(j);
15261       }
15262     }
15263
15264     return bottoms.reverse().concat(tops);
15265   }
15266
15267   function reverse(series) {
15268     return none$2(series).reverse();
15269   }
15270
15271   function constant$b(x) {
15272     return function() {
15273       return x;
15274     };
15275   }
15276
15277   function x$4(d) {
15278     return d[0];
15279   }
15280
15281   function y$4(d) {
15282     return d[1];
15283   }
15284
15285   function RedBlackTree() {
15286     this._ = null; // root node
15287   }
15288
15289   function RedBlackNode(node) {
15290     node.U = // parent node
15291     node.C = // color - true for red, false for black
15292     node.L = // left node
15293     node.R = // right node
15294     node.P = // previous node
15295     node.N = null; // next node
15296   }
15297
15298   RedBlackTree.prototype = {
15299     constructor: RedBlackTree,
15300
15301     insert: function(after, node) {
15302       var parent, grandpa, uncle;
15303
15304       if (after) {
15305         node.P = after;
15306         node.N = after.N;
15307         if (after.N) after.N.P = node;
15308         after.N = node;
15309         if (after.R) {
15310           after = after.R;
15311           while (after.L) after = after.L;
15312           after.L = node;
15313         } else {
15314           after.R = node;
15315         }
15316         parent = after;
15317       } else if (this._) {
15318         after = RedBlackFirst(this._);
15319         node.P = null;
15320         node.N = after;
15321         after.P = after.L = node;
15322         parent = after;
15323       } else {
15324         node.P = node.N = null;
15325         this._ = node;
15326         parent = null;
15327       }
15328       node.L = node.R = null;
15329       node.U = parent;
15330       node.C = true;
15331
15332       after = node;
15333       while (parent && parent.C) {
15334         grandpa = parent.U;
15335         if (parent === grandpa.L) {
15336           uncle = grandpa.R;
15337           if (uncle && uncle.C) {
15338             parent.C = uncle.C = false;
15339             grandpa.C = true;
15340             after = grandpa;
15341           } else {
15342             if (after === parent.R) {
15343               RedBlackRotateLeft(this, parent);
15344               after = parent;
15345               parent = after.U;
15346             }
15347             parent.C = false;
15348             grandpa.C = true;
15349             RedBlackRotateRight(this, grandpa);
15350           }
15351         } else {
15352           uncle = grandpa.L;
15353           if (uncle && uncle.C) {
15354             parent.C = uncle.C = false;
15355             grandpa.C = true;
15356             after = grandpa;
15357           } else {
15358             if (after === parent.L) {
15359               RedBlackRotateRight(this, parent);
15360               after = parent;
15361               parent = after.U;
15362             }
15363             parent.C = false;
15364             grandpa.C = true;
15365             RedBlackRotateLeft(this, grandpa);
15366           }
15367         }
15368         parent = after.U;
15369       }
15370       this._.C = false;
15371     },
15372
15373     remove: function(node) {
15374       if (node.N) node.N.P = node.P;
15375       if (node.P) node.P.N = node.N;
15376       node.N = node.P = null;
15377
15378       var parent = node.U,
15379           sibling,
15380           left = node.L,
15381           right = node.R,
15382           next,
15383           red;
15384
15385       if (!left) next = right;
15386       else if (!right) next = left;
15387       else next = RedBlackFirst(right);
15388
15389       if (parent) {
15390         if (parent.L === node) parent.L = next;
15391         else parent.R = next;
15392       } else {
15393         this._ = next;
15394       }
15395
15396       if (left && right) {
15397         red = next.C;
15398         next.C = node.C;
15399         next.L = left;
15400         left.U = next;
15401         if (next !== right) {
15402           parent = next.U;
15403           next.U = node.U;
15404           node = next.R;
15405           parent.L = node;
15406           next.R = right;
15407           right.U = next;
15408         } else {
15409           next.U = parent;
15410           parent = next;
15411           node = next.R;
15412         }
15413       } else {
15414         red = node.C;
15415         node = next;
15416       }
15417
15418       if (node) node.U = parent;
15419       if (red) return;
15420       if (node && node.C) { node.C = false; return; }
15421
15422       do {
15423         if (node === this._) break;
15424         if (node === parent.L) {
15425           sibling = parent.R;
15426           if (sibling.C) {
15427             sibling.C = false;
15428             parent.C = true;
15429             RedBlackRotateLeft(this, parent);
15430             sibling = parent.R;
15431           }
15432           if ((sibling.L && sibling.L.C)
15433               || (sibling.R && sibling.R.C)) {
15434             if (!sibling.R || !sibling.R.C) {
15435               sibling.L.C = false;
15436               sibling.C = true;
15437               RedBlackRotateRight(this, sibling);
15438               sibling = parent.R;
15439             }
15440             sibling.C = parent.C;
15441             parent.C = sibling.R.C = false;
15442             RedBlackRotateLeft(this, parent);
15443             node = this._;
15444             break;
15445           }
15446         } else {
15447           sibling = parent.L;
15448           if (sibling.C) {
15449             sibling.C = false;
15450             parent.C = true;
15451             RedBlackRotateRight(this, parent);
15452             sibling = parent.L;
15453           }
15454           if ((sibling.L && sibling.L.C)
15455             || (sibling.R && sibling.R.C)) {
15456             if (!sibling.L || !sibling.L.C) {
15457               sibling.R.C = false;
15458               sibling.C = true;
15459               RedBlackRotateLeft(this, sibling);
15460               sibling = parent.L;
15461             }
15462             sibling.C = parent.C;
15463             parent.C = sibling.L.C = false;
15464             RedBlackRotateRight(this, parent);
15465             node = this._;
15466             break;
15467           }
15468         }
15469         sibling.C = true;
15470         node = parent;
15471         parent = parent.U;
15472       } while (!node.C);
15473
15474       if (node) node.C = false;
15475     }
15476   };
15477
15478   function RedBlackRotateLeft(tree, node) {
15479     var p = node,
15480         q = node.R,
15481         parent = p.U;
15482
15483     if (parent) {
15484       if (parent.L === p) parent.L = q;
15485       else parent.R = q;
15486     } else {
15487       tree._ = q;
15488     }
15489
15490     q.U = parent;
15491     p.U = q;
15492     p.R = q.L;
15493     if (p.R) p.R.U = p;
15494     q.L = p;
15495   }
15496
15497   function RedBlackRotateRight(tree, node) {
15498     var p = node,
15499         q = node.L,
15500         parent = p.U;
15501
15502     if (parent) {
15503       if (parent.L === p) parent.L = q;
15504       else parent.R = q;
15505     } else {
15506       tree._ = q;
15507     }
15508
15509     q.U = parent;
15510     p.U = q;
15511     p.L = q.R;
15512     if (p.L) p.L.U = p;
15513     q.R = p;
15514   }
15515
15516   function RedBlackFirst(node) {
15517     while (node.L) node = node.L;
15518     return node;
15519   }
15520
15521   function createEdge(left, right, v0, v1) {
15522     var edge = [null, null],
15523         index = edges.push(edge) - 1;
15524     edge.left = left;
15525     edge.right = right;
15526     if (v0) setEdgeEnd(edge, left, right, v0);
15527     if (v1) setEdgeEnd(edge, right, left, v1);
15528     cells[left.index].halfedges.push(index);
15529     cells[right.index].halfedges.push(index);
15530     return edge;
15531   }
15532
15533   function createBorderEdge(left, v0, v1) {
15534     var edge = [v0, v1];
15535     edge.left = left;
15536     return edge;
15537   }
15538
15539   function setEdgeEnd(edge, left, right, vertex) {
15540     if (!edge[0] && !edge[1]) {
15541       edge[0] = vertex;
15542       edge.left = left;
15543       edge.right = right;
15544     } else if (edge.left === right) {
15545       edge[1] = vertex;
15546     } else {
15547       edge[0] = vertex;
15548     }
15549   }
15550
15551   // Liang–Barsky line clipping.
15552   function clipEdge(edge, x0, y0, x1, y1) {
15553     var a = edge[0],
15554         b = edge[1],
15555         ax = a[0],
15556         ay = a[1],
15557         bx = b[0],
15558         by = b[1],
15559         t0 = 0,
15560         t1 = 1,
15561         dx = bx - ax,
15562         dy = by - ay,
15563         r;
15564
15565     r = x0 - ax;
15566     if (!dx && r > 0) return;
15567     r /= dx;
15568     if (dx < 0) {
15569       if (r < t0) return;
15570       if (r < t1) t1 = r;
15571     } else if (dx > 0) {
15572       if (r > t1) return;
15573       if (r > t0) t0 = r;
15574     }
15575
15576     r = x1 - ax;
15577     if (!dx && r < 0) return;
15578     r /= dx;
15579     if (dx < 0) {
15580       if (r > t1) return;
15581       if (r > t0) t0 = r;
15582     } else if (dx > 0) {
15583       if (r < t0) return;
15584       if (r < t1) t1 = r;
15585     }
15586
15587     r = y0 - ay;
15588     if (!dy && r > 0) return;
15589     r /= dy;
15590     if (dy < 0) {
15591       if (r < t0) return;
15592       if (r < t1) t1 = r;
15593     } else if (dy > 0) {
15594       if (r > t1) return;
15595       if (r > t0) t0 = r;
15596     }
15597
15598     r = y1 - ay;
15599     if (!dy && r < 0) return;
15600     r /= dy;
15601     if (dy < 0) {
15602       if (r > t1) return;
15603       if (r > t0) t0 = r;
15604     } else if (dy > 0) {
15605       if (r < t0) return;
15606       if (r < t1) t1 = r;
15607     }
15608
15609     if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
15610
15611     if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
15612     if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
15613     return true;
15614   }
15615
15616   function connectEdge(edge, x0, y0, x1, y1) {
15617     var v1 = edge[1];
15618     if (v1) return true;
15619
15620     var v0 = edge[0],
15621         left = edge.left,
15622         right = edge.right,
15623         lx = left[0],
15624         ly = left[1],
15625         rx = right[0],
15626         ry = right[1],
15627         fx = (lx + rx) / 2,
15628         fy = (ly + ry) / 2,
15629         fm,
15630         fb;
15631
15632     if (ry === ly) {
15633       if (fx < x0 || fx >= x1) return;
15634       if (lx > rx) {
15635         if (!v0) v0 = [fx, y0];
15636         else if (v0[1] >= y1) return;
15637         v1 = [fx, y1];
15638       } else {
15639         if (!v0) v0 = [fx, y1];
15640         else if (v0[1] < y0) return;
15641         v1 = [fx, y0];
15642       }
15643     } else {
15644       fm = (lx - rx) / (ry - ly);
15645       fb = fy - fm * fx;
15646       if (fm < -1 || fm > 1) {
15647         if (lx > rx) {
15648           if (!v0) v0 = [(y0 - fb) / fm, y0];
15649           else if (v0[1] >= y1) return;
15650           v1 = [(y1 - fb) / fm, y1];
15651         } else {
15652           if (!v0) v0 = [(y1 - fb) / fm, y1];
15653           else if (v0[1] < y0) return;
15654           v1 = [(y0 - fb) / fm, y0];
15655         }
15656       } else {
15657         if (ly < ry) {
15658           if (!v0) v0 = [x0, fm * x0 + fb];
15659           else if (v0[0] >= x1) return;
15660           v1 = [x1, fm * x1 + fb];
15661         } else {
15662           if (!v0) v0 = [x1, fm * x1 + fb];
15663           else if (v0[0] < x0) return;
15664           v1 = [x0, fm * x0 + fb];
15665         }
15666       }
15667     }
15668
15669     edge[0] = v0;
15670     edge[1] = v1;
15671     return true;
15672   }
15673
15674   function clipEdges(x0, y0, x1, y1) {
15675     var i = edges.length,
15676         edge;
15677
15678     while (i--) {
15679       if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
15680           || !clipEdge(edge, x0, y0, x1, y1)
15681           || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4
15682               || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) {
15683         delete edges[i];
15684       }
15685     }
15686   }
15687
15688   function createCell(site) {
15689     return cells[site.index] = {
15690       site: site,
15691       halfedges: []
15692     };
15693   }
15694
15695   function cellHalfedgeAngle(cell, edge) {
15696     var site = cell.site,
15697         va = edge.left,
15698         vb = edge.right;
15699     if (site === vb) vb = va, va = site;
15700     if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
15701     if (site === va) va = edge[1], vb = edge[0];
15702     else va = edge[0], vb = edge[1];
15703     return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
15704   }
15705
15706   function cellHalfedgeStart(cell, edge) {
15707     return edge[+(edge.left !== cell.site)];
15708   }
15709
15710   function cellHalfedgeEnd(cell, edge) {
15711     return edge[+(edge.left === cell.site)];
15712   }
15713
15714   function sortCellHalfedges() {
15715     for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
15716       if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
15717         var index = new Array(m),
15718             array = new Array(m);
15719         for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
15720         index.sort(function(i, j) { return array[j] - array[i]; });
15721         for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
15722         for (j = 0; j < m; ++j) halfedges[j] = array[j];
15723       }
15724     }
15725   }
15726
15727   function clipCells(x0, y0, x1, y1) {
15728     var nCells = cells.length,
15729         iCell,
15730         cell,
15731         site,
15732         iHalfedge,
15733         halfedges,
15734         nHalfedges,
15735         start,
15736         startX,
15737         startY,
15738         end,
15739         endX,
15740         endY,
15741         cover = true;
15742
15743     for (iCell = 0; iCell < nCells; ++iCell) {
15744       if (cell = cells[iCell]) {
15745         site = cell.site;
15746         halfedges = cell.halfedges;
15747         iHalfedge = halfedges.length;
15748
15749         // Remove any dangling clipped edges.
15750         while (iHalfedge--) {
15751           if (!edges[halfedges[iHalfedge]]) {
15752             halfedges.splice(iHalfedge, 1);
15753           }
15754         }
15755
15756         // Insert any border edges as necessary.
15757         iHalfedge = 0, nHalfedges = halfedges.length;
15758         while (iHalfedge < nHalfedges) {
15759           end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
15760           start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
15761           if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) {
15762             halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
15763                 Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1]
15764                 : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1]
15765                 : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0]
15766                 : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0]
15767                 : null)) - 1);
15768             ++nHalfedges;
15769           }
15770         }
15771
15772         if (nHalfedges) cover = false;
15773       }
15774     }
15775
15776     // If there weren’t any edges, have the closest site cover the extent.
15777     // It doesn’t matter which corner of the extent we measure!
15778     if (cover) {
15779       var dx, dy, d2, dc = Infinity;
15780
15781       for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
15782         if (cell = cells[iCell]) {
15783           site = cell.site;
15784           dx = site[0] - x0;
15785           dy = site[1] - y0;
15786           d2 = dx * dx + dy * dy;
15787           if (d2 < dc) dc = d2, cover = cell;
15788         }
15789       }
15790
15791       if (cover) {
15792         var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
15793         cover.halfedges.push(
15794           edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
15795           edges.push(createBorderEdge(site, v01, v11)) - 1,
15796           edges.push(createBorderEdge(site, v11, v10)) - 1,
15797           edges.push(createBorderEdge(site, v10, v00)) - 1
15798         );
15799       }
15800     }
15801
15802     // Lastly delete any cells with no edges; these were entirely clipped.
15803     for (iCell = 0; iCell < nCells; ++iCell) {
15804       if (cell = cells[iCell]) {
15805         if (!cell.halfedges.length) {
15806           delete cells[iCell];
15807         }
15808       }
15809     }
15810   }
15811
15812   var circlePool = [];
15813
15814   var firstCircle;
15815
15816   function Circle() {
15817     RedBlackNode(this);
15818     this.x =
15819     this.y =
15820     this.arc =
15821     this.site =
15822     this.cy = null;
15823   }
15824
15825   function attachCircle(arc) {
15826     var lArc = arc.P,
15827         rArc = arc.N;
15828
15829     if (!lArc || !rArc) return;
15830
15831     var lSite = lArc.site,
15832         cSite = arc.site,
15833         rSite = rArc.site;
15834
15835     if (lSite === rSite) return;
15836
15837     var bx = cSite[0],
15838         by = cSite[1],
15839         ax = lSite[0] - bx,
15840         ay = lSite[1] - by,
15841         cx = rSite[0] - bx,
15842         cy = rSite[1] - by;
15843
15844     var d = 2 * (ax * cy - ay * cx);
15845     if (d >= -epsilon2$2) return;
15846
15847     var ha = ax * ax + ay * ay,
15848         hc = cx * cx + cy * cy,
15849         x = (cy * ha - ay * hc) / d,
15850         y = (ax * hc - cx * ha) / d;
15851
15852     var circle = circlePool.pop() || new Circle;
15853     circle.arc = arc;
15854     circle.site = cSite;
15855     circle.x = x + bx;
15856     circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
15857
15858     arc.circle = circle;
15859
15860     var before = null,
15861         node = circles._;
15862
15863     while (node) {
15864       if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
15865         if (node.L) node = node.L;
15866         else { before = node.P; break; }
15867       } else {
15868         if (node.R) node = node.R;
15869         else { before = node; break; }
15870       }
15871     }
15872
15873     circles.insert(before, circle);
15874     if (!before) firstCircle = circle;
15875   }
15876
15877   function detachCircle(arc) {
15878     var circle = arc.circle;
15879     if (circle) {
15880       if (!circle.P) firstCircle = circle.N;
15881       circles.remove(circle);
15882       circlePool.push(circle);
15883       RedBlackNode(circle);
15884       arc.circle = null;
15885     }
15886   }
15887
15888   var beachPool = [];
15889
15890   function Beach() {
15891     RedBlackNode(this);
15892     this.edge =
15893     this.site =
15894     this.circle = null;
15895   }
15896
15897   function createBeach(site) {
15898     var beach = beachPool.pop() || new Beach;
15899     beach.site = site;
15900     return beach;
15901   }
15902
15903   function detachBeach(beach) {
15904     detachCircle(beach);
15905     beaches.remove(beach);
15906     beachPool.push(beach);
15907     RedBlackNode(beach);
15908   }
15909
15910   function removeBeach(beach) {
15911     var circle = beach.circle,
15912         x = circle.x,
15913         y = circle.cy,
15914         vertex = [x, y],
15915         previous = beach.P,
15916         next = beach.N,
15917         disappearing = [beach];
15918
15919     detachBeach(beach);
15920
15921     var lArc = previous;
15922     while (lArc.circle
15923         && Math.abs(x - lArc.circle.x) < epsilon$4
15924         && Math.abs(y - lArc.circle.cy) < epsilon$4) {
15925       previous = lArc.P;
15926       disappearing.unshift(lArc);
15927       detachBeach(lArc);
15928       lArc = previous;
15929     }
15930
15931     disappearing.unshift(lArc);
15932     detachCircle(lArc);
15933
15934     var rArc = next;
15935     while (rArc.circle
15936         && Math.abs(x - rArc.circle.x) < epsilon$4
15937         && Math.abs(y - rArc.circle.cy) < epsilon$4) {
15938       next = rArc.N;
15939       disappearing.push(rArc);
15940       detachBeach(rArc);
15941       rArc = next;
15942     }
15943
15944     disappearing.push(rArc);
15945     detachCircle(rArc);
15946
15947     var nArcs = disappearing.length,
15948         iArc;
15949     for (iArc = 1; iArc < nArcs; ++iArc) {
15950       rArc = disappearing[iArc];
15951       lArc = disappearing[iArc - 1];
15952       setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
15953     }
15954
15955     lArc = disappearing[0];
15956     rArc = disappearing[nArcs - 1];
15957     rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
15958
15959     attachCircle(lArc);
15960     attachCircle(rArc);
15961   }
15962
15963   function addBeach(site) {
15964     var x = site[0],
15965         directrix = site[1],
15966         lArc,
15967         rArc,
15968         dxl,
15969         dxr,
15970         node = beaches._;
15971
15972     while (node) {
15973       dxl = leftBreakPoint(node, directrix) - x;
15974       if (dxl > epsilon$4) node = node.L; else {
15975         dxr = x - rightBreakPoint(node, directrix);
15976         if (dxr > epsilon$4) {
15977           if (!node.R) {
15978             lArc = node;
15979             break;
15980           }
15981           node = node.R;
15982         } else {
15983           if (dxl > -epsilon$4) {
15984             lArc = node.P;
15985             rArc = node;
15986           } else if (dxr > -epsilon$4) {
15987             lArc = node;
15988             rArc = node.N;
15989           } else {
15990             lArc = rArc = node;
15991           }
15992           break;
15993         }
15994       }
15995     }
15996
15997     createCell(site);
15998     var newArc = createBeach(site);
15999     beaches.insert(lArc, newArc);
16000
16001     if (!lArc && !rArc) return;
16002
16003     if (lArc === rArc) {
16004       detachCircle(lArc);
16005       rArc = createBeach(lArc.site);
16006       beaches.insert(newArc, rArc);
16007       newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
16008       attachCircle(lArc);
16009       attachCircle(rArc);
16010       return;
16011     }
16012
16013     if (!rArc) { // && lArc
16014       newArc.edge = createEdge(lArc.site, newArc.site);
16015       return;
16016     }
16017
16018     // else lArc !== rArc
16019     detachCircle(lArc);
16020     detachCircle(rArc);
16021
16022     var lSite = lArc.site,
16023         ax = lSite[0],
16024         ay = lSite[1],
16025         bx = site[0] - ax,
16026         by = site[1] - ay,
16027         rSite = rArc.site,
16028         cx = rSite[0] - ax,
16029         cy = rSite[1] - ay,
16030         d = 2 * (bx * cy - by * cx),
16031         hb = bx * bx + by * by,
16032         hc = cx * cx + cy * cy,
16033         vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
16034
16035     setEdgeEnd(rArc.edge, lSite, rSite, vertex);
16036     newArc.edge = createEdge(lSite, site, null, vertex);
16037     rArc.edge = createEdge(site, rSite, null, vertex);
16038     attachCircle(lArc);
16039     attachCircle(rArc);
16040   }
16041
16042   function leftBreakPoint(arc, directrix) {
16043     var site = arc.site,
16044         rfocx = site[0],
16045         rfocy = site[1],
16046         pby2 = rfocy - directrix;
16047
16048     if (!pby2) return rfocx;
16049
16050     var lArc = arc.P;
16051     if (!lArc) return -Infinity;
16052
16053     site = lArc.site;
16054     var lfocx = site[0],
16055         lfocy = site[1],
16056         plby2 = lfocy - directrix;
16057
16058     if (!plby2) return lfocx;
16059
16060     var hl = lfocx - rfocx,
16061         aby2 = 1 / pby2 - 1 / plby2,
16062         b = hl / plby2;
16063
16064     if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
16065
16066     return (rfocx + lfocx) / 2;
16067   }
16068
16069   function rightBreakPoint(arc, directrix) {
16070     var rArc = arc.N;
16071     if (rArc) return leftBreakPoint(rArc, directrix);
16072     var site = arc.site;
16073     return site[1] === directrix ? site[0] : Infinity;
16074   }
16075
16076   var epsilon$4 = 1e-6;
16077   var epsilon2$2 = 1e-12;
16078   var beaches;
16079   var cells;
16080   var circles;
16081   var edges;
16082
16083   function triangleArea(a, b, c) {
16084     return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
16085   }
16086
16087   function lexicographic(a, b) {
16088     return b[1] - a[1]
16089         || b[0] - a[0];
16090   }
16091
16092   function Diagram(sites, extent) {
16093     var site = sites.sort(lexicographic).pop(),
16094         x,
16095         y,
16096         circle;
16097
16098     edges = [];
16099     cells = new Array(sites.length);
16100     beaches = new RedBlackTree;
16101     circles = new RedBlackTree;
16102
16103     while (true) {
16104       circle = firstCircle;
16105       if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
16106         if (site[0] !== x || site[1] !== y) {
16107           addBeach(site);
16108           x = site[0], y = site[1];
16109         }
16110         site = sites.pop();
16111       } else if (circle) {
16112         removeBeach(circle.arc);
16113       } else {
16114         break;
16115       }
16116     }
16117
16118     sortCellHalfedges();
16119
16120     if (extent) {
16121       var x0 = +extent[0][0],
16122           y0 = +extent[0][1],
16123           x1 = +extent[1][0],
16124           y1 = +extent[1][1];
16125       clipEdges(x0, y0, x1, y1);
16126       clipCells(x0, y0, x1, y1);
16127     }
16128
16129     this.edges = edges;
16130     this.cells = cells;
16131
16132     beaches =
16133     circles =
16134     edges =
16135     cells = null;
16136   }
16137
16138   Diagram.prototype = {
16139     constructor: Diagram,
16140
16141     polygons: function() {
16142       var edges = this.edges;
16143
16144       return this.cells.map(function(cell) {
16145         var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
16146         polygon.data = cell.site.data;
16147         return polygon;
16148       });
16149     },
16150
16151     triangles: function() {
16152       var triangles = [],
16153           edges = this.edges;
16154
16155       this.cells.forEach(function(cell, i) {
16156         if (!(m = (halfedges = cell.halfedges).length)) return;
16157         var site = cell.site,
16158             halfedges,
16159             j = -1,
16160             m,
16161             s0,
16162             e1 = edges[halfedges[m - 1]],
16163             s1 = e1.left === site ? e1.right : e1.left;
16164
16165         while (++j < m) {
16166           s0 = s1;
16167           e1 = edges[halfedges[j]];
16168           s1 = e1.left === site ? e1.right : e1.left;
16169           if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
16170             triangles.push([site.data, s0.data, s1.data]);
16171           }
16172         }
16173       });
16174
16175       return triangles;
16176     },
16177
16178     links: function() {
16179       return this.edges.filter(function(edge) {
16180         return edge.right;
16181       }).map(function(edge) {
16182         return {
16183           source: edge.left.data,
16184           target: edge.right.data
16185         };
16186       });
16187     },
16188
16189     find: function(x, y, radius) {
16190       var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
16191
16192       // Use the previously-found cell, or start with an arbitrary one.
16193       while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
16194       var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
16195
16196       // Traverse the half-edges to find a closer cell, if any.
16197       do {
16198         cell = that.cells[i0 = i1], i1 = null;
16199         cell.halfedges.forEach(function(e) {
16200           var edge = that.edges[e], v = edge.left;
16201           if ((v === cell.site || !v) && !(v = edge.right)) return;
16202           var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
16203           if (v2 < d2) d2 = v2, i1 = v.index;
16204         });
16205       } while (i1 !== null);
16206
16207       that._found = i0;
16208
16209       return radius == null || d2 <= radius * radius ? cell.site : null;
16210     }
16211   };
16212
16213   function voronoi() {
16214     var x$$1 = x$4,
16215         y$$1 = y$4,
16216         extent = null;
16217
16218     function voronoi(data) {
16219       return new Diagram(data.map(function(d, i) {
16220         var s = [Math.round(x$$1(d, i, data) / epsilon$4) * epsilon$4, Math.round(y$$1(d, i, data) / epsilon$4) * epsilon$4];
16221         s.index = i;
16222         s.data = d;
16223         return s;
16224       }), extent);
16225     }
16226
16227     voronoi.polygons = function(data) {
16228       return voronoi(data).polygons();
16229     };
16230
16231     voronoi.links = function(data) {
16232       return voronoi(data).links();
16233     };
16234
16235     voronoi.triangles = function(data) {
16236       return voronoi(data).triangles();
16237     };
16238
16239     voronoi.x = function(_) {
16240       return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$b(+_), voronoi) : x$$1;
16241     };
16242
16243     voronoi.y = function(_) {
16244       return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$b(+_), voronoi) : y$$1;
16245     };
16246
16247     voronoi.extent = function(_) {
16248       return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]];
16249     };
16250
16251     voronoi.size = function(_) {
16252       return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
16253     };
16254
16255     return voronoi;
16256   }
16257
16258   function constant$c(x) {
16259     return function() {
16260       return x;
16261     };
16262   }
16263
16264   function ZoomEvent(target, type, transform) {
16265     this.target = target;
16266     this.type = type;
16267     this.transform = transform;
16268   }
16269
16270   function Transform(k, x, y) {
16271     this.k = k;
16272     this.x = x;
16273     this.y = y;
16274   }
16275
16276   Transform.prototype = {
16277     constructor: Transform,
16278     scale: function(k) {
16279       return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
16280     },
16281     translate: function(x, y) {
16282       return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
16283     },
16284     apply: function(point) {
16285       return [point[0] * this.k + this.x, point[1] * this.k + this.y];
16286     },
16287     applyX: function(x) {
16288       return x * this.k + this.x;
16289     },
16290     applyY: function(y) {
16291       return y * this.k + this.y;
16292     },
16293     invert: function(location) {
16294       return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
16295     },
16296     invertX: function(x) {
16297       return (x - this.x) / this.k;
16298     },
16299     invertY: function(y) {
16300       return (y - this.y) / this.k;
16301     },
16302     rescaleX: function(x) {
16303       return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
16304     },
16305     rescaleY: function(y) {
16306       return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
16307     },
16308     toString: function() {
16309       return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
16310     }
16311   };
16312
16313   var identity$7 = new Transform(1, 0, 0);
16314
16315   transform.prototype = Transform.prototype;
16316
16317   function transform(node) {
16318     return node.__zoom || identity$7;
16319   }
16320
16321   function nopropagation$2() {
16322     event.stopImmediatePropagation();
16323   }
16324
16325   function noevent$2() {
16326     event.preventDefault();
16327     event.stopImmediatePropagation();
16328   }
16329
16330   // Ignore right-click, since that should open the context menu.
16331   function defaultFilter$2() {
16332     return !event.button;
16333   }
16334
16335   function defaultExtent$1() {
16336     var e = this, w, h;
16337     if (e instanceof SVGElement) {
16338       e = e.ownerSVGElement || e;
16339       w = e.width.baseVal.value;
16340       h = e.height.baseVal.value;
16341     } else {
16342       w = e.clientWidth;
16343       h = e.clientHeight;
16344     }
16345     return [[0, 0], [w, h]];
16346   }
16347
16348   function defaultTransform() {
16349     return this.__zoom || identity$7;
16350   }
16351
16352   function defaultWheelDelta() {
16353     return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
16354   }
16355
16356   function defaultTouchable$1() {
16357     return "ontouchstart" in this;
16358   }
16359
16360   function defaultConstrain(transform$$1, extent, translateExtent) {
16361     var dx0 = transform$$1.invertX(extent[0][0]) - translateExtent[0][0],
16362         dx1 = transform$$1.invertX(extent[1][0]) - translateExtent[1][0],
16363         dy0 = transform$$1.invertY(extent[0][1]) - translateExtent[0][1],
16364         dy1 = transform$$1.invertY(extent[1][1]) - translateExtent[1][1];
16365     return transform$$1.translate(
16366       dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
16367       dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
16368     );
16369   }
16370
16371   function d3_zoom() {
16372     var filter = defaultFilter$2,
16373         extent = defaultExtent$1,
16374         constrain = defaultConstrain,
16375         wheelDelta = defaultWheelDelta,
16376         touchable = defaultTouchable$1,
16377         scaleExtent = [0, Infinity],
16378         translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
16379         duration = 250,
16380         interpolate$$1 = interpolateZoom,
16381         gestures = [],
16382         listeners = dispatch("start", "zoom", "end"),
16383         touchstarting,
16384         touchending,
16385         touchDelay = 500,
16386         wheelDelay = 150,
16387         clickDistance2 = 0;
16388
16389     function zoom(selection$$1) {
16390       selection$$1
16391           .property("__zoom", defaultTransform)
16392           .on("wheel.zoom", wheeled)
16393           .on("mousedown.zoom", mousedowned)
16394           .on("dblclick.zoom", dblclicked)
16395         .filter(touchable)
16396           .on("touchstart.zoom", touchstarted)
16397           .on("touchmove.zoom", touchmoved)
16398           .on("touchend.zoom touchcancel.zoom", touchended)
16399           .style("touch-action", "none")
16400           .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
16401     }
16402
16403     zoom.transform = function(collection, transform$$1) {
16404       var selection$$1 = collection.selection ? collection.selection() : collection;
16405       selection$$1.property("__zoom", defaultTransform);
16406       if (collection !== selection$$1) {
16407         schedule(collection, transform$$1);
16408       } else {
16409         selection$$1.interrupt().each(function() {
16410           gesture(this, arguments)
16411               .start()
16412               .zoom(null, typeof transform$$1 === "function" ? transform$$1.apply(this, arguments) : transform$$1)
16413               .end();
16414         });
16415       }
16416     };
16417
16418     zoom.scaleBy = function(selection$$1, k) {
16419       zoom.scaleTo(selection$$1, function() {
16420         var k0 = this.__zoom.k,
16421             k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16422         return k0 * k1;
16423       });
16424     };
16425
16426     zoom.scaleTo = function(selection$$1, k) {
16427       zoom.transform(selection$$1, function() {
16428         var e = extent.apply(this, arguments),
16429             t0 = this.__zoom,
16430             p0 = centroid(e),
16431             p1 = t0.invert(p0),
16432             k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16433         return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
16434       });
16435     };
16436
16437     zoom.translateBy = function(selection$$1, x, y) {
16438       zoom.transform(selection$$1, function() {
16439         return constrain(this.__zoom.translate(
16440           typeof x === "function" ? x.apply(this, arguments) : x,
16441           typeof y === "function" ? y.apply(this, arguments) : y
16442         ), extent.apply(this, arguments), translateExtent);
16443       });
16444     };
16445
16446     zoom.translateTo = function(selection$$1, x, y) {
16447       zoom.transform(selection$$1, function() {
16448         var e = extent.apply(this, arguments),
16449             t = this.__zoom,
16450             p = centroid(e);
16451         return constrain(identity$7.translate(p[0], p[1]).scale(t.k).translate(
16452           typeof x === "function" ? -x.apply(this, arguments) : -x,
16453           typeof y === "function" ? -y.apply(this, arguments) : -y
16454         ), e, translateExtent);
16455       });
16456     };
16457
16458     function scale(transform$$1, k) {
16459       k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
16460       return k === transform$$1.k ? transform$$1 : new Transform(k, transform$$1.x, transform$$1.y);
16461     }
16462
16463     function translate(transform$$1, p0, p1) {
16464       var x = p0[0] - p1[0] * transform$$1.k, y = p0[1] - p1[1] * transform$$1.k;
16465       return x === transform$$1.x && y === transform$$1.y ? transform$$1 : new Transform(transform$$1.k, x, y);
16466     }
16467
16468     function centroid(extent) {
16469       return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
16470     }
16471
16472     function schedule(transition$$1, transform$$1, center) {
16473       transition$$1
16474           .on("start.zoom", function() { gesture(this, arguments).start(); })
16475           .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
16476           .tween("zoom", function() {
16477             var that = this,
16478                 args = arguments,
16479                 g = gesture(that, args),
16480                 e = extent.apply(that, args),
16481                 p = center || centroid(e),
16482                 w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
16483                 a = that.__zoom,
16484                 b = typeof transform$$1 === "function" ? transform$$1.apply(that, args) : transform$$1,
16485                 i = interpolate$$1(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
16486             return function(t) {
16487               if (t === 1) t = b; // Avoid rounding error on end.
16488               else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
16489               g.zoom(null, t);
16490             };
16491           });
16492     }
16493
16494     function gesture(that, args) {
16495       for (var i = 0, n = gestures.length, g; i < n; ++i) {
16496         if ((g = gestures[i]).that === that) {
16497           return g;
16498         }
16499       }
16500       return new Gesture(that, args);
16501     }
16502
16503     function Gesture(that, args) {
16504       this.that = that;
16505       this.args = args;
16506       this.index = -1;
16507       this.active = 0;
16508       this.extent = extent.apply(that, args);
16509     }
16510
16511     Gesture.prototype = {
16512       start: function() {
16513         if (++this.active === 1) {
16514           this.index = gestures.push(this) - 1;
16515           this.emit("start");
16516         }
16517         return this;
16518       },
16519       zoom: function(key, transform$$1) {
16520         if (this.mouse && key !== "mouse") this.mouse[1] = transform$$1.invert(this.mouse[0]);
16521         if (this.touch0 && key !== "touch") this.touch0[1] = transform$$1.invert(this.touch0[0]);
16522         if (this.touch1 && key !== "touch") this.touch1[1] = transform$$1.invert(this.touch1[0]);
16523         this.that.__zoom = transform$$1;
16524         this.emit("zoom");
16525         return this;
16526       },
16527       end: function() {
16528         if (--this.active === 0) {
16529           gestures.splice(this.index, 1);
16530           this.index = -1;
16531           this.emit("end");
16532         }
16533         return this;
16534       },
16535       emit: function(type) {
16536         customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
16537       }
16538     };
16539
16540     function wheeled() {
16541       if (!filter.apply(this, arguments)) return;
16542       var g = gesture(this, arguments),
16543           t = this.__zoom,
16544           k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
16545           p = mouse(this);
16546
16547       // If the mouse is in the same location as before, reuse it.
16548       // If there were recent wheel events, reset the wheel idle timeout.
16549       if (g.wheel) {
16550         if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
16551           g.mouse[1] = t.invert(g.mouse[0] = p);
16552         }
16553         clearTimeout(g.wheel);
16554       }
16555
16556       // If this wheel event won’t trigger a transform change, ignore it.
16557       else if (t.k === k) return;
16558
16559       // Otherwise, capture the mouse point and location at the start.
16560       else {
16561         g.mouse = [p, t.invert(p)];
16562         interrupt(this);
16563         g.start();
16564       }
16565
16566       noevent$2();
16567       g.wheel = setTimeout(wheelidled, wheelDelay);
16568       g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
16569
16570       function wheelidled() {
16571         g.wheel = null;
16572         g.end();
16573       }
16574     }
16575
16576     function mousedowned() {
16577       if (touchending || !filter.apply(this, arguments)) return;
16578       var g = gesture(this, arguments),
16579           v = select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
16580           p = mouse(this),
16581           x0 = event.clientX,
16582           y0 = event.clientY;
16583
16584       dragDisable(event.view);
16585       nopropagation$2();
16586       g.mouse = [p, this.__zoom.invert(p)];
16587       interrupt(this);
16588       g.start();
16589
16590       function mousemoved() {
16591         noevent$2();
16592         if (!g.moved) {
16593           var dx = event.clientX - x0, dy = event.clientY - y0;
16594           g.moved = dx * dx + dy * dy > clickDistance2;
16595         }
16596         g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent, translateExtent));
16597       }
16598
16599       function mouseupped() {
16600         v.on("mousemove.zoom mouseup.zoom", null);
16601         yesdrag(event.view, g.moved);
16602         noevent$2();
16603         g.end();
16604       }
16605     }
16606
16607     function dblclicked() {
16608       if (!filter.apply(this, arguments)) return;
16609       var t0 = this.__zoom,
16610           p0 = mouse(this),
16611           p1 = t0.invert(p0),
16612           k1 = t0.k * (event.shiftKey ? 0.5 : 2),
16613           t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
16614
16615       noevent$2();
16616       if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0);
16617       else select(this).call(zoom.transform, t1);
16618     }
16619
16620     function touchstarted() {
16621       if (!filter.apply(this, arguments)) return;
16622       var g = gesture(this, arguments),
16623           touches = event.changedTouches,
16624           started,
16625           n = touches.length, i, t, p;
16626
16627       nopropagation$2();
16628       for (i = 0; i < n; ++i) {
16629         t = touches[i], p = touch(this, touches, t.identifier);
16630         p = [p, this.__zoom.invert(p), t.identifier];
16631         if (!g.touch0) g.touch0 = p, started = true;
16632         else if (!g.touch1) g.touch1 = p;
16633       }
16634
16635       // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
16636       if (touchstarting) {
16637         touchstarting = clearTimeout(touchstarting);
16638         if (!g.touch1) {
16639           g.end();
16640           p = select(this).on("dblclick.zoom");
16641           if (p) p.apply(this, arguments);
16642           return;
16643         }
16644       }
16645
16646       if (started) {
16647         touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
16648         interrupt(this);
16649         g.start();
16650       }
16651     }
16652
16653     function touchmoved() {
16654       var g = gesture(this, arguments),
16655           touches = event.changedTouches,
16656           n = touches.length, i, t, p, l;
16657
16658       noevent$2();
16659       if (touchstarting) touchstarting = clearTimeout(touchstarting);
16660       for (i = 0; i < n; ++i) {
16661         t = touches[i], p = touch(this, touches, t.identifier);
16662         if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
16663         else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
16664       }
16665       t = g.that.__zoom;
16666       if (g.touch1) {
16667         var p0 = g.touch0[0], l0 = g.touch0[1],
16668             p1 = g.touch1[0], l1 = g.touch1[1],
16669             dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
16670             dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
16671         t = scale(t, Math.sqrt(dp / dl));
16672         p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
16673         l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
16674       }
16675       else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
16676       else return;
16677       g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
16678     }
16679
16680     function touchended() {
16681       var g = gesture(this, arguments),
16682           touches = event.changedTouches,
16683           n = touches.length, i, t;
16684
16685       nopropagation$2();
16686       if (touchending) clearTimeout(touchending);
16687       touchending = setTimeout(function() { touchending = null; }, touchDelay);
16688       for (i = 0; i < n; ++i) {
16689         t = touches[i];
16690         if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
16691         else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
16692       }
16693       if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
16694       if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
16695       else g.end();
16696     }
16697
16698     zoom.wheelDelta = function(_) {
16699       return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$c(+_), zoom) : wheelDelta;
16700     };
16701
16702     zoom.filter = function(_) {
16703       return arguments.length ? (filter = typeof _ === "function" ? _ : constant$c(!!_), zoom) : filter;
16704     };
16705
16706     zoom.touchable = function(_) {
16707       return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$c(!!_), zoom) : touchable;
16708     };
16709
16710     zoom.extent = function(_) {
16711       return arguments.length ? (extent = typeof _ === "function" ? _ : constant$c([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
16712     };
16713
16714     zoom.scaleExtent = function(_) {
16715       return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
16716     };
16717
16718     zoom.translateExtent = function(_) {
16719       return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];
16720     };
16721
16722     zoom.constrain = function(_) {
16723       return arguments.length ? (constrain = _, zoom) : constrain;
16724     };
16725
16726     zoom.duration = function(_) {
16727       return arguments.length ? (duration = +_, zoom) : duration;
16728     };
16729
16730     zoom.interpolate = function(_) {
16731       return arguments.length ? (interpolate$$1 = _, zoom) : interpolate$$1;
16732     };
16733
16734     zoom.on = function() {
16735       var value = listeners.on.apply(listeners, arguments);
16736       return value === listeners ? zoom : value;
16737     };
16738
16739     zoom.clickDistance = function(_) {
16740       return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
16741     };
16742
16743     return zoom;
16744   }
16745
16746
16747
16748   var index$3 = /*#__PURE__*/Object.freeze({
16749     version: version,
16750     bisect: bisectRight,
16751     bisectRight: bisectRight,
16752     bisectLeft: bisectLeft,
16753     ascending: ascending,
16754     bisector: bisector,
16755     cross: cross,
16756     descending: d3_descending,
16757     deviation: deviation,
16758     extent: extent,
16759     histogram: histogram,
16760     thresholdFreedmanDiaconis: freedmanDiaconis,
16761     thresholdScott: scott,
16762     thresholdSturges: sturges,
16763     max: max,
16764     mean: mean,
16765     median: d3_median,
16766     merge: merge,
16767     min: min,
16768     pairs: pairs,
16769     permute: permute,
16770     quantile: quantile,
16771     range: range,
16772     scan: scan,
16773     shuffle: shuffle,
16774     sum: sum,
16775     ticks: ticks,
16776     tickIncrement: tickIncrement,
16777     tickStep: tickStep,
16778     transpose: transpose,
16779     variance: variance,
16780     zip: zip,
16781     axisTop: axisTop,
16782     axisRight: axisRight,
16783     axisBottom: axisBottom,
16784     axisLeft: axisLeft,
16785     brush: brush,
16786     brushX: brushX,
16787     brushY: brushY,
16788     brushSelection: brushSelection,
16789     chord: chord,
16790     ribbon: ribbon,
16791     nest: nest,
16792     set: set$2,
16793     map: map$1,
16794     keys: keys,
16795     values: values,
16796     entries: entries,
16797     color: color,
16798     rgb: rgb,
16799     hsl: hsl,
16800     lab: lab,
16801     hcl: hcl,
16802     cubehelix: cubehelix,
16803     dispatch: dispatch,
16804     drag: d3_drag,
16805     dragDisable: dragDisable,
16806     dragEnable: yesdrag,
16807     dsvFormat: dsv,
16808     csvParse: csvParse,
16809     csvParseRows: csvParseRows,
16810     csvFormat: csvFormat,
16811     csvFormatRows: csvFormatRows,
16812     tsvParse: tsvParse,
16813     tsvParseRows: tsvParseRows,
16814     tsvFormat: tsvFormat,
16815     tsvFormatRows: tsvFormatRows,
16816     easeLinear: linear$1,
16817     easeQuad: quadInOut,
16818     easeQuadIn: quadIn,
16819     easeQuadOut: quadOut,
16820     easeQuadInOut: quadInOut,
16821     easeCubic: cubicInOut,
16822     easeCubicIn: cubicIn,
16823     easeCubicOut: cubicOut,
16824     easeCubicInOut: cubicInOut,
16825     easePoly: polyInOut,
16826     easePolyIn: polyIn,
16827     easePolyOut: polyOut,
16828     easePolyInOut: polyInOut,
16829     easeSin: sinInOut,
16830     easeSinIn: sinIn,
16831     easeSinOut: sinOut,
16832     easeSinInOut: sinInOut,
16833     easeExp: expInOut,
16834     easeExpIn: expIn,
16835     easeExpOut: expOut,
16836     easeExpInOut: expInOut,
16837     easeCircle: circleInOut,
16838     easeCircleIn: circleIn,
16839     easeCircleOut: circleOut,
16840     easeCircleInOut: circleInOut,
16841     easeBounce: bounceOut,
16842     easeBounceIn: bounceIn,
16843     easeBounceOut: bounceOut,
16844     easeBounceInOut: bounceInOut,
16845     easeBack: backInOut,
16846     easeBackIn: backIn,
16847     easeBackOut: backOut,
16848     easeBackInOut: backInOut,
16849     easeElastic: elasticOut,
16850     easeElasticIn: elasticIn,
16851     easeElasticOut: elasticOut,
16852     easeElasticInOut: elasticInOut,
16853     forceCenter: center$1,
16854     forceCollide: collide,
16855     forceLink: link,
16856     forceManyBody: manyBody,
16857     forceRadial: radial,
16858     forceSimulation: simulation,
16859     forceX: x$2,
16860     forceY: y$2,
16861     formatDefaultLocale: defaultLocale,
16862     get format () { return format; },
16863     get formatPrefix () { return formatPrefix; },
16864     formatLocale: formatLocale,
16865     formatSpecifier: formatSpecifier,
16866     precisionFixed: precisionFixed,
16867     precisionPrefix: precisionPrefix,
16868     precisionRound: precisionRound,
16869     geoArea: d3_geoArea,
16870     geoBounds: d3_geoBounds,
16871     geoCentroid: d3_geoCentroid,
16872     geoCircle: circle,
16873     geoClipAntimeridian: clipAntimeridian,
16874     geoClipCircle: clipCircle,
16875     geoClipExtent: extent$1,
16876     geoClipRectangle: clipRectangle,
16877     geoContains: contains,
16878     geoDistance: distance,
16879     geoGraticule: graticule,
16880     geoGraticule10: graticule10,
16881     geoInterpolate: interpolate$2,
16882     geoLength: length$1,
16883     geoPath: d3_geoPath,
16884     geoAlbers: albers,
16885     geoAlbersUsa: albersUsa,
16886     geoAzimuthalEqualArea: azimuthalEqualArea,
16887     geoAzimuthalEqualAreaRaw: azimuthalEqualAreaRaw,
16888     geoAzimuthalEquidistant: azimuthalEquidistant,
16889     geoAzimuthalEquidistantRaw: azimuthalEquidistantRaw,
16890     geoConicConformal: conicConformal,
16891     geoConicConformalRaw: conicConformalRaw,
16892     geoConicEqualArea: conicEqualArea,
16893     geoConicEqualAreaRaw: conicEqualAreaRaw,
16894     geoConicEquidistant: conicEquidistant,
16895     geoConicEquidistantRaw: conicEquidistantRaw,
16896     geoEquirectangular: equirectangular,
16897     geoEquirectangularRaw: equirectangularRaw,
16898     geoGnomonic: gnomonic,
16899     geoGnomonicRaw: gnomonicRaw,
16900     geoIdentity: d3_geoIdentity,
16901     geoProjection: projection,
16902     geoProjectionMutator: projectionMutator,
16903     geoMercator: mercator,
16904     geoMercatorRaw: mercatorRaw,
16905     geoNaturalEarth1: naturalEarth1,
16906     geoNaturalEarth1Raw: naturalEarth1Raw,
16907     geoOrthographic: orthographic,
16908     geoOrthographicRaw: orthographicRaw,
16909     geoStereographic: stereographic,
16910     geoStereographicRaw: stereographicRaw,
16911     geoTransverseMercator: transverseMercator,
16912     geoTransverseMercatorRaw: transverseMercatorRaw,
16913     geoRotation: rotation,
16914     geoStream: geoStream,
16915     geoTransform: d3_geoTransform,
16916     cluster: cluster,
16917     hierarchy: hierarchy,
16918     pack: index$1,
16919     packSiblings: siblings,
16920     packEnclose: enclose,
16921     partition: partition,
16922     stratify: stratify,
16923     tree: tree,
16924     treemap: index$2,
16925     treemapBinary: binary,
16926     treemapDice: treemapDice,
16927     treemapSlice: treemapSlice,
16928     treemapSliceDice: sliceDice,
16929     treemapSquarify: squarify,
16930     treemapResquarify: resquarify,
16931     interpolate: interpolate,
16932     interpolateArray: array$1,
16933     interpolateBasis: basis$1,
16934     interpolateBasisClosed: basisClosed,
16935     interpolateDate: date,
16936     interpolateNumber: interpolateNumber,
16937     interpolateObject: object,
16938     interpolateRound: interpolateRound,
16939     interpolateString: interpolateString,
16940     interpolateTransformCss: interpolateTransformCss,
16941     interpolateTransformSvg: interpolateTransformSvg,
16942     interpolateZoom: interpolateZoom,
16943     interpolateRgb: interpolateRgb,
16944     interpolateRgbBasis: rgbBasis,
16945     interpolateRgbBasisClosed: rgbBasisClosed,
16946     interpolateHsl: hsl$2,
16947     interpolateHslLong: hslLong,
16948     interpolateLab: lab$1,
16949     interpolateHcl: hcl$2,
16950     interpolateHclLong: hclLong,
16951     interpolateCubehelix: cubehelix$2,
16952     interpolateCubehelixLong: cubehelixLong,
16953     quantize: d3_quantize,
16954     path: path,
16955     polygonArea: d3_polygonArea,
16956     polygonCentroid: d3_polygonCentroid,
16957     polygonHull: d3_polygonHull,
16958     polygonContains: contains$1,
16959     polygonLength: length$2,
16960     quadtree: quadtree,
16961     queue: queue,
16962     randomUniform: uniform,
16963     randomNormal: normal,
16964     randomLogNormal: logNormal,
16965     randomBates: bates,
16966     randomIrwinHall: irwinHall,
16967     randomExponential: exponential$1,
16968     request: request,
16969     html: html,
16970     json: d3_json,
16971     text: d3_text,
16972     xml: d3_xml,
16973     csv: csv$1,
16974     tsv: tsv$1,
16975     scaleBand: band,
16976     scalePoint: point$1,
16977     scaleIdentity: identity$5,
16978     scaleLinear: linear$2,
16979     scaleLog: log$1,
16980     scaleOrdinal: ordinal,
16981     scaleImplicit: implicit,
16982     scalePow: pow$1,
16983     scaleSqrt: sqrt$1,
16984     scaleQuantile: quantile$1,
16985     scaleQuantize: quantize,
16986     scaleThreshold: threshold,
16987     scaleTime: time,
16988     scaleUtc: utcTime,
16989     schemeCategory10: category10,
16990     schemeCategory20b: category20b,
16991     schemeCategory20c: category20c,
16992     schemeCategory20: category20,
16993     interpolateCubehelixDefault: cubehelix$3,
16994     interpolateRainbow: rainbow$1,
16995     interpolateWarm: warm,
16996     interpolateCool: cool,
16997     interpolateViridis: viridis,
16998     interpolateMagma: magma,
16999     interpolateInferno: inferno,
17000     interpolatePlasma: plasma,
17001     scaleSequential: sequential,
17002     create: create,
17003     creator: creator,
17004     local: local,
17005     matcher: matcher$1,
17006     mouse: mouse,
17007     namespace: namespace,
17008     namespaces: namespaces,
17009     clientPoint: point,
17010     select: select,
17011     selectAll: d3_selectAll,
17012     selection: selection,
17013     selector: selector,
17014     selectorAll: selectorAll,
17015     style: styleValue,
17016     touch: touch,
17017     touches: d3_touches,
17018     window: defaultView,
17019     get event () { return event; },
17020     customEvent: customEvent,
17021     arc: arc,
17022     area: area,
17023     line: line,
17024     pie: pie,
17025     areaRadial: areaRadial,
17026     radialArea: areaRadial,
17027     lineRadial: lineRadial$1,
17028     radialLine: lineRadial$1,
17029     pointRadial: pointRadial,
17030     linkHorizontal: linkHorizontal,
17031     linkVertical: linkVertical,
17032     linkRadial: linkRadial,
17033     symbol: symbol,
17034     symbols: symbols,
17035     symbolCircle: circle$2,
17036     symbolCross: cross$2,
17037     symbolDiamond: diamond,
17038     symbolSquare: square,
17039     symbolStar: star,
17040     symbolTriangle: triangle,
17041     symbolWye: wye,
17042     curveBasisClosed: basisClosed$1,
17043     curveBasisOpen: basisOpen,
17044     curveBasis: basis$2,
17045     curveBundle: bundle,
17046     curveCardinalClosed: cardinalClosed,
17047     curveCardinalOpen: cardinalOpen,
17048     curveCardinal: cardinal,
17049     curveCatmullRomClosed: catmullRomClosed,
17050     curveCatmullRomOpen: catmullRomOpen,
17051     curveCatmullRom: catmullRom,
17052     curveLinearClosed: linearClosed,
17053     curveLinear: curveLinear,
17054     curveMonotoneX: monotoneX,
17055     curveMonotoneY: monotoneY,
17056     curveNatural: natural,
17057     curveStep: step,
17058     curveStepAfter: stepAfter,
17059     curveStepBefore: stepBefore,
17060     stack: stack,
17061     stackOffsetExpand: expand,
17062     stackOffsetDiverging: diverging,
17063     stackOffsetNone: none$1,
17064     stackOffsetSilhouette: silhouette,
17065     stackOffsetWiggle: wiggle,
17066     stackOrderAscending: ascending$2,
17067     stackOrderDescending: descending$1,
17068     stackOrderInsideOut: insideOut,
17069     stackOrderNone: none$2,
17070     stackOrderReverse: reverse,
17071     timeInterval: newInterval,
17072     timeMillisecond: millisecond,
17073     timeMilliseconds: milliseconds,
17074     utcMillisecond: millisecond,
17075     utcMilliseconds: milliseconds,
17076     timeSecond: second,
17077     timeSeconds: seconds,
17078     utcSecond: second,
17079     utcSeconds: seconds,
17080     timeMinute: minute,
17081     timeMinutes: minutes,
17082     timeHour: hour,
17083     timeHours: hours,
17084     timeDay: day,
17085     timeDays: days,
17086     timeWeek: sunday,
17087     timeWeeks: sundays,
17088     timeSunday: sunday,
17089     timeSundays: sundays,
17090     timeMonday: monday,
17091     timeMondays: mondays,
17092     timeTuesday: tuesday,
17093     timeTuesdays: tuesdays,
17094     timeWednesday: wednesday,
17095     timeWednesdays: wednesdays,
17096     timeThursday: thursday,
17097     timeThursdays: thursdays,
17098     timeFriday: friday,
17099     timeFridays: fridays,
17100     timeSaturday: saturday,
17101     timeSaturdays: saturdays,
17102     timeMonth: month,
17103     timeMonths: months,
17104     timeYear: year,
17105     timeYears: years,
17106     utcMinute: utcMinute,
17107     utcMinutes: utcMinutes,
17108     utcHour: utcHour,
17109     utcHours: utcHours,
17110     utcDay: utcDay,
17111     utcDays: utcDays,
17112     utcWeek: utcSunday,
17113     utcWeeks: utcSundays,
17114     utcSunday: utcSunday,
17115     utcSundays: utcSundays,
17116     utcMonday: utcMonday,
17117     utcMondays: utcMondays,
17118     utcTuesday: utcTuesday,
17119     utcTuesdays: utcTuesdays,
17120     utcWednesday: utcWednesday,
17121     utcWednesdays: utcWednesdays,
17122     utcThursday: utcThursday,
17123     utcThursdays: utcThursdays,
17124     utcFriday: utcFriday,
17125     utcFridays: utcFridays,
17126     utcSaturday: utcSaturday,
17127     utcSaturdays: utcSaturdays,
17128     utcMonth: utcMonth,
17129     utcMonths: utcMonths,
17130     utcYear: utcYear,
17131     utcYears: utcYears,
17132     timeFormatDefaultLocale: defaultLocale$1,
17133     get timeFormat () { return timeFormat; },
17134     get timeParse () { return timeParse; },
17135     get utcFormat () { return utcFormat; },
17136     get utcParse () { return utcParse; },
17137     timeFormatLocale: formatLocale$1,
17138     isoFormat: formatIso,
17139     isoParse: parseIso,
17140     now: now,
17141     timer: timer,
17142     timerFlush: timerFlush,
17143     timeout: timeout$1,
17144     interval: interval$1,
17145     transition: transition,
17146     active: active,
17147     interrupt: interrupt,
17148     voronoi: voronoi,
17149     zoom: d3_zoom,
17150     zoomTransform: transform,
17151     zoomIdentity: identity$7
17152   });
17153
17154   function actionAddEntity(way) {
17155       return function(graph) {
17156           return graph.replace(way);
17157       };
17158   }
17159
17160   /**
17161    * Removes all key-value entries from the list cache.
17162    *
17163    * @private
17164    * @name clear
17165    * @memberOf ListCache
17166    */
17167   function listCacheClear() {
17168     this.__data__ = [];
17169     this.size = 0;
17170   }
17171
17172   /**
17173    * Performs a
17174    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
17175    * comparison between two values to determine if they are equivalent.
17176    *
17177    * @static
17178    * @memberOf _
17179    * @since 4.0.0
17180    * @category Lang
17181    * @param {*} value The value to compare.
17182    * @param {*} other The other value to compare.
17183    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
17184    * @example
17185    *
17186    * var object = { 'a': 1 };
17187    * var other = { 'a': 1 };
17188    *
17189    * _.eq(object, object);
17190    * // => true
17191    *
17192    * _.eq(object, other);
17193    * // => false
17194    *
17195    * _.eq('a', 'a');
17196    * // => true
17197    *
17198    * _.eq('a', Object('a'));
17199    * // => false
17200    *
17201    * _.eq(NaN, NaN);
17202    * // => true
17203    */
17204   function eq(value, other) {
17205     return value === other || (value !== value && other !== other);
17206   }
17207
17208   /**
17209    * Gets the index at which the `key` is found in `array` of key-value pairs.
17210    *
17211    * @private
17212    * @param {Array} array The array to inspect.
17213    * @param {*} key The key to search for.
17214    * @returns {number} Returns the index of the matched value, else `-1`.
17215    */
17216   function assocIndexOf(array, key) {
17217     var length = array.length;
17218     while (length--) {
17219       if (eq(array[length][0], key)) {
17220         return length;
17221       }
17222     }
17223     return -1;
17224   }
17225
17226   /** Used for built-in method references. */
17227   var arrayProto = Array.prototype;
17228
17229   /** Built-in value references. */
17230   var splice = arrayProto.splice;
17231
17232   /**
17233    * Removes `key` and its value from the list cache.
17234    *
17235    * @private
17236    * @name delete
17237    * @memberOf ListCache
17238    * @param {string} key The key of the value to remove.
17239    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17240    */
17241   function listCacheDelete(key) {
17242     var data = this.__data__,
17243         index = assocIndexOf(data, key);
17244
17245     if (index < 0) {
17246       return false;
17247     }
17248     var lastIndex = data.length - 1;
17249     if (index == lastIndex) {
17250       data.pop();
17251     } else {
17252       splice.call(data, index, 1);
17253     }
17254     --this.size;
17255     return true;
17256   }
17257
17258   /**
17259    * Gets the list cache value for `key`.
17260    *
17261    * @private
17262    * @name get
17263    * @memberOf ListCache
17264    * @param {string} key The key of the value to get.
17265    * @returns {*} Returns the entry value.
17266    */
17267   function listCacheGet(key) {
17268     var data = this.__data__,
17269         index = assocIndexOf(data, key);
17270
17271     return index < 0 ? undefined : data[index][1];
17272   }
17273
17274   /**
17275    * Checks if a list cache value for `key` exists.
17276    *
17277    * @private
17278    * @name has
17279    * @memberOf ListCache
17280    * @param {string} key The key of the entry to check.
17281    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17282    */
17283   function listCacheHas(key) {
17284     return assocIndexOf(this.__data__, key) > -1;
17285   }
17286
17287   /**
17288    * Sets the list cache `key` to `value`.
17289    *
17290    * @private
17291    * @name set
17292    * @memberOf ListCache
17293    * @param {string} key The key of the value to set.
17294    * @param {*} value The value to set.
17295    * @returns {Object} Returns the list cache instance.
17296    */
17297   function listCacheSet(key, value) {
17298     var data = this.__data__,
17299         index = assocIndexOf(data, key);
17300
17301     if (index < 0) {
17302       ++this.size;
17303       data.push([key, value]);
17304     } else {
17305       data[index][1] = value;
17306     }
17307     return this;
17308   }
17309
17310   /**
17311    * Creates an list cache object.
17312    *
17313    * @private
17314    * @constructor
17315    * @param {Array} [entries] The key-value pairs to cache.
17316    */
17317   function ListCache(entries) {
17318     var index = -1,
17319         length = entries == null ? 0 : entries.length;
17320
17321     this.clear();
17322     while (++index < length) {
17323       var entry = entries[index];
17324       this.set(entry[0], entry[1]);
17325     }
17326   }
17327
17328   // Add methods to `ListCache`.
17329   ListCache.prototype.clear = listCacheClear;
17330   ListCache.prototype['delete'] = listCacheDelete;
17331   ListCache.prototype.get = listCacheGet;
17332   ListCache.prototype.has = listCacheHas;
17333   ListCache.prototype.set = listCacheSet;
17334
17335   /**
17336    * Removes all key-value entries from the stack.
17337    *
17338    * @private
17339    * @name clear
17340    * @memberOf Stack
17341    */
17342   function stackClear() {
17343     this.__data__ = new ListCache;
17344     this.size = 0;
17345   }
17346
17347   /**
17348    * Removes `key` and its value from the stack.
17349    *
17350    * @private
17351    * @name delete
17352    * @memberOf Stack
17353    * @param {string} key The key of the value to remove.
17354    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17355    */
17356   function stackDelete(key) {
17357     var data = this.__data__,
17358         result = data['delete'](key);
17359
17360     this.size = data.size;
17361     return result;
17362   }
17363
17364   /**
17365    * Gets the stack value for `key`.
17366    *
17367    * @private
17368    * @name get
17369    * @memberOf Stack
17370    * @param {string} key The key of the value to get.
17371    * @returns {*} Returns the entry value.
17372    */
17373   function stackGet(key) {
17374     return this.__data__.get(key);
17375   }
17376
17377   /**
17378    * Checks if a stack value for `key` exists.
17379    *
17380    * @private
17381    * @name has
17382    * @memberOf Stack
17383    * @param {string} key The key of the entry to check.
17384    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17385    */
17386   function stackHas(key) {
17387     return this.__data__.has(key);
17388   }
17389
17390   /** Detect free variable `global` from Node.js. */
17391   var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
17392
17393   /** Detect free variable `self`. */
17394   var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
17395
17396   /** Used as a reference to the global object. */
17397   var root$2 = freeGlobal || freeSelf || Function('return this')();
17398
17399   /** Built-in value references. */
17400   var Symbol = root$2.Symbol;
17401
17402   /** Used for built-in method references. */
17403   var objectProto = Object.prototype;
17404
17405   /** Used to check objects for own properties. */
17406   var hasOwnProperty = objectProto.hasOwnProperty;
17407
17408   /**
17409    * Used to resolve the
17410    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17411    * of values.
17412    */
17413   var nativeObjectToString = objectProto.toString;
17414
17415   /** Built-in value references. */
17416   var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
17417
17418   /**
17419    * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
17420    *
17421    * @private
17422    * @param {*} value The value to query.
17423    * @returns {string} Returns the raw `toStringTag`.
17424    */
17425   function getRawTag(value) {
17426     var isOwn = hasOwnProperty.call(value, symToStringTag),
17427         tag = value[symToStringTag];
17428
17429     try {
17430       value[symToStringTag] = undefined;
17431     } catch (e) {}
17432
17433     var result = nativeObjectToString.call(value);
17434     {
17435       if (isOwn) {
17436         value[symToStringTag] = tag;
17437       } else {
17438         delete value[symToStringTag];
17439       }
17440     }
17441     return result;
17442   }
17443
17444   /** Used for built-in method references. */
17445   var objectProto$1 = Object.prototype;
17446
17447   /**
17448    * Used to resolve the
17449    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17450    * of values.
17451    */
17452   var nativeObjectToString$1 = objectProto$1.toString;
17453
17454   /**
17455    * Converts `value` to a string using `Object.prototype.toString`.
17456    *
17457    * @private
17458    * @param {*} value The value to convert.
17459    * @returns {string} Returns the converted string.
17460    */
17461   function objectToString(value) {
17462     return nativeObjectToString$1.call(value);
17463   }
17464
17465   /** `Object#toString` result references. */
17466   var nullTag = '[object Null]',
17467       undefinedTag = '[object Undefined]';
17468
17469   /** Built-in value references. */
17470   var symToStringTag$1 = Symbol ? Symbol.toStringTag : undefined;
17471
17472   /**
17473    * The base implementation of `getTag` without fallbacks for buggy environments.
17474    *
17475    * @private
17476    * @param {*} value The value to query.
17477    * @returns {string} Returns the `toStringTag`.
17478    */
17479   function baseGetTag(value) {
17480     if (value == null) {
17481       return value === undefined ? undefinedTag : nullTag;
17482     }
17483     return (symToStringTag$1 && symToStringTag$1 in Object(value))
17484       ? getRawTag(value)
17485       : objectToString(value);
17486   }
17487
17488   /**
17489    * Checks if `value` is the
17490    * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
17491    * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
17492    *
17493    * @static
17494    * @memberOf _
17495    * @since 0.1.0
17496    * @category Lang
17497    * @param {*} value The value to check.
17498    * @returns {boolean} Returns `true` if `value` is an object, else `false`.
17499    * @example
17500    *
17501    * _.isObject({});
17502    * // => true
17503    *
17504    * _.isObject([1, 2, 3]);
17505    * // => true
17506    *
17507    * _.isObject(_.noop);
17508    * // => true
17509    *
17510    * _.isObject(null);
17511    * // => false
17512    */
17513   function isObject(value) {
17514     var type = typeof value;
17515     return value != null && (type == 'object' || type == 'function');
17516   }
17517
17518   /** `Object#toString` result references. */
17519   var asyncTag = '[object AsyncFunction]',
17520       funcTag = '[object Function]',
17521       genTag = '[object GeneratorFunction]',
17522       proxyTag = '[object Proxy]';
17523
17524   /**
17525    * Checks if `value` is classified as a `Function` object.
17526    *
17527    * @static
17528    * @memberOf _
17529    * @since 0.1.0
17530    * @category Lang
17531    * @param {*} value The value to check.
17532    * @returns {boolean} Returns `true` if `value` is a function, else `false`.
17533    * @example
17534    *
17535    * _.isFunction(_);
17536    * // => true
17537    *
17538    * _.isFunction(/abc/);
17539    * // => false
17540    */
17541   function isFunction(value) {
17542     if (!isObject(value)) {
17543       return false;
17544     }
17545     // The use of `Object#toString` avoids issues with the `typeof` operator
17546     // in Safari 9 which returns 'object' for typed arrays and other constructors.
17547     var tag = baseGetTag(value);
17548     return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
17549   }
17550
17551   /** Used to detect overreaching core-js shims. */
17552   var coreJsData = root$2['__core-js_shared__'];
17553
17554   /** Used to detect methods masquerading as native. */
17555   var maskSrcKey = (function() {
17556     var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
17557     return uid ? ('Symbol(src)_1.' + uid) : '';
17558   }());
17559
17560   /**
17561    * Checks if `func` has its source masked.
17562    *
17563    * @private
17564    * @param {Function} func The function to check.
17565    * @returns {boolean} Returns `true` if `func` is masked, else `false`.
17566    */
17567   function isMasked(func) {
17568     return !!maskSrcKey && (maskSrcKey in func);
17569   }
17570
17571   /** Used for built-in method references. */
17572   var funcProto = Function.prototype;
17573
17574   /** Used to resolve the decompiled source of functions. */
17575   var funcToString = funcProto.toString;
17576
17577   /**
17578    * Converts `func` to its source code.
17579    *
17580    * @private
17581    * @param {Function} func The function to convert.
17582    * @returns {string} Returns the source code.
17583    */
17584   function toSource(func) {
17585     if (func != null) {
17586       try {
17587         return funcToString.call(func);
17588       } catch (e) {}
17589       try {
17590         return (func + '');
17591       } catch (e) {}
17592     }
17593     return '';
17594   }
17595
17596   /**
17597    * Used to match `RegExp`
17598    * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
17599    */
17600   var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
17601
17602   /** Used to detect host constructors (Safari). */
17603   var reIsHostCtor = /^\[object .+?Constructor\]$/;
17604
17605   /** Used for built-in method references. */
17606   var funcProto$1 = Function.prototype,
17607       objectProto$2 = Object.prototype;
17608
17609   /** Used to resolve the decompiled source of functions. */
17610   var funcToString$1 = funcProto$1.toString;
17611
17612   /** Used to check objects for own properties. */
17613   var hasOwnProperty$1 = objectProto$2.hasOwnProperty;
17614
17615   /** Used to detect if a method is native. */
17616   var reIsNative = RegExp('^' +
17617     funcToString$1.call(hasOwnProperty$1).replace(reRegExpChar, '\\$&')
17618     .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
17619   );
17620
17621   /**
17622    * The base implementation of `_.isNative` without bad shim checks.
17623    *
17624    * @private
17625    * @param {*} value The value to check.
17626    * @returns {boolean} Returns `true` if `value` is a native function,
17627    *  else `false`.
17628    */
17629   function baseIsNative(value) {
17630     if (!isObject(value) || isMasked(value)) {
17631       return false;
17632     }
17633     var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
17634     return pattern.test(toSource(value));
17635   }
17636
17637   /**
17638    * Gets the value at `key` of `object`.
17639    *
17640    * @private
17641    * @param {Object} [object] The object to query.
17642    * @param {string} key The key of the property to get.
17643    * @returns {*} Returns the property value.
17644    */
17645   function getValue(object, key) {
17646     return object == null ? undefined : object[key];
17647   }
17648
17649   /**
17650    * Gets the native function at `key` of `object`.
17651    *
17652    * @private
17653    * @param {Object} object The object to query.
17654    * @param {string} key The key of the method to get.
17655    * @returns {*} Returns the function if it's native, else `undefined`.
17656    */
17657   function getNative(object, key) {
17658     var value = getValue(object, key);
17659     return baseIsNative(value) ? value : undefined;
17660   }
17661
17662   /* Built-in method references that are verified to be native. */
17663   var Map$1 = getNative(root$2, 'Map');
17664
17665   /* Built-in method references that are verified to be native. */
17666   var nativeCreate = getNative(Object, 'create');
17667
17668   /**
17669    * Removes all key-value entries from the hash.
17670    *
17671    * @private
17672    * @name clear
17673    * @memberOf Hash
17674    */
17675   function hashClear() {
17676     this.__data__ = nativeCreate ? nativeCreate(null) : {};
17677     this.size = 0;
17678   }
17679
17680   /**
17681    * Removes `key` and its value from the hash.
17682    *
17683    * @private
17684    * @name delete
17685    * @memberOf Hash
17686    * @param {Object} hash The hash to modify.
17687    * @param {string} key The key of the value to remove.
17688    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17689    */
17690   function hashDelete(key) {
17691     var result = this.has(key) && delete this.__data__[key];
17692     this.size -= result ? 1 : 0;
17693     return result;
17694   }
17695
17696   /** Used to stand-in for `undefined` hash values. */
17697   var HASH_UNDEFINED = '__lodash_hash_undefined__';
17698
17699   /** Used for built-in method references. */
17700   var objectProto$3 = Object.prototype;
17701
17702   /** Used to check objects for own properties. */
17703   var hasOwnProperty$2 = objectProto$3.hasOwnProperty;
17704
17705   /**
17706    * Gets the hash value for `key`.
17707    *
17708    * @private
17709    * @name get
17710    * @memberOf Hash
17711    * @param {string} key The key of the value to get.
17712    * @returns {*} Returns the entry value.
17713    */
17714   function hashGet(key) {
17715     var data = this.__data__;
17716     if (nativeCreate) {
17717       var result = data[key];
17718       return result === HASH_UNDEFINED ? undefined : result;
17719     }
17720     return hasOwnProperty$2.call(data, key) ? data[key] : undefined;
17721   }
17722
17723   /** Used for built-in method references. */
17724   var objectProto$4 = Object.prototype;
17725
17726   /** Used to check objects for own properties. */
17727   var hasOwnProperty$3 = objectProto$4.hasOwnProperty;
17728
17729   /**
17730    * Checks if a hash value for `key` exists.
17731    *
17732    * @private
17733    * @name has
17734    * @memberOf Hash
17735    * @param {string} key The key of the entry to check.
17736    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17737    */
17738   function hashHas(key) {
17739     var data = this.__data__;
17740     return nativeCreate ? (data[key] !== undefined) : hasOwnProperty$3.call(data, key);
17741   }
17742
17743   /** Used to stand-in for `undefined` hash values. */
17744   var HASH_UNDEFINED$1 = '__lodash_hash_undefined__';
17745
17746   /**
17747    * Sets the hash `key` to `value`.
17748    *
17749    * @private
17750    * @name set
17751    * @memberOf Hash
17752    * @param {string} key The key of the value to set.
17753    * @param {*} value The value to set.
17754    * @returns {Object} Returns the hash instance.
17755    */
17756   function hashSet(key, value) {
17757     var data = this.__data__;
17758     this.size += this.has(key) ? 0 : 1;
17759     data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value;
17760     return this;
17761   }
17762
17763   /**
17764    * Creates a hash object.
17765    *
17766    * @private
17767    * @constructor
17768    * @param {Array} [entries] The key-value pairs to cache.
17769    */
17770   function Hash(entries) {
17771     var index = -1,
17772         length = entries == null ? 0 : entries.length;
17773
17774     this.clear();
17775     while (++index < length) {
17776       var entry = entries[index];
17777       this.set(entry[0], entry[1]);
17778     }
17779   }
17780
17781   // Add methods to `Hash`.
17782   Hash.prototype.clear = hashClear;
17783   Hash.prototype['delete'] = hashDelete;
17784   Hash.prototype.get = hashGet;
17785   Hash.prototype.has = hashHas;
17786   Hash.prototype.set = hashSet;
17787
17788   /**
17789    * Removes all key-value entries from the map.
17790    *
17791    * @private
17792    * @name clear
17793    * @memberOf MapCache
17794    */
17795   function mapCacheClear() {
17796     this.size = 0;
17797     this.__data__ = {
17798       'hash': new Hash,
17799       'map': new (Map$1 || ListCache),
17800       'string': new Hash
17801     };
17802   }
17803
17804   /**
17805    * Checks if `value` is suitable for use as unique object key.
17806    *
17807    * @private
17808    * @param {*} value The value to check.
17809    * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
17810    */
17811   function isKeyable(value) {
17812     var type = typeof value;
17813     return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
17814       ? (value !== '__proto__')
17815       : (value === null);
17816   }
17817
17818   /**
17819    * Gets the data for `map`.
17820    *
17821    * @private
17822    * @param {Object} map The map to query.
17823    * @param {string} key The reference key.
17824    * @returns {*} Returns the map data.
17825    */
17826   function getMapData(map, key) {
17827     var data = map.__data__;
17828     return isKeyable(key)
17829       ? data[typeof key == 'string' ? 'string' : 'hash']
17830       : data.map;
17831   }
17832
17833   /**
17834    * Removes `key` and its value from the map.
17835    *
17836    * @private
17837    * @name delete
17838    * @memberOf MapCache
17839    * @param {string} key The key of the value to remove.
17840    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17841    */
17842   function mapCacheDelete(key) {
17843     var result = getMapData(this, key)['delete'](key);
17844     this.size -= result ? 1 : 0;
17845     return result;
17846   }
17847
17848   /**
17849    * Gets the map value for `key`.
17850    *
17851    * @private
17852    * @name get
17853    * @memberOf MapCache
17854    * @param {string} key The key of the value to get.
17855    * @returns {*} Returns the entry value.
17856    */
17857   function mapCacheGet(key) {
17858     return getMapData(this, key).get(key);
17859   }
17860
17861   /**
17862    * Checks if a map value for `key` exists.
17863    *
17864    * @private
17865    * @name has
17866    * @memberOf MapCache
17867    * @param {string} key The key of the entry to check.
17868    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17869    */
17870   function mapCacheHas(key) {
17871     return getMapData(this, key).has(key);
17872   }
17873
17874   /**
17875    * Sets the map `key` to `value`.
17876    *
17877    * @private
17878    * @name set
17879    * @memberOf MapCache
17880    * @param {string} key The key of the value to set.
17881    * @param {*} value The value to set.
17882    * @returns {Object} Returns the map cache instance.
17883    */
17884   function mapCacheSet(key, value) {
17885     var data = getMapData(this, key),
17886         size = data.size;
17887
17888     data.set(key, value);
17889     this.size += data.size == size ? 0 : 1;
17890     return this;
17891   }
17892
17893   /**
17894    * Creates a map cache object to store key-value pairs.
17895    *
17896    * @private
17897    * @constructor
17898    * @param {Array} [entries] The key-value pairs to cache.
17899    */
17900   function MapCache(entries) {
17901     var index = -1,
17902         length = entries == null ? 0 : entries.length;
17903
17904     this.clear();
17905     while (++index < length) {
17906       var entry = entries[index];
17907       this.set(entry[0], entry[1]);
17908     }
17909   }
17910
17911   // Add methods to `MapCache`.
17912   MapCache.prototype.clear = mapCacheClear;
17913   MapCache.prototype['delete'] = mapCacheDelete;
17914   MapCache.prototype.get = mapCacheGet;
17915   MapCache.prototype.has = mapCacheHas;
17916   MapCache.prototype.set = mapCacheSet;
17917
17918   /** Used as the size to enable large array optimizations. */
17919   var LARGE_ARRAY_SIZE = 200;
17920
17921   /**
17922    * Sets the stack `key` to `value`.
17923    *
17924    * @private
17925    * @name set
17926    * @memberOf Stack
17927    * @param {string} key The key of the value to set.
17928    * @param {*} value The value to set.
17929    * @returns {Object} Returns the stack cache instance.
17930    */
17931   function stackSet(key, value) {
17932     var data = this.__data__;
17933     if (data instanceof ListCache) {
17934       var pairs = data.__data__;
17935       if (!Map$1 || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
17936         pairs.push([key, value]);
17937         this.size = ++data.size;
17938         return this;
17939       }
17940       data = this.__data__ = new MapCache(pairs);
17941     }
17942     data.set(key, value);
17943     this.size = data.size;
17944     return this;
17945   }
17946
17947   /**
17948    * Creates a stack cache object to store key-value pairs.
17949    *
17950    * @private
17951    * @constructor
17952    * @param {Array} [entries] The key-value pairs to cache.
17953    */
17954   function Stack(entries) {
17955     var data = this.__data__ = new ListCache(entries);
17956     this.size = data.size;
17957   }
17958
17959   // Add methods to `Stack`.
17960   Stack.prototype.clear = stackClear;
17961   Stack.prototype['delete'] = stackDelete;
17962   Stack.prototype.get = stackGet;
17963   Stack.prototype.has = stackHas;
17964   Stack.prototype.set = stackSet;
17965
17966   /**
17967    * A specialized version of `_.forEach` for arrays without support for
17968    * iteratee shorthands.
17969    *
17970    * @private
17971    * @param {Array} [array] The array to iterate over.
17972    * @param {Function} iteratee The function invoked per iteration.
17973    * @returns {Array} Returns `array`.
17974    */
17975   function arrayEach(array, iteratee) {
17976     var index = -1,
17977         length = array == null ? 0 : array.length;
17978
17979     while (++index < length) {
17980       if (iteratee(array[index], index, array) === false) {
17981         break;
17982       }
17983     }
17984     return array;
17985   }
17986
17987   var defineProperty = (function() {
17988     try {
17989       var func = getNative(Object, 'defineProperty');
17990       func({}, '', {});
17991       return func;
17992     } catch (e) {}
17993   }());
17994
17995   /**
17996    * The base implementation of `assignValue` and `assignMergeValue` without
17997    * value checks.
17998    *
17999    * @private
18000    * @param {Object} object The object to modify.
18001    * @param {string} key The key of the property to assign.
18002    * @param {*} value The value to assign.
18003    */
18004   function baseAssignValue(object, key, value) {
18005     if (key == '__proto__' && defineProperty) {
18006       defineProperty(object, key, {
18007         'configurable': true,
18008         'enumerable': true,
18009         'value': value,
18010         'writable': true
18011       });
18012     } else {
18013       object[key] = value;
18014     }
18015   }
18016
18017   /** Used for built-in method references. */
18018   var objectProto$5 = Object.prototype;
18019
18020   /** Used to check objects for own properties. */
18021   var hasOwnProperty$4 = objectProto$5.hasOwnProperty;
18022
18023   /**
18024    * Assigns `value` to `key` of `object` if the existing value is not equivalent
18025    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
18026    * for equality comparisons.
18027    *
18028    * @private
18029    * @param {Object} object The object to modify.
18030    * @param {string} key The key of the property to assign.
18031    * @param {*} value The value to assign.
18032    */
18033   function assignValue(object, key, value) {
18034     var objValue = object[key];
18035     if (!(hasOwnProperty$4.call(object, key) && eq(objValue, value)) ||
18036         (value === undefined && !(key in object))) {
18037       baseAssignValue(object, key, value);
18038     }
18039   }
18040
18041   /**
18042    * Copies properties of `source` to `object`.
18043    *
18044    * @private
18045    * @param {Object} source The object to copy properties from.
18046    * @param {Array} props The property identifiers to copy.
18047    * @param {Object} [object={}] The object to copy properties to.
18048    * @param {Function} [customizer] The function to customize copied values.
18049    * @returns {Object} Returns `object`.
18050    */
18051   function copyObject(source, props, object, customizer) {
18052     var isNew = !object;
18053     object || (object = {});
18054
18055     var index = -1,
18056         length = props.length;
18057
18058     while (++index < length) {
18059       var key = props[index];
18060
18061       var newValue = customizer
18062         ? customizer(object[key], source[key], key, object, source)
18063         : undefined;
18064
18065       if (newValue === undefined) {
18066         newValue = source[key];
18067       }
18068       if (isNew) {
18069         baseAssignValue(object, key, newValue);
18070       } else {
18071         assignValue(object, key, newValue);
18072       }
18073     }
18074     return object;
18075   }
18076
18077   /**
18078    * The base implementation of `_.times` without support for iteratee shorthands
18079    * or max array length checks.
18080    *
18081    * @private
18082    * @param {number} n The number of times to invoke `iteratee`.
18083    * @param {Function} iteratee The function invoked per iteration.
18084    * @returns {Array} Returns the array of results.
18085    */
18086   function baseTimes(n, iteratee) {
18087     var index = -1,
18088         result = Array(n);
18089
18090     while (++index < n) {
18091       result[index] = iteratee(index);
18092     }
18093     return result;
18094   }
18095
18096   /**
18097    * Checks if `value` is object-like. A value is object-like if it's not `null`
18098    * and has a `typeof` result of "object".
18099    *
18100    * @static
18101    * @memberOf _
18102    * @since 4.0.0
18103    * @category Lang
18104    * @param {*} value The value to check.
18105    * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
18106    * @example
18107    *
18108    * _.isObjectLike({});
18109    * // => true
18110    *
18111    * _.isObjectLike([1, 2, 3]);
18112    * // => true
18113    *
18114    * _.isObjectLike(_.noop);
18115    * // => false
18116    *
18117    * _.isObjectLike(null);
18118    * // => false
18119    */
18120   function isObjectLike(value) {
18121     return value != null && typeof value == 'object';
18122   }
18123
18124   /** `Object#toString` result references. */
18125   var argsTag = '[object Arguments]';
18126
18127   /**
18128    * The base implementation of `_.isArguments`.
18129    *
18130    * @private
18131    * @param {*} value The value to check.
18132    * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18133    */
18134   function baseIsArguments(value) {
18135     return isObjectLike(value) && baseGetTag(value) == argsTag;
18136   }
18137
18138   /** Used for built-in method references. */
18139   var objectProto$6 = Object.prototype;
18140
18141   /** Used to check objects for own properties. */
18142   var hasOwnProperty$5 = objectProto$6.hasOwnProperty;
18143
18144   /** Built-in value references. */
18145   var propertyIsEnumerable = objectProto$6.propertyIsEnumerable;
18146
18147   /**
18148    * Checks if `value` is likely an `arguments` object.
18149    *
18150    * @static
18151    * @memberOf _
18152    * @since 0.1.0
18153    * @category Lang
18154    * @param {*} value The value to check.
18155    * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18156    *  else `false`.
18157    * @example
18158    *
18159    * _.isArguments(function() { return arguments; }());
18160    * // => true
18161    *
18162    * _.isArguments([1, 2, 3]);
18163    * // => false
18164    */
18165   var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
18166     return isObjectLike(value) && hasOwnProperty$5.call(value, 'callee') &&
18167       !propertyIsEnumerable.call(value, 'callee');
18168   };
18169
18170   /**
18171    * Checks if `value` is classified as an `Array` object.
18172    *
18173    * @static
18174    * @memberOf _
18175    * @since 0.1.0
18176    * @category Lang
18177    * @param {*} value The value to check.
18178    * @returns {boolean} Returns `true` if `value` is an array, else `false`.
18179    * @example
18180    *
18181    * _.isArray([1, 2, 3]);
18182    * // => true
18183    *
18184    * _.isArray(document.body.children);
18185    * // => false
18186    *
18187    * _.isArray('abc');
18188    * // => false
18189    *
18190    * _.isArray(_.noop);
18191    * // => false
18192    */
18193   var isArray = Array.isArray;
18194
18195   /**
18196    * This method returns `false`.
18197    *
18198    * @static
18199    * @memberOf _
18200    * @since 4.13.0
18201    * @category Util
18202    * @returns {boolean} Returns `false`.
18203    * @example
18204    *
18205    * _.times(2, _.stubFalse);
18206    * // => [false, false]
18207    */
18208   function stubFalse() {
18209     return false;
18210   }
18211
18212   /** Detect free variable `exports`. */
18213   var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
18214
18215   /** Detect free variable `module`. */
18216   var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
18217
18218   /** Detect the popular CommonJS extension `module.exports`. */
18219   var moduleExports = freeModule && freeModule.exports === freeExports;
18220
18221   /** Built-in value references. */
18222   var Buffer = moduleExports ? root$2.Buffer : undefined;
18223
18224   /* Built-in method references for those with the same name as other `lodash` methods. */
18225   var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
18226
18227   /**
18228    * Checks if `value` is a buffer.
18229    *
18230    * @static
18231    * @memberOf _
18232    * @since 4.3.0
18233    * @category Lang
18234    * @param {*} value The value to check.
18235    * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
18236    * @example
18237    *
18238    * _.isBuffer(new Buffer(2));
18239    * // => true
18240    *
18241    * _.isBuffer(new Uint8Array(2));
18242    * // => false
18243    */
18244   var isBuffer = nativeIsBuffer || stubFalse;
18245
18246   /** Used as references for various `Number` constants. */
18247   var MAX_SAFE_INTEGER = 9007199254740991;
18248
18249   /** Used to detect unsigned integer values. */
18250   var reIsUint = /^(?:0|[1-9]\d*)$/;
18251
18252   /**
18253    * Checks if `value` is a valid array-like index.
18254    *
18255    * @private
18256    * @param {*} value The value to check.
18257    * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
18258    * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
18259    */
18260   function isIndex(value, length) {
18261     var type = typeof value;
18262     length = length == null ? MAX_SAFE_INTEGER : length;
18263
18264     return !!length &&
18265       (type == 'number' ||
18266         (type != 'symbol' && reIsUint.test(value))) &&
18267           (value > -1 && value % 1 == 0 && value < length);
18268   }
18269
18270   /** Used as references for various `Number` constants. */
18271   var MAX_SAFE_INTEGER$1 = 9007199254740991;
18272
18273   /**
18274    * Checks if `value` is a valid array-like length.
18275    *
18276    * **Note:** This method is loosely based on
18277    * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
18278    *
18279    * @static
18280    * @memberOf _
18281    * @since 4.0.0
18282    * @category Lang
18283    * @param {*} value The value to check.
18284    * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
18285    * @example
18286    *
18287    * _.isLength(3);
18288    * // => true
18289    *
18290    * _.isLength(Number.MIN_VALUE);
18291    * // => false
18292    *
18293    * _.isLength(Infinity);
18294    * // => false
18295    *
18296    * _.isLength('3');
18297    * // => false
18298    */
18299   function isLength(value) {
18300     return typeof value == 'number' &&
18301       value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$1;
18302   }
18303
18304   /** `Object#toString` result references. */
18305   var argsTag$1 = '[object Arguments]',
18306       arrayTag = '[object Array]',
18307       boolTag = '[object Boolean]',
18308       dateTag = '[object Date]',
18309       errorTag = '[object Error]',
18310       funcTag$1 = '[object Function]',
18311       mapTag = '[object Map]',
18312       numberTag = '[object Number]',
18313       objectTag = '[object Object]',
18314       regexpTag = '[object RegExp]',
18315       setTag = '[object Set]',
18316       stringTag = '[object String]',
18317       weakMapTag = '[object WeakMap]';
18318
18319   var arrayBufferTag = '[object ArrayBuffer]',
18320       dataViewTag = '[object DataView]',
18321       float32Tag = '[object Float32Array]',
18322       float64Tag = '[object Float64Array]',
18323       int8Tag = '[object Int8Array]',
18324       int16Tag = '[object Int16Array]',
18325       int32Tag = '[object Int32Array]',
18326       uint8Tag = '[object Uint8Array]',
18327       uint8ClampedTag = '[object Uint8ClampedArray]',
18328       uint16Tag = '[object Uint16Array]',
18329       uint32Tag = '[object Uint32Array]';
18330
18331   /** Used to identify `toStringTag` values of typed arrays. */
18332   var typedArrayTags = {};
18333   typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
18334   typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
18335   typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
18336   typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
18337   typedArrayTags[uint32Tag] = true;
18338   typedArrayTags[argsTag$1] = typedArrayTags[arrayTag] =
18339   typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
18340   typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
18341   typedArrayTags[errorTag] = typedArrayTags[funcTag$1] =
18342   typedArrayTags[mapTag] = typedArrayTags[numberTag] =
18343   typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
18344   typedArrayTags[setTag] = typedArrayTags[stringTag] =
18345   typedArrayTags[weakMapTag] = false;
18346
18347   /**
18348    * The base implementation of `_.isTypedArray` without Node.js optimizations.
18349    *
18350    * @private
18351    * @param {*} value The value to check.
18352    * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18353    */
18354   function baseIsTypedArray(value) {
18355     return isObjectLike(value) &&
18356       isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
18357   }
18358
18359   /**
18360    * The base implementation of `_.unary` without support for storing metadata.
18361    *
18362    * @private
18363    * @param {Function} func The function to cap arguments for.
18364    * @returns {Function} Returns the new capped function.
18365    */
18366   function baseUnary(func) {
18367     return function(value) {
18368       return func(value);
18369     };
18370   }
18371
18372   /** Detect free variable `exports`. */
18373   var freeExports$1 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18374
18375   /** Detect free variable `module`. */
18376   var freeModule$1 = freeExports$1 && typeof module == 'object' && module && !module.nodeType && module;
18377
18378   /** Detect the popular CommonJS extension `module.exports`. */
18379   var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;
18380
18381   /** Detect free variable `process` from Node.js. */
18382   var freeProcess = moduleExports$1 && freeGlobal.process;
18383
18384   /** Used to access faster Node.js helpers. */
18385   var nodeUtil = (function() {
18386     try {
18387       // Use `util.types` for Node.js 10+.
18388       var types = freeModule$1 && freeModule$1.require && freeModule$1.require('util').types;
18389
18390       if (types) {
18391         return types;
18392       }
18393
18394       // Legacy `process.binding('util')` for Node.js < 10.
18395       return freeProcess && freeProcess.binding && freeProcess.binding('util');
18396     } catch (e) {}
18397   }());
18398
18399   /* Node.js helper references. */
18400   var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
18401
18402   /**
18403    * Checks if `value` is classified as a typed array.
18404    *
18405    * @static
18406    * @memberOf _
18407    * @since 3.0.0
18408    * @category Lang
18409    * @param {*} value The value to check.
18410    * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18411    * @example
18412    *
18413    * _.isTypedArray(new Uint8Array);
18414    * // => true
18415    *
18416    * _.isTypedArray([]);
18417    * // => false
18418    */
18419   var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
18420
18421   /** Used for built-in method references. */
18422   var objectProto$7 = Object.prototype;
18423
18424   /** Used to check objects for own properties. */
18425   var hasOwnProperty$6 = objectProto$7.hasOwnProperty;
18426
18427   /**
18428    * Creates an array of the enumerable property names of the array-like `value`.
18429    *
18430    * @private
18431    * @param {*} value The value to query.
18432    * @param {boolean} inherited Specify returning inherited property names.
18433    * @returns {Array} Returns the array of property names.
18434    */
18435   function arrayLikeKeys(value, inherited) {
18436     var isArr = isArray(value),
18437         isArg = !isArr && isArguments(value),
18438         isBuff = !isArr && !isArg && isBuffer(value),
18439         isType = !isArr && !isArg && !isBuff && isTypedArray(value),
18440         skipIndexes = isArr || isArg || isBuff || isType,
18441         result = skipIndexes ? baseTimes(value.length, String) : [],
18442         length = result.length;
18443
18444     for (var key in value) {
18445       if ((inherited || hasOwnProperty$6.call(value, key)) &&
18446           !(skipIndexes && (
18447              // Safari 9 has enumerable `arguments.length` in strict mode.
18448              key == 'length' ||
18449              // Node.js 0.10 has enumerable non-index properties on buffers.
18450              (isBuff && (key == 'offset' || key == 'parent')) ||
18451              // PhantomJS 2 has enumerable non-index properties on typed arrays.
18452              (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
18453              // Skip index properties.
18454              isIndex(key, length)
18455           ))) {
18456         result.push(key);
18457       }
18458     }
18459     return result;
18460   }
18461
18462   /** Used for built-in method references. */
18463   var objectProto$8 = Object.prototype;
18464
18465   /**
18466    * Checks if `value` is likely a prototype object.
18467    *
18468    * @private
18469    * @param {*} value The value to check.
18470    * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
18471    */
18472   function isPrototype(value) {
18473     var Ctor = value && value.constructor,
18474         proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$8;
18475
18476     return value === proto;
18477   }
18478
18479   /**
18480    * Creates a unary function that invokes `func` with its argument transformed.
18481    *
18482    * @private
18483    * @param {Function} func The function to wrap.
18484    * @param {Function} transform The argument transform.
18485    * @returns {Function} Returns the new function.
18486    */
18487   function overArg(func, transform) {
18488     return function(arg) {
18489       return func(transform(arg));
18490     };
18491   }
18492
18493   /* Built-in method references for those with the same name as other `lodash` methods. */
18494   var nativeKeys = overArg(Object.keys, Object);
18495
18496   /** Used for built-in method references. */
18497   var objectProto$9 = Object.prototype;
18498
18499   /** Used to check objects for own properties. */
18500   var hasOwnProperty$7 = objectProto$9.hasOwnProperty;
18501
18502   /**
18503    * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
18504    *
18505    * @private
18506    * @param {Object} object The object to query.
18507    * @returns {Array} Returns the array of property names.
18508    */
18509   function baseKeys(object) {
18510     if (!isPrototype(object)) {
18511       return nativeKeys(object);
18512     }
18513     var result = [];
18514     for (var key in Object(object)) {
18515       if (hasOwnProperty$7.call(object, key) && key != 'constructor') {
18516         result.push(key);
18517       }
18518     }
18519     return result;
18520   }
18521
18522   /**
18523    * Checks if `value` is array-like. A value is considered array-like if it's
18524    * not a function and has a `value.length` that's an integer greater than or
18525    * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
18526    *
18527    * @static
18528    * @memberOf _
18529    * @since 4.0.0
18530    * @category Lang
18531    * @param {*} value The value to check.
18532    * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
18533    * @example
18534    *
18535    * _.isArrayLike([1, 2, 3]);
18536    * // => true
18537    *
18538    * _.isArrayLike(document.body.children);
18539    * // => true
18540    *
18541    * _.isArrayLike('abc');
18542    * // => true
18543    *
18544    * _.isArrayLike(_.noop);
18545    * // => false
18546    */
18547   function isArrayLike(value) {
18548     return value != null && isLength(value.length) && !isFunction(value);
18549   }
18550
18551   /**
18552    * Creates an array of the own enumerable property names of `object`.
18553    *
18554    * **Note:** Non-object values are coerced to objects. See the
18555    * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18556    * for more details.
18557    *
18558    * @static
18559    * @since 0.1.0
18560    * @memberOf _
18561    * @category Object
18562    * @param {Object} object The object to query.
18563    * @returns {Array} Returns the array of property names.
18564    * @example
18565    *
18566    * function Foo() {
18567    *   this.a = 1;
18568    *   this.b = 2;
18569    * }
18570    *
18571    * Foo.prototype.c = 3;
18572    *
18573    * _.keys(new Foo);
18574    * // => ['a', 'b'] (iteration order is not guaranteed)
18575    *
18576    * _.keys('hi');
18577    * // => ['0', '1']
18578    */
18579   function keys$1(object) {
18580     return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
18581   }
18582
18583   /**
18584    * The base implementation of `_.assign` without support for multiple sources
18585    * or `customizer` functions.
18586    *
18587    * @private
18588    * @param {Object} object The destination object.
18589    * @param {Object} source The source object.
18590    * @returns {Object} Returns `object`.
18591    */
18592   function baseAssign(object, source) {
18593     return object && copyObject(source, keys$1(source), object);
18594   }
18595
18596   /**
18597    * This function is like
18598    * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18599    * except that it includes inherited enumerable properties.
18600    *
18601    * @private
18602    * @param {Object} object The object to query.
18603    * @returns {Array} Returns the array of property names.
18604    */
18605   function nativeKeysIn(object) {
18606     var result = [];
18607     if (object != null) {
18608       for (var key in Object(object)) {
18609         result.push(key);
18610       }
18611     }
18612     return result;
18613   }
18614
18615   /** Used for built-in method references. */
18616   var objectProto$a = Object.prototype;
18617
18618   /** Used to check objects for own properties. */
18619   var hasOwnProperty$8 = objectProto$a.hasOwnProperty;
18620
18621   /**
18622    * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
18623    *
18624    * @private
18625    * @param {Object} object The object to query.
18626    * @returns {Array} Returns the array of property names.
18627    */
18628   function baseKeysIn(object) {
18629     if (!isObject(object)) {
18630       return nativeKeysIn(object);
18631     }
18632     var isProto = isPrototype(object),
18633         result = [];
18634
18635     for (var key in object) {
18636       if (!(key == 'constructor' && (isProto || !hasOwnProperty$8.call(object, key)))) {
18637         result.push(key);
18638       }
18639     }
18640     return result;
18641   }
18642
18643   /**
18644    * Creates an array of the own and inherited enumerable property names of `object`.
18645    *
18646    * **Note:** Non-object values are coerced to objects.
18647    *
18648    * @static
18649    * @memberOf _
18650    * @since 3.0.0
18651    * @category Object
18652    * @param {Object} object The object to query.
18653    * @returns {Array} Returns the array of property names.
18654    * @example
18655    *
18656    * function Foo() {
18657    *   this.a = 1;
18658    *   this.b = 2;
18659    * }
18660    *
18661    * Foo.prototype.c = 3;
18662    *
18663    * _.keysIn(new Foo);
18664    * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
18665    */
18666   function keysIn$1(object) {
18667     return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
18668   }
18669
18670   /**
18671    * The base implementation of `_.assignIn` without support for multiple sources
18672    * or `customizer` functions.
18673    *
18674    * @private
18675    * @param {Object} object The destination object.
18676    * @param {Object} source The source object.
18677    * @returns {Object} Returns `object`.
18678    */
18679   function baseAssignIn(object, source) {
18680     return object && copyObject(source, keysIn$1(source), object);
18681   }
18682
18683   /** Detect free variable `exports`. */
18684   var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18685
18686   /** Detect free variable `module`. */
18687   var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module;
18688
18689   /** Detect the popular CommonJS extension `module.exports`. */
18690   var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
18691
18692   /** Built-in value references. */
18693   var Buffer$1 = moduleExports$2 ? root$2.Buffer : undefined,
18694       allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;
18695
18696   /**
18697    * Creates a clone of  `buffer`.
18698    *
18699    * @private
18700    * @param {Buffer} buffer The buffer to clone.
18701    * @param {boolean} [isDeep] Specify a deep clone.
18702    * @returns {Buffer} Returns the cloned buffer.
18703    */
18704   function cloneBuffer(buffer, isDeep) {
18705     if (isDeep) {
18706       return buffer.slice();
18707     }
18708     var length = buffer.length,
18709         result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
18710
18711     buffer.copy(result);
18712     return result;
18713   }
18714
18715   /**
18716    * Copies the values of `source` to `array`.
18717    *
18718    * @private
18719    * @param {Array} source The array to copy values from.
18720    * @param {Array} [array=[]] The array to copy values to.
18721    * @returns {Array} Returns `array`.
18722    */
18723   function copyArray(source, array) {
18724     var index = -1,
18725         length = source.length;
18726
18727     array || (array = Array(length));
18728     while (++index < length) {
18729       array[index] = source[index];
18730     }
18731     return array;
18732   }
18733
18734   /**
18735    * A specialized version of `_.filter` for arrays without support for
18736    * iteratee shorthands.
18737    *
18738    * @private
18739    * @param {Array} [array] The array to iterate over.
18740    * @param {Function} predicate The function invoked per iteration.
18741    * @returns {Array} Returns the new filtered array.
18742    */
18743   function arrayFilter(array, predicate) {
18744     var index = -1,
18745         length = array == null ? 0 : array.length,
18746         resIndex = 0,
18747         result = [];
18748
18749     while (++index < length) {
18750       var value = array[index];
18751       if (predicate(value, index, array)) {
18752         result[resIndex++] = value;
18753       }
18754     }
18755     return result;
18756   }
18757
18758   /**
18759    * This method returns a new empty array.
18760    *
18761    * @static
18762    * @memberOf _
18763    * @since 4.13.0
18764    * @category Util
18765    * @returns {Array} Returns the new empty array.
18766    * @example
18767    *
18768    * var arrays = _.times(2, _.stubArray);
18769    *
18770    * console.log(arrays);
18771    * // => [[], []]
18772    *
18773    * console.log(arrays[0] === arrays[1]);
18774    * // => false
18775    */
18776   function stubArray() {
18777     return [];
18778   }
18779
18780   /** Used for built-in method references. */
18781   var objectProto$b = Object.prototype;
18782
18783   /** Built-in value references. */
18784   var propertyIsEnumerable$1 = objectProto$b.propertyIsEnumerable;
18785
18786   /* Built-in method references for those with the same name as other `lodash` methods. */
18787   var nativeGetSymbols = Object.getOwnPropertySymbols;
18788
18789   /**
18790    * Creates an array of the own enumerable symbols of `object`.
18791    *
18792    * @private
18793    * @param {Object} object The object to query.
18794    * @returns {Array} Returns the array of symbols.
18795    */
18796   var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
18797     if (object == null) {
18798       return [];
18799     }
18800     object = Object(object);
18801     return arrayFilter(nativeGetSymbols(object), function(symbol) {
18802       return propertyIsEnumerable$1.call(object, symbol);
18803     });
18804   };
18805
18806   /**
18807    * Copies own symbols of `source` to `object`.
18808    *
18809    * @private
18810    * @param {Object} source The object to copy symbols from.
18811    * @param {Object} [object={}] The object to copy symbols to.
18812    * @returns {Object} Returns `object`.
18813    */
18814   function copySymbols(source, object) {
18815     return copyObject(source, getSymbols(source), object);
18816   }
18817
18818   /**
18819    * Appends the elements of `values` to `array`.
18820    *
18821    * @private
18822    * @param {Array} array The array to modify.
18823    * @param {Array} values The values to append.
18824    * @returns {Array} Returns `array`.
18825    */
18826   function arrayPush(array, values) {
18827     var index = -1,
18828         length = values.length,
18829         offset = array.length;
18830
18831     while (++index < length) {
18832       array[offset + index] = values[index];
18833     }
18834     return array;
18835   }
18836
18837   /** Built-in value references. */
18838   var getPrototype = overArg(Object.getPrototypeOf, Object);
18839
18840   /* Built-in method references for those with the same name as other `lodash` methods. */
18841   var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
18842
18843   /**
18844    * Creates an array of the own and inherited enumerable symbols of `object`.
18845    *
18846    * @private
18847    * @param {Object} object The object to query.
18848    * @returns {Array} Returns the array of symbols.
18849    */
18850   var getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function(object) {
18851     var result = [];
18852     while (object) {
18853       arrayPush(result, getSymbols(object));
18854       object = getPrototype(object);
18855     }
18856     return result;
18857   };
18858
18859   /**
18860    * Copies own and inherited symbols of `source` to `object`.
18861    *
18862    * @private
18863    * @param {Object} source The object to copy symbols from.
18864    * @param {Object} [object={}] The object to copy symbols to.
18865    * @returns {Object} Returns `object`.
18866    */
18867   function copySymbolsIn(source, object) {
18868     return copyObject(source, getSymbolsIn(source), object);
18869   }
18870
18871   /**
18872    * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
18873    * `keysFunc` and `symbolsFunc` to get the enumerable property names and
18874    * symbols of `object`.
18875    *
18876    * @private
18877    * @param {Object} object The object to query.
18878    * @param {Function} keysFunc The function to get the keys of `object`.
18879    * @param {Function} symbolsFunc The function to get the symbols of `object`.
18880    * @returns {Array} Returns the array of property names and symbols.
18881    */
18882   function baseGetAllKeys(object, keysFunc, symbolsFunc) {
18883     var result = keysFunc(object);
18884     return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
18885   }
18886
18887   /**
18888    * Creates an array of own enumerable property names and symbols of `object`.
18889    *
18890    * @private
18891    * @param {Object} object The object to query.
18892    * @returns {Array} Returns the array of property names and symbols.
18893    */
18894   function getAllKeys(object) {
18895     return baseGetAllKeys(object, keys$1, getSymbols);
18896   }
18897
18898   /**
18899    * Creates an array of own and inherited enumerable property names and
18900    * symbols of `object`.
18901    *
18902    * @private
18903    * @param {Object} object The object to query.
18904    * @returns {Array} Returns the array of property names and symbols.
18905    */
18906   function getAllKeysIn(object) {
18907     return baseGetAllKeys(object, keysIn$1, getSymbolsIn);
18908   }
18909
18910   /* Built-in method references that are verified to be native. */
18911   var DataView = getNative(root$2, 'DataView');
18912
18913   /* Built-in method references that are verified to be native. */
18914   var Promise = getNative(root$2, 'Promise');
18915
18916   /* Built-in method references that are verified to be native. */
18917   var Set$1 = getNative(root$2, 'Set');
18918
18919   /* Built-in method references that are verified to be native. */
18920   var WeakMap = getNative(root$2, 'WeakMap');
18921
18922   /** `Object#toString` result references. */
18923   var mapTag$1 = '[object Map]',
18924       objectTag$1 = '[object Object]',
18925       promiseTag = '[object Promise]',
18926       setTag$1 = '[object Set]',
18927       weakMapTag$1 = '[object WeakMap]';
18928
18929   var dataViewTag$1 = '[object DataView]';
18930
18931   /** Used to detect maps, sets, and weakmaps. */
18932   var dataViewCtorString = toSource(DataView),
18933       mapCtorString = toSource(Map$1),
18934       promiseCtorString = toSource(Promise),
18935       setCtorString = toSource(Set$1),
18936       weakMapCtorString = toSource(WeakMap);
18937
18938   /**
18939    * Gets the `toStringTag` of `value`.
18940    *
18941    * @private
18942    * @param {*} value The value to query.
18943    * @returns {string} Returns the `toStringTag`.
18944    */
18945   var getTag = baseGetTag;
18946
18947   // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
18948   if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$1) ||
18949       (Map$1 && getTag(new Map$1) != mapTag$1) ||
18950       (Promise && getTag(Promise.resolve()) != promiseTag) ||
18951       (Set$1 && getTag(new Set$1) != setTag$1) ||
18952       (WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
18953     getTag = function(value) {
18954       var result = baseGetTag(value),
18955           Ctor = result == objectTag$1 ? value.constructor : undefined,
18956           ctorString = Ctor ? toSource(Ctor) : '';
18957
18958       if (ctorString) {
18959         switch (ctorString) {
18960           case dataViewCtorString: return dataViewTag$1;
18961           case mapCtorString: return mapTag$1;
18962           case promiseCtorString: return promiseTag;
18963           case setCtorString: return setTag$1;
18964           case weakMapCtorString: return weakMapTag$1;
18965         }
18966       }
18967       return result;
18968     };
18969   }
18970
18971   var getTag$1 = getTag;
18972
18973   /** Used for built-in method references. */
18974   var objectProto$c = Object.prototype;
18975
18976   /** Used to check objects for own properties. */
18977   var hasOwnProperty$9 = objectProto$c.hasOwnProperty;
18978
18979   /**
18980    * Initializes an array clone.
18981    *
18982    * @private
18983    * @param {Array} array The array to clone.
18984    * @returns {Array} Returns the initialized clone.
18985    */
18986   function initCloneArray(array) {
18987     var length = array.length,
18988         result = new array.constructor(length);
18989
18990     // Add properties assigned by `RegExp#exec`.
18991     if (length && typeof array[0] == 'string' && hasOwnProperty$9.call(array, 'index')) {
18992       result.index = array.index;
18993       result.input = array.input;
18994     }
18995     return result;
18996   }
18997
18998   /** Built-in value references. */
18999   var Uint8Array$1 = root$2.Uint8Array;
19000
19001   /**
19002    * Creates a clone of `arrayBuffer`.
19003    *
19004    * @private
19005    * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
19006    * @returns {ArrayBuffer} Returns the cloned array buffer.
19007    */
19008   function cloneArrayBuffer(arrayBuffer) {
19009     var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
19010     new Uint8Array$1(result).set(new Uint8Array$1(arrayBuffer));
19011     return result;
19012   }
19013
19014   /**
19015    * Creates a clone of `dataView`.
19016    *
19017    * @private
19018    * @param {Object} dataView The data view to clone.
19019    * @param {boolean} [isDeep] Specify a deep clone.
19020    * @returns {Object} Returns the cloned data view.
19021    */
19022   function cloneDataView(dataView, isDeep) {
19023     var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
19024     return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
19025   }
19026
19027   /** Used to match `RegExp` flags from their coerced string values. */
19028   var reFlags = /\w*$/;
19029
19030   /**
19031    * Creates a clone of `regexp`.
19032    *
19033    * @private
19034    * @param {Object} regexp The regexp to clone.
19035    * @returns {Object} Returns the cloned regexp.
19036    */
19037   function cloneRegExp(regexp) {
19038     var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
19039     result.lastIndex = regexp.lastIndex;
19040     return result;
19041   }
19042
19043   /** Used to convert symbols to primitives and strings. */
19044   var symbolProto = Symbol ? Symbol.prototype : undefined,
19045       symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
19046
19047   /**
19048    * Creates a clone of the `symbol` object.
19049    *
19050    * @private
19051    * @param {Object} symbol The symbol object to clone.
19052    * @returns {Object} Returns the cloned symbol object.
19053    */
19054   function cloneSymbol(symbol) {
19055     return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
19056   }
19057
19058   /**
19059    * Creates a clone of `typedArray`.
19060    *
19061    * @private
19062    * @param {Object} typedArray The typed array to clone.
19063    * @param {boolean} [isDeep] Specify a deep clone.
19064    * @returns {Object} Returns the cloned typed array.
19065    */
19066   function cloneTypedArray(typedArray, isDeep) {
19067     var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
19068     return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
19069   }
19070
19071   /** `Object#toString` result references. */
19072   var boolTag$1 = '[object Boolean]',
19073       dateTag$1 = '[object Date]',
19074       mapTag$2 = '[object Map]',
19075       numberTag$1 = '[object Number]',
19076       regexpTag$1 = '[object RegExp]',
19077       setTag$2 = '[object Set]',
19078       stringTag$1 = '[object String]',
19079       symbolTag = '[object Symbol]';
19080
19081   var arrayBufferTag$1 = '[object ArrayBuffer]',
19082       dataViewTag$2 = '[object DataView]',
19083       float32Tag$1 = '[object Float32Array]',
19084       float64Tag$1 = '[object Float64Array]',
19085       int8Tag$1 = '[object Int8Array]',
19086       int16Tag$1 = '[object Int16Array]',
19087       int32Tag$1 = '[object Int32Array]',
19088       uint8Tag$1 = '[object Uint8Array]',
19089       uint8ClampedTag$1 = '[object Uint8ClampedArray]',
19090       uint16Tag$1 = '[object Uint16Array]',
19091       uint32Tag$1 = '[object Uint32Array]';
19092
19093   /**
19094    * Initializes an object clone based on its `toStringTag`.
19095    *
19096    * **Note:** This function only supports cloning values with tags of
19097    * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
19098    *
19099    * @private
19100    * @param {Object} object The object to clone.
19101    * @param {string} tag The `toStringTag` of the object to clone.
19102    * @param {boolean} [isDeep] Specify a deep clone.
19103    * @returns {Object} Returns the initialized clone.
19104    */
19105   function initCloneByTag(object, tag, isDeep) {
19106     var Ctor = object.constructor;
19107     switch (tag) {
19108       case arrayBufferTag$1:
19109         return cloneArrayBuffer(object);
19110
19111       case boolTag$1:
19112       case dateTag$1:
19113         return new Ctor(+object);
19114
19115       case dataViewTag$2:
19116         return cloneDataView(object, isDeep);
19117
19118       case float32Tag$1: case float64Tag$1:
19119       case int8Tag$1: case int16Tag$1: case int32Tag$1:
19120       case uint8Tag$1: case uint8ClampedTag$1: case uint16Tag$1: case uint32Tag$1:
19121         return cloneTypedArray(object, isDeep);
19122
19123       case mapTag$2:
19124         return new Ctor;
19125
19126       case numberTag$1:
19127       case stringTag$1:
19128         return new Ctor(object);
19129
19130       case regexpTag$1:
19131         return cloneRegExp(object);
19132
19133       case setTag$2:
19134         return new Ctor;
19135
19136       case symbolTag:
19137         return cloneSymbol(object);
19138     }
19139   }
19140
19141   /** Built-in value references. */
19142   var objectCreate = Object.create;
19143
19144   /**
19145    * The base implementation of `_.create` without support for assigning
19146    * properties to the created object.
19147    *
19148    * @private
19149    * @param {Object} proto The object to inherit from.
19150    * @returns {Object} Returns the new object.
19151    */
19152   var baseCreate = (function() {
19153     function object() {}
19154     return function(proto) {
19155       if (!isObject(proto)) {
19156         return {};
19157       }
19158       if (objectCreate) {
19159         return objectCreate(proto);
19160       }
19161       object.prototype = proto;
19162       var result = new object;
19163       object.prototype = undefined;
19164       return result;
19165     };
19166   }());
19167
19168   /**
19169    * Initializes an object clone.
19170    *
19171    * @private
19172    * @param {Object} object The object to clone.
19173    * @returns {Object} Returns the initialized clone.
19174    */
19175   function initCloneObject(object) {
19176     return (typeof object.constructor == 'function' && !isPrototype(object))
19177       ? baseCreate(getPrototype(object))
19178       : {};
19179   }
19180
19181   /** `Object#toString` result references. */
19182   var mapTag$3 = '[object Map]';
19183
19184   /**
19185    * The base implementation of `_.isMap` without Node.js optimizations.
19186    *
19187    * @private
19188    * @param {*} value The value to check.
19189    * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19190    */
19191   function baseIsMap(value) {
19192     return isObjectLike(value) && getTag$1(value) == mapTag$3;
19193   }
19194
19195   /* Node.js helper references. */
19196   var nodeIsMap = nodeUtil && nodeUtil.isMap;
19197
19198   /**
19199    * Checks if `value` is classified as a `Map` object.
19200    *
19201    * @static
19202    * @memberOf _
19203    * @since 4.3.0
19204    * @category Lang
19205    * @param {*} value The value to check.
19206    * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19207    * @example
19208    *
19209    * _.isMap(new Map);
19210    * // => true
19211    *
19212    * _.isMap(new WeakMap);
19213    * // => false
19214    */
19215   var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
19216
19217   /** `Object#toString` result references. */
19218   var setTag$3 = '[object Set]';
19219
19220   /**
19221    * The base implementation of `_.isSet` without Node.js optimizations.
19222    *
19223    * @private
19224    * @param {*} value The value to check.
19225    * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19226    */
19227   function baseIsSet(value) {
19228     return isObjectLike(value) && getTag$1(value) == setTag$3;
19229   }
19230
19231   /* Node.js helper references. */
19232   var nodeIsSet = nodeUtil && nodeUtil.isSet;
19233
19234   /**
19235    * Checks if `value` is classified as a `Set` object.
19236    *
19237    * @static
19238    * @memberOf _
19239    * @since 4.3.0
19240    * @category Lang
19241    * @param {*} value The value to check.
19242    * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19243    * @example
19244    *
19245    * _.isSet(new Set);
19246    * // => true
19247    *
19248    * _.isSet(new WeakSet);
19249    * // => false
19250    */
19251   var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
19252
19253   /** Used to compose bitmasks for cloning. */
19254   var CLONE_DEEP_FLAG = 1,
19255       CLONE_FLAT_FLAG = 2,
19256       CLONE_SYMBOLS_FLAG = 4;
19257
19258   /** `Object#toString` result references. */
19259   var argsTag$2 = '[object Arguments]',
19260       arrayTag$1 = '[object Array]',
19261       boolTag$2 = '[object Boolean]',
19262       dateTag$2 = '[object Date]',
19263       errorTag$1 = '[object Error]',
19264       funcTag$2 = '[object Function]',
19265       genTag$1 = '[object GeneratorFunction]',
19266       mapTag$4 = '[object Map]',
19267       numberTag$2 = '[object Number]',
19268       objectTag$2 = '[object Object]',
19269       regexpTag$2 = '[object RegExp]',
19270       setTag$4 = '[object Set]',
19271       stringTag$2 = '[object String]',
19272       symbolTag$1 = '[object Symbol]',
19273       weakMapTag$2 = '[object WeakMap]';
19274
19275   var arrayBufferTag$2 = '[object ArrayBuffer]',
19276       dataViewTag$3 = '[object DataView]',
19277       float32Tag$2 = '[object Float32Array]',
19278       float64Tag$2 = '[object Float64Array]',
19279       int8Tag$2 = '[object Int8Array]',
19280       int16Tag$2 = '[object Int16Array]',
19281       int32Tag$2 = '[object Int32Array]',
19282       uint8Tag$2 = '[object Uint8Array]',
19283       uint8ClampedTag$2 = '[object Uint8ClampedArray]',
19284       uint16Tag$2 = '[object Uint16Array]',
19285       uint32Tag$2 = '[object Uint32Array]';
19286
19287   /** Used to identify `toStringTag` values supported by `_.clone`. */
19288   var cloneableTags = {};
19289   cloneableTags[argsTag$2] = cloneableTags[arrayTag$1] =
19290   cloneableTags[arrayBufferTag$2] = cloneableTags[dataViewTag$3] =
19291   cloneableTags[boolTag$2] = cloneableTags[dateTag$2] =
19292   cloneableTags[float32Tag$2] = cloneableTags[float64Tag$2] =
19293   cloneableTags[int8Tag$2] = cloneableTags[int16Tag$2] =
19294   cloneableTags[int32Tag$2] = cloneableTags[mapTag$4] =
19295   cloneableTags[numberTag$2] = cloneableTags[objectTag$2] =
19296   cloneableTags[regexpTag$2] = cloneableTags[setTag$4] =
19297   cloneableTags[stringTag$2] = cloneableTags[symbolTag$1] =
19298   cloneableTags[uint8Tag$2] = cloneableTags[uint8ClampedTag$2] =
19299   cloneableTags[uint16Tag$2] = cloneableTags[uint32Tag$2] = true;
19300   cloneableTags[errorTag$1] = cloneableTags[funcTag$2] =
19301   cloneableTags[weakMapTag$2] = false;
19302
19303   /**
19304    * The base implementation of `_.clone` and `_.cloneDeep` which tracks
19305    * traversed objects.
19306    *
19307    * @private
19308    * @param {*} value The value to clone.
19309    * @param {boolean} bitmask The bitmask flags.
19310    *  1 - Deep clone
19311    *  2 - Flatten inherited properties
19312    *  4 - Clone symbols
19313    * @param {Function} [customizer] The function to customize cloning.
19314    * @param {string} [key] The key of `value`.
19315    * @param {Object} [object] The parent object of `value`.
19316    * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
19317    * @returns {*} Returns the cloned value.
19318    */
19319   function baseClone(value, bitmask, customizer, key, object, stack) {
19320     var result,
19321         isDeep = bitmask & CLONE_DEEP_FLAG,
19322         isFlat = bitmask & CLONE_FLAT_FLAG,
19323         isFull = bitmask & CLONE_SYMBOLS_FLAG;
19324
19325     if (customizer) {
19326       result = object ? customizer(value, key, object, stack) : customizer(value);
19327     }
19328     if (result !== undefined) {
19329       return result;
19330     }
19331     if (!isObject(value)) {
19332       return value;
19333     }
19334     var isArr = isArray(value);
19335     if (isArr) {
19336       result = initCloneArray(value);
19337       if (!isDeep) {
19338         return copyArray(value, result);
19339       }
19340     } else {
19341       var tag = getTag$1(value),
19342           isFunc = tag == funcTag$2 || tag == genTag$1;
19343
19344       if (isBuffer(value)) {
19345         return cloneBuffer(value, isDeep);
19346       }
19347       if (tag == objectTag$2 || tag == argsTag$2 || (isFunc && !object)) {
19348         result = (isFlat || isFunc) ? {} : initCloneObject(value);
19349         if (!isDeep) {
19350           return isFlat
19351             ? copySymbolsIn(value, baseAssignIn(result, value))
19352             : copySymbols(value, baseAssign(result, value));
19353         }
19354       } else {
19355         if (!cloneableTags[tag]) {
19356           return object ? value : {};
19357         }
19358         result = initCloneByTag(value, tag, isDeep);
19359       }
19360     }
19361     // Check for circular references and return its corresponding clone.
19362     stack || (stack = new Stack);
19363     var stacked = stack.get(value);
19364     if (stacked) {
19365       return stacked;
19366     }
19367     stack.set(value, result);
19368
19369     if (isSet(value)) {
19370       value.forEach(function(subValue) {
19371         result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
19372       });
19373
19374       return result;
19375     }
19376
19377     if (isMap(value)) {
19378       value.forEach(function(subValue, key) {
19379         result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
19380       });
19381
19382       return result;
19383     }
19384
19385     var keysFunc = isFull
19386       ? (isFlat ? getAllKeysIn : getAllKeys)
19387       : (isFlat ? keysIn : keys$1);
19388
19389     var props = isArr ? undefined : keysFunc(value);
19390     arrayEach(props || value, function(subValue, key) {
19391       if (props) {
19392         key = subValue;
19393         subValue = value[key];
19394       }
19395       // Recursively populate clone (susceptible to call stack limits).
19396       assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
19397     });
19398     return result;
19399   }
19400
19401   /** Used to compose bitmasks for cloning. */
19402   var CLONE_SYMBOLS_FLAG$1 = 4;
19403
19404   /**
19405    * Creates a shallow clone of `value`.
19406    *
19407    * **Note:** This method is loosely based on the
19408    * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
19409    * and supports cloning arrays, array buffers, booleans, date objects, maps,
19410    * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
19411    * arrays. The own enumerable properties of `arguments` objects are cloned
19412    * as plain objects. An empty object is returned for uncloneable values such
19413    * as error objects, functions, DOM nodes, and WeakMaps.
19414    *
19415    * @static
19416    * @memberOf _
19417    * @since 0.1.0
19418    * @category Lang
19419    * @param {*} value The value to clone.
19420    * @returns {*} Returns the cloned value.
19421    * @see _.cloneDeep
19422    * @example
19423    *
19424    * var objects = [{ 'a': 1 }, { 'b': 2 }];
19425    *
19426    * var shallow = _.clone(objects);
19427    * console.log(shallow[0] === objects[0]);
19428    * // => true
19429    */
19430   function clone(value) {
19431     return baseClone(value, CLONE_SYMBOLS_FLAG$1);
19432   }
19433
19434   /**
19435    * A specialized version of `baseAggregator` for arrays.
19436    *
19437    * @private
19438    * @param {Array} [array] The array to iterate over.
19439    * @param {Function} setter The function to set `accumulator` values.
19440    * @param {Function} iteratee The iteratee to transform keys.
19441    * @param {Object} accumulator The initial aggregated object.
19442    * @returns {Function} Returns `accumulator`.
19443    */
19444   function arrayAggregator(array, setter, iteratee, accumulator) {
19445     var index = -1,
19446         length = array == null ? 0 : array.length;
19447
19448     while (++index < length) {
19449       var value = array[index];
19450       setter(accumulator, value, iteratee(value), array);
19451     }
19452     return accumulator;
19453   }
19454
19455   /**
19456    * Creates a base function for methods like `_.forIn` and `_.forOwn`.
19457    *
19458    * @private
19459    * @param {boolean} [fromRight] Specify iterating from right to left.
19460    * @returns {Function} Returns the new base function.
19461    */
19462   function createBaseFor(fromRight) {
19463     return function(object, iteratee, keysFunc) {
19464       var index = -1,
19465           iterable = Object(object),
19466           props = keysFunc(object),
19467           length = props.length;
19468
19469       while (length--) {
19470         var key = props[fromRight ? length : ++index];
19471         if (iteratee(iterable[key], key, iterable) === false) {
19472           break;
19473         }
19474       }
19475       return object;
19476     };
19477   }
19478
19479   /**
19480    * The base implementation of `baseForOwn` which iterates over `object`
19481    * properties returned by `keysFunc` and invokes `iteratee` for each property.
19482    * Iteratee functions may exit iteration early by explicitly returning `false`.
19483    *
19484    * @private
19485    * @param {Object} object The object to iterate over.
19486    * @param {Function} iteratee The function invoked per iteration.
19487    * @param {Function} keysFunc The function to get the keys of `object`.
19488    * @returns {Object} Returns `object`.
19489    */
19490   var baseFor = createBaseFor();
19491
19492   /**
19493    * The base implementation of `_.forOwn` without support for iteratee shorthands.
19494    *
19495    * @private
19496    * @param {Object} object The object to iterate over.
19497    * @param {Function} iteratee The function invoked per iteration.
19498    * @returns {Object} Returns `object`.
19499    */
19500   function baseForOwn(object, iteratee) {
19501     return object && baseFor(object, iteratee, keys$1);
19502   }
19503
19504   /**
19505    * Creates a `baseEach` or `baseEachRight` function.
19506    *
19507    * @private
19508    * @param {Function} eachFunc The function to iterate over a collection.
19509    * @param {boolean} [fromRight] Specify iterating from right to left.
19510    * @returns {Function} Returns the new base function.
19511    */
19512   function createBaseEach(eachFunc, fromRight) {
19513     return function(collection, iteratee) {
19514       if (collection == null) {
19515         return collection;
19516       }
19517       if (!isArrayLike(collection)) {
19518         return eachFunc(collection, iteratee);
19519       }
19520       var length = collection.length,
19521           index = fromRight ? length : -1,
19522           iterable = Object(collection);
19523
19524       while ((fromRight ? index-- : ++index < length)) {
19525         if (iteratee(iterable[index], index, iterable) === false) {
19526           break;
19527         }
19528       }
19529       return collection;
19530     };
19531   }
19532
19533   /**
19534    * The base implementation of `_.forEach` without support for iteratee shorthands.
19535    *
19536    * @private
19537    * @param {Array|Object} collection The collection to iterate over.
19538    * @param {Function} iteratee The function invoked per iteration.
19539    * @returns {Array|Object} Returns `collection`.
19540    */
19541   var baseEach = createBaseEach(baseForOwn);
19542
19543   /**
19544    * Aggregates elements of `collection` on `accumulator` with keys transformed
19545    * by `iteratee` and values set by `setter`.
19546    *
19547    * @private
19548    * @param {Array|Object} collection The collection to iterate over.
19549    * @param {Function} setter The function to set `accumulator` values.
19550    * @param {Function} iteratee The iteratee to transform keys.
19551    * @param {Object} accumulator The initial aggregated object.
19552    * @returns {Function} Returns `accumulator`.
19553    */
19554   function baseAggregator(collection, setter, iteratee, accumulator) {
19555     baseEach(collection, function(value, key, collection) {
19556       setter(accumulator, value, iteratee(value), collection);
19557     });
19558     return accumulator;
19559   }
19560
19561   /** Used to stand-in for `undefined` hash values. */
19562   var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
19563
19564   /**
19565    * Adds `value` to the array cache.
19566    *
19567    * @private
19568    * @name add
19569    * @memberOf SetCache
19570    * @alias push
19571    * @param {*} value The value to cache.
19572    * @returns {Object} Returns the cache instance.
19573    */
19574   function setCacheAdd(value) {
19575     this.__data__.set(value, HASH_UNDEFINED$2);
19576     return this;
19577   }
19578
19579   /**
19580    * Checks if `value` is in the array cache.
19581    *
19582    * @private
19583    * @name has
19584    * @memberOf SetCache
19585    * @param {*} value The value to search for.
19586    * @returns {number} Returns `true` if `value` is found, else `false`.
19587    */
19588   function setCacheHas(value) {
19589     return this.__data__.has(value);
19590   }
19591
19592   /**
19593    *
19594    * Creates an array cache object to store unique values.
19595    *
19596    * @private
19597    * @constructor
19598    * @param {Array} [values] The values to cache.
19599    */
19600   function SetCache(values) {
19601     var index = -1,
19602         length = values == null ? 0 : values.length;
19603
19604     this.__data__ = new MapCache;
19605     while (++index < length) {
19606       this.add(values[index]);
19607     }
19608   }
19609
19610   // Add methods to `SetCache`.
19611   SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
19612   SetCache.prototype.has = setCacheHas;
19613
19614   /**
19615    * A specialized version of `_.some` for arrays without support for iteratee
19616    * shorthands.
19617    *
19618    * @private
19619    * @param {Array} [array] The array to iterate over.
19620    * @param {Function} predicate The function invoked per iteration.
19621    * @returns {boolean} Returns `true` if any element passes the predicate check,
19622    *  else `false`.
19623    */
19624   function arraySome(array, predicate) {
19625     var index = -1,
19626         length = array == null ? 0 : array.length;
19627
19628     while (++index < length) {
19629       if (predicate(array[index], index, array)) {
19630         return true;
19631       }
19632     }
19633     return false;
19634   }
19635
19636   /**
19637    * Checks if a `cache` value for `key` exists.
19638    *
19639    * @private
19640    * @param {Object} cache The cache to query.
19641    * @param {string} key The key of the entry to check.
19642    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
19643    */
19644   function cacheHas(cache, key) {
19645     return cache.has(key);
19646   }
19647
19648   /** Used to compose bitmasks for value comparisons. */
19649   var COMPARE_PARTIAL_FLAG = 1,
19650       COMPARE_UNORDERED_FLAG = 2;
19651
19652   /**
19653    * A specialized version of `baseIsEqualDeep` for arrays with support for
19654    * partial deep comparisons.
19655    *
19656    * @private
19657    * @param {Array} array The array to compare.
19658    * @param {Array} other The other array to compare.
19659    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19660    * @param {Function} customizer The function to customize comparisons.
19661    * @param {Function} equalFunc The function to determine equivalents of values.
19662    * @param {Object} stack Tracks traversed `array` and `other` objects.
19663    * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
19664    */
19665   function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
19666     var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
19667         arrLength = array.length,
19668         othLength = other.length;
19669
19670     if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
19671       return false;
19672     }
19673     // Assume cyclic values are equal.
19674     var stacked = stack.get(array);
19675     if (stacked && stack.get(other)) {
19676       return stacked == other;
19677     }
19678     var index = -1,
19679         result = true,
19680         seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
19681
19682     stack.set(array, other);
19683     stack.set(other, array);
19684
19685     // Ignore non-index properties.
19686     while (++index < arrLength) {
19687       var arrValue = array[index],
19688           othValue = other[index];
19689
19690       if (customizer) {
19691         var compared = isPartial
19692           ? customizer(othValue, arrValue, index, other, array, stack)
19693           : customizer(arrValue, othValue, index, array, other, stack);
19694       }
19695       if (compared !== undefined) {
19696         if (compared) {
19697           continue;
19698         }
19699         result = false;
19700         break;
19701       }
19702       // Recursively compare arrays (susceptible to call stack limits).
19703       if (seen) {
19704         if (!arraySome(other, function(othValue, othIndex) {
19705               if (!cacheHas(seen, othIndex) &&
19706                   (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
19707                 return seen.push(othIndex);
19708               }
19709             })) {
19710           result = false;
19711           break;
19712         }
19713       } else if (!(
19714             arrValue === othValue ||
19715               equalFunc(arrValue, othValue, bitmask, customizer, stack)
19716           )) {
19717         result = false;
19718         break;
19719       }
19720     }
19721     stack['delete'](array);
19722     stack['delete'](other);
19723     return result;
19724   }
19725
19726   /**
19727    * Converts `map` to its key-value pairs.
19728    *
19729    * @private
19730    * @param {Object} map The map to convert.
19731    * @returns {Array} Returns the key-value pairs.
19732    */
19733   function mapToArray(map) {
19734     var index = -1,
19735         result = Array(map.size);
19736
19737     map.forEach(function(value, key) {
19738       result[++index] = [key, value];
19739     });
19740     return result;
19741   }
19742
19743   /**
19744    * Converts `set` to an array of its values.
19745    *
19746    * @private
19747    * @param {Object} set The set to convert.
19748    * @returns {Array} Returns the values.
19749    */
19750   function setToArray(set) {
19751     var index = -1,
19752         result = Array(set.size);
19753
19754     set.forEach(function(value) {
19755       result[++index] = value;
19756     });
19757     return result;
19758   }
19759
19760   /** Used to compose bitmasks for value comparisons. */
19761   var COMPARE_PARTIAL_FLAG$1 = 1,
19762       COMPARE_UNORDERED_FLAG$1 = 2;
19763
19764   /** `Object#toString` result references. */
19765   var boolTag$3 = '[object Boolean]',
19766       dateTag$3 = '[object Date]',
19767       errorTag$2 = '[object Error]',
19768       mapTag$5 = '[object Map]',
19769       numberTag$3 = '[object Number]',
19770       regexpTag$3 = '[object RegExp]',
19771       setTag$5 = '[object Set]',
19772       stringTag$3 = '[object String]',
19773       symbolTag$2 = '[object Symbol]';
19774
19775   var arrayBufferTag$3 = '[object ArrayBuffer]',
19776       dataViewTag$4 = '[object DataView]';
19777
19778   /** Used to convert symbols to primitives and strings. */
19779   var symbolProto$1 = Symbol ? Symbol.prototype : undefined,
19780       symbolValueOf$1 = symbolProto$1 ? symbolProto$1.valueOf : undefined;
19781
19782   /**
19783    * A specialized version of `baseIsEqualDeep` for comparing objects of
19784    * the same `toStringTag`.
19785    *
19786    * **Note:** This function only supports comparing values with tags of
19787    * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
19788    *
19789    * @private
19790    * @param {Object} object The object to compare.
19791    * @param {Object} other The other object to compare.
19792    * @param {string} tag The `toStringTag` of the objects to compare.
19793    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19794    * @param {Function} customizer The function to customize comparisons.
19795    * @param {Function} equalFunc The function to determine equivalents of values.
19796    * @param {Object} stack Tracks traversed `object` and `other` objects.
19797    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19798    */
19799   function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
19800     switch (tag) {
19801       case dataViewTag$4:
19802         if ((object.byteLength != other.byteLength) ||
19803             (object.byteOffset != other.byteOffset)) {
19804           return false;
19805         }
19806         object = object.buffer;
19807         other = other.buffer;
19808
19809       case arrayBufferTag$3:
19810         if ((object.byteLength != other.byteLength) ||
19811             !equalFunc(new Uint8Array$1(object), new Uint8Array$1(other))) {
19812           return false;
19813         }
19814         return true;
19815
19816       case boolTag$3:
19817       case dateTag$3:
19818       case numberTag$3:
19819         // Coerce booleans to `1` or `0` and dates to milliseconds.
19820         // Invalid dates are coerced to `NaN`.
19821         return eq(+object, +other);
19822
19823       case errorTag$2:
19824         return object.name == other.name && object.message == other.message;
19825
19826       case regexpTag$3:
19827       case stringTag$3:
19828         // Coerce regexes to strings and treat strings, primitives and objects,
19829         // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
19830         // for more details.
19831         return object == (other + '');
19832
19833       case mapTag$5:
19834         var convert = mapToArray;
19835
19836       case setTag$5:
19837         var isPartial = bitmask & COMPARE_PARTIAL_FLAG$1;
19838         convert || (convert = setToArray);
19839
19840         if (object.size != other.size && !isPartial) {
19841           return false;
19842         }
19843         // Assume cyclic values are equal.
19844         var stacked = stack.get(object);
19845         if (stacked) {
19846           return stacked == other;
19847         }
19848         bitmask |= COMPARE_UNORDERED_FLAG$1;
19849
19850         // Recursively compare objects (susceptible to call stack limits).
19851         stack.set(object, other);
19852         var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
19853         stack['delete'](object);
19854         return result;
19855
19856       case symbolTag$2:
19857         if (symbolValueOf$1) {
19858           return symbolValueOf$1.call(object) == symbolValueOf$1.call(other);
19859         }
19860     }
19861     return false;
19862   }
19863
19864   /** Used to compose bitmasks for value comparisons. */
19865   var COMPARE_PARTIAL_FLAG$2 = 1;
19866
19867   /** Used for built-in method references. */
19868   var objectProto$d = Object.prototype;
19869
19870   /** Used to check objects for own properties. */
19871   var hasOwnProperty$a = objectProto$d.hasOwnProperty;
19872
19873   /**
19874    * A specialized version of `baseIsEqualDeep` for objects with support for
19875    * partial deep comparisons.
19876    *
19877    * @private
19878    * @param {Object} object The object to compare.
19879    * @param {Object} other The other object to compare.
19880    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19881    * @param {Function} customizer The function to customize comparisons.
19882    * @param {Function} equalFunc The function to determine equivalents of values.
19883    * @param {Object} stack Tracks traversed `object` and `other` objects.
19884    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19885    */
19886   function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
19887     var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,
19888         objProps = getAllKeys(object),
19889         objLength = objProps.length,
19890         othProps = getAllKeys(other),
19891         othLength = othProps.length;
19892
19893     if (objLength != othLength && !isPartial) {
19894       return false;
19895     }
19896     var index = objLength;
19897     while (index--) {
19898       var key = objProps[index];
19899       if (!(isPartial ? key in other : hasOwnProperty$a.call(other, key))) {
19900         return false;
19901       }
19902     }
19903     // Assume cyclic values are equal.
19904     var stacked = stack.get(object);
19905     if (stacked && stack.get(other)) {
19906       return stacked == other;
19907     }
19908     var result = true;
19909     stack.set(object, other);
19910     stack.set(other, object);
19911
19912     var skipCtor = isPartial;
19913     while (++index < objLength) {
19914       key = objProps[index];
19915       var objValue = object[key],
19916           othValue = other[key];
19917
19918       if (customizer) {
19919         var compared = isPartial
19920           ? customizer(othValue, objValue, key, other, object, stack)
19921           : customizer(objValue, othValue, key, object, other, stack);
19922       }
19923       // Recursively compare objects (susceptible to call stack limits).
19924       if (!(compared === undefined
19925             ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
19926             : compared
19927           )) {
19928         result = false;
19929         break;
19930       }
19931       skipCtor || (skipCtor = key == 'constructor');
19932     }
19933     if (result && !skipCtor) {
19934       var objCtor = object.constructor,
19935           othCtor = other.constructor;
19936
19937       // Non `Object` object instances with different constructors are not equal.
19938       if (objCtor != othCtor &&
19939           ('constructor' in object && 'constructor' in other) &&
19940           !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
19941             typeof othCtor == 'function' && othCtor instanceof othCtor)) {
19942         result = false;
19943       }
19944     }
19945     stack['delete'](object);
19946     stack['delete'](other);
19947     return result;
19948   }
19949
19950   /** Used to compose bitmasks for value comparisons. */
19951   var COMPARE_PARTIAL_FLAG$3 = 1;
19952
19953   /** `Object#toString` result references. */
19954   var argsTag$3 = '[object Arguments]',
19955       arrayTag$2 = '[object Array]',
19956       objectTag$3 = '[object Object]';
19957
19958   /** Used for built-in method references. */
19959   var objectProto$e = Object.prototype;
19960
19961   /** Used to check objects for own properties. */
19962   var hasOwnProperty$b = objectProto$e.hasOwnProperty;
19963
19964   /**
19965    * A specialized version of `baseIsEqual` for arrays and objects which performs
19966    * deep comparisons and tracks traversed objects enabling objects with circular
19967    * references to be compared.
19968    *
19969    * @private
19970    * @param {Object} object The object to compare.
19971    * @param {Object} other The other object to compare.
19972    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19973    * @param {Function} customizer The function to customize comparisons.
19974    * @param {Function} equalFunc The function to determine equivalents of values.
19975    * @param {Object} [stack] Tracks traversed `object` and `other` objects.
19976    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19977    */
19978   function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
19979     var objIsArr = isArray(object),
19980         othIsArr = isArray(other),
19981         objTag = objIsArr ? arrayTag$2 : getTag$1(object),
19982         othTag = othIsArr ? arrayTag$2 : getTag$1(other);
19983
19984     objTag = objTag == argsTag$3 ? objectTag$3 : objTag;
19985     othTag = othTag == argsTag$3 ? objectTag$3 : othTag;
19986
19987     var objIsObj = objTag == objectTag$3,
19988         othIsObj = othTag == objectTag$3,
19989         isSameTag = objTag == othTag;
19990
19991     if (isSameTag && isBuffer(object)) {
19992       if (!isBuffer(other)) {
19993         return false;
19994       }
19995       objIsArr = true;
19996       objIsObj = false;
19997     }
19998     if (isSameTag && !objIsObj) {
19999       stack || (stack = new Stack);
20000       return (objIsArr || isTypedArray(object))
20001         ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
20002         : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
20003     }
20004     if (!(bitmask & COMPARE_PARTIAL_FLAG$3)) {
20005       var objIsWrapped = objIsObj && hasOwnProperty$b.call(object, '__wrapped__'),
20006           othIsWrapped = othIsObj && hasOwnProperty$b.call(other, '__wrapped__');
20007
20008       if (objIsWrapped || othIsWrapped) {
20009         var objUnwrapped = objIsWrapped ? object.value() : object,
20010             othUnwrapped = othIsWrapped ? other.value() : other;
20011
20012         stack || (stack = new Stack);
20013         return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
20014       }
20015     }
20016     if (!isSameTag) {
20017       return false;
20018     }
20019     stack || (stack = new Stack);
20020     return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
20021   }
20022
20023   /**
20024    * The base implementation of `_.isEqual` which supports partial comparisons
20025    * and tracks traversed objects.
20026    *
20027    * @private
20028    * @param {*} value The value to compare.
20029    * @param {*} other The other value to compare.
20030    * @param {boolean} bitmask The bitmask flags.
20031    *  1 - Unordered comparison
20032    *  2 - Partial comparison
20033    * @param {Function} [customizer] The function to customize comparisons.
20034    * @param {Object} [stack] Tracks traversed `value` and `other` objects.
20035    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
20036    */
20037   function baseIsEqual(value, other, bitmask, customizer, stack) {
20038     if (value === other) {
20039       return true;
20040     }
20041     if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
20042       return value !== value && other !== other;
20043     }
20044     return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
20045   }
20046
20047   /** Used to compose bitmasks for value comparisons. */
20048   var COMPARE_PARTIAL_FLAG$4 = 1,
20049       COMPARE_UNORDERED_FLAG$2 = 2;
20050
20051   /**
20052    * The base implementation of `_.isMatch` without support for iteratee shorthands.
20053    *
20054    * @private
20055    * @param {Object} object The object to inspect.
20056    * @param {Object} source The object of property values to match.
20057    * @param {Array} matchData The property names, values, and compare flags to match.
20058    * @param {Function} [customizer] The function to customize comparisons.
20059    * @returns {boolean} Returns `true` if `object` is a match, else `false`.
20060    */
20061   function baseIsMatch(object, source, matchData, customizer) {
20062     var index = matchData.length,
20063         length = index,
20064         noCustomizer = !customizer;
20065
20066     if (object == null) {
20067       return !length;
20068     }
20069     object = Object(object);
20070     while (index--) {
20071       var data = matchData[index];
20072       if ((noCustomizer && data[2])
20073             ? data[1] !== object[data[0]]
20074             : !(data[0] in object)
20075           ) {
20076         return false;
20077       }
20078     }
20079     while (++index < length) {
20080       data = matchData[index];
20081       var key = data[0],
20082           objValue = object[key],
20083           srcValue = data[1];
20084
20085       if (noCustomizer && data[2]) {
20086         if (objValue === undefined && !(key in object)) {
20087           return false;
20088         }
20089       } else {
20090         var stack = new Stack;
20091         if (customizer) {
20092           var result = customizer(objValue, srcValue, key, object, source, stack);
20093         }
20094         if (!(result === undefined
20095               ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$4 | COMPARE_UNORDERED_FLAG$2, customizer, stack)
20096               : result
20097             )) {
20098           return false;
20099         }
20100       }
20101     }
20102     return true;
20103   }
20104
20105   /**
20106    * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
20107    *
20108    * @private
20109    * @param {*} value The value to check.
20110    * @returns {boolean} Returns `true` if `value` if suitable for strict
20111    *  equality comparisons, else `false`.
20112    */
20113   function isStrictComparable(value) {
20114     return value === value && !isObject(value);
20115   }
20116
20117   /**
20118    * Gets the property names, values, and compare flags of `object`.
20119    *
20120    * @private
20121    * @param {Object} object The object to query.
20122    * @returns {Array} Returns the match data of `object`.
20123    */
20124   function getMatchData(object) {
20125     var result = keys$1(object),
20126         length = result.length;
20127
20128     while (length--) {
20129       var key = result[length],
20130           value = object[key];
20131
20132       result[length] = [key, value, isStrictComparable(value)];
20133     }
20134     return result;
20135   }
20136
20137   /**
20138    * A specialized version of `matchesProperty` for source values suitable
20139    * for strict equality comparisons, i.e. `===`.
20140    *
20141    * @private
20142    * @param {string} key The key of the property to get.
20143    * @param {*} srcValue The value to match.
20144    * @returns {Function} Returns the new spec function.
20145    */
20146   function matchesStrictComparable(key, srcValue) {
20147     return function(object) {
20148       if (object == null) {
20149         return false;
20150       }
20151       return object[key] === srcValue &&
20152         (srcValue !== undefined || (key in Object(object)));
20153     };
20154   }
20155
20156   /**
20157    * The base implementation of `_.matches` which doesn't clone `source`.
20158    *
20159    * @private
20160    * @param {Object} source The object of property values to match.
20161    * @returns {Function} Returns the new spec function.
20162    */
20163   function baseMatches(source) {
20164     var matchData = getMatchData(source);
20165     if (matchData.length == 1 && matchData[0][2]) {
20166       return matchesStrictComparable(matchData[0][0], matchData[0][1]);
20167     }
20168     return function(object) {
20169       return object === source || baseIsMatch(object, source, matchData);
20170     };
20171   }
20172
20173   /** `Object#toString` result references. */
20174   var symbolTag$3 = '[object Symbol]';
20175
20176   /**
20177    * Checks if `value` is classified as a `Symbol` primitive or object.
20178    *
20179    * @static
20180    * @memberOf _
20181    * @since 4.0.0
20182    * @category Lang
20183    * @param {*} value The value to check.
20184    * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
20185    * @example
20186    *
20187    * _.isSymbol(Symbol.iterator);
20188    * // => true
20189    *
20190    * _.isSymbol('abc');
20191    * // => false
20192    */
20193   function isSymbol(value) {
20194     return typeof value == 'symbol' ||
20195       (isObjectLike(value) && baseGetTag(value) == symbolTag$3);
20196   }
20197
20198   /** Used to match property names within property paths. */
20199   var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
20200       reIsPlainProp = /^\w*$/;
20201
20202   /**
20203    * Checks if `value` is a property name and not a property path.
20204    *
20205    * @private
20206    * @param {*} value The value to check.
20207    * @param {Object} [object] The object to query keys on.
20208    * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
20209    */
20210   function isKey(value, object) {
20211     if (isArray(value)) {
20212       return false;
20213     }
20214     var type = typeof value;
20215     if (type == 'number' || type == 'symbol' || type == 'boolean' ||
20216         value == null || isSymbol(value)) {
20217       return true;
20218     }
20219     return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
20220       (object != null && value in Object(object));
20221   }
20222
20223   /** Error message constants. */
20224   var FUNC_ERROR_TEXT = 'Expected a function';
20225
20226   /**
20227    * Creates a function that memoizes the result of `func`. If `resolver` is
20228    * provided, it determines the cache key for storing the result based on the
20229    * arguments provided to the memoized function. By default, the first argument
20230    * provided to the memoized function is used as the map cache key. The `func`
20231    * is invoked with the `this` binding of the memoized function.
20232    *
20233    * **Note:** The cache is exposed as the `cache` property on the memoized
20234    * function. Its creation may be customized by replacing the `_.memoize.Cache`
20235    * constructor with one whose instances implement the
20236    * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
20237    * method interface of `clear`, `delete`, `get`, `has`, and `set`.
20238    *
20239    * @static
20240    * @memberOf _
20241    * @since 0.1.0
20242    * @category Function
20243    * @param {Function} func The function to have its output memoized.
20244    * @param {Function} [resolver] The function to resolve the cache key.
20245    * @returns {Function} Returns the new memoized function.
20246    * @example
20247    *
20248    * var object = { 'a': 1, 'b': 2 };
20249    * var other = { 'c': 3, 'd': 4 };
20250    *
20251    * var values = _.memoize(_.values);
20252    * values(object);
20253    * // => [1, 2]
20254    *
20255    * values(other);
20256    * // => [3, 4]
20257    *
20258    * object.a = 2;
20259    * values(object);
20260    * // => [1, 2]
20261    *
20262    * // Modify the result cache.
20263    * values.cache.set(object, ['a', 'b']);
20264    * values(object);
20265    * // => ['a', 'b']
20266    *
20267    * // Replace `_.memoize.Cache`.
20268    * _.memoize.Cache = WeakMap;
20269    */
20270   function memoize(func, resolver) {
20271     if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
20272       throw new TypeError(FUNC_ERROR_TEXT);
20273     }
20274     var memoized = function() {
20275       var args = arguments,
20276           key = resolver ? resolver.apply(this, args) : args[0],
20277           cache = memoized.cache;
20278
20279       if (cache.has(key)) {
20280         return cache.get(key);
20281       }
20282       var result = func.apply(this, args);
20283       memoized.cache = cache.set(key, result) || cache;
20284       return result;
20285     };
20286     memoized.cache = new (memoize.Cache || MapCache);
20287     return memoized;
20288   }
20289
20290   // Expose `MapCache`.
20291   memoize.Cache = MapCache;
20292
20293   /** Used as the maximum memoize cache size. */
20294   var MAX_MEMOIZE_SIZE = 500;
20295
20296   /**
20297    * A specialized version of `_.memoize` which clears the memoized function's
20298    * cache when it exceeds `MAX_MEMOIZE_SIZE`.
20299    *
20300    * @private
20301    * @param {Function} func The function to have its output memoized.
20302    * @returns {Function} Returns the new memoized function.
20303    */
20304   function memoizeCapped(func) {
20305     var result = memoize(func, function(key) {
20306       if (cache.size === MAX_MEMOIZE_SIZE) {
20307         cache.clear();
20308       }
20309       return key;
20310     });
20311
20312     var cache = result.cache;
20313     return result;
20314   }
20315
20316   /** Used to match property names within property paths. */
20317   var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
20318
20319   /** Used to match backslashes in property paths. */
20320   var reEscapeChar = /\\(\\)?/g;
20321
20322   /**
20323    * Converts `string` to a property path array.
20324    *
20325    * @private
20326    * @param {string} string The string to convert.
20327    * @returns {Array} Returns the property path array.
20328    */
20329   var stringToPath = memoizeCapped(function(string) {
20330     var result = [];
20331     if (string.charCodeAt(0) === 46 /* . */) {
20332       result.push('');
20333     }
20334     string.replace(rePropName, function(match, number, quote, subString) {
20335       result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
20336     });
20337     return result;
20338   });
20339
20340   /**
20341    * A specialized version of `_.map` for arrays without support for iteratee
20342    * shorthands.
20343    *
20344    * @private
20345    * @param {Array} [array] The array to iterate over.
20346    * @param {Function} iteratee The function invoked per iteration.
20347    * @returns {Array} Returns the new mapped array.
20348    */
20349   function arrayMap(array, iteratee) {
20350     var index = -1,
20351         length = array == null ? 0 : array.length,
20352         result = Array(length);
20353
20354     while (++index < length) {
20355       result[index] = iteratee(array[index], index, array);
20356     }
20357     return result;
20358   }
20359
20360   /** Used as references for various `Number` constants. */
20361   var INFINITY = 1 / 0;
20362
20363   /** Used to convert symbols to primitives and strings. */
20364   var symbolProto$2 = Symbol ? Symbol.prototype : undefined,
20365       symbolToString = symbolProto$2 ? symbolProto$2.toString : undefined;
20366
20367   /**
20368    * The base implementation of `_.toString` which doesn't convert nullish
20369    * values to empty strings.
20370    *
20371    * @private
20372    * @param {*} value The value to process.
20373    * @returns {string} Returns the string.
20374    */
20375   function baseToString(value) {
20376     // Exit early for strings to avoid a performance hit in some environments.
20377     if (typeof value == 'string') {
20378       return value;
20379     }
20380     if (isArray(value)) {
20381       // Recursively convert values (susceptible to call stack limits).
20382       return arrayMap(value, baseToString) + '';
20383     }
20384     if (isSymbol(value)) {
20385       return symbolToString ? symbolToString.call(value) : '';
20386     }
20387     var result = (value + '');
20388     return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
20389   }
20390
20391   /**
20392    * Converts `value` to a string. An empty string is returned for `null`
20393    * and `undefined` values. The sign of `-0` is preserved.
20394    *
20395    * @static
20396    * @memberOf _
20397    * @since 4.0.0
20398    * @category Lang
20399    * @param {*} value The value to convert.
20400    * @returns {string} Returns the converted string.
20401    * @example
20402    *
20403    * _.toString(null);
20404    * // => ''
20405    *
20406    * _.toString(-0);
20407    * // => '-0'
20408    *
20409    * _.toString([1, 2, 3]);
20410    * // => '1,2,3'
20411    */
20412   function toString(value) {
20413     return value == null ? '' : baseToString(value);
20414   }
20415
20416   /**
20417    * Casts `value` to a path array if it's not one.
20418    *
20419    * @private
20420    * @param {*} value The value to inspect.
20421    * @param {Object} [object] The object to query keys on.
20422    * @returns {Array} Returns the cast property path array.
20423    */
20424   function castPath(value, object) {
20425     if (isArray(value)) {
20426       return value;
20427     }
20428     return isKey(value, object) ? [value] : stringToPath(toString(value));
20429   }
20430
20431   /** Used as references for various `Number` constants. */
20432   var INFINITY$1 = 1 / 0;
20433
20434   /**
20435    * Converts `value` to a string key if it's not a string or symbol.
20436    *
20437    * @private
20438    * @param {*} value The value to inspect.
20439    * @returns {string|symbol} Returns the key.
20440    */
20441   function toKey(value) {
20442     if (typeof value == 'string' || isSymbol(value)) {
20443       return value;
20444     }
20445     var result = (value + '');
20446     return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
20447   }
20448
20449   /**
20450    * The base implementation of `_.get` without support for default values.
20451    *
20452    * @private
20453    * @param {Object} object The object to query.
20454    * @param {Array|string} path The path of the property to get.
20455    * @returns {*} Returns the resolved value.
20456    */
20457   function baseGet(object, path) {
20458     path = castPath(path, object);
20459
20460     var index = 0,
20461         length = path.length;
20462
20463     while (object != null && index < length) {
20464       object = object[toKey(path[index++])];
20465     }
20466     return (index && index == length) ? object : undefined;
20467   }
20468
20469   /**
20470    * Gets the value at `path` of `object`. If the resolved value is
20471    * `undefined`, the `defaultValue` is returned in its place.
20472    *
20473    * @static
20474    * @memberOf _
20475    * @since 3.7.0
20476    * @category Object
20477    * @param {Object} object The object to query.
20478    * @param {Array|string} path The path of the property to get.
20479    * @param {*} [defaultValue] The value returned for `undefined` resolved values.
20480    * @returns {*} Returns the resolved value.
20481    * @example
20482    *
20483    * var object = { 'a': [{ 'b': { 'c': 3 } }] };
20484    *
20485    * _.get(object, 'a[0].b.c');
20486    * // => 3
20487    *
20488    * _.get(object, ['a', '0', 'b', 'c']);
20489    * // => 3
20490    *
20491    * _.get(object, 'a.b.c', 'default');
20492    * // => 'default'
20493    */
20494   function get$2(object, path, defaultValue) {
20495     var result = object == null ? undefined : baseGet(object, path);
20496     return result === undefined ? defaultValue : result;
20497   }
20498
20499   /**
20500    * The base implementation of `_.hasIn` without support for deep paths.
20501    *
20502    * @private
20503    * @param {Object} [object] The object to query.
20504    * @param {Array|string} key The key to check.
20505    * @returns {boolean} Returns `true` if `key` exists, else `false`.
20506    */
20507   function baseHasIn(object, key) {
20508     return object != null && key in Object(object);
20509   }
20510
20511   /**
20512    * Checks if `path` exists on `object`.
20513    *
20514    * @private
20515    * @param {Object} object The object to query.
20516    * @param {Array|string} path The path to check.
20517    * @param {Function} hasFunc The function to check properties.
20518    * @returns {boolean} Returns `true` if `path` exists, else `false`.
20519    */
20520   function hasPath(object, path, hasFunc) {
20521     path = castPath(path, object);
20522
20523     var index = -1,
20524         length = path.length,
20525         result = false;
20526
20527     while (++index < length) {
20528       var key = toKey(path[index]);
20529       if (!(result = object != null && hasFunc(object, key))) {
20530         break;
20531       }
20532       object = object[key];
20533     }
20534     if (result || ++index != length) {
20535       return result;
20536     }
20537     length = object == null ? 0 : object.length;
20538     return !!length && isLength(length) && isIndex(key, length) &&
20539       (isArray(object) || isArguments(object));
20540   }
20541
20542   /**
20543    * Checks if `path` is a direct or inherited property of `object`.
20544    *
20545    * @static
20546    * @memberOf _
20547    * @since 4.0.0
20548    * @category Object
20549    * @param {Object} object The object to query.
20550    * @param {Array|string} path The path to check.
20551    * @returns {boolean} Returns `true` if `path` exists, else `false`.
20552    * @example
20553    *
20554    * var object = _.create({ 'a': _.create({ 'b': 2 }) });
20555    *
20556    * _.hasIn(object, 'a');
20557    * // => true
20558    *
20559    * _.hasIn(object, 'a.b');
20560    * // => true
20561    *
20562    * _.hasIn(object, ['a', 'b']);
20563    * // => true
20564    *
20565    * _.hasIn(object, 'b');
20566    * // => false
20567    */
20568   function hasIn(object, path) {
20569     return object != null && hasPath(object, path, baseHasIn);
20570   }
20571
20572   /** Used to compose bitmasks for value comparisons. */
20573   var COMPARE_PARTIAL_FLAG$5 = 1,
20574       COMPARE_UNORDERED_FLAG$3 = 2;
20575
20576   /**
20577    * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
20578    *
20579    * @private
20580    * @param {string} path The path of the property to get.
20581    * @param {*} srcValue The value to match.
20582    * @returns {Function} Returns the new spec function.
20583    */
20584   function baseMatchesProperty(path, srcValue) {
20585     if (isKey(path) && isStrictComparable(srcValue)) {
20586       return matchesStrictComparable(toKey(path), srcValue);
20587     }
20588     return function(object) {
20589       var objValue = get$2(object, path);
20590       return (objValue === undefined && objValue === srcValue)
20591         ? hasIn(object, path)
20592         : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3);
20593     };
20594   }
20595
20596   /**
20597    * This method returns the first argument it receives.
20598    *
20599    * @static
20600    * @since 0.1.0
20601    * @memberOf _
20602    * @category Util
20603    * @param {*} value Any value.
20604    * @returns {*} Returns `value`.
20605    * @example
20606    *
20607    * var object = { 'a': 1 };
20608    *
20609    * console.log(_.identity(object) === object);
20610    * // => true
20611    */
20612   function identity$8(value) {
20613     return value;
20614   }
20615
20616   /**
20617    * The base implementation of `_.property` without support for deep paths.
20618    *
20619    * @private
20620    * @param {string} key The key of the property to get.
20621    * @returns {Function} Returns the new accessor function.
20622    */
20623   function baseProperty(key) {
20624     return function(object) {
20625       return object == null ? undefined : object[key];
20626     };
20627   }
20628
20629   /**
20630    * A specialized version of `baseProperty` which supports deep paths.
20631    *
20632    * @private
20633    * @param {Array|string} path The path of the property to get.
20634    * @returns {Function} Returns the new accessor function.
20635    */
20636   function basePropertyDeep(path) {
20637     return function(object) {
20638       return baseGet(object, path);
20639     };
20640   }
20641
20642   /**
20643    * Creates a function that returns the value at `path` of a given object.
20644    *
20645    * @static
20646    * @memberOf _
20647    * @since 2.4.0
20648    * @category Util
20649    * @param {Array|string} path The path of the property to get.
20650    * @returns {Function} Returns the new accessor function.
20651    * @example
20652    *
20653    * var objects = [
20654    *   { 'a': { 'b': 2 } },
20655    *   { 'a': { 'b': 1 } }
20656    * ];
20657    *
20658    * _.map(objects, _.property('a.b'));
20659    * // => [2, 1]
20660    *
20661    * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
20662    * // => [1, 2]
20663    */
20664   function property(path) {
20665     return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
20666   }
20667
20668   /**
20669    * The base implementation of `_.iteratee`.
20670    *
20671    * @private
20672    * @param {*} [value=_.identity] The value to convert to an iteratee.
20673    * @returns {Function} Returns the iteratee.
20674    */
20675   function baseIteratee(value) {
20676     // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
20677     // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
20678     if (typeof value == 'function') {
20679       return value;
20680     }
20681     if (value == null) {
20682       return identity$8;
20683     }
20684     if (typeof value == 'object') {
20685       return isArray(value)
20686         ? baseMatchesProperty(value[0], value[1])
20687         : baseMatches(value);
20688     }
20689     return property(value);
20690   }
20691
20692   /**
20693    * Creates a function like `_.groupBy`.
20694    *
20695    * @private
20696    * @param {Function} setter The function to set accumulator values.
20697    * @param {Function} [initializer] The accumulator object initializer.
20698    * @returns {Function} Returns the new aggregator function.
20699    */
20700   function createAggregator(setter, initializer) {
20701     return function(collection, iteratee) {
20702       var func = isArray(collection) ? arrayAggregator : baseAggregator,
20703           accumulator = initializer ? initializer() : {};
20704
20705       return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
20706     };
20707   }
20708
20709   /** Used for built-in method references. */
20710   var objectProto$f = Object.prototype;
20711
20712   /** Used to check objects for own properties. */
20713   var hasOwnProperty$c = objectProto$f.hasOwnProperty;
20714
20715   /**
20716    * Creates an object composed of keys generated from the results of running
20717    * each element of `collection` thru `iteratee`. The order of grouped values
20718    * is determined by the order they occur in `collection`. The corresponding
20719    * value of each key is an array of elements responsible for generating the
20720    * key. The iteratee is invoked with one argument: (value).
20721    *
20722    * @static
20723    * @memberOf _
20724    * @since 0.1.0
20725    * @category Collection
20726    * @param {Array|Object} collection The collection to iterate over.
20727    * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
20728    * @returns {Object} Returns the composed aggregate object.
20729    * @example
20730    *
20731    * _.groupBy([6.1, 4.2, 6.3], Math.floor);
20732    * // => { '4': [4.2], '6': [6.1, 6.3] }
20733    *
20734    * // The `_.property` iteratee shorthand.
20735    * _.groupBy(['one', 'two', 'three'], 'length');
20736    * // => { '3': ['one', 'two'], '5': ['three'] }
20737    */
20738   var groupBy = createAggregator(function(result, value, key) {
20739     if (hasOwnProperty$c.call(result, key)) {
20740       result[key].push(value);
20741     } else {
20742       baseAssignValue(result, key, [value]);
20743     }
20744   });
20745
20746   /**
20747    * Gets the last element of `array`.
20748    *
20749    * @static
20750    * @memberOf _
20751    * @since 0.1.0
20752    * @category Array
20753    * @param {Array} array The array to query.
20754    * @returns {*} Returns the last element of `array`.
20755    * @example
20756    *
20757    * _.last([1, 2, 3]);
20758    * // => 3
20759    */
20760   function last(array) {
20761     var length = array == null ? 0 : array.length;
20762     return length ? array[length - 1] : undefined;
20763   }
20764
20765   /**
20766    * The base implementation of `_.slice` without an iteratee call guard.
20767    *
20768    * @private
20769    * @param {Array} array The array to slice.
20770    * @param {number} [start=0] The start position.
20771    * @param {number} [end=array.length] The end position.
20772    * @returns {Array} Returns the slice of `array`.
20773    */
20774   function baseSlice(array, start, end) {
20775     var index = -1,
20776         length = array.length;
20777
20778     if (start < 0) {
20779       start = -start > length ? 0 : (length + start);
20780     }
20781     end = end > length ? length : end;
20782     if (end < 0) {
20783       end += length;
20784     }
20785     length = start > end ? 0 : ((end - start) >>> 0);
20786     start >>>= 0;
20787
20788     var result = Array(length);
20789     while (++index < length) {
20790       result[index] = array[index + start];
20791     }
20792     return result;
20793   }
20794
20795   /**
20796    * Gets the parent value at `path` of `object`.
20797    *
20798    * @private
20799    * @param {Object} object The object to query.
20800    * @param {Array} path The path to get the parent value of.
20801    * @returns {*} Returns the parent value.
20802    */
20803   function parent(object, path) {
20804     return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
20805   }
20806
20807   /**
20808    * The base implementation of `_.unset`.
20809    *
20810    * @private
20811    * @param {Object} object The object to modify.
20812    * @param {Array|string} path The property path to unset.
20813    * @returns {boolean} Returns `true` if the property is deleted, else `false`.
20814    */
20815   function baseUnset(object, path) {
20816     path = castPath(path, object);
20817     object = parent(object, path);
20818     return object == null || delete object[toKey(last(path))];
20819   }
20820
20821   /** `Object#toString` result references. */
20822   var objectTag$4 = '[object Object]';
20823
20824   /** Used for built-in method references. */
20825   var funcProto$2 = Function.prototype,
20826       objectProto$g = Object.prototype;
20827
20828   /** Used to resolve the decompiled source of functions. */
20829   var funcToString$2 = funcProto$2.toString;
20830
20831   /** Used to check objects for own properties. */
20832   var hasOwnProperty$d = objectProto$g.hasOwnProperty;
20833
20834   /** Used to infer the `Object` constructor. */
20835   var objectCtorString = funcToString$2.call(Object);
20836
20837   /**
20838    * Checks if `value` is a plain object, that is, an object created by the
20839    * `Object` constructor or one with a `[[Prototype]]` of `null`.
20840    *
20841    * @static
20842    * @memberOf _
20843    * @since 0.8.0
20844    * @category Lang
20845    * @param {*} value The value to check.
20846    * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
20847    * @example
20848    *
20849    * function Foo() {
20850    *   this.a = 1;
20851    * }
20852    *
20853    * _.isPlainObject(new Foo);
20854    * // => false
20855    *
20856    * _.isPlainObject([1, 2, 3]);
20857    * // => false
20858    *
20859    * _.isPlainObject({ 'x': 0, 'y': 0 });
20860    * // => true
20861    *
20862    * _.isPlainObject(Object.create(null));
20863    * // => true
20864    */
20865   function isPlainObject(value) {
20866     if (!isObjectLike(value) || baseGetTag(value) != objectTag$4) {
20867       return false;
20868     }
20869     var proto = getPrototype(value);
20870     if (proto === null) {
20871       return true;
20872     }
20873     var Ctor = hasOwnProperty$d.call(proto, 'constructor') && proto.constructor;
20874     return typeof Ctor == 'function' && Ctor instanceof Ctor &&
20875       funcToString$2.call(Ctor) == objectCtorString;
20876   }
20877
20878   /**
20879    * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
20880    * objects.
20881    *
20882    * @private
20883    * @param {*} value The value to inspect.
20884    * @param {string} key The key of the property to inspect.
20885    * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
20886    */
20887   function customOmitClone(value) {
20888     return isPlainObject(value) ? undefined : value;
20889   }
20890
20891   /** Built-in value references. */
20892   var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
20893
20894   /**
20895    * Checks if `value` is a flattenable `arguments` object or array.
20896    *
20897    * @private
20898    * @param {*} value The value to check.
20899    * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
20900    */
20901   function isFlattenable(value) {
20902     return isArray(value) || isArguments(value) ||
20903       !!(spreadableSymbol && value && value[spreadableSymbol]);
20904   }
20905
20906   /**
20907    * The base implementation of `_.flatten` with support for restricting flattening.
20908    *
20909    * @private
20910    * @param {Array} array The array to flatten.
20911    * @param {number} depth The maximum recursion depth.
20912    * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
20913    * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
20914    * @param {Array} [result=[]] The initial result value.
20915    * @returns {Array} Returns the new flattened array.
20916    */
20917   function baseFlatten(array, depth, predicate, isStrict, result) {
20918     var index = -1,
20919         length = array.length;
20920
20921     predicate || (predicate = isFlattenable);
20922     result || (result = []);
20923
20924     while (++index < length) {
20925       var value = array[index];
20926       if (depth > 0 && predicate(value)) {
20927         if (depth > 1) {
20928           // Recursively flatten arrays (susceptible to call stack limits).
20929           baseFlatten(value, depth - 1, predicate, isStrict, result);
20930         } else {
20931           arrayPush(result, value);
20932         }
20933       } else if (!isStrict) {
20934         result[result.length] = value;
20935       }
20936     }
20937     return result;
20938   }
20939
20940   /**
20941    * Flattens `array` a single level deep.
20942    *
20943    * @static
20944    * @memberOf _
20945    * @since 0.1.0
20946    * @category Array
20947    * @param {Array} array The array to flatten.
20948    * @returns {Array} Returns the new flattened array.
20949    * @example
20950    *
20951    * _.flatten([1, [2, [3, [4]], 5]]);
20952    * // => [1, 2, [3, [4]], 5]
20953    */
20954   function flatten(array) {
20955     var length = array == null ? 0 : array.length;
20956     return length ? baseFlatten(array, 1) : [];
20957   }
20958
20959   /**
20960    * A faster alternative to `Function#apply`, this function invokes `func`
20961    * with the `this` binding of `thisArg` and the arguments of `args`.
20962    *
20963    * @private
20964    * @param {Function} func The function to invoke.
20965    * @param {*} thisArg The `this` binding of `func`.
20966    * @param {Array} args The arguments to invoke `func` with.
20967    * @returns {*} Returns the result of `func`.
20968    */
20969   function apply(func, thisArg, args) {
20970     switch (args.length) {
20971       case 0: return func.call(thisArg);
20972       case 1: return func.call(thisArg, args[0]);
20973       case 2: return func.call(thisArg, args[0], args[1]);
20974       case 3: return func.call(thisArg, args[0], args[1], args[2]);
20975     }
20976     return func.apply(thisArg, args);
20977   }
20978
20979   /* Built-in method references for those with the same name as other `lodash` methods. */
20980   var nativeMax = Math.max;
20981
20982   /**
20983    * A specialized version of `baseRest` which transforms the rest array.
20984    *
20985    * @private
20986    * @param {Function} func The function to apply a rest parameter to.
20987    * @param {number} [start=func.length-1] The start position of the rest parameter.
20988    * @param {Function} transform The rest array transform.
20989    * @returns {Function} Returns the new function.
20990    */
20991   function overRest(func, start, transform) {
20992     start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
20993     return function() {
20994       var args = arguments,
20995           index = -1,
20996           length = nativeMax(args.length - start, 0),
20997           array = Array(length);
20998
20999       while (++index < length) {
21000         array[index] = args[start + index];
21001       }
21002       index = -1;
21003       var otherArgs = Array(start + 1);
21004       while (++index < start) {
21005         otherArgs[index] = args[index];
21006       }
21007       otherArgs[start] = transform(array);
21008       return apply(func, this, otherArgs);
21009     };
21010   }
21011
21012   /**
21013    * Creates a function that returns `value`.
21014    *
21015    * @static
21016    * @memberOf _
21017    * @since 2.4.0
21018    * @category Util
21019    * @param {*} value The value to return from the new function.
21020    * @returns {Function} Returns the new constant function.
21021    * @example
21022    *
21023    * var objects = _.times(2, _.constant({ 'a': 1 }));
21024    *
21025    * console.log(objects);
21026    * // => [{ 'a': 1 }, { 'a': 1 }]
21027    *
21028    * console.log(objects[0] === objects[1]);
21029    * // => true
21030    */
21031   function constant$d(value) {
21032     return function() {
21033       return value;
21034     };
21035   }
21036
21037   /**
21038    * The base implementation of `setToString` without support for hot loop shorting.
21039    *
21040    * @private
21041    * @param {Function} func The function to modify.
21042    * @param {Function} string The `toString` result.
21043    * @returns {Function} Returns `func`.
21044    */
21045   var baseSetToString = !defineProperty ? identity$8 : function(func, string) {
21046     return defineProperty(func, 'toString', {
21047       'configurable': true,
21048       'enumerable': false,
21049       'value': constant$d(string),
21050       'writable': true
21051     });
21052   };
21053
21054   /** Used to detect hot functions by number of calls within a span of milliseconds. */
21055   var HOT_COUNT = 800,
21056       HOT_SPAN = 16;
21057
21058   /* Built-in method references for those with the same name as other `lodash` methods. */
21059   var nativeNow = Date.now;
21060
21061   /**
21062    * Creates a function that'll short out and invoke `identity` instead
21063    * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
21064    * milliseconds.
21065    *
21066    * @private
21067    * @param {Function} func The function to restrict.
21068    * @returns {Function} Returns the new shortable function.
21069    */
21070   function shortOut(func) {
21071     var count = 0,
21072         lastCalled = 0;
21073
21074     return function() {
21075       var stamp = nativeNow(),
21076           remaining = HOT_SPAN - (stamp - lastCalled);
21077
21078       lastCalled = stamp;
21079       if (remaining > 0) {
21080         if (++count >= HOT_COUNT) {
21081           return arguments[0];
21082         }
21083       } else {
21084         count = 0;
21085       }
21086       return func.apply(undefined, arguments);
21087     };
21088   }
21089
21090   /**
21091    * Sets the `toString` method of `func` to return `string`.
21092    *
21093    * @private
21094    * @param {Function} func The function to modify.
21095    * @param {Function} string The `toString` result.
21096    * @returns {Function} Returns `func`.
21097    */
21098   var setToString = shortOut(baseSetToString);
21099
21100   /**
21101    * A specialized version of `baseRest` which flattens the rest array.
21102    *
21103    * @private
21104    * @param {Function} func The function to apply a rest parameter to.
21105    * @returns {Function} Returns the new function.
21106    */
21107   function flatRest(func) {
21108     return setToString(overRest(func, undefined, flatten), func + '');
21109   }
21110
21111   /** Used to compose bitmasks for cloning. */
21112   var CLONE_DEEP_FLAG$1 = 1,
21113       CLONE_FLAT_FLAG$1 = 2,
21114       CLONE_SYMBOLS_FLAG$2 = 4;
21115
21116   /**
21117    * The opposite of `_.pick`; this method creates an object composed of the
21118    * own and inherited enumerable property paths of `object` that are not omitted.
21119    *
21120    * **Note:** This method is considerably slower than `_.pick`.
21121    *
21122    * @static
21123    * @since 0.1.0
21124    * @memberOf _
21125    * @category Object
21126    * @param {Object} object The source object.
21127    * @param {...(string|string[])} [paths] The property paths to omit.
21128    * @returns {Object} Returns the new object.
21129    * @example
21130    *
21131    * var object = { 'a': 1, 'b': '2', 'c': 3 };
21132    *
21133    * _.omit(object, ['a', 'c']);
21134    * // => { 'b': '2' }
21135    */
21136   var omit = flatRest(function(object, paths) {
21137     var result = {};
21138     if (object == null) {
21139       return result;
21140     }
21141     var isDeep = false;
21142     paths = arrayMap(paths, function(path) {
21143       path = castPath(path, object);
21144       isDeep || (isDeep = path.length > 1);
21145       return path;
21146     });
21147     copyObject(object, getAllKeysIn(object), result);
21148     if (isDeep) {
21149       result = baseClone(result, CLONE_DEEP_FLAG$1 | CLONE_FLAT_FLAG$1 | CLONE_SYMBOLS_FLAG$2, customOmitClone);
21150     }
21151     var length = paths.length;
21152     while (length--) {
21153       baseUnset(result, paths[length]);
21154     }
21155     return result;
21156   });
21157
21158   /**
21159    * Creates an array with all falsey values removed. The values `false`, `null`,
21160    * `0`, `""`, `undefined`, and `NaN` are falsey.
21161    *
21162    * @static
21163    * @memberOf _
21164    * @since 0.1.0
21165    * @category Array
21166    * @param {Array} array The array to compact.
21167    * @returns {Array} Returns the new array of filtered values.
21168    * @example
21169    *
21170    * _.compact([0, 1, false, 2, '', 3]);
21171    * // => [1, 2, 3]
21172    */
21173   function compact(array) {
21174     var index = -1,
21175         length = array == null ? 0 : array.length,
21176         resIndex = 0,
21177         result = [];
21178
21179     while (++index < length) {
21180       var value = array[index];
21181       if (value) {
21182         result[resIndex++] = value;
21183       }
21184     }
21185     return result;
21186   }
21187
21188   /**
21189    * The base implementation of `_.rest` which doesn't validate or coerce arguments.
21190    *
21191    * @private
21192    * @param {Function} func The function to apply a rest parameter to.
21193    * @param {number} [start=func.length-1] The start position of the rest parameter.
21194    * @returns {Function} Returns the new function.
21195    */
21196   function baseRest(func, start) {
21197     return setToString(overRest(func, start, identity$8), func + '');
21198   }
21199
21200   /**
21201    * Checks if the given arguments are from an iteratee call.
21202    *
21203    * @private
21204    * @param {*} value The potential iteratee value argument.
21205    * @param {*} index The potential iteratee index or key argument.
21206    * @param {*} object The potential iteratee object argument.
21207    * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
21208    *  else `false`.
21209    */
21210   function isIterateeCall(value, index, object) {
21211     if (!isObject(object)) {
21212       return false;
21213     }
21214     var type = typeof index;
21215     if (type == 'number'
21216           ? (isArrayLike(object) && isIndex(index, object.length))
21217           : (type == 'string' && index in object)
21218         ) {
21219       return eq(object[index], value);
21220     }
21221     return false;
21222   }
21223
21224   /**
21225    * Creates a function like `_.assign`.
21226    *
21227    * @private
21228    * @param {Function} assigner The function to assign values.
21229    * @returns {Function} Returns the new assigner function.
21230    */
21231   function createAssigner(assigner) {
21232     return baseRest(function(object, sources) {
21233       var index = -1,
21234           length = sources.length,
21235           customizer = length > 1 ? sources[length - 1] : undefined,
21236           guard = length > 2 ? sources[2] : undefined;
21237
21238       customizer = (assigner.length > 3 && typeof customizer == 'function')
21239         ? (length--, customizer)
21240         : undefined;
21241
21242       if (guard && isIterateeCall(sources[0], sources[1], guard)) {
21243         customizer = length < 3 ? undefined : customizer;
21244         length = 1;
21245       }
21246       object = Object(object);
21247       while (++index < length) {
21248         var source = sources[index];
21249         if (source) {
21250           assigner(object, source, index, customizer);
21251         }
21252       }
21253       return object;
21254     });
21255   }
21256
21257   /**
21258    * This method is like `_.assign` except that it iterates over own and
21259    * inherited source properties.
21260    *
21261    * **Note:** This method mutates `object`.
21262    *
21263    * @static
21264    * @memberOf _
21265    * @since 4.0.0
21266    * @alias extend
21267    * @category Object
21268    * @param {Object} object The destination object.
21269    * @param {...Object} [sources] The source objects.
21270    * @returns {Object} Returns `object`.
21271    * @see _.assign
21272    * @example
21273    *
21274    * function Foo() {
21275    *   this.a = 1;
21276    * }
21277    *
21278    * function Bar() {
21279    *   this.c = 3;
21280    * }
21281    *
21282    * Foo.prototype.b = 2;
21283    * Bar.prototype.d = 4;
21284    *
21285    * _.assignIn({ 'a': 0 }, new Foo, new Bar);
21286    * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
21287    */
21288   var assignIn = createAssigner(function(object, source) {
21289     copyObject(source, keysIn$1(source), object);
21290   });
21291
21292   /**
21293    * The base implementation of `_.filter` without support for iteratee shorthands.
21294    *
21295    * @private
21296    * @param {Array|Object} collection The collection to iterate over.
21297    * @param {Function} predicate The function invoked per iteration.
21298    * @returns {Array} Returns the new filtered array.
21299    */
21300   function baseFilter(collection, predicate) {
21301     var result = [];
21302     baseEach(collection, function(value, index, collection) {
21303       if (predicate(value, index, collection)) {
21304         result.push(value);
21305       }
21306     });
21307     return result;
21308   }
21309
21310   /**
21311    * Iterates over elements of `collection`, returning an array of all elements
21312    * `predicate` returns truthy for. The predicate is invoked with three
21313    * arguments: (value, index|key, collection).
21314    *
21315    * **Note:** Unlike `_.remove`, this method returns a new array.
21316    *
21317    * @static
21318    * @memberOf _
21319    * @since 0.1.0
21320    * @category Collection
21321    * @param {Array|Object} collection The collection to iterate over.
21322    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21323    * @returns {Array} Returns the new filtered array.
21324    * @see _.reject
21325    * @example
21326    *
21327    * var users = [
21328    *   { 'user': 'barney', 'age': 36, 'active': true },
21329    *   { 'user': 'fred',   'age': 40, 'active': false }
21330    * ];
21331    *
21332    * _.filter(users, function(o) { return !o.active; });
21333    * // => objects for ['fred']
21334    *
21335    * // The `_.matches` iteratee shorthand.
21336    * _.filter(users, { 'age': 36, 'active': true });
21337    * // => objects for ['barney']
21338    *
21339    * // The `_.matchesProperty` iteratee shorthand.
21340    * _.filter(users, ['active', false]);
21341    * // => objects for ['fred']
21342    *
21343    * // The `_.property` iteratee shorthand.
21344    * _.filter(users, 'active');
21345    * // => objects for ['barney']
21346    */
21347   function filter(collection, predicate) {
21348     var func = isArray(collection) ? arrayFilter : baseFilter;
21349     return func(collection, baseIteratee(predicate, 3));
21350   }
21351
21352   /**
21353    * Creates a `_.find` or `_.findLast` function.
21354    *
21355    * @private
21356    * @param {Function} findIndexFunc The function to find the collection index.
21357    * @returns {Function} Returns the new find function.
21358    */
21359   function createFind(findIndexFunc) {
21360     return function(collection, predicate, fromIndex) {
21361       var iterable = Object(collection);
21362       if (!isArrayLike(collection)) {
21363         var iteratee = baseIteratee(predicate, 3);
21364         collection = keys$1(collection);
21365         predicate = function(key) { return iteratee(iterable[key], key, iterable); };
21366       }
21367       var index = findIndexFunc(collection, predicate, fromIndex);
21368       return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
21369     };
21370   }
21371
21372   /**
21373    * The base implementation of `_.findIndex` and `_.findLastIndex` without
21374    * support for iteratee shorthands.
21375    *
21376    * @private
21377    * @param {Array} array The array to inspect.
21378    * @param {Function} predicate The function invoked per iteration.
21379    * @param {number} fromIndex The index to search from.
21380    * @param {boolean} [fromRight] Specify iterating from right to left.
21381    * @returns {number} Returns the index of the matched value, else `-1`.
21382    */
21383   function baseFindIndex(array, predicate, fromIndex, fromRight) {
21384     var length = array.length,
21385         index = fromIndex + (fromRight ? 1 : -1);
21386
21387     while ((fromRight ? index-- : ++index < length)) {
21388       if (predicate(array[index], index, array)) {
21389         return index;
21390       }
21391     }
21392     return -1;
21393   }
21394
21395   /** Used as references for various `Number` constants. */
21396   var NAN = 0 / 0;
21397
21398   /** Used to match leading and trailing whitespace. */
21399   var reTrim = /^\s+|\s+$/g;
21400
21401   /** Used to detect bad signed hexadecimal string values. */
21402   var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
21403
21404   /** Used to detect binary string values. */
21405   var reIsBinary = /^0b[01]+$/i;
21406
21407   /** Used to detect octal string values. */
21408   var reIsOctal = /^0o[0-7]+$/i;
21409
21410   /** Built-in method references without a dependency on `root`. */
21411   var freeParseInt = parseInt;
21412
21413   /**
21414    * Converts `value` to a number.
21415    *
21416    * @static
21417    * @memberOf _
21418    * @since 4.0.0
21419    * @category Lang
21420    * @param {*} value The value to process.
21421    * @returns {number} Returns the number.
21422    * @example
21423    *
21424    * _.toNumber(3.2);
21425    * // => 3.2
21426    *
21427    * _.toNumber(Number.MIN_VALUE);
21428    * // => 5e-324
21429    *
21430    * _.toNumber(Infinity);
21431    * // => Infinity
21432    *
21433    * _.toNumber('3.2');
21434    * // => 3.2
21435    */
21436   function toNumber(value) {
21437     if (typeof value == 'number') {
21438       return value;
21439     }
21440     if (isSymbol(value)) {
21441       return NAN;
21442     }
21443     if (isObject(value)) {
21444       var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
21445       value = isObject(other) ? (other + '') : other;
21446     }
21447     if (typeof value != 'string') {
21448       return value === 0 ? value : +value;
21449     }
21450     value = value.replace(reTrim, '');
21451     var isBinary = reIsBinary.test(value);
21452     return (isBinary || reIsOctal.test(value))
21453       ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
21454       : (reIsBadHex.test(value) ? NAN : +value);
21455   }
21456
21457   /** Used as references for various `Number` constants. */
21458   var INFINITY$2 = 1 / 0,
21459       MAX_INTEGER = 1.7976931348623157e+308;
21460
21461   /**
21462    * Converts `value` to a finite number.
21463    *
21464    * @static
21465    * @memberOf _
21466    * @since 4.12.0
21467    * @category Lang
21468    * @param {*} value The value to convert.
21469    * @returns {number} Returns the converted number.
21470    * @example
21471    *
21472    * _.toFinite(3.2);
21473    * // => 3.2
21474    *
21475    * _.toFinite(Number.MIN_VALUE);
21476    * // => 5e-324
21477    *
21478    * _.toFinite(Infinity);
21479    * // => 1.7976931348623157e+308
21480    *
21481    * _.toFinite('3.2');
21482    * // => 3.2
21483    */
21484   function toFinite(value) {
21485     if (!value) {
21486       return value === 0 ? value : 0;
21487     }
21488     value = toNumber(value);
21489     if (value === INFINITY$2 || value === -INFINITY$2) {
21490       var sign = (value < 0 ? -1 : 1);
21491       return sign * MAX_INTEGER;
21492     }
21493     return value === value ? value : 0;
21494   }
21495
21496   /**
21497    * Converts `value` to an integer.
21498    *
21499    * **Note:** This method is loosely based on
21500    * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
21501    *
21502    * @static
21503    * @memberOf _
21504    * @since 4.0.0
21505    * @category Lang
21506    * @param {*} value The value to convert.
21507    * @returns {number} Returns the converted integer.
21508    * @example
21509    *
21510    * _.toInteger(3.2);
21511    * // => 3
21512    *
21513    * _.toInteger(Number.MIN_VALUE);
21514    * // => 0
21515    *
21516    * _.toInteger(Infinity);
21517    * // => 1.7976931348623157e+308
21518    *
21519    * _.toInteger('3.2');
21520    * // => 3
21521    */
21522   function toInteger(value) {
21523     var result = toFinite(value),
21524         remainder = result % 1;
21525
21526     return result === result ? (remainder ? result - remainder : result) : 0;
21527   }
21528
21529   /* Built-in method references for those with the same name as other `lodash` methods. */
21530   var nativeMax$1 = Math.max;
21531
21532   /**
21533    * This method is like `_.find` except that it returns the index of the first
21534    * element `predicate` returns truthy for instead of the element itself.
21535    *
21536    * @static
21537    * @memberOf _
21538    * @since 1.1.0
21539    * @category Array
21540    * @param {Array} array The array to inspect.
21541    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21542    * @param {number} [fromIndex=0] The index to search from.
21543    * @returns {number} Returns the index of the found element, else `-1`.
21544    * @example
21545    *
21546    * var users = [
21547    *   { 'user': 'barney',  'active': false },
21548    *   { 'user': 'fred',    'active': false },
21549    *   { 'user': 'pebbles', 'active': true }
21550    * ];
21551    *
21552    * _.findIndex(users, function(o) { return o.user == 'barney'; });
21553    * // => 0
21554    *
21555    * // The `_.matches` iteratee shorthand.
21556    * _.findIndex(users, { 'user': 'fred', 'active': false });
21557    * // => 1
21558    *
21559    * // The `_.matchesProperty` iteratee shorthand.
21560    * _.findIndex(users, ['active', false]);
21561    * // => 0
21562    *
21563    * // The `_.property` iteratee shorthand.
21564    * _.findIndex(users, 'active');
21565    * // => 2
21566    */
21567   function findIndex(array, predicate, fromIndex) {
21568     var length = array == null ? 0 : array.length;
21569     if (!length) {
21570       return -1;
21571     }
21572     var index = fromIndex == null ? 0 : toInteger(fromIndex);
21573     if (index < 0) {
21574       index = nativeMax$1(length + index, 0);
21575     }
21576     return baseFindIndex(array, baseIteratee(predicate, 3), index);
21577   }
21578
21579   /**
21580    * Iterates over elements of `collection`, returning the first element
21581    * `predicate` returns truthy for. The predicate is invoked with three
21582    * arguments: (value, index|key, collection).
21583    *
21584    * @static
21585    * @memberOf _
21586    * @since 0.1.0
21587    * @category Collection
21588    * @param {Array|Object} collection The collection to inspect.
21589    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21590    * @param {number} [fromIndex=0] The index to search from.
21591    * @returns {*} Returns the matched element, else `undefined`.
21592    * @example
21593    *
21594    * var users = [
21595    *   { 'user': 'barney',  'age': 36, 'active': true },
21596    *   { 'user': 'fred',    'age': 40, 'active': false },
21597    *   { 'user': 'pebbles', 'age': 1,  'active': true }
21598    * ];
21599    *
21600    * _.find(users, function(o) { return o.age < 40; });
21601    * // => object for 'barney'
21602    *
21603    * // The `_.matches` iteratee shorthand.
21604    * _.find(users, { 'age': 1, 'active': true });
21605    * // => object for 'pebbles'
21606    *
21607    * // The `_.matchesProperty` iteratee shorthand.
21608    * _.find(users, ['active', false]);
21609    * // => object for 'fred'
21610    *
21611    * // The `_.property` iteratee shorthand.
21612    * _.find(users, 'active');
21613    * // => object for 'barney'
21614    */
21615   var find$1 = createFind(findIndex);
21616
21617   /**
21618    * The base implementation of `_.map` without support for iteratee shorthands.
21619    *
21620    * @private
21621    * @param {Array|Object} collection The collection to iterate over.
21622    * @param {Function} iteratee The function invoked per iteration.
21623    * @returns {Array} Returns the new mapped array.
21624    */
21625   function baseMap(collection, iteratee) {
21626     var index = -1,
21627         result = isArrayLike(collection) ? Array(collection.length) : [];
21628
21629     baseEach(collection, function(value, key, collection) {
21630       result[++index] = iteratee(value, key, collection);
21631     });
21632     return result;
21633   }
21634
21635   /**
21636    * Creates an array of values by running each element in `collection` thru
21637    * `iteratee`. The iteratee is invoked with three arguments:
21638    * (value, index|key, collection).
21639    *
21640    * Many lodash methods are guarded to work as iteratees for methods like
21641    * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
21642    *
21643    * The guarded methods are:
21644    * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
21645    * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
21646    * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
21647    * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
21648    *
21649    * @static
21650    * @memberOf _
21651    * @since 0.1.0
21652    * @category Collection
21653    * @param {Array|Object} collection The collection to iterate over.
21654    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
21655    * @returns {Array} Returns the new mapped array.
21656    * @example
21657    *
21658    * function square(n) {
21659    *   return n * n;
21660    * }
21661    *
21662    * _.map([4, 8], square);
21663    * // => [16, 64]
21664    *
21665    * _.map({ 'a': 4, 'b': 8 }, square);
21666    * // => [16, 64] (iteration order is not guaranteed)
21667    *
21668    * var users = [
21669    *   { 'user': 'barney' },
21670    *   { 'user': 'fred' }
21671    * ];
21672    *
21673    * // The `_.property` iteratee shorthand.
21674    * _.map(users, 'user');
21675    * // => ['barney', 'fred']
21676    */
21677   function map$3(collection, iteratee) {
21678     var func = isArray(collection) ? arrayMap : baseMap;
21679     return func(collection, baseIteratee(iteratee, 3));
21680   }
21681
21682   /**
21683    * The base implementation of `_.values` and `_.valuesIn` which creates an
21684    * array of `object` property values corresponding to the property names
21685    * of `props`.
21686    *
21687    * @private
21688    * @param {Object} object The object to query.
21689    * @param {Array} props The property names to get values for.
21690    * @returns {Object} Returns the array of property values.
21691    */
21692   function baseValues(object, props) {
21693     return arrayMap(props, function(key) {
21694       return object[key];
21695     });
21696   }
21697
21698   /**
21699    * Creates an array of the own enumerable string keyed property values of `object`.
21700    *
21701    * **Note:** Non-object values are coerced to objects.
21702    *
21703    * @static
21704    * @since 0.1.0
21705    * @memberOf _
21706    * @category Object
21707    * @param {Object} object The object to query.
21708    * @returns {Array} Returns the array of property values.
21709    * @example
21710    *
21711    * function Foo() {
21712    *   this.a = 1;
21713    *   this.b = 2;
21714    * }
21715    *
21716    * Foo.prototype.c = 3;
21717    *
21718    * _.values(new Foo);
21719    * // => [1, 2] (iteration order is not guaranteed)
21720    *
21721    * _.values('hi');
21722    * // => ['h', 'i']
21723    */
21724   function values$1(object) {
21725     return object == null ? [] : baseValues(object, keys$1(object));
21726   }
21727
21728   /**
21729    * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
21730    * of key-value pairs for `object` corresponding to the property names of `props`.
21731    *
21732    * @private
21733    * @param {Object} object The object to query.
21734    * @param {Array} props The property names to get values for.
21735    * @returns {Object} Returns the key-value pairs.
21736    */
21737   function baseToPairs(object, props) {
21738     return arrayMap(props, function(key) {
21739       return [key, object[key]];
21740     });
21741   }
21742
21743   /**
21744    * Converts `set` to its value-value pairs.
21745    *
21746    * @private
21747    * @param {Object} set The set to convert.
21748    * @returns {Array} Returns the value-value pairs.
21749    */
21750   function setToPairs(set) {
21751     var index = -1,
21752         result = Array(set.size);
21753
21754     set.forEach(function(value) {
21755       result[++index] = [value, value];
21756     });
21757     return result;
21758   }
21759
21760   /** `Object#toString` result references. */
21761   var mapTag$6 = '[object Map]',
21762       setTag$6 = '[object Set]';
21763
21764   /**
21765    * Creates a `_.toPairs` or `_.toPairsIn` function.
21766    *
21767    * @private
21768    * @param {Function} keysFunc The function to get the keys of a given object.
21769    * @returns {Function} Returns the new pairs function.
21770    */
21771   function createToPairs(keysFunc) {
21772     return function(object) {
21773       var tag = getTag$1(object);
21774       if (tag == mapTag$6) {
21775         return mapToArray(object);
21776       }
21777       if (tag == setTag$6) {
21778         return setToPairs(object);
21779       }
21780       return baseToPairs(object, keysFunc(object));
21781     };
21782   }
21783
21784   /**
21785    * Creates an array of own enumerable string keyed-value pairs for `object`
21786    * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
21787    * entries are returned.
21788    *
21789    * @static
21790    * @memberOf _
21791    * @since 4.0.0
21792    * @alias entries
21793    * @category Object
21794    * @param {Object} object The object to query.
21795    * @returns {Array} Returns the key-value pairs.
21796    * @example
21797    *
21798    * function Foo() {
21799    *   this.a = 1;
21800    *   this.b = 2;
21801    * }
21802    *
21803    * Foo.prototype.c = 3;
21804    *
21805    * _.toPairs(new Foo);
21806    * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
21807    */
21808   var toPairs = createToPairs(keys$1);
21809
21810   /**
21811    * The base implementation of `_.isNaN` without support for number objects.
21812    *
21813    * @private
21814    * @param {*} value The value to check.
21815    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
21816    */
21817   function baseIsNaN(value) {
21818     return value !== value;
21819   }
21820
21821   /**
21822    * A specialized version of `_.indexOf` which performs strict equality
21823    * comparisons of values, i.e. `===`.
21824    *
21825    * @private
21826    * @param {Array} array The array to inspect.
21827    * @param {*} value The value to search for.
21828    * @param {number} fromIndex The index to search from.
21829    * @returns {number} Returns the index of the matched value, else `-1`.
21830    */
21831   function strictIndexOf(array, value, fromIndex) {
21832     var index = fromIndex - 1,
21833         length = array.length;
21834
21835     while (++index < length) {
21836       if (array[index] === value) {
21837         return index;
21838       }
21839     }
21840     return -1;
21841   }
21842
21843   /**
21844    * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
21845    *
21846    * @private
21847    * @param {Array} array The array to inspect.
21848    * @param {*} value The value to search for.
21849    * @param {number} fromIndex The index to search from.
21850    * @returns {number} Returns the index of the matched value, else `-1`.
21851    */
21852   function baseIndexOf(array, value, fromIndex) {
21853     return value === value
21854       ? strictIndexOf(array, value, fromIndex)
21855       : baseFindIndex(array, baseIsNaN, fromIndex);
21856   }
21857
21858   /**
21859    * A specialized version of `_.includes` for arrays without support for
21860    * specifying an index to search from.
21861    *
21862    * @private
21863    * @param {Array} [array] The array to inspect.
21864    * @param {*} target The value to search for.
21865    * @returns {boolean} Returns `true` if `target` is found, else `false`.
21866    */
21867   function arrayIncludes(array, value) {
21868     var length = array == null ? 0 : array.length;
21869     return !!length && baseIndexOf(array, value, 0) > -1;
21870   }
21871
21872   /**
21873    * This function is like `arrayIncludes` except that it accepts a comparator.
21874    *
21875    * @private
21876    * @param {Array} [array] The array to inspect.
21877    * @param {*} target The value to search for.
21878    * @param {Function} comparator The comparator invoked per element.
21879    * @returns {boolean} Returns `true` if `target` is found, else `false`.
21880    */
21881   function arrayIncludesWith(array, value, comparator) {
21882     var index = -1,
21883         length = array == null ? 0 : array.length;
21884
21885     while (++index < length) {
21886       if (comparator(value, array[index])) {
21887         return true;
21888       }
21889     }
21890     return false;
21891   }
21892
21893   /**
21894    * This method returns `undefined`.
21895    *
21896    * @static
21897    * @memberOf _
21898    * @since 2.3.0
21899    * @category Util
21900    * @example
21901    *
21902    * _.times(2, _.noop);
21903    * // => [undefined, undefined]
21904    */
21905   function noop$3() {
21906     // No operation performed.
21907   }
21908
21909   /** Used as references for various `Number` constants. */
21910   var INFINITY$3 = 1 / 0;
21911
21912   /**
21913    * Creates a set object of `values`.
21914    *
21915    * @private
21916    * @param {Array} values The values to add to the set.
21917    * @returns {Object} Returns the new set.
21918    */
21919   var createSet = !(Set$1 && (1 / setToArray(new Set$1([,-0]))[1]) == INFINITY$3) ? noop$3 : function(values) {
21920     return new Set$1(values);
21921   };
21922
21923   /** Used as the size to enable large array optimizations. */
21924   var LARGE_ARRAY_SIZE$1 = 200;
21925
21926   /**
21927    * The base implementation of `_.uniqBy` without support for iteratee shorthands.
21928    *
21929    * @private
21930    * @param {Array} array The array to inspect.
21931    * @param {Function} [iteratee] The iteratee invoked per element.
21932    * @param {Function} [comparator] The comparator invoked per element.
21933    * @returns {Array} Returns the new duplicate free array.
21934    */
21935   function baseUniq(array, iteratee, comparator) {
21936     var index = -1,
21937         includes = arrayIncludes,
21938         length = array.length,
21939         isCommon = true,
21940         result = [],
21941         seen = result;
21942
21943     if (comparator) {
21944       isCommon = false;
21945       includes = arrayIncludesWith;
21946     }
21947     else if (length >= LARGE_ARRAY_SIZE$1) {
21948       var set = iteratee ? null : createSet(array);
21949       if (set) {
21950         return setToArray(set);
21951       }
21952       isCommon = false;
21953       includes = cacheHas;
21954       seen = new SetCache;
21955     }
21956     else {
21957       seen = iteratee ? [] : result;
21958     }
21959     outer:
21960     while (++index < length) {
21961       var value = array[index],
21962           computed = iteratee ? iteratee(value) : value;
21963
21964       value = (comparator || value !== 0) ? value : 0;
21965       if (isCommon && computed === computed) {
21966         var seenIndex = seen.length;
21967         while (seenIndex--) {
21968           if (seen[seenIndex] === computed) {
21969             continue outer;
21970           }
21971         }
21972         if (iteratee) {
21973           seen.push(computed);
21974         }
21975         result.push(value);
21976       }
21977       else if (!includes(seen, computed, comparator)) {
21978         if (seen !== result) {
21979           seen.push(computed);
21980         }
21981         result.push(value);
21982       }
21983     }
21984     return result;
21985   }
21986
21987   /**
21988    * This method is like `_.isArrayLike` except that it also checks if `value`
21989    * is an object.
21990    *
21991    * @static
21992    * @memberOf _
21993    * @since 4.0.0
21994    * @category Lang
21995    * @param {*} value The value to check.
21996    * @returns {boolean} Returns `true` if `value` is an array-like object,
21997    *  else `false`.
21998    * @example
21999    *
22000    * _.isArrayLikeObject([1, 2, 3]);
22001    * // => true
22002    *
22003    * _.isArrayLikeObject(document.body.children);
22004    * // => true
22005    *
22006    * _.isArrayLikeObject('abc');
22007    * // => false
22008    *
22009    * _.isArrayLikeObject(_.noop);
22010    * // => false
22011    */
22012   function isArrayLikeObject(value) {
22013     return isObjectLike(value) && isArrayLike(value);
22014   }
22015
22016   /**
22017    * Creates an array of unique values, in order, from all given arrays using
22018    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22019    * for equality comparisons.
22020    *
22021    * @static
22022    * @memberOf _
22023    * @since 0.1.0
22024    * @category Array
22025    * @param {...Array} [arrays] The arrays to inspect.
22026    * @returns {Array} Returns the new array of combined values.
22027    * @example
22028    *
22029    * _.union([2], [1, 2]);
22030    * // => [2, 1]
22031    */
22032   var union = baseRest(function(arrays) {
22033     return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
22034   });
22035
22036   /** Used as the size to enable large array optimizations. */
22037   var LARGE_ARRAY_SIZE$2 = 200;
22038
22039   /**
22040    * The base implementation of methods like `_.difference` without support
22041    * for excluding multiple arrays or iteratee shorthands.
22042    *
22043    * @private
22044    * @param {Array} array The array to inspect.
22045    * @param {Array} values The values to exclude.
22046    * @param {Function} [iteratee] The iteratee invoked per element.
22047    * @param {Function} [comparator] The comparator invoked per element.
22048    * @returns {Array} Returns the new array of filtered values.
22049    */
22050   function baseDifference(array, values, iteratee, comparator) {
22051     var index = -1,
22052         includes = arrayIncludes,
22053         isCommon = true,
22054         length = array.length,
22055         result = [],
22056         valuesLength = values.length;
22057
22058     if (!length) {
22059       return result;
22060     }
22061     if (iteratee) {
22062       values = arrayMap(values, baseUnary(iteratee));
22063     }
22064     if (comparator) {
22065       includes = arrayIncludesWith;
22066       isCommon = false;
22067     }
22068     else if (values.length >= LARGE_ARRAY_SIZE$2) {
22069       includes = cacheHas;
22070       isCommon = false;
22071       values = new SetCache(values);
22072     }
22073     outer:
22074     while (++index < length) {
22075       var value = array[index],
22076           computed = iteratee == null ? value : iteratee(value);
22077
22078       value = (comparator || value !== 0) ? value : 0;
22079       if (isCommon && computed === computed) {
22080         var valuesIndex = valuesLength;
22081         while (valuesIndex--) {
22082           if (values[valuesIndex] === computed) {
22083             continue outer;
22084           }
22085         }
22086         result.push(value);
22087       }
22088       else if (!includes(values, computed, comparator)) {
22089         result.push(value);
22090       }
22091     }
22092     return result;
22093   }
22094
22095   /**
22096    * Creates an array excluding all given values using
22097    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22098    * for equality comparisons.
22099    *
22100    * **Note:** Unlike `_.pull`, this method returns a new array.
22101    *
22102    * @static
22103    * @memberOf _
22104    * @since 0.1.0
22105    * @category Array
22106    * @param {Array} array The array to inspect.
22107    * @param {...*} [values] The values to exclude.
22108    * @returns {Array} Returns the new array of filtered values.
22109    * @see _.difference, _.xor
22110    * @example
22111    *
22112    * _.without([2, 1, 2, 3], 1, 2);
22113    * // => [3]
22114    */
22115   var without = baseRest(function(array, values) {
22116     return isArrayLikeObject(array)
22117       ? baseDifference(array, values)
22118       : [];
22119   });
22120
22121   function osmIsInterestingTag(key) {
22122       return key !== 'attribution' &&
22123           key !== 'created_by' &&
22124           key !== 'source' &&
22125           key !== 'odbl' &&
22126           key.indexOf('tiger:') !== 0;
22127
22128   }
22129
22130
22131   var osmOneWayTags = {
22132       'aerialway': {
22133           'chair_lift': true,
22134           'mixed_lift': true,
22135           't-bar': true,
22136           'j-bar': true,
22137           'platter': true,
22138           'rope_tow': true,
22139           'magic_carpet': true,
22140           'yes': true
22141       },
22142       'highway': {
22143           'motorway': true
22144       },
22145       'junction': {
22146           'circular': true,
22147           'roundabout': true
22148       },
22149       'man_made': {
22150           'piste:halfpipe': true
22151       },
22152       'piste:type': {
22153           'downhill': true,
22154           'sled': true,
22155           'yes': true
22156       },
22157       'waterway': {
22158           'canal': true,
22159           'ditch': true,
22160           'drain': true,
22161           'river': true,
22162           'stream': true
22163       }
22164   };
22165
22166
22167   var osmPavedTags = {
22168       'surface': {
22169           'paved': true,
22170           'asphalt': true,
22171           'concrete': true,
22172           'concrete:lanes': true,
22173           'concrete:plates': true
22174       },
22175       'tracktype': {
22176           'grade1': true
22177       }
22178   };
22179
22180   var osmRightSideIsInsideTags = {
22181       'natural': {
22182           'cliff': true,
22183           'coastline': 'coastline',
22184       },
22185       'barrier': {
22186           'retaining_wall': true,
22187           'kerb': true,
22188           'guard_rail': true,
22189           'city_wall': true,
22190       },
22191       'man_made': {
22192           'embankment': true
22193       }
22194   };
22195
22196   var wikipedia = [
22197       [
22198           "Abkhazian",
22199           "Аҧсшәа",
22200           "ab"
22201       ],
22202       [
22203           "Achinese",
22204           "Acèh",
22205           "ace"
22206       ],
22207       [
22208           "Adyghe",
22209           "адыгабзэ",
22210           "ady"
22211       ],
22212       [
22213           "Afrikaans",
22214           "Afrikaans",
22215           "af"
22216       ],
22217       [
22218           "Akan",
22219           "Akan",
22220           "ak"
22221       ],
22222       [
22223           "Alemannisch",
22224           "Alemannisch",
22225           "als"
22226       ],
22227       [
22228           "Amharic",
22229           "አማርኛ",
22230           "am"
22231       ],
22232       [
22233           "Aragonese",
22234           "aragonés",
22235           "an"
22236       ],
22237       [
22238           "Old English",
22239           "Ænglisc",
22240           "ang"
22241       ],
22242       [
22243           "Arabic",
22244           "العربية",
22245           "ar"
22246       ],
22247       [
22248           "Aramaic",
22249           "ܐܪܡܝܐ",
22250           "arc"
22251       ],
22252       [
22253           "Egyptian Arabic",
22254           "مصرى",
22255           "arz"
22256       ],
22257       [
22258           "Assamese",
22259           "অসমীয়া",
22260           "as"
22261       ],
22262       [
22263           "Asturian",
22264           "asturianu",
22265           "ast"
22266       ],
22267       [
22268           "Avaric",
22269           "авар",
22270           "av"
22271       ],
22272       [
22273           "Aymara",
22274           "Aymar aru",
22275           "ay"
22276       ],
22277       [
22278           "Azerbaijani",
22279           "azərbaycanca",
22280           "az"
22281       ],
22282       [
22283           "تۆرکجه",
22284           "تۆرکجه",
22285           "azb"
22286       ],
22287       [
22288           "Bashkir",
22289           "башҡортса",
22290           "ba"
22291       ],
22292       [
22293           "Bavarian",
22294           "Boarisch",
22295           "bar"
22296       ],
22297       [
22298           "Samogitian",
22299           "žemaitėška",
22300           "bat-smg"
22301       ],
22302       [
22303           "Bikol Central",
22304           "Bikol Central",
22305           "bcl"
22306       ],
22307       [
22308           "Belarusian",
22309           "беларуская",
22310           "be"
22311       ],
22312       [
22313           "беларуская (тарашкевіца)‎",
22314           "беларуская (тарашкевіца)‎",
22315           "be-x-old"
22316       ],
22317       [
22318           "Bulgarian",
22319           "български",
22320           "bg"
22321       ],
22322       [
22323           "भोजपुरी",
22324           "भोजपुरी",
22325           "bh"
22326       ],
22327       [
22328           "Bislama",
22329           "Bislama",
22330           "bi"
22331       ],
22332       [
22333           "Banjar",
22334           "Bahasa Banjar",
22335           "bjn"
22336       ],
22337       [
22338           "Bambara",
22339           "bamanankan",
22340           "bm"
22341       ],
22342       [
22343           "Bangla",
22344           "বাংলা",
22345           "bn"
22346       ],
22347       [
22348           "Tibetan",
22349           "བོད་ཡིག",
22350           "bo"
22351       ],
22352       [
22353           "Bishnupriya",
22354           "বিষ্ণুপ্রিয়া মণিপুরী",
22355           "bpy"
22356       ],
22357       [
22358           "Breton",
22359           "brezhoneg",
22360           "br"
22361       ],
22362       [
22363           "Bosnian",
22364           "bosanski",
22365           "bs"
22366       ],
22367       [
22368           "Buginese",
22369           "ᨅᨔ ᨕᨘᨁᨗ",
22370           "bug"
22371       ],
22372       [
22373           "буряад",
22374           "буряад",
22375           "bxr"
22376       ],
22377       [
22378           "Catalan",
22379           "català",
22380           "ca"
22381       ],
22382       [
22383           "Chavacano de Zamboanga",
22384           "Chavacano de Zamboanga",
22385           "cbk-zam"
22386       ],
22387       [
22388           "Min Dong Chinese",
22389           "Mìng-dĕ̤ng-ngṳ̄",
22390           "cdo"
22391       ],
22392       [
22393           "Chechen",
22394           "нохчийн",
22395           "ce"
22396       ],
22397       [
22398           "Cebuano",
22399           "Cebuano",
22400           "ceb"
22401       ],
22402       [
22403           "Chamorro",
22404           "Chamoru",
22405           "ch"
22406       ],
22407       [
22408           "Cherokee",
22409           "ᏣᎳᎩ",
22410           "chr"
22411       ],
22412       [
22413           "Cheyenne",
22414           "Tsetsêhestâhese",
22415           "chy"
22416       ],
22417       [
22418           "Central Kurdish",
22419           "کوردیی ناوەندی",
22420           "ckb"
22421       ],
22422       [
22423           "Corsican",
22424           "corsu",
22425           "co"
22426       ],
22427       [
22428           "Cree",
22429           "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ",
22430           "cr"
22431       ],
22432       [
22433           "Crimean Turkish",
22434           "qırımtatarca",
22435           "crh"
22436       ],
22437       [
22438           "Czech",
22439           "čeština",
22440           "cs"
22441       ],
22442       [
22443           "Kashubian",
22444           "kaszëbsczi",
22445           "csb"
22446       ],
22447       [
22448           "Church Slavic",
22449           "словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ",
22450           "cu"
22451       ],
22452       [
22453           "Chuvash",
22454           "Чӑвашла",
22455           "cv"
22456       ],
22457       [
22458           "Welsh",
22459           "Cymraeg",
22460           "cy"
22461       ],
22462       [
22463           "Danish",
22464           "dansk",
22465           "da"
22466       ],
22467       [
22468           "German",
22469           "Deutsch",
22470           "de"
22471       ],
22472       [
22473           "Zazaki",
22474           "Zazaki",
22475           "diq"
22476       ],
22477       [
22478           "Lower Sorbian",
22479           "dolnoserbski",
22480           "dsb"
22481       ],
22482       [
22483           "Divehi",
22484           "ދިވެހިބަސް",
22485           "dv"
22486       ],
22487       [
22488           "Dzongkha",
22489           "ཇོང་ཁ",
22490           "dz"
22491       ],
22492       [
22493           "Ewe",
22494           "eʋegbe",
22495           "ee"
22496       ],
22497       [
22498           "Greek",
22499           "Ελληνικά",
22500           "el"
22501       ],
22502       [
22503           "Emiliano-Romagnolo",
22504           "emiliàn e rumagnòl",
22505           "eml"
22506       ],
22507       [
22508           "English",
22509           "English",
22510           "en"
22511       ],
22512       [
22513           "Esperanto",
22514           "Esperanto",
22515           "eo"
22516       ],
22517       [
22518           "Spanish",
22519           "español",
22520           "es"
22521       ],
22522       [
22523           "Estonian",
22524           "eesti",
22525           "et"
22526       ],
22527       [
22528           "Basque",
22529           "euskara",
22530           "eu"
22531       ],
22532       [
22533           "Extremaduran",
22534           "estremeñu",
22535           "ext"
22536       ],
22537       [
22538           "Persian",
22539           "فارسی",
22540           "fa"
22541       ],
22542       [
22543           "Fulah",
22544           "Fulfulde",
22545           "ff"
22546       ],
22547       [
22548           "Finnish",
22549           "suomi",
22550           "fi"
22551       ],
22552       [
22553           "Võro",
22554           "Võro",
22555           "fiu-vro"
22556       ],
22557       [
22558           "Fijian",
22559           "Na Vosa Vakaviti",
22560           "fj"
22561       ],
22562       [
22563           "Faroese",
22564           "føroyskt",
22565           "fo"
22566       ],
22567       [
22568           "French",
22569           "français",
22570           "fr"
22571       ],
22572       [
22573           "Arpitan",
22574           "arpetan",
22575           "frp"
22576       ],
22577       [
22578           "Northern Frisian",
22579           "Nordfriisk",
22580           "frr"
22581       ],
22582       [
22583           "Friulian",
22584           "furlan",
22585           "fur"
22586       ],
22587       [
22588           "Western Frisian",
22589           "Frysk",
22590           "fy"
22591       ],
22592       [
22593           "Irish",
22594           "Gaeilge",
22595           "ga"
22596       ],
22597       [
22598           "Gagauz",
22599           "Gagauz",
22600           "gag"
22601       ],
22602       [
22603           "Gan Chinese",
22604           "贛語",
22605           "gan"
22606       ],
22607       [
22608           "Scottish Gaelic",
22609           "Gàidhlig",
22610           "gd"
22611       ],
22612       [
22613           "Galician",
22614           "galego",
22615           "gl"
22616       ],
22617       [
22618           "Gilaki",
22619           "گیلکی",
22620           "glk"
22621       ],
22622       [
22623           "Guarani",
22624           "Avañe'ẽ",
22625           "gn"
22626       ],
22627       [
22628           "Goan Konkani",
22629           "गोंयची कोंकणी / Gõychi Konknni",
22630           "gom"
22631       ],
22632       [
22633           "Gothic",
22634           "𐌲𐌿𐍄𐌹𐍃𐌺",
22635           "got"
22636       ],
22637       [
22638           "Gujarati",
22639           "ગુજરાતી",
22640           "gu"
22641       ],
22642       [
22643           "Manx",
22644           "Gaelg",
22645           "gv"
22646       ],
22647       [
22648           "Hausa",
22649           "Hausa",
22650           "ha"
22651       ],
22652       [
22653           "Hakka Chinese",
22654           "客家語/Hak-kâ-ngî",
22655           "hak"
22656       ],
22657       [
22658           "Hawaiian",
22659           "Hawaiʻi",
22660           "haw"
22661       ],
22662       [
22663           "Hebrew",
22664           "עברית",
22665           "he"
22666       ],
22667       [
22668           "Hindi",
22669           "हिन्दी",
22670           "hi"
22671       ],
22672       [
22673           "Fiji Hindi",
22674           "Fiji Hindi",
22675           "hif"
22676       ],
22677       [
22678           "Croatian",
22679           "hrvatski",
22680           "hr"
22681       ],
22682       [
22683           "Upper Sorbian",
22684           "hornjoserbsce",
22685           "hsb"
22686       ],
22687       [
22688           "Haitian Creole",
22689           "Kreyòl ayisyen",
22690           "ht"
22691       ],
22692       [
22693           "Hungarian",
22694           "magyar",
22695           "hu"
22696       ],
22697       [
22698           "Armenian",
22699           "Հայերեն",
22700           "hy"
22701       ],
22702       [
22703           "Interlingua",
22704           "interlingua",
22705           "ia"
22706       ],
22707       [
22708           "Indonesian",
22709           "Bahasa Indonesia",
22710           "id"
22711       ],
22712       [
22713           "Interlingue",
22714           "Interlingue",
22715           "ie"
22716       ],
22717       [
22718           "Igbo",
22719           "Igbo",
22720           "ig"
22721       ],
22722       [
22723           "Inupiaq",
22724           "Iñupiak",
22725           "ik"
22726       ],
22727       [
22728           "Iloko",
22729           "Ilokano",
22730           "ilo"
22731       ],
22732       [
22733           "Ido",
22734           "Ido",
22735           "io"
22736       ],
22737       [
22738           "Icelandic",
22739           "íslenska",
22740           "is"
22741       ],
22742       [
22743           "Italian",
22744           "italiano",
22745           "it"
22746       ],
22747       [
22748           "Inuktitut",
22749           "ᐃᓄᒃᑎᑐᑦ/inuktitut",
22750           "iu"
22751       ],
22752       [
22753           "Japanese",
22754           "日本語",
22755           "ja"
22756       ],
22757       [
22758           "Jamaican Creole English",
22759           "Patois",
22760           "jam"
22761       ],
22762       [
22763           "Lojban",
22764           "la .lojban.",
22765           "jbo"
22766       ],
22767       [
22768           "Javanese",
22769           "Basa Jawa",
22770           "jv"
22771       ],
22772       [
22773           "Georgian",
22774           "ქართული",
22775           "ka"
22776       ],
22777       [
22778           "Kara-Kalpak",
22779           "Qaraqalpaqsha",
22780           "kaa"
22781       ],
22782       [
22783           "Kabyle",
22784           "Taqbaylit",
22785           "kab"
22786       ],
22787       [
22788           "Kabardian",
22789           "Адыгэбзэ",
22790           "kbd"
22791       ],
22792       [
22793           "Kongo",
22794           "Kongo",
22795           "kg"
22796       ],
22797       [
22798           "Kikuyu",
22799           "Gĩkũyũ",
22800           "ki"
22801       ],
22802       [
22803           "Kazakh",
22804           "қазақша",
22805           "kk"
22806       ],
22807       [
22808           "Kalaallisut",
22809           "kalaallisut",
22810           "kl"
22811       ],
22812       [
22813           "Khmer",
22814           "ភាសាខ្មែរ",
22815           "km"
22816       ],
22817       [
22818           "Kannada",
22819           "ಕನ್ನಡ",
22820           "kn"
22821       ],
22822       [
22823           "Korean",
22824           "한국어",
22825           "ko"
22826       ],
22827       [
22828           "Komi-Permyak",
22829           "Перем Коми",
22830           "koi"
22831       ],
22832       [
22833           "Karachay-Balkar",
22834           "къарачай-малкъар",
22835           "krc"
22836       ],
22837       [
22838           "Kashmiri",
22839           "कॉशुर / کٲشُر",
22840           "ks"
22841       ],
22842       [
22843           "Colognian",
22844           "Ripoarisch",
22845           "ksh"
22846       ],
22847       [
22848           "Kurdish",
22849           "Kurdî",
22850           "ku"
22851       ],
22852       [
22853           "Komi",
22854           "коми",
22855           "kv"
22856       ],
22857       [
22858           "Cornish",
22859           "kernowek",
22860           "kw"
22861       ],
22862       [
22863           "Kyrgyz",
22864           "Кыргызча",
22865           "ky"
22866       ],
22867       [
22868           "Latin",
22869           "Latina",
22870           "la"
22871       ],
22872       [
22873           "Ladino",
22874           "Ladino",
22875           "lad"
22876       ],
22877       [
22878           "Luxembourgish",
22879           "Lëtzebuergesch",
22880           "lb"
22881       ],
22882       [
22883           "лакку",
22884           "лакку",
22885           "lbe"
22886       ],
22887       [
22888           "Lezghian",
22889           "лезги",
22890           "lez"
22891       ],
22892       [
22893           "Ganda",
22894           "Luganda",
22895           "lg"
22896       ],
22897       [
22898           "Limburgish",
22899           "Limburgs",
22900           "li"
22901       ],
22902       [
22903           "Ligurian",
22904           "Ligure",
22905           "lij"
22906       ],
22907       [
22908           "Lombard",
22909           "lumbaart",
22910           "lmo"
22911       ],
22912       [
22913           "Lingala",
22914           "lingála",
22915           "ln"
22916       ],
22917       [
22918           "Lao",
22919           "ລາວ",
22920           "lo"
22921       ],
22922       [
22923           "Northern Luri",
22924           "لۊری شومالی",
22925           "lrc"
22926       ],
22927       [
22928           "Lithuanian",
22929           "lietuvių",
22930           "lt"
22931       ],
22932       [
22933           "Latgalian",
22934           "latgaļu",
22935           "ltg"
22936       ],
22937       [
22938           "Latvian",
22939           "latviešu",
22940           "lv"
22941       ],
22942       [
22943           "Maithili",
22944           "मैथिली",
22945           "mai"
22946       ],
22947       [
22948           "Basa Banyumasan",
22949           "Basa Banyumasan",
22950           "map-bms"
22951       ],
22952       [
22953           "Moksha",
22954           "мокшень",
22955           "mdf"
22956       ],
22957       [
22958           "Malagasy",
22959           "Malagasy",
22960           "mg"
22961       ],
22962       [
22963           "Eastern Mari",
22964           "олык марий",
22965           "mhr"
22966       ],
22967       [
22968           "Maori",
22969           "Māori",
22970           "mi"
22971       ],
22972       [
22973           "Minangkabau",
22974           "Baso Minangkabau",
22975           "min"
22976       ],
22977       [
22978           "Macedonian",
22979           "македонски",
22980           "mk"
22981       ],
22982       [
22983           "Malayalam",
22984           "മലയാളം",
22985           "ml"
22986       ],
22987       [
22988           "Mongolian",
22989           "монгол",
22990           "mn"
22991       ],
22992       [
22993           "Marathi",
22994           "मराठी",
22995           "mr"
22996       ],
22997       [
22998           "Western Mari",
22999           "кырык мары",
23000           "mrj"
23001       ],
23002       [
23003           "Malay",
23004           "Bahasa Melayu",
23005           "ms"
23006       ],
23007       [
23008           "Maltese",
23009           "Malti",
23010           "mt"
23011       ],
23012       [
23013           "Mirandese",
23014           "Mirandés",
23015           "mwl"
23016       ],
23017       [
23018           "Burmese",
23019           "မြန်မာဘာသာ",
23020           "my"
23021       ],
23022       [
23023           "Erzya",
23024           "эрзянь",
23025           "myv"
23026       ],
23027       [
23028           "Mazanderani",
23029           "مازِرونی",
23030           "mzn"
23031       ],
23032       [
23033           "Nauru",
23034           "Dorerin Naoero",
23035           "na"
23036       ],
23037       [
23038           "Nāhuatl",
23039           "Nāhuatl",
23040           "nah"
23041       ],
23042       [
23043           "Neapolitan",
23044           "Napulitano",
23045           "nap"
23046       ],
23047       [
23048           "Low German",
23049           "Plattdüütsch",
23050           "nds"
23051       ],
23052       [
23053           "Low Saxon",
23054           "Nedersaksies",
23055           "nds-nl"
23056       ],
23057       [
23058           "Nepali",
23059           "नेपाली",
23060           "ne"
23061       ],
23062       [
23063           "Newari",
23064           "नेपाल भाषा",
23065           "new"
23066       ],
23067       [
23068           "Dutch",
23069           "Nederlands",
23070           "nl"
23071       ],
23072       [
23073           "Norwegian Nynorsk",
23074           "norsk nynorsk",
23075           "nn"
23076       ],
23077       [
23078           "Norwegian",
23079           "norsk bokmål",
23080           "no"
23081       ],
23082       [
23083           "Novial",
23084           "Novial",
23085           "nov"
23086       ],
23087       [
23088           "Nouormand",
23089           "Nouormand",
23090           "nrm"
23091       ],
23092       [
23093           "Northern Sotho",
23094           "Sesotho sa Leboa",
23095           "nso"
23096       ],
23097       [
23098           "Navajo",
23099           "Diné bizaad",
23100           "nv"
23101       ],
23102       [
23103           "Nyanja",
23104           "Chi-Chewa",
23105           "ny"
23106       ],
23107       [
23108           "Occitan",
23109           "occitan",
23110           "oc"
23111       ],
23112       [
23113           "Livvi-Karelian",
23114           "Livvinkarjala",
23115           "olo"
23116       ],
23117       [
23118           "Oromo",
23119           "Oromoo",
23120           "om"
23121       ],
23122       [
23123           "Odia",
23124           "ଓଡ଼ିଆ",
23125           "or"
23126       ],
23127       [
23128           "Ossetic",
23129           "Ирон",
23130           "os"
23131       ],
23132       [
23133           "Punjabi",
23134           "ਪੰਜਾਬੀ",
23135           "pa"
23136       ],
23137       [
23138           "Pangasinan",
23139           "Pangasinan",
23140           "pag"
23141       ],
23142       [
23143           "Pampanga",
23144           "Kapampangan",
23145           "pam"
23146       ],
23147       [
23148           "Papiamento",
23149           "Papiamentu",
23150           "pap"
23151       ],
23152       [
23153           "Picard",
23154           "Picard",
23155           "pcd"
23156       ],
23157       [
23158           "Pennsylvania German",
23159           "Deitsch",
23160           "pdc"
23161       ],
23162       [
23163           "Palatine German",
23164           "Pälzisch",
23165           "pfl"
23166       ],
23167       [
23168           "Pali",
23169           "पालि",
23170           "pi"
23171       ],
23172       [
23173           "Norfuk / Pitkern",
23174           "Norfuk / Pitkern",
23175           "pih"
23176       ],
23177       [
23178           "Polish",
23179           "polski",
23180           "pl"
23181       ],
23182       [
23183           "Piedmontese",
23184           "Piemontèis",
23185           "pms"
23186       ],
23187       [
23188           "Western Punjabi",
23189           "پنجابی",
23190           "pnb"
23191       ],
23192       [
23193           "Pontic",
23194           "Ποντιακά",
23195           "pnt"
23196       ],
23197       [
23198           "Pashto",
23199           "پښتو",
23200           "ps"
23201       ],
23202       [
23203           "Portuguese",
23204           "português",
23205           "pt"
23206       ],
23207       [
23208           "Quechua",
23209           "Runa Simi",
23210           "qu"
23211       ],
23212       [
23213           "Romansh",
23214           "rumantsch",
23215           "rm"
23216       ],
23217       [
23218           "Romani",
23219           "Romani",
23220           "rmy"
23221       ],
23222       [
23223           "Rundi",
23224           "Kirundi",
23225           "rn"
23226       ],
23227       [
23228           "Romanian",
23229           "română",
23230           "ro"
23231       ],
23232       [
23233           "Aromanian",
23234           "armãneashti",
23235           "roa-rup"
23236       ],
23237       [
23238           "tarandíne",
23239           "tarandíne",
23240           "roa-tara"
23241       ],
23242       [
23243           "Russian",
23244           "русский",
23245           "ru"
23246       ],
23247       [
23248           "Rusyn",
23249           "русиньскый",
23250           "rue"
23251       ],
23252       [
23253           "Kinyarwanda",
23254           "Kinyarwanda",
23255           "rw"
23256       ],
23257       [
23258           "Sanskrit",
23259           "संस्कृतम्",
23260           "sa"
23261       ],
23262       [
23263           "Sakha",
23264           "саха тыла",
23265           "sah"
23266       ],
23267       [
23268           "Sardinian",
23269           "sardu",
23270           "sc"
23271       ],
23272       [
23273           "Sicilian",
23274           "sicilianu",
23275           "scn"
23276       ],
23277       [
23278           "Scots",
23279           "Scots",
23280           "sco"
23281       ],
23282       [
23283           "Sindhi",
23284           "سنڌي",
23285           "sd"
23286       ],
23287       [
23288           "Northern Sami",
23289           "sámegiella",
23290           "se"
23291       ],
23292       [
23293           "Sango",
23294           "Sängö",
23295           "sg"
23296       ],
23297       [
23298           "Serbo-Croatian",
23299           "srpskohrvatski / српскохрватски",
23300           "sh"
23301       ],
23302       [
23303           "Sinhala",
23304           "සිංහල",
23305           "si"
23306       ],
23307       [
23308           "Simple English",
23309           "Simple English",
23310           "simple"
23311       ],
23312       [
23313           "Slovak",
23314           "slovenčina",
23315           "sk"
23316       ],
23317       [
23318           "Slovenian",
23319           "slovenščina",
23320           "sl"
23321       ],
23322       [
23323           "Samoan",
23324           "Gagana Samoa",
23325           "sm"
23326       ],
23327       [
23328           "Shona",
23329           "chiShona",
23330           "sn"
23331       ],
23332       [
23333           "Somali",
23334           "Soomaaliga",
23335           "so"
23336       ],
23337       [
23338           "Albanian",
23339           "shqip",
23340           "sq"
23341       ],
23342       [
23343           "Serbian",
23344           "српски / srpski",
23345           "sr"
23346       ],
23347       [
23348           "Sranan Tongo",
23349           "Sranantongo",
23350           "srn"
23351       ],
23352       [
23353           "Swati",
23354           "SiSwati",
23355           "ss"
23356       ],
23357       [
23358           "Southern Sotho",
23359           "Sesotho",
23360           "st"
23361       ],
23362       [
23363           "Saterland Frisian",
23364           "Seeltersk",
23365           "stq"
23366       ],
23367       [
23368           "Sundanese",
23369           "Basa Sunda",
23370           "su"
23371       ],
23372       [
23373           "Swedish",
23374           "svenska",
23375           "sv"
23376       ],
23377       [
23378           "Swahili",
23379           "Kiswahili",
23380           "sw"
23381       ],
23382       [
23383           "Silesian",
23384           "ślůnski",
23385           "szl"
23386       ],
23387       [
23388           "Tamil",
23389           "தமிழ்",
23390           "ta"
23391       ],
23392       [
23393           "Tulu",
23394           "ತುಳು",
23395           "tcy"
23396       ],
23397       [
23398           "Telugu",
23399           "తెలుగు",
23400           "te"
23401       ],
23402       [
23403           "Tetum",
23404           "tetun",
23405           "tet"
23406       ],
23407       [
23408           "Tajik",
23409           "тоҷикӣ",
23410           "tg"
23411       ],
23412       [
23413           "Thai",
23414           "ไทย",
23415           "th"
23416       ],
23417       [
23418           "Tigrinya",
23419           "ትግርኛ",
23420           "ti"
23421       ],
23422       [
23423           "Turkmen",
23424           "Türkmençe",
23425           "tk"
23426       ],
23427       [
23428           "Tagalog",
23429           "Tagalog",
23430           "tl"
23431       ],
23432       [
23433           "Tswana",
23434           "Setswana",
23435           "tn"
23436       ],
23437       [
23438           "Tongan",
23439           "lea faka-Tonga",
23440           "to"
23441       ],
23442       [
23443           "Tok Pisin",
23444           "Tok Pisin",
23445           "tpi"
23446       ],
23447       [
23448           "Turkish",
23449           "Türkçe",
23450           "tr"
23451       ],
23452       [
23453           "Tsonga",
23454           "Xitsonga",
23455           "ts"
23456       ],
23457       [
23458           "Tatar",
23459           "татарча/tatarça",
23460           "tt"
23461       ],
23462       [
23463           "Tumbuka",
23464           "chiTumbuka",
23465           "tum"
23466       ],
23467       [
23468           "Twi",
23469           "Twi",
23470           "tw"
23471       ],
23472       [
23473           "Tahitian",
23474           "reo tahiti",
23475           "ty"
23476       ],
23477       [
23478           "Tuvinian",
23479           "тыва дыл",
23480           "tyv"
23481       ],
23482       [
23483           "Udmurt",
23484           "удмурт",
23485           "udm"
23486       ],
23487       [
23488           "Uyghur",
23489           "ئۇيغۇرچە / Uyghurche",
23490           "ug"
23491       ],
23492       [
23493           "Ukrainian",
23494           "українська",
23495           "uk"
23496       ],
23497       [
23498           "Urdu",
23499           "اردو",
23500           "ur"
23501       ],
23502       [
23503           "Uzbek",
23504           "oʻzbekcha/ўзбекча",
23505           "uz"
23506       ],
23507       [
23508           "Venda",
23509           "Tshivenda",
23510           "ve"
23511       ],
23512       [
23513           "Venetian",
23514           "vèneto",
23515           "vec"
23516       ],
23517       [
23518           "Veps",
23519           "vepsän kel’",
23520           "vep"
23521       ],
23522       [
23523           "Vietnamese",
23524           "Tiếng Việt",
23525           "vi"
23526       ],
23527       [
23528           "West Flemish",
23529           "West-Vlams",
23530           "vls"
23531       ],
23532       [
23533           "Volapük",
23534           "Volapük",
23535           "vo"
23536       ],
23537       [
23538           "Walloon",
23539           "walon",
23540           "wa"
23541       ],
23542       [
23543           "Waray",
23544           "Winaray",
23545           "war"
23546       ],
23547       [
23548           "Wolof",
23549           "Wolof",
23550           "wo"
23551       ],
23552       [
23553           "Wu Chinese",
23554           "吴语",
23555           "wuu"
23556       ],
23557       [
23558           "Kalmyk",
23559           "хальмг",
23560           "xal"
23561       ],
23562       [
23563           "Xhosa",
23564           "isiXhosa",
23565           "xh"
23566       ],
23567       [
23568           "Mingrelian",
23569           "მარგალური",
23570           "xmf"
23571       ],
23572       [
23573           "Yiddish",
23574           "ייִדיש",
23575           "yi"
23576       ],
23577       [
23578           "Yoruba",
23579           "Yorùbá",
23580           "yo"
23581       ],
23582       [
23583           "Zhuang",
23584           "Vahcuengh",
23585           "za"
23586       ],
23587       [
23588           "Zeelandic",
23589           "Zeêuws",
23590           "zea"
23591       ],
23592       [
23593           "Chinese",
23594           "中文",
23595           "zh"
23596       ],
23597       [
23598           "Classical Chinese",
23599           "文言",
23600           "zh-classical"
23601       ],
23602       [
23603           "Chinese (Min Nan)",
23604           "Bân-lâm-gú",
23605           "zh-min-nan"
23606       ],
23607       [
23608           "Cantonese",
23609           "粵語",
23610           "zh-yue"
23611       ],
23612       [
23613           "Zulu",
23614           "isiZulu",
23615           "zu"
23616       ]
23617   ];
23618
23619   var wikipedia$1 = /*#__PURE__*/Object.freeze({
23620     default: wikipedia
23621   });
23622
23623   var require$$6 = ( wikipedia$1 && wikipedia ) || wikipedia$1;
23624
23625   var wikipedia$2 = require$$6;
23626
23627   var dataAddressFormats = [{format:[["housenumber","street"],["city","postcode"]]},{countryCodes:["au"],format:[["unit","housenumber","street"],["suburb","state","postcode"]]},{countryCodes:["gb"],format:[["housename"],["housenumber","street"],["city","postcode"]]},{countryCodes:["ie"],format:[["housename"],["housenumber","street"],["city"],["postcode"]]},{countryCodes:["at","ch","de","si","pl"],format:[["street","housenumber"],["postcode","city"]]},{countryCodes:["ad","ba","be","cz","dk","es","fi","gr","hr","is","it","li","nl","no","pt","se","sk","sm","va"],format:[["street","housenumber","unit"],["postcode","city"]]},{countryCodes:["fr","lu","mo"],format:[["housenumber","street"],["postcode","city"]]},{countryCodes:["br"],format:[["street"],["housenumber","suburb"],["city","postcode"]]},{countryCodes:["vn"],format:[["housenumber","street"],["subdistrict"],["district"],["city"],["province","postcode"]]},{countryCodes:["ca"],format:[["housenumber","street","unit"],["city","province","postcode"]]},{countryCodes:["us"],format:[["housenumber","street","unit"],["city","state","postcode"]]},{countryCodes:["tw"],format:[["postcode","city","district"],["place","street"],["housenumber","floor","unit"]]},{countryCodes:["jp"],format:[["postcode","province","county"],["city","suburb"],["quarter","neighbourhood"],["block_number","housenumber"]],dropdowns:["postcode","province","county","city","suburb","quarter","neighbourhood","block_number"],widths:{postcode:0.3,province:0.35,county:0.35,city:0.65,suburb:0.35,quarter:0.5,neighbourhood:0.5,block_number:0.5,housenumber:0.5}},{countryCodes:["tr"],format:[["neighbourhood"],["street","housenumber"],["postcode","district","city"]]},{countryCodes:["ua"],format:[["housenumber","postcode"],["street"]]},{countryCodes:["cn"],format:[["postcode","province"],["city","district"],["street","housenumber"]]}];
23628
23629   var dataDeprecated = [{old:{amenity:"firepit"},replace:{leisure:"firepit"}},{old:{barrier:"wire_fence"},replace:{barrier:"fence",fence_type:"chain"}},{old:{barrier:"wood_fence"},replace:{barrier:"fence",fence_type:"wood"}},{old:{highway:"ford"},replace:{ford:"yes"}},{old:{highway:"stile"},replace:{barrier:"stile"}},{old:{highway:"incline"},replace:{highway:"road",incline:"up"}},{old:{highway:"incline_steep"},replace:{highway:"road",incline:"up"}},{old:{highway:"unsurfaced"},replace:{highway:"road",incline:"unpaved"}},{old:{landuse:"wood"},replace:{landuse:"forest",natural:"wood"}},{old:{natural:"marsh"},replace:{natural:"wetland",wetland:"marsh"}},{old:{power_source:"*"},replace:{"generator:source":"$1"}},{old:{power_rating:"*"},replace:{"generator:output":"$1"}},{old:{shop:"organic"},replace:{shop:"supermarket",organic:"only"}}];
23630
23631   var dataDiscarded = {created_by:true,odbl:true,"odbl:note":true,"tiger:upload_uuid":true,"tiger:tlid":true,"tiger:source":true,"tiger:separated":true,"geobase:datasetName":true,"geobase:uuid":true,"sub_sea:type":true,"KSJ2:ADS":true,"KSJ2:ARE":true,"KSJ2:AdminArea":true,"KSJ2:COP_label":true,"KSJ2:DFD":true,"KSJ2:INT":true,"KSJ2:INT_label":true,"KSJ2:LOC":true,"KSJ2:LPN":true,"KSJ2:OPC":true,"KSJ2:PubFacAdmin":true,"KSJ2:RAC":true,"KSJ2:RAC_label":true,"KSJ2:RIC":true,"KSJ2:RIN":true,"KSJ2:WSC":true,"KSJ2:coordinate":true,"KSJ2:curve_id":true,"KSJ2:curve_type":true,"KSJ2:filename":true,"KSJ2:lake_id":true,"KSJ2:lat":true,"KSJ2:long":true,"KSJ2:river_id":true,"SK53_bulk:load":true,"yh:LINE_NAME":true,"yh:LINE_NUM":true,"yh:STRUCTURE":true,"yh:TOTYUMONO":true,"yh:TYPE":true,"yh:WIDTH":true,"yh:WIDTH_RANK":true};
23632
23633   var dataLocales = {af:{rtl:false},ar:{rtl:true},"ar-AA":{rtl:true},ast:{rtl:false},be:{rtl:false},bg:{rtl:false},bn:{rtl:false},bs:{rtl:false},ca:{rtl:false},ckb:{rtl:true},cs:{rtl:false},cy:{rtl:false},da:{rtl:false},de:{rtl:false},dv:{rtl:true},el:{rtl:false},"en-AU":{rtl:false},"en-GB":{rtl:false},eo:{rtl:false},es:{rtl:false},et:{rtl:false},eu:{rtl:false},fa:{rtl:true},fi:{rtl:false},fr:{rtl:false},gan:{rtl:false},gl:{rtl:false},gu:{rtl:false},he:{rtl:true},hi:{rtl:false},hr:{rtl:false},hu:{rtl:false},hy:{rtl:false},ia:{rtl:false},id:{rtl:false},is:{rtl:false},it:{rtl:false},ja:{rtl:false},jv:{rtl:false},km:{rtl:false},kn:{rtl:false},ko:{rtl:false},ku:{rtl:false},lij:{rtl:false},lt:{rtl:false},lv:{rtl:false},mg:{rtl:false},mk:{rtl:false},ml:{rtl:false},mn:{rtl:false},ms:{rtl:false},ne:{rtl:false},nl:{rtl:false},nn:{rtl:false},no:{rtl:false},nv:{rtl:false},pl:{rtl:false},pt:{rtl:false},"pt-BR":{rtl:false},rm:{rtl:false},ro:{rtl:false},ru:{rtl:false},sc:{rtl:false},si:{rtl:false},sk:{rtl:false},sl:{rtl:false},so:{rtl:false},sq:{rtl:false},sr:{rtl:false},sv:{rtl:false},ta:{rtl:false},te:{rtl:false},th:{rtl:false},tl:{rtl:false},tr:{rtl:false},uk:{rtl:false},ur:{rtl:true},vi:{rtl:false},yue:{rtl:false},zh:{rtl:false},"zh-CN":{rtl:false},"zh-HK":{rtl:false},"zh-TW":{rtl:false}};
23634
23635   var dataPhoneFormats = {ag:"+1-268-555-1234",ai:"+1-264-555-1234",as:"+1-684-555-1234",at:"+43 1 123 45 67",bb:"+1-246-555-1234",bj:"+229 20 12 34 56",bm:"+1-441-555-1234",br:"+55 11 0982 1098",bs:"+1-242-555-1234",ca:"+1-226-555-1234",ci:"+225 20 12 34 56",cn:"+86 10 12345678",de:"+49 89 1234567",dm:"+1-767-555-1234","do":"+1-809-555-1234",es:"+34 989 12 34 56",fi:"+358 40 123 4567",fr:"+33 1 23 45 67 89",gb:"+44 1632 961234",gd:"+1-473-555-1234",gg:"+44 1632 961234",gu:"+1-671-555-1234",hk:"+852 1234 5678",hr:"+385 01 123 4567",hu:"+36 1 123 45 67",ie:"+353 20 912 3456",im:"+44 1632 961234",it:"+39 01 123 456",je:"+44 1632 961234",jm:"+1-876-555-1234",kn:"+1-869-555-1234",ky:"+1-345-555-1234",kz:"+7 495 1234567",lc:"+1-758-555-1234",mp:"+1-670-555-1234",ms:"+1-664-555-1234",nl:"+31 42 123 4567",no:"+47 22 12 34 56",pl:"+48 42 123 4567",pr:"+1-787-555-1234",pt:"+351 211 123456",ru:"+7 495 1234567",se:"+46 31 123 4567",si:"+386 31 123 4567",sj:"+47 22 12 34 56",sx:"+1-721-555-1234",tc:"+1-649-555-1234",tr:"+90 312 123 4567",tt:"+1-868-555-1234",tw:"+886 1 2345 6789",ua:"+380 44 123 4567",us:"+1-202-555-1234",va:"+39 01 123 456",vc:"+1-784-555-1234",vg:"+1-284-555-1234",vi:"+1-340-555-1234",vn:"+84 1 234 5678",za:"+27 11 907 1111"};
23636
23637   var dataShortcuts = [{tab:"browsing",text:"shortcuts.browsing.title",columns:[{rows:[{section:"navigation",text:"shortcuts.browsing.navigation.title"},{shortcuts:["↓","↑","←","→"],text:"shortcuts.browsing.navigation.pan",separator:","},{modifiers:["⌘"],shortcuts:["↓","↑","←","→"],text:"shortcuts.browsing.navigation.pan_more",separator:","},{shortcuts:["+","-"],text:"shortcuts.browsing.navigation.zoom",separator:","},{modifiers:["⌘"],shortcuts:["+","-"],text:"shortcuts.browsing.navigation.zoom_more",separator:","},{section:"help",text:"shortcuts.browsing.help.title"},{shortcuts:["help.key"],text:"shortcuts.browsing.help.help"},{shortcuts:["shortcuts.toggle.key"],text:"shortcuts.browsing.help.keyboard"},{section:"display_options",text:"shortcuts.browsing.display_options.title"},{shortcuts:["background.key"],text:"shortcuts.browsing.display_options.background"},{modifiers:["⌘"],shortcuts:["background.key"],text:"shortcuts.browsing.display_options.background_switch"},{shortcuts:["map_data.key"],text:"shortcuts.browsing.display_options.map_data"},{modifiers:["⌃","⌘"],shortcuts:["F","F11"],text:"shortcuts.browsing.display_options.fullscreen"},{shortcuts:["sidebar.key"],text:"shortcuts.browsing.display_options.sidebar"},{shortcuts:["area_fill.wireframe.key"],text:"shortcuts.browsing.display_options.wireframe"},{shortcuts:["background.minimap.key"],text:"shortcuts.browsing.display_options.minimap"}]},{rows:[{section:"selecting",text:"shortcuts.browsing.selecting.title"},{shortcuts:["Left-click"],text:"shortcuts.browsing.selecting.select_one"},{modifiers:["⇧"],shortcuts:["Left-click"],text:"shortcuts.browsing.selecting.select_multi"},{modifiers:["⇧"],shortcuts:["Left-click"],gesture:"shortcuts.gesture.drag",text:"shortcuts.browsing.selecting.lasso"},{modifiers:["⌘"],shortcuts:["F"],text:"shortcuts.browsing.selecting.search"},{section:"with_selected",text:"shortcuts.browsing.with_selected.title"},{shortcuts:["Right-click","shortcuts.key.space"],text:"shortcuts.browsing.with_selected.edit_menu"},{shortcuts:[],text:""},{section:"vertex_selected",text:"shortcuts.browsing.vertex_selected.title"},{shortcuts:["[","↖"],text:"shortcuts.browsing.vertex_selected.previous"},{shortcuts:["]","↘"],text:"shortcuts.browsing.vertex_selected.next"},{shortcuts:["{","⇞"],text:"shortcuts.browsing.vertex_selected.first"},{shortcuts:["}","⇟"],text:"shortcuts.browsing.vertex_selected.last"},{shortcuts:["\\","shortcuts.key.pause"],text:"shortcuts.browsing.vertex_selected.change_parent"}]}]},{tab:"editing",text:"shortcuts.editing.title",columns:[{rows:[{section:"drawing",text:"shortcuts.editing.drawing.title"},{shortcuts:["1"],text:"shortcuts.editing.drawing.add_point"},{shortcuts:["2"],text:"shortcuts.editing.drawing.add_line"},{shortcuts:["3"],text:"shortcuts.editing.drawing.add_area"},{shortcuts:["4"],text:"shortcuts.editing.drawing.add_note"},{shortcuts:["Left-click","shortcuts.key.space"],text:"shortcuts.editing.drawing.place_point"},{shortcuts:["⌥"],text:"shortcuts.editing.drawing.disable_snap"},{shortcuts:["↵","⎋"],text:"shortcuts.editing.drawing.stop_line"},{section:"commands",text:"shortcuts.editing.commands.title"},{modifiers:["⌘"],shortcuts:["C"],text:"shortcuts.editing.commands.copy"},{modifiers:["⌘"],shortcuts:["V"],text:"shortcuts.editing.commands.paste"},{modifiers:["⌘"],shortcuts:["Z"],text:"shortcuts.editing.commands.undo"},{modifiers:["⌘","⇧"],shortcuts:["Z"],text:"shortcuts.editing.commands.redo"},{modifiers:["⌘"],shortcuts:["S"],text:"shortcuts.editing.commands.save"}]},{rows:[{section:"operations",text:"shortcuts.editing.operations.title"},{shortcuts:["operations.continue.key"],text:"shortcuts.editing.operations.continue_line"},{shortcuts:["operations.merge.key"],text:"shortcuts.editing.operations.merge"},{shortcuts:["operations.disconnect.key"],text:"shortcuts.editing.operations.disconnect"},{shortcuts:["operations.detach_node.key"],text:"shortcuts.editing.operations.detach_node"},{shortcuts:["operations.split.key"],text:"shortcuts.editing.operations.split"},{shortcuts:["operations.reverse.key"],text:"shortcuts.editing.operations.reverse"},{shortcuts:["operations.move.key"],text:"shortcuts.editing.operations.move"},{shortcuts:["operations.rotate.key"],text:"shortcuts.editing.operations.rotate"},{shortcuts:["operations.orthogonalize.key"],text:"shortcuts.editing.operations.orthogonalize"},{shortcuts:["operations.circularize.key"],text:"shortcuts.editing.operations.circularize"},{shortcuts:["operations.reflect.key.long"],text:"shortcuts.editing.operations.reflect_long"},{shortcuts:["operations.reflect.key.short"],text:"shortcuts.editing.operations.reflect_short"},{modifiers:["⌘"],shortcuts:["⌫"],text:"shortcuts.editing.operations.delete"}]}]},{tab:"tools",text:"shortcuts.tools.title",columns:[{rows:[{section:"info",text:"shortcuts.tools.info.title"},{modifiers:["⌘"],shortcuts:["info_panels.key"],text:"shortcuts.tools.info.all"},{modifiers:["⌘","⇧"],shortcuts:["info_panels.background.key"],text:"shortcuts.tools.info.background"},{modifiers:["⌘","⇧"],shortcuts:["info_panels.history.key"],text:"shortcuts.tools.info.history"},{modifiers:["⌘","⇧"],shortcuts:["info_panels.location.key"],text:"shortcuts.tools.info.location"},{modifiers:["⌘","⇧"],shortcuts:["info_panels.measurement.key"],text:"shortcuts.tools.info.measurement"}]}]}];
23638
23639   var type$2 = "FeatureCollection";
23640   var features = [{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[1.97754,51.13111],[1.8457,63.45051],[-10.45898,57.01681],[-6.82251,55.26503],[-7.25583,55.06525],[-7.26546,55.0665],[-7.26992,55.06419],[-7.2725,55.06346],[-7.27818,55.05362],[-7.2893,55.04735],[-7.29939,55.0561],[-7.31835,55.04475],[-7.3447,55.05079],[-7.38831,55.02389],[-7.40547,55.00292],[-7.39157,54.99507],[-7.40075,54.98892],[-7.40706,54.98291],[-7.40363,54.97963],[-7.40633,54.97813],[-7.39835,54.97013],[-7.40745,54.96357],[-7.40178,54.95961],[-7.40727,54.95515],[-7.3944,54.94376],[-7.44444,54.93858],[-7.45216,54.89793],[-7.44204,54.87532],[-7.4713,54.83431],[-7.48092,54.83093],[-7.49216,54.82185],[-7.55121,54.79054],[-7.5443,54.78609],[-7.54958,54.75653],[-7.5349,54.74917],[-7.54881,54.74068],[-7.55941,54.74556],[-7.57894,54.74221],[-7.57507,54.7494],[-7.58606,54.75039],[-7.58872,54.74377],[-7.60031,54.74603],[-7.60632,54.74405],[-7.61662,54.74459],[-7.63593,54.75108],[-7.68854,54.72968],[-7.72064,54.72155],[-7.75094,54.70469],[-7.79094,54.71942],[-7.8051,54.71932],[-7.83497,54.73632],[-7.85419,54.72745],[-7.91496,54.67582],[-7.90174,54.66182],[-7.83832,54.63401],[-7.7433,54.6188],[-7.70863,54.63485],[-7.70682,54.6189],[-7.69386,54.6188],[-7.69631,54.61125],[-7.75845,54.59509],[-7.78708,54.58],[-7.79446,54.58141],[-7.79969,54.57704],[-7.79673,54.56915],[-7.8184,54.56315],[-7.83334,54.55227],[-7.82737,54.54299],[-7.85007,54.53363],[-7.90741,54.53722],[-7.93213,54.53388],[-8.00487,54.54568],[-8.03727,54.51162],[-8.04285,54.48759],[-8.08027,54.48829],[-8.09988,54.48395],[-8.09126,54.4765],[-8.111,54.47807],[-8.11512,54.46904],[-8.16542,54.46914],[-8.1776,54.46485],[-8.14293,54.45003],[-8.16284,54.4413],[-8.08731,54.4002],[-8.06062,54.37051],[-8.03289,54.35711],[-8.00054,54.34835],[-7.93333,54.30561],[-7.85849,54.29151],[-7.87067,54.28794],[-7.87265,54.26648],[-7.86123,54.25931],[-7.85917,54.21256],[-7.71043,54.20307],[-7.70193,54.20776],[-7.68828,54.202],[-7.67644,54.18906],[-7.66082,54.1871],[-7.62554,54.16545],[-7.62541,54.15319],[-7.61026,54.14353],[-7.57421,54.14142],[-7.57181,54.13287],[-7.56228,54.12704],[-7.51379,54.12998],[-7.47944,54.122],[-7.47169,54.12665],[-7.47075,54.13318],[-7.44684,54.15168],[-7.40792,54.156],[-7.42579,54.14092],[-7.41903,54.13629],[-7.3744,54.14172],[-7.37234,54.13881],[-7.39509,54.12624],[-7.39182,54.12017],[-7.36341,54.13157],[-7.34518,54.11577],[-7.32471,54.12123],[-7.32003,54.11379],[-7.3078,54.11718],[-7.30548,54.12347],[-7.31591,54.12697],[-7.31213,54.13162],[-7.3187,54.13411],[-7.31857,54.13745],[-7.32222,54.13836],[-7.32737,54.13544],[-7.3399,54.14585],[-7.30827,54.16716],[-7.30024,54.16625],[-7.29029,54.1715],[-7.28158,54.16839],[-7.2863,54.14919],[-7.29874,54.14904],[-7.30162,54.14411],[-7.28411,54.13971],[-7.29192,54.13071],[-7.29737,54.133],[-7.30883,54.13242],[-7.30333,54.12251],[-7.29218,54.11929],[-7.27844,54.12282],[-7.27707,54.12986],[-7.26613,54.13624],[-7.2566,54.16354],[-7.24015,54.17125],[-7.2575,54.17678],[-7.2581,54.19257],[-7.25179,54.19403],[-7.23608,54.1935],[-7.23338,54.19792],[-7.24317,54.20076],[-7.24892,54.1977],[-7.25183,54.20201],[-7.24119,54.20623],[-7.23094,54.20578],[-7.23269,54.20912],[-7.22188,54.21607],[-7.20643,54.2117],[-7.18506,54.22485],[-7.17055,54.21742],[-7.14721,54.22488],[-7.14633,54.23008],[-7.15051,54.23165],[-7.14613,54.23983],[-7.15802,54.24434],[-7.13985,54.25298],[-7.15255,54.26235],[-7.16064,54.27405],[-7.17991,54.27144],[-7.17201,54.28627],[-7.21252,54.2985],[-7.19888,54.31117],[-7.17918,54.30946],[-7.1812,54.3397],[-7.15339,54.33514],[-7.10253,54.35811],[-7.10811,54.36677],[-7.06927,54.3899],[-7.05593,54.41056],[-7.02898,54.42135],[-7.00198,54.40832],[-6.98683,54.40829],[-6.97562,54.40014],[-6.96774,54.40145],[-6.90682,54.36966],[-6.89772,54.35075],[-6.87527,54.33853],[-6.86512,54.32568],[-6.85163,54.29137],[-6.87452,54.28677],[-6.87791,54.27918],[-6.86673,54.27522],[-6.85177,54.26489],[-6.83693,54.26658],[-6.82165,54.24346],[-6.81633,54.22299],[-6.80045,54.22108],[-6.80122,54.21338],[-6.77599,54.19965],[-6.75573,54.1987],[-6.74316,54.18258],[-6.73406,54.18566],[-6.72445,54.18127],[-6.70295,54.20036],[-6.69166,54.20018],[-6.68673,54.19398],[-6.669,54.19584],[-6.65248,54.18102],[-6.6433,54.17801],[-6.63467,54.16449],[-6.63179,54.14766],[-6.64081,54.14238],[-6.63935,54.13599],[-6.66149,54.1205],[-6.6481,54.10153],[-6.66119,54.0934],[-6.66458,54.06629],[-6.64681,54.05873],[-6.62501,54.03737],[-6.59291,54.04755],[-6.58905,54.05808],[-6.5597,54.0481],[-6.52897,54.05888],[-6.50442,54.05566],[-6.47824,54.07004],[-6.47919,54.07762],[-6.43601,54.05959],[-6.36314,54.07057],[-6.36589,54.09338],[-6.36293,54.09758],[-6.37104,54.11497],[-6.3522,54.11084],[-6.34242,54.1114],[-6.33589,54.10833],[-6.33636,54.09469],[-6.31808,54.09096],[-6.30903,54.10463],[-6.29165,54.11235],[-6.28246,54.11145],[-6.26272,54.09786],[-5.35583,53.72597],[-7.0752,49.23912],[-1.83472,49.02346],[-2.12036,49.94415],[1.97754,51.13111]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-65.2,18.7],[-65,16.3],[-63.7,19.2],[-65.2,18.7]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-63,-50.5],[-55,-51],[-60,-54],[-63,-50.5]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-139.19952,60.08402],[-141,60.30621],[-141,76],[-169,68.63655],[-169,65.20147],[-180,61],[-180,-4],[-154,9],[-133.76404,54.54021],[-130.73868,54.71986],[-129.96277,55.29163],[-130.15228,55.7758],[-130.01787,55.90688],[-130.00362,56.00798],[-130.10284,56.12336],[-130.24498,56.09656],[-130.42625,56.14249],[-131.87439,56.79787],[-135.02884,59.56285],[-135.11759,59.62306],[-135.15827,59.6261],[-135.47928,59.79822],[-136.28677,59.57955],[-136.30531,59.46462],[-136.36836,59.44898],[-136.47697,59.46558],[-137.19727,59.01935],[-139.19952,60.08402]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-111.96064,48.99841],[-121.22623,49.00049],[-122.26513,49.00246],[-122.7565,49.00208],[-123.32218,49.00218],[-122.97821,48.76524],[-123.2666,48.69821],[-123.21991,48.21186],[-125.80444,48.60749],[-124.32129,31.54109],[-117.125,32.53429],[-116.82417,32.55996],[-115.88036,32.63735],[-115.49738,32.66486],[-114.71984,32.71877],[-114.7649,32.64602],[-114.80885,32.60959],[-114.81481,32.49451],[-112.81743,31.88004],[-111.07481,31.33224],[-109.56051,31.33402],[-108.20847,31.33384],[-108.20838,31.78363],[-106.52847,31.78391],[-106.52781,31.78086],[-106.52249,31.77501],[-106.51249,31.76933],[-106.50988,31.7612],[-106.50709,31.76123],[-106.48896,31.74806],[-106.48473,31.74769],[-106.4719,31.75101],[-106.46816,31.75897],[-106.45434,31.76466],[-106.45035,31.76426],[-106.43516,31.75492],[-106.41484,31.75101],[-106.37864,31.73021],[-106.37225,31.71174],[-106.34924,31.69633],[-106.33289,31.66178],[-106.3068,31.62459],[-106.28079,31.56179],[-106.24775,31.54226],[-106.2329,31.49982],[-106.2105,31.46857],[-106.08201,31.39863],[-106.00554,31.39233],[-105.76401,31.17051],[-105.58548,31.06117],[-105.56419,30.98526],[-104.99153,30.6639],[-104.97162,30.60896],[-104.90639,30.57822],[-104.83772,30.38117],[-104.70177,30.20567],[-104.68048,29.92399],[-104.57611,29.77838],[-104.51157,29.63674],[-104.39758,29.57047],[-104.39278,29.55293],[-104.05769,29.32173],[-103.79883,29.2581],[-103.78196,29.26555],[-103.76759,29.22799],[-103.14102,28.93666],[-102.86087,29.2217],[-102.65076,29.79418],[-101.41068,29.73457],[-101.26511,29.51372],[-101.05997,29.452],[-101.04083,29.38038],[-100.96303,29.34735],[-100.94406,29.34369],[-100.94071,29.33351],[-100.92775,29.32663],[-100.89814,29.30957],[-100.87818,29.28086],[-100.80076,29.2238],[-100.76437,29.15981],[-100.67047,29.08663],[-100.6412,28.91299],[-100.63236,28.90255],[-100.61296,28.89939],[-100.534,28.75622],[-100.51495,28.74531],[-100.50705,28.7143],[-100.51203,28.70666],[-100.51014,28.69127],[-100.50048,28.66186],[-100.45547,28.6381],[-100.44697,28.60743],[-100.35599,28.45239],[-100.34946,28.39653],[-100.29488,28.31315],[-100.29591,28.27324],[-100.17197,28.17493],[-99.93645,27.9568],[-99.87722,27.80173],[-99.79671,27.73338],[-99.772,27.72532],[-99.74556,27.69979],[-99.71947,27.65981],[-99.5957,27.59974],[-99.54094,27.60537],[-99.53055,27.57973],[-99.52034,27.55782],[-99.52802,27.49773],[-99.50141,27.49986],[-99.48755,27.49518],[-99.47897,27.48421],[-99.48661,27.46453],[-99.49534,27.44861],[-99.48927,27.40941],[-99.53957,27.31565],[-99.43588,27.19678],[-99.46404,27.01968],[-99.16698,26.56039],[-99.17474,26.53939],[-99.12698,26.51958],[-99.1135,26.42954],[-99.08355,26.39625],[-99.06007,26.39737],[-99.03634,26.41255],[-99.02042,26.40598],[-99.01291,26.39364],[-98.95686,26.38641],[-98.9566,26.37365],[-98.94523,26.36949],[-98.90013,26.36419],[-98.89905,26.35454],[-98.80305,26.36626],[-98.78254,26.30511],[-98.66667,26.23457],[-98.58496,26.24647],[-98.57951,26.23434],[-98.56519,26.23987],[-98.56294,26.22464],[-98.50599,26.20858],[-98.44806,26.21236],[-98.38617,26.15721],[-98.34176,26.15278],[-98.33579,26.1388],[-98.30626,26.10003],[-98.28841,26.10512],[-98.26524,26.0914],[-98.19898,26.06411],[-98.09577,26.05698],[-98.07568,26.06667],[-98.08302,26.03396],[-97.9771,26.04136],[-97.9532,26.06179],[-97.81643,26.04475],[-97.77017,26.02439],[-97.73884,26.02902],[-97.5289,25.90648],[-97.52151,25.88625],[-97.50615,25.89031],[-97.49851,25.89903],[-97.49637,25.89641],[-97.49748,25.88008],[-97.49422,25.87981],[-97.48847,25.88564],[-97.46409,25.88174],[-97.42607,25.842],[-97.36856,25.8396],[-97.26231,25.94724],[-80.81543,24.00633],[-66.87378,44.77794],[-67.16148,45.16715],[-67.2286,45.16739],[-67.26246,45.18797],[-67.28311,45.19175],[-67.28959,45.18784],[-67.29332,45.17568],[-67.29049,45.17317],[-67.3001,45.16776],[-67.3025,45.16122],[-67.29761,45.14766],[-67.33975,45.1255],[-67.40524,45.16122],[-67.40387,45.17139],[-67.4818,45.27682],[-67.42172,45.38543],[-67.45262,45.41008],[-67.50498,45.4889],[-67.41623,45.50105],[-67.42219,45.55661],[-67.42902,45.56833],[-67.42331,45.57154],[-67.42498,45.57836],[-67.45193,45.60323],[-67.77981,45.6738],[-67.79019,47.06776],[-67.88006,47.1067],[-67.91319,47.14793],[-67.92598,47.15418],[-67.95181,47.1875],[-68.02374,47.23915],[-68.13017,47.29309],[-68.17669,47.32893],[-68.24046,47.35354],[-68.32809,47.36005],[-68.36363,47.35476],[-68.38054,47.34167],[-68.38509,47.30321],[-68.37367,47.28796],[-68.4377,47.28232],[-68.47916,47.29623],[-68.51074,47.29885],[-68.54593,47.28441],[-68.58408,47.28482],[-68.59777,47.27134],[-68.59271,47.25762],[-68.61889,47.24148],[-68.68936,47.24125],[-68.71768,47.23676],[-68.80128,47.21423],[-68.89629,47.17676],[-69.05354,47.24847],[-69.04924,47.41798],[-69.22425,47.45961],[-69.99729,46.69558],[-70.0569,46.4149],[-70.25551,46.10871],[-70.29001,46.09431],[-70.39919,45.80667],[-70.83229,45.40062],[-70.80794,45.37878],[-70.82663,45.2367],[-70.87538,45.23453],[-70.92138,45.28099],[-70.90645,45.30918],[-71.0109,45.34798],[-71.08429,45.30556],[-71.1454,45.24226],[-71.20525,45.25278],[-71.28925,45.30097],[-71.41405,45.23513],[-71.43044,45.12381],[-71.49692,45.06991],[-71.50623,45.04878],[-71.49284,45.03629],[-71.50027,45.01372],[-71.79359,45.01075],[-72.08774,45.00581],[-72.14155,45.00568],[-72.15282,45.00609],[-72.17142,45.00584],[-72.25847,45.00436],[-72.38795,45.00626],[-72.4496,45.00863],[-72.5356,45.00936],[-72.66257,45.01523],[-72.82537,45.01642],[-73.08466,45.01561],[-73.45219,45.00875],[-74.14699,44.99145],[-74.33753,44.9923],[-74.50786,44.99798],[-74.66158,44.99949],[-74.71244,44.99734],[-74.75887,44.98708],[-74.76368,45.00632],[-74.78977,45.00365],[-74.82376,45.01773],[-74.94186,44.98229],[-75.30098,44.83883],[-75.30304,44.82836],[-75.59418,44.6457],[-75.97269,44.33502],[-75.97295,44.34595],[-76.00059,44.34797],[-76.17645,44.2865],[-76.18744,44.22158],[-76.88782,43.82759],[-79.16851,43.32168],[-79.05487,43.25371],[-79.05092,43.169],[-79.04603,43.16093],[-79.04208,43.13942],[-79.07002,43.12038],[-79.06015,43.114],[-79.0568,43.10474],[-79.0774,43.07861],[-78.9996,43.05484],[-79.02311,43.02071],[-79.02552,42.99473],[-78.96235,42.9573],[-78.91188,42.9426],[-78.90398,42.89181],[-82.42767,41.47978],[-83.14316,42.03807],[-83.12805,42.23843],[-83.09715,42.29052],[-83.07252,42.31515],[-82.94575,42.34332],[-82.59676,42.5479],[-82.51368,42.61785],[-82.5108,42.66464],[-82.4675,42.76415],[-82.48055,42.80573],[-82.45497,42.9284],[-82.41334,42.97099],[-82.42596,42.99536],[-82.15851,43.39507],[-83.53729,46.098],[-83.96301,46.05036],[-84.11021,46.23851],[-84.09794,46.25656],[-84.11613,46.26878],[-84.11905,46.31516],[-84.10721,46.3218],[-84.14394,46.41076],[-84.11682,46.51576],[-84.13536,46.53218],[-84.16162,46.5284],[-84.21621,46.53891],[-84.26994,46.49189],[-84.36092,46.50997],[-84.55284,46.4407],[-84.95178,46.77185],[-89.59179,48.00307],[-89.67547,48.00371],[-90.87204,48.25943],[-91.41312,48.06753],[-92.99377,48.62474],[-93.34877,48.62604],[-93.35529,48.61124],[-93.37074,48.60584],[-93.39812,48.60369],[-93.40542,48.61089],[-93.43846,48.59478],[-93.46859,48.59205],[-93.45735,48.56667],[-93.46533,48.54593],[-93.64763,48.51751],[-93.80625,48.51888],[-93.80642,48.58047],[-93.83328,48.62582],[-93.84865,48.63064],[-93.93388,48.6326],[-94.01327,48.64471],[-94.16176,48.64697],[-94.25025,48.65463],[-94.24931,48.67827],[-94.26046,48.69816],[-94.30578,48.71073],[-94.32758,48.70433],[-94.36123,48.70478],[-94.38406,48.71135],[-94.41629,48.71067],[-94.44294,48.69266],[-94.53615,48.7024],[-94.55031,48.71419],[-94.58894,48.71928],[-94.69425,48.77938],[-94.70129,48.83376],[-94.68996,48.83953],[-94.68395,48.99914],[-111.96064,48.99841]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[180,55],[170,53],[180,49],[180,55]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[143,22],[147,22],[147,12],[143,12],[143,22]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-171.5,-10],[-171,-15],[-167,-15],[-171.5,-10]]]}}];
23641   var dataImperial = {
23642   type: type$2,
23643   features: features
23644   };
23645
23646   var type$3 = "FeatureCollection";
23647   var features$1 = [{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[113.573,22.186],[114,22.5],[114.05534,22.503],[114.0595,22.51422],[114.07345,22.51934],[114.0786,22.53012],[114.08512,22.53228],[114.09034,22.53717],[114.09611,22.53486],[114.10602,22.53472],[114.1115,22.52929],[114.11522,22.5308],[114.11649,22.53418],[114.11979,22.53511],[114.1244,22.5393],[114.12729,22.53947],[114.13018,22.54132],[114.13807,22.5432],[114.14429,22.54176],[114.14441,22.54114],[114.14846,22.54179],[114.14855,22.54397],[114.15042,22.54593],[114.14964,22.54954],[114.15166,22.55168],[114.15192,22.55438],[114.15642,22.55495],[114.15841,22.55909],[114.16032,22.56153],[114.16162,22.56187],[114.1634,22.55931],[114.16553,22.5593],[114.16733,22.56119],[114.16934,22.56093],[114.17061,22.5597],[114.17702,22.56],[114.17798,22.55546],[114.18401,22.5552],[114.18673,22.55468],[114.1878,22.55545],[114.18979,22.55446],[114.1955,22.55564],[114.19674,22.55691],[114.20005,22.55717],[114.20376,22.55623],[114.20884,22.55672],[114.22438,22.55055],[114.2264,22.5476],[114.22545,22.54528],[114.22661,22.54339],[114.32,22.576],[114.45,22.43],[114.45,22.14],[113.9,22.14],[113.75,22.22],[113.553,22.095],[113.54678,22.1207],[113.5456,22.1207],[113.54076,22.12373],[113.54016,22.13618],[113.54701,22.13651],[113.5475,22.14583],[113.52456,22.17978],[113.53623,22.20191],[113.53299,22.21232],[113.53497,22.21351],[113.53735,22.21377],[113.54156,22.21315],[113.54385,22.21709],[113.55849,22.21565],[113.573,22.186]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-75,18],[-80,20.5],[-83,19],[-77,16],[-75,18]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-64.33594,32.86113],[-79.39819,27.21067],[-80.63965,23.71998],[-73.39966,20.40642],[-65.1709,19.20743],[-65.09399,16.23577],[-59.13391,16.80454],[-62.64404,15.16228],[-59.43054,14.85985],[-62.83081,13.64599],[-61.80359,10.73752],[-62.08649,10.04729],[-61.06201,9.85522],[-59.81369,8.31274],[-59.8027,8.27469],[-59.83498,8.22712],[-59.94141,8.21149],[-59.99771,8.15576],[-59.97986,8.13265],[-59.99771,8.12041],[-60.00183,8.07147],[-60.05127,8.02524],[-60.09933,8.03747],[-60.12268,8.02388],[-60.14053,7.98988],[-60.36163,7.83345],[-60.53467,7.81713],[-60.5896,7.6375],[-60.72144,7.54493],[-60.5896,7.31888],[-60.63904,7.24532],[-60.54703,7.12542],[-60.46875,7.20309],[-60.37262,7.18401],[-60.29984,7.1445],[-60.2916,7.06819],[-60.39871,6.95097],[-60.66513,6.83235],[-60.71869,6.75053],[-60.91232,6.81735],[-60.94254,6.72053],[-61.14441,6.72326],[-61.23093,6.5773],[-61.1554,6.45314],[-61.14441,6.20199],[-61.39709,5.95619],[-60.71045,5.20036],[-60.21606,5.23319],[-59.99634,5.06906],[-60.13916,4.51071],[-59.69971,4.40118],[-59.5459,3.93002],[-59.87549,3.56825],[-59.7876,3.37086],[-60.01831,2.83332],[-59.90845,2.38335],[-59.69971,2.2626],[-59.77661,1.87833],[-59.65302,1.85087],[-59.69147,1.75754],[-59.61456,1.71361],[-59.55139,1.73283],[-59.36188,1.49123],[-59.26575,1.39238],[-58.92242,1.30726],[-58.83728,1.17271],[-58.71918,1.23037],[-58.71094,1.29902],[-58.49121,1.26058],[-58.461,1.37591],[-58.50494,1.38689],[-58.51044,1.46102],[-58.38135,1.4775],[-58.32642,1.57359],[-58.00507,1.49946],[-57.99133,1.65321],[-57.79907,1.69165],[-57.70844,1.71087],[-57.54364,1.68341],[-57.41455,1.94421],[-57.10693,1.97715],[-56.8103,1.85636],[-56.48071,1.92225],[-55.90942,1.81244],[-55.90942,2.04302],[-56.14014,2.26534],[-55.94788,2.53701],[-55.70892,2.39981],[-55.37933,2.43274],[-55.19257,2.53976],[-54.98108,2.57268],[-54.88495,2.43548],[-54.71191,2.46293],[-54.69543,2.34767],[-54.58832,2.32846],[-54.43451,2.43548],[-54.20654,2.76748],[-54.17358,3.12955],[-53.96484,3.57921],[-54.33838,4.00674],[-54.44412,4.52577],[-54.46884,4.91036],[-54.36653,5.13061],[-54.27727,5.26191],[-54.19968,5.3084],[-54.01222,5.54457],[-54.0239,5.64605],[-53.86322,5.94936],[-64.33594,32.86113]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-14.5,-6],[11.79657,-17.27197],[12.03415,-17.14866],[12.38159,-17.22213],[12.58484,-17.22476],[13.01193,-16.97405],[13.24951,-17.00098],[13.38135,-16.98522],[13.93341,-17.38734],[18.42476,-17.38996],[18.47763,-17.46857],[18.62663,-17.64599],[18.79211,-17.76177],[18.92944,-17.82061],[19.33044,-17.84806],[19.66278,-17.8644],[19.74792,-17.90557],[19.85161,-17.87486],[20.10361,-17.90296],[20.18394,-17.88401],[20.34737,-17.88466],[20.44693,-17.91733],[20.51697,-17.96698],[20.83008,-18.03032],[20.95711,-17.97285],[21.16997,-17.93497],[21.42677,-18.0264],[23.45032,-17.63879],[22.00012,-16.38866],[21.99944,-13.00523],[24.03809,-12.99118],[24.03809,-10.91962],[24.43359,-11.09217],[24.45557,-11.48002],[25.37842,-11.19996],[25.42236,-11.60919],[26.96045,-11.97484],[27.18018,-11.60919],[28.125,-12.42048],[29.11377,-13.36824],[29.1687,-13.43771],[29.55872,-13.19716],[29.68506,-13.2239],[29.62463,-13.41099],[29.80591,-13.44305],[29.81415,-12.14809],[29.31152,-12.55456],[28.41064,-11.78133],[28.63037,-10.70379],[28.65234,-9.73071],[28.37219,-9.24309],[28.89748,-8.47916],[30.78644,-8.26857],[29.39941,-6.05316],[29.4873,-4.45595],[29.75922,-4.46759],[29.81415,-4.36421],[29.88007,-4.36832],[30.04074,-4.26699],[30.07919,-4.1629],[30.18356,-4.08311],[30.1918,-4.05126],[30.21566,-4.04595],[30.22923,-4.01136],[30.21326,-3.99612],[30.25978,-3.88755],[30.29274,-3.86288],[30.34424,-3.77245],[30.39848,-3.79095],[30.40878,-3.76765],[30.39548,-3.7304],[30.39054,-3.72821],[30.3896,-3.71918],[30.39093,-3.7101],[30.39514,-3.70444],[30.42028,-3.64963],[30.46886,-3.53501],[30.67108,-3.41335],[30.63297,-3.34892],[30.84206,-3.25535],[30.84549,-3.16108],[30.83485,-3.09698],[30.7933,-3.06235],[30.82111,-3.02258],[30.84515,-2.9739],[30.74764,-2.99618],[30.7037,-2.97013],[30.66422,-2.98967],[30.57632,-2.90738],[30.49393,-2.94441],[30.41016,-2.87172],[30.52002,-2.39432],[30.77545,-2.38883],[30.8606,-2.31199],[30.84961,-2.19398],[30.89081,-2.07322],[30.81116,-1.96068],[30.83862,-1.6587],[30.73425,-1.4418],[30.56259,-1.33884],[30.4541,-1.05737],[30.35797,-1.06287],[30.34149,-1.13152],[30.16571,-1.34296],[29.91852,-1.48024],[29.83887,-1.31824],[29.58344,-1.39238],[29.729,0.05493],[29.96796,0.5136],[29.9707,0.8569],[30.22339,0.92281],[30.24536,1.15349],[30.47745,1.20772],[31.30966,2.15693],[31.20255,2.22211],[31.20255,2.29278],[31.16409,2.27906],[31.13937,2.28318],[31.13113,2.26534],[31.07826,2.30033],[31.0714,2.34767],[31.00479,2.4005],[30.97183,2.40461],[30.94711,2.38746],[30.94849,2.36276],[30.9375,2.33532],[30.88531,2.34012],[30.83038,2.42176],[30.74112,2.43274],[30.76035,2.5864],[30.90179,2.88132],[30.76447,3.04178],[30.93613,3.40239],[30.94059,3.50588],[30.85236,3.48601],[30.90866,3.5936],[30.95055,3.63918],[30.94677,3.65391],[30.9866,3.70187],[31.00582,3.70701],[31.02058,3.69708],[31.16547,3.7954],[31.28838,3.79643],[31.52699,3.66282],[31.7038,3.72449],[31.82671,3.82794],[31.96198,3.65596],[31.95854,3.57099],[32.04987,3.59155],[32.07733,3.57099],[32.0842,3.53672],[32.20093,3.50657],[32.21672,3.56448],[32.19578,3.59977],[32.41516,3.74504],[32.72055,3.76782],[32.89307,3.81219],[33.02782,3.89371],[33.18146,3.7793],[33.51173,3.75258],[33.98758,4.23309],[34.05762,4.28342],[34.38721,4.61065],[35.94452,4.62023],[35.95688,4.53467],[36.04134,4.44568],[36.89621,4.4491],[38.14728,3.62992],[38.55927,3.62033],[38.92181,3.51068],[39.56039,3.43392],[39.87076,3.87522],[40.76752,4.28753],[41.16371,3.94372],[41.89774,3.97797],[41.31271,3.14463],[40.98896,2.82869],[40.99548,-0.84042],[41.7,-1.8],[41.7,-49],[-27,-60],[-65.7,-52.5],[-14.5,-6]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[31.33301,35.47856],[33.0249,33.75175],[35.44189,36.02245],[31.33301,35.47856]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[14,36.5],[15,36],[14,35],[14,36.5]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[0,62],[2.5,51.3],[-2,50],[-1.9,49],[-20,53],[0,62]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[180,-35],[161,-19],[167,-12],[180,-22],[180,4],[170,3.7],[127,5.7],[118,2.7],[119.5,5.4],[117.2,7.5],[102.6,8],[102.9158,11.74099],[102.76268,12.07357],[102.70226,12.17158],[102.74139,12.46474],[102.53128,12.68857],[102.49557,12.9256],[102.49763,13.0064],[102.4597,13.08199],[102.43412,13.09026],[102.39155,13.16407],[102.35481,13.29341],[102.35893,13.30945],[102.34503,13.34837],[102.35928,13.39797],[102.3567,13.48095],[102.36168,13.50582],[102.33559,13.53787],[102.33971,13.56023],[102.35498,13.5649],[102.36511,13.5785],[102.40047,13.5679],[102.42537,13.56891],[102.44614,13.56123],[102.48047,13.57091],[102.53849,13.56757],[102.5699,13.58526],[102.57806,13.60486],[102.62501,13.60845],[102.62132,13.61295],[102.60767,13.61562],[102.57231,13.63331],[102.56922,13.64082],[102.54879,13.658],[102.56252,13.68552],[102.5972,13.70803],[102.67084,13.74472],[102.68818,13.75172],[102.7014,13.7684],[102.73161,13.77082],[102.76543,13.85541],[102.78397,13.93207],[102.80388,13.94406],[102.81607,13.96639],[102.90705,14.02119],[102.89726,14.0535],[102.90095,14.0838],[102.92421,14.10744],[102.92378,14.12838],[102.94147,14.15035],[102.92953,14.17952],[103.17535,14.33774],[103.19939,14.32992],[103.68553,14.44],[103.94508,14.34157],[104.05756,14.34589],[104.06636,14.3419],[104.26025,14.37749],[104.50058,14.36984],[104.57817,14.36019],[104.6422,14.42387],[104.66632,14.40234],[104.68357,14.39877],[104.71138,14.43169],[104.72305,14.42188],[104.71687,14.40043],[104.75344,14.40459],[104.80408,14.43867],[104.83429,14.41573],[104.99239,14.3838],[105.05402,14.19783],[105.47905,14.49186],[105.60883,15.0005],[105.46703,15.13005],[105.48866,15.20237],[105.59269,15.2716],[105.58617,15.32823],[105.50308,15.31912],[105.46703,15.33948],[105.49175,15.37921],[105.59372,15.42869],[105.59372,15.50927],[105.60986,15.54871],[105.62616,15.56492],[105.62702,15.59129],[105.63518,15.62742],[105.63612,15.66056],[105.5975,15.72088],[105.49965,15.76681],[105.46291,15.74517],[105.43819,15.75459],[105.40489,15.79424],[105.34241,15.92039],[105.37811,15.98344],[105.39167,15.99136],[105.41931,15.98608],[105.42652,15.99764],[105.41468,16.01661],[105.21263,16.05076],[105.04955,16.10552],[105.01316,16.24401],[104.88235,16.37812],[104.8391,16.45782],[104.77936,16.49041],[104.73919,16.53287],[104.74228,16.62205],[104.76391,16.70953],[104.73953,16.80323],[104.76425,16.85088],[104.73782,16.90968],[104.744,17.0128],[104.81266,17.21853],[104.79841,17.39274],[104.70348,17.52833],[104.46384,17.65515],[104.34368,17.83564],[104.27776,17.8559],[104.22661,17.98069],[104.1116,18.10735],[104.06525,18.21174],[103.97392,18.33823],[103.9286,18.33237],[103.88809,18.29456],[103.85582,18.28673],[103.83659,18.32715],[103.79128,18.3467],[103.70201,18.34214],[103.60931,18.40405],[103.57292,18.40437],[103.51593,18.42978],[103.45963,18.42587],[103.41568,18.44802],[103.30479,18.43206],[103.24265,18.37082],[103.24333,18.34133],[103.29123,18.32357],[103.28899,18.29521],[103.23595,18.28299],[103.16608,18.25511],[103.02429,17.98135],[102.6535,17.83237],[102.40631,17.99963],[102.10968,18.22413],[101.548,17.81538],[101.30493,17.64991],[101.14563,17.46595],[100.95886,17.61654],[101.01757,17.88858],[101.18752,18.05121],[101.16863,18.10409],[101.18134,18.33595],[101.08727,18.38287],[101.05499,18.43988],[101.23215,18.73015],[101.35265,19.04524],[101.25927,19.12733],[101.2373,19.32637],[101.25824,19.58438],[101.11954,19.56836],[101.08898,19.58777],[101.08624,19.59715],[101.03165,19.6185],[100.89844,19.62125],[100.77827,19.49249],[100.63751,19.56432],[100.58258,19.49313],[100.47478,19.5944],[100.42929,19.67152],[100.43341,19.7024],[100.4147,19.7255],[100.40525,19.7646],[100.43907,19.80345],[100.45555,19.84843],[100.50636,19.87264],[100.51709,19.93027],[100.58653,20.1599],[100.56576,20.1757],[100.54945,20.17473],[100.52731,20.14379],[100.51065,20.14895],[100.48697,20.17956],[100.46774,20.196],[100.45246,20.20147],[100.45521,20.22129],[100.44783,20.23546],[100.41607,20.25286],[100.40594,20.28184],[100.38397,20.31082],[100.37556,20.35187],[100.36165,20.35638],[100.35736,20.37408],[100.33195,20.39902],[100.27805,20.40224],[100.25917,20.39677],[100.2475,20.37263],[100.22535,20.35509],[100.22346,20.31839],[100.16579,20.29988],[100.17162,20.24545],[100.10845,20.25221],[100.09266,20.2696],[100.09798,20.31485],[100.07961,20.3678],[99.9567,20.46417],[99.91636,20.44925],[99.90765,20.44977],[99.89121,20.44511],[99.87276,20.44406],[99.86212,20.44326],[99.80186,20.33948],[99.46472,20.3884],[99.56085,20.20035],[99.43691,20.08882],[99.27727,20.11623],[99.06921,20.1101],[98.97789,19.74538],[98.24387,19.68656],[97.85934,19.57014],[97.76733,18.57336],[97.39655,18.47179],[97.62451,18.30238],[97.73849,17.97743],[97.66502,17.87943],[97.90947,17.56745],[98.52951,16.82557],[98.51303,16.69276],[98.69293,16.26873],[98.87421,16.43609],[98.93394,16.3353],[98.84743,16.13356],[98.74512,16.12037],[98.58307,16.07287],[98.5762,15.79754],[98.54736,15.37557],[98.17383,15.15167],[98.3606,14.63674],[99.08295,13.89208],[99.16534,13.72204],[99.18182,13.00723],[99.39331,12.56797],[99.64153,11.78973],[99.32156,11.30266],[98.77859,10.67849],[98.80597,10.47642],[98.76657,10.40459],[98.74924,10.34194],[96.85547,6.40265],[92.42523,20.54794],[92.2728,20.96272],[92.187,21.16],[92.26,21.36],[92.27,21.4328],[92.62,21.43],[92.6,22],[93.22,22.25],[93.4,23.7],[93.34,23.95],[94.155,23.847],[94.17,23.92],[94.25171,24.07405],[94.28,24.23],[94.30175,24.2371],[94.3256,24.2731],[94.6,24.7],[94.78,25.47],[95.2,26],[95.1,26.6],[97.3,27.9],[96.14,29.38],[95.4,29.1],[94.8,29.2],[92.5,27.8],[91.64,27.76],[91.4,28],[89.58,28.18],[88.9,27.32],[88.74,27.47],[88.9,27.86],[88.7,28.1],[88.1,27.87],[85.93,27.942],[81.6,30.5],[81.2,30],[78.73,31.5],[78.77,31.99],[78.4,32.5],[79.3,32.5],[79,34.3],[78.3,34.6],[78,35.5],[76.1,35.8],[76,36.55],[75.15,37],[72.5,36.9],[71.1,36.1],[71.65,35.44],[71.45,35],[70.985,34.54],[71.18,34.36],[71.092,34.118],[70.88,33.97],[70.5,33.94],[69.908,34.04],[69.869,33.96],[70,33.75],[70.13,33.73],[70.34,33.34],[70.013,33.14],[69.57,33.09],[69.24,32.45],[69.3,31.9],[68.1,31.6],[66.393,30.934],[66.2,29.8],[62.5,29.4],[60.87,29.86],[61.53,29.0165],[61.66,28.77],[61.96,28.54],[62.43,28.42],[62.6,28.25],[62.795,28.28],[62.86,27.25],[63.24,27.25],[63.327,27.13],[63.25,27.1],[63.25,26.84],[63.18,26.83],[63.18,26.65],[62.3,26.5],[62.2,26.28],[61.85,26.22],[61.84,25.75],[61.68,25.67],[56.5,-21],[180,-65],[180,-35]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[138.7,46.7],[145.5,44.5],[145.2,43.7],[146,43.3],[142,18],[122,24.3],[138.7,46.7]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-180,7],[-148,7],[-151,-12],[-171.5,-10.75],[-171,-16],[-152,-19],[-180,-55],[-180,7]]]}}];
23648   var dataDriveLeft = {
23649   type: type$3,
23650   features: features$1
23651   };
23652
23653   var en = {icons:{download:"download",information:"info",remove:"remove",undo:"undo",zoom_to:"zoom to",copy:"copy",open_wikidata:"open on wikidata.org"},modes:{add_area:{title:"Area",description:"Add parks, buildings, lakes or other areas to the map.",tail:"Click on the map to start drawing an area, like a park, lake, or building."},add_line:{title:"Line",description:"Add highways, streets, pedestrian paths, canals or other lines to the map.",tail:"Click on the map to start drawing a road, path, or route."},add_point:{title:"Point",description:"Add restaurants, monuments, postal boxes or other points to the map.",tail:"Click on the map to add a point."},add_note:{title:"Note",description:"Spotted an issue? Let other mappers know.",tail:"Click on the map to add a note."},browse:{title:"Browse",description:"Pan and zoom the map."},draw_area:{tail:"Click to add nodes to your area. Click the first node to finish the area."},draw_line:{tail:"Click to add more nodes to the line. Click on other lines to connect to them, and double-click to end the line."},drag_node:{connected_to_hidden:"This can't be edited because it is connected to a hidden feature."}},operations:{add:{annotation:{point:"Added a point.",vertex:"Added a node to a way.",relation:"Added a relation.",note:"Added a note."}},start:{annotation:{line:"Started a line.",area:"Started an area."}},"continue":{key:"A",title:"Continue",description:"Continue this line.",not_eligible:"No line can be continued here.",multiple:"Several lines can be continued here. To choose a line, press the Shift key and click on it to select it.",annotation:{line:"Continued a line.",area:"Continued an area."}},cancel_draw:{annotation:"Canceled drawing."},change_role:{annotation:"Changed the role of a relation member."},change_tags:{annotation:"Changed tags."},circularize:{title:"Circularize",description:{line:"Make this line circular.",area:"Make this area circular."},key:"O",annotation:{line:"Made a line circular.",area:"Made an area circular."},not_closed:"This can't be made circular because it's not a loop.",too_large:"This can't be made circular because not enough of it is currently visible.",connected_to_hidden:"This can't be made circular because it is connected to a hidden feature."},orthogonalize:{title:"Square",description:{line:"Square the corners of this line.",area:"Square the corners of this area."},key:"S",annotation:{line:"Squared the corners of a line.",area:"Squared the corners of an area."},not_squarish:"This can't be made square because it is not squarish.",too_large:"This can't be made square because not enough of it is currently visible.",connected_to_hidden:"This can't be made square because it is connected to a hidden feature."},straighten:{title:"Straighten",description:"Straighten this line.",key:"S",annotation:"Straightened a line.",too_bendy:"This can't be straightened because it bends too much.",connected_to_hidden:"This line can't be straightened because it is connected to a hidden feature."},"delete":{title:"Delete",description:{single:"Delete this feature permanently.",multiple:"Delete these features permanently."},annotation:{point:"Deleted a point.",vertex:"Deleted a node from a way.",line:"Deleted a line.",area:"Deleted an area.",relation:"Deleted a relation.",multiple:"Deleted {n} features."},too_large:{single:"This feature can't be deleted because not enough of it is currently visible.",multiple:"These features can't be deleted because not enough of them are currently visible."},incomplete_relation:{single:"This feature can't be deleted because it hasn't been fully downloaded.",multiple:"These features can't be deleted because they haven't been fully downloaded."},part_of_relation:{single:"This feature can't be deleted because it is part of a larger relation. You must remove it from the relation first.",multiple:"These features can't be deleted because they are part of larger relations. You must remove them from the relations first."},connected_to_hidden:{single:"This feature can't be deleted because it is connected to a hidden feature.",multiple:"These features can't be deleted because some are connected to hidden features."}},add_member:{annotation:"Added a member to a relation."},delete_member:{annotation:"Removed a member from a relation."},connect:{annotation:{from_vertex:{to_point:"Connected a way to a point.",to_vertex:"Connected a way to another.",to_line:"Connected a way to a line.",to_area:"Connected a way to an area.",to_adjacent_vertex:"Merged adjacent points in a way.",to_sibling_vertex:"Connected a way to itself."},from_point:{to_point:"Merged a point with another.",to_vertex:"Merged a point with a point in a way.",to_line:"Moved a point to a line.",to_area:"Moved a point to an area."}},relation:"These features can't be connected because they have conflicting relation roles.",restriction:"These features can't be connected because it would damage a \"{relation}\" relation."},disconnect:{title:"Disconnect",description:"Disconnect these lines/areas from each other.",key:"D",annotation:"Disconnected lines/areas.",not_connected:"There aren't enough lines/areas here to disconnect.",connected_to_hidden:"This can't be disconnected because it is connected to a hidden feature.",relation:"This can't be disconnected because it connects members of a relation."},merge:{title:"Merge",description:"Merge these features.",key:"C",annotation:"Merged {n} features.",not_eligible:"These features can't be merged.",not_adjacent:"These features can't be merged because their endpoints aren't connected.",restriction:"These features can't be merged because it would damage a \"{relation}\" relation.",relation:"These features can't be merged because they have conflicting relation roles.",incomplete_relation:"These features can't be merged because at least one hasn't been fully downloaded.",conflicting_tags:"These features can't be merged because some of their tags have conflicting values."},move:{title:"Move",description:{single:"Move this feature to a different location.",multiple:"Move these features to a different location."},key:"M",annotation:{point:"Moved a point.",vertex:"Moved a node in a way.",line:"Moved a line.",area:"Moved an area.",multiple:"Moved multiple features."},incomplete_relation:{single:"This feature can't be moved because it hasn't been fully downloaded.",multiple:"These features can't be moved because they haven't been fully downloaded."},too_large:{single:"This feature can't be moved because not enough of it is currently visible.",multiple:"These features can't be moved because not enough of them are currently visible."},connected_to_hidden:{single:"This feature can't be moved because it is connected to a hidden feature.",multiple:"These features can't be moved because some are connected to hidden features."}},reflect:{title:{long:"Reflect Long",short:"Reflect Short"},description:{long:{single:"Reflect this feature across its long axis.",multiple:"Reflect these features across their long axis."},short:{single:"Reflect this feature across its short axis.",multiple:"Reflect these features across their short axis."}},key:{long:"T",short:"Y"},annotation:{long:{single:"Reflected a feature across its long axis.",multiple:"Reflected multiple features across their long axis."},short:{single:"Reflected a feature across its short axis.",multiple:"Reflected multiple features across their short axis."}},incomplete_relation:{single:"This feature can't be reflected because it hasn't been fully downloaded.",multiple:"These features can't be reflected because they haven't been fully downloaded."},too_large:{single:"This feature can't be reflected because not enough of it is currently visible.",multiple:"These features can't be reflected because not enough of them are currently visible."},connected_to_hidden:{single:"This feature can't be reflected because it is connected to a hidden feature.",multiple:"These features can't be reflected because some are connected to hidden features."}},rotate:{title:"Rotate",description:{single:"Rotate this feature around its center point.",multiple:"Rotate these features around their center point."},key:"R",annotation:{line:"Rotated a line.",area:"Rotated an area.",multiple:"Rotated multiple features."},incomplete_relation:{single:"This feature can't be rotated because it hasn't been fully downloaded.",multiple:"These features can't be rotated because they haven't been fully downloaded."},too_large:{single:"This feature can't be rotated because not enough of it is currently visible.",multiple:"These features can't be rotated because not enough of them are currently visible."},connected_to_hidden:{single:"This feature can't be rotated because it is connected to a hidden feature.",multiple:"These features can't be rotated because some are connected to hidden features."}},reverse:{title:"Reverse",description:"Make this line go in the opposite direction.",key:"V",annotation:"Reversed a line."},split:{title:"Split",description:{line:"Split this line into two at this node.",area:"Split the boundary of this area into two.",multiple:"Split the lines/area boundaries at this node into two."},key:"X",annotation:{line:"Split a line.",area:"Split an area boundary.",multiple:"Split {n} lines/area boundaries."},not_eligible:"Lines can't be split at their beginning or end.",multiple_ways:"There are too many lines here to split.",connected_to_hidden:"This can't be split because it is connected to a hidden feature."},restriction:{annotation:{create:"Added a turn restriction","delete":"Deleted a turn restriction"}},detach_node:{title:"Detach",key:"E",description:"Detach this node from these lines/areas.",annotation:"Detached a node from parent lines/areas.",restriction:"This node can't be detached because it would damage a \"{relation}\" relation.",connected_to_hidden:"This node can't be detached because it is connected to a hidden feature."}},restriction:{controls:{distance:"Distance",distance_up_to:"Up to {distance}",via:"Via",via_node_only:"Node only",via_up_to_one:"Up to 1 way",via_up_to_two:"Up to 2 ways"},help:{indirect:"(indirect)",turn:{no_left_turn:"NO Left Turn {indirect}",no_right_turn:"NO Right Turn {indirect}",no_u_turn:"NO U-Turn {indirect}",no_straight_on:"NO Straight On {indirect}",only_left_turn:"ONLY Left Turn {indirect}",only_right_turn:"ONLY Right Turn {indirect}",only_u_turn:"ONLY U-Turn {indirect}",only_straight_on:"ONLY Straight On {indirect}",allowed_left_turn:"Left Turn Allowed {indirect}",allowed_right_turn:"Right Turn Allowed {indirect}",allowed_u_turn:"U-Turn Allowed {indirect}",allowed_straight_on:"Straight On Allowed {indirect}"},from:"FROM",via:"VIA",to:"TO",from_name:"{from} {fromName}",from_name_to_name:"{from} {fromName} {to} {toName}",via_names:"{via} {viaNames}",select_from:"Click to select a {from} segment",select_from_name:"Click to select {from} {fromName}",toggle:"Click for \"{turn}\""}},undo:{tooltip:"Undo: {action}",nothing:"Nothing to undo."},redo:{tooltip:"Redo: {action}",nothing:"Nothing to redo."},tooltip_keyhint:"Shortcut:",browser_notice:"This editor is supported in Firefox, Chrome, Safari, Opera, and Internet Explorer 11 and above. Please upgrade your browser or use Potlatch 2 to edit the map.",translate:{translate:"Translate",localized_translation_label:"Multilingual Name",localized_translation_language:"Choose language",localized_translation_name:"Name"},zoom_in_edit:"Zoom in to edit",login:"Log In",logout:"Log Out",loading_auth:"Connecting to OpenStreetMap...",report_a_bug:"Report a bug",help_translate:"Help translate",sidebar:{key:"`",tooltip:"Toggle the sidebar."},feature_info:{hidden_warning:"{count} hidden features",hidden_details:"These features are currently hidden: {details}"},status:{error:"Unable to connect to API.",offline:"The API is offline. Please try editing later.",readonly:"The API is read-only. You will need to wait to save your changes.",rateLimit:"The API is limiting anonymous connections.  You can fix this by logging in."},commit:{title:"Upload to OpenStreetMap",upload_explanation:"The changes you upload will be visible on all maps that use OpenStreetMap data.",upload_explanation_with_user:"The changes you upload as {user} will be visible on all maps that use OpenStreetMap data.",request_review:"I would like someone to review my edits.",save:"Upload",cancel:"Cancel",changes:"{count} Changes",download_changes:"Download osmChange file",warnings:"Warnings",modified:"Modified",deleted:"Deleted",created:"Created",about_changeset_comments:"About changeset comments",about_changeset_comments_link:"//wiki.openstreetmap.org/wiki/Good_changeset_comments",google_warning:"You mentioned Google in this comment: remember that copying from Google Maps is strictly forbidden.",google_warning_link:"https://www.openstreetmap.org/copyright"},contributors:{list:"Edits by {users}",truncated_list:"Edits by {users} and {count} others"},info_panels:{key:"I",background:{key:"B",title:"Background",zoom:"Zoom",vintage:"Vintage",source:"Source",description:"Description",resolution:"Resolution",accuracy:"Accuracy",unknown:"Unknown",show_tiles:"Show Tiles",hide_tiles:"Hide Tiles",show_vintage:"Show Vintage",hide_vintage:"Hide Vintage"},history:{key:"H",title:"History",selected:"{n} selected",no_history:"No History (New Feature)",version:"Version",last_edit:"Last Edit",edited_by:"Edited By",changeset:"Changeset",unknown:"Unknown",link_text:"History on openstreetmap.org",note_no_history:"No History (New Note)",note_comments:"Comments",note_created_date:"Created Date",note_created_user:"Created By",note_link_text:"Note on openstreetmap.org"},location:{key:"L",title:"Location",unknown_location:"Unknown Location"},measurement:{key:"M",title:"Measurement",selected:"{n} selected",geometry:"Geometry",closed_line:"closed line",closed_area:"closed area",center:"Center",perimeter:"Perimeter",length:"Length",area:"Area",centroid:"Centroid",location:"Location",metric:"Metric",imperial:"Imperial",node_count:"Number of nodes"}},geometry:{point:"point",vertex:"vertex",line:"line",area:"area",relation:"relation",note:"note"},geocoder:{search:"Search worldwide...",no_results_visible:"No results in visible map area",no_results_worldwide:"No results found"},geolocate:{title:"Show My Location",locating:"Locating, please wait..."},inspector:{no_documentation_combination:"There is no documentation available for this tag combination",no_documentation_key:"There is no documentation available for this key",documentation_redirect:"This documentation has been redirected to a new page",show_more:"Show More",view_on_osm:"View on openstreetmap.org",all_fields:"All fields",all_tags:"All tags",all_members:"All members",all_relations:"All relations",new_relation:"New relation...",role:"Role",choose:"Select feature type",results:"{n} results for {search}",reference:"View on OpenStreetMap Wiki",back_tooltip:"Change feature",remove:"Remove",search:"Search",multiselect:"Selected features",unknown:"Unknown",incomplete:"<not downloaded>",feature_list:"Search features",edit:"Edit feature",check:{yes:"Yes",no:"No",reverser:"Change Direction"},radio:{structure:{type:"Type","default":"Default",layer:"Layer"}},add:"Add",none:"None",node:"Node",way:"Way",relation:"Relation",location:"Location",add_fields:"Add field:",lock:{suggestion:"The \"{label}\" field is locked because there is a Wikidata tag. You can delete it or edit the tags in the \"All tags\" section."}},background:{title:"Background",description:"Background settings",key:"B",backgrounds:"Backgrounds",none:"None",best_imagery:"Best known imagery source for this location","switch":"Switch back to this background",custom:"Custom",overlays:"Overlays",imagery_source_faq:"Imagery Info / Report a Problem",reset:"reset",display_options:"Display Options",brightness:"Brightness",contrast:"Contrast",saturation:"Saturation",sharpness:"Sharpness",minimap:{description:"Show Minimap",tooltip:"Show a zoomed out map to help locate the area currently displayed.",key:"/"},fix_misalignment:"Adjust imagery offset",offset:"Drag anywhere in the gray area below to adjust the imagery offset, or enter the offset values in meters."},map_data:{title:"Map Data",description:"Map Data",key:"F",data_layers:"Data Layers",layers:{osm:{tooltip:"Map data from OpenStreetMap",title:"OpenStreetMap data"},notes:{tooltip:"Note data from OpenStreetMap",title:"OpenStreetMap notes"},custom:{tooltip:"Drag and drop a data file onto the page, or click the button to setup",title:"Custom Map Data",zoom:"Zoom to data"}},fill_area:"Fill Areas",map_features:"Map Features",autohidden:"These features have been automatically hidden because too many would be shown on the screen.  You can zoom in to edit them.",osmhidden:"These features have been automatically hidden because the OpenStreetMap layer is hidden."},feature:{points:{description:"Points",tooltip:"Points of Interest"},traffic_roads:{description:"Traffic Roads",tooltip:"Highways, Streets, etc."},service_roads:{description:"Service Roads",tooltip:"Service Roads, Parking Aisles, Tracks, etc."},paths:{description:"Paths",tooltip:"Sidewalks, Foot Paths, Cycle Paths, etc."},buildings:{description:"Buildings",tooltip:"Buildings, Shelters, Garages, etc."},landuse:{description:"Landuse Features",tooltip:"Forests, Farmland, Parks, Residential, Commercial, etc."},boundaries:{description:"Boundaries",tooltip:"Administrative Boundaries"},water:{description:"Water Features",tooltip:"Rivers, Lakes, Ponds, Basins, etc."},rail:{description:"Rail Features",tooltip:"Railways"},power:{description:"Power Features",tooltip:"Power Lines, Power Plants, Substations, etc."},past_future:{description:"Past/Future",tooltip:"Proposed, Construction, Abandoned, Demolished, etc."},others:{description:"Others",tooltip:"Everything Else"}},area_fill:{wireframe:{description:"No Fill (Wireframe)",tooltip:"Enabling wireframe mode makes it easy to see the background imagery.",key:"W"},partial:{description:"Partial Fill",tooltip:"Areas are drawn with fill only around their inner edges. (Recommended for beginner mappers)"},full:{description:"Full Fill",tooltip:"Areas are drawn fully filled."}},settings:{custom_background:{tooltip:"Edit custom background",header:"Custom Background Settings",instructions:"Enter a tile URL template. Valid tokens are:\n   {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n   {-y} or {ty} for flipped TMS-style Y coordinates\n   {u} for quadtile scheme\n   {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}",template:{placeholder:"Enter a url template"}},custom_data:{tooltip:"Edit custom data layer",header:"Custom Map Data Settings",file:{instructions:"Choose a local data file. Supported types are:\n   .gpx, .kml, .geojson, .json",label:"Browse files"},or:"Or",url:{instructions:"Enter a data file URL or vector tile URL template. Valid tokens are:\n   {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme",placeholder:"Enter a url"}}},restore:{heading:"You have unsaved changes",description:"Do you wish to restore unsaved changes from a previous editing session?",restore:"Restore my changes",reset:"Discard my changes"},save:{title:"Save",help:"Review your changes and upload them to OpenStreetMap, making them visible to other users.",no_changes:"No changes to save.",error:"Errors occurred while trying to save",status_code:"Server returned status code {code}",unknown_error_details:"Please ensure you are connected to the internet.",uploading:"Uploading changes to OpenStreetMap...",conflict_progress:"Checking for conflicts: {num} of {total}",unsaved_changes:"You have unsaved changes",conflict:{header:"Resolve conflicting edits",count:"Conflict {num} of {total}",previous:"< Previous",next:"Next >",keep_local:"Keep mine",keep_remote:"Use theirs",restore:"Restore","delete":"Leave Deleted",download_changes:"Or download osmChange file",done:"All conflicts resolved!",help:"Another user changed some of the same map features you changed.\nClick on each feature below for more details about the conflict, and choose whether to keep\nyour changes or the other user's changes.\n"}},merge_remote_changes:{conflict:{deleted:"This feature has been deleted by {user}.",location:"This feature was moved by both you and {user}.",nodelist:"Nodes were changed by both you and {user}.",memberlist:"Relation members were changed by both you and {user}.",tags:"You changed the <b>{tag}</b> tag to \"{local}\" and {user} changed it to \"{remote}\"."}},success:{just_edited:"You just edited OpenStreetMap!",thank_you:"Thank you for improving the map.",thank_you_location:"Thank you for improving the map around {where}.",help_html:"Your changes should appear on OpenStreetMap within a few minutes. It may take longer for maps elsewhere to receive updates.",help_link_text:"Details",help_link_url:"https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F",view_on_osm:"View Changes on OSM",changeset_id:"Your changeset #: {changeset_id}",like_osm:"Like OpenStreetMap? Connect with others:",more:"More",events:"Events",languages:"Languages: {languages}",missing:"Is something missing from this list?",tell_us:"Tell us!"},confirm:{okay:"OK",cancel:"Cancel"},splash:{welcome:"Welcome to the iD OpenStreetMap editor",text:"iD is a friendly but powerful tool for contributing to the world's best free world map. This is version {version}. For more information see {website} and report bugs at {github}.",walkthrough:"Start the Walkthrough",start:"Edit now"},source_switch:{live:"live",lose_changes:"You have unsaved changes. Switching the map server will discard them. Are you sure you want to switch servers?",dev:"dev"},version:{whats_new:"What's new in iD {version}"},tag_reference:{description:"Description",on_wiki:"{tag} on wiki.osm.org",used_with:"used with {type}"},validations:{disconnected_highway:"Disconnected highway",disconnected_highway_tooltip:"Roads should be connected to other roads or building entrances.",old_multipolygon:"Multipolygon tags on outer way",old_multipolygon_tooltip:"This style of multipolygon is deprecated. Please assign the tags to the parent multipolygon instead of the outer way.",untagged_point:"Untagged point",untagged_point_tooltip:"Select a feature type that describes what this point is.",untagged_line:"Untagged line",untagged_line_tooltip:"Select a feature type that describes what this line is.",untagged_area:"Untagged area",untagged_area_tooltip:"Select a feature type that describes what this area is.",untagged_relation:"Untagged relation",untagged_relation_tooltip:"Select a feature type that describes what this relation is.",many_deletions:"You're deleting {n} features: {p} nodes, {l} lines, {a} areas, {r} relations. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.",tag_suggests_area:"The tag {tag} suggests line should be area, but it is not an area",deprecated_tags:"Deprecated tags: {tags}"},zoom:{"in":"Zoom in",out:"Zoom out"},cannot_zoom:"Cannot zoom out further in current mode.",full_screen:"Toggle Full Screen",streetside:{tooltip:"Streetside photos from Microsoft",title:"Photo Overlay (Bing Streetside)",report:"Report a privacy concern with this image",view_on_bing:"View on Bing Maps",hires:"High resolution"},mapillary_images:{tooltip:"Street-level photos from Mapillary",title:"Photo Overlay (Mapillary)"},mapillary_signs:{tooltip:"Traffic signs from Mapillary (must enable Photo Overlay)",title:"Traffic Sign Overlay (Mapillary)"},mapillary:{view_on_mapillary:"View this image on Mapillary"},openstreetcam_images:{tooltip:"Street-level photos from OpenStreetCam",title:"Photo Overlay (OpenStreetCam)"},openstreetcam:{view_on_openstreetcam:"View this image on OpenStreetCam"},note:{note:"Note",title:"Edit note",anonymous:"anonymous",closed:"(Closed)",commentTitle:"Comments",status:{opened:"opened {when}",reopened:"reopened {when}",commented:"commented {when}",closed:"closed {when}"},newComment:"New Comment",inputPlaceholder:"Enter a comment to share with other users.",close:"Close Note",open:"Reopen Note",comment:"Comment",close_comment:"Close and Comment",open_comment:"Reopen and Comment",report:"Report","new":"New Note",newDescription:"Describe the issue.",save:"Save Note",login:"You must log in to change or comment on this note.",upload_explanation:"Your comments will be publicly visible to all OpenStreetMap users.",upload_explanation_with_user:"Your comments as {user} will be publicly visible to all OpenStreetMap users."},help:{title:"Help",key:"H",help:{title:"Help",welcome:"Welcome to the iD editor for [OpenStreetMap](https://www.openstreetmap.org/). With this editor you can update OpenStreetMap right from your web browser.",open_data_h:"Open Data",open_data:"Edits that you make on this map will be visible to everyone who uses OpenStreetMap. Your edits can be based on personal knowledge, on-the-ground surveying, or imagery collected from aerial or street level photos. Copying from commercial sources, like Google Maps, [is strictly forbidden](https://www.openstreetmap.org/copyright).",before_start_h:"Before you start",before_start:"You should be familiar with OpenStreetMap and this editor before you start editing. iD contains a walkthrough to teach you the basics of editing OpenStreetMap. Click \"Start the Walkthrough\" on this screen to take the tutorial - it takes only about 15 minutes.",open_source_h:"Open Source",open_source:"The iD editor is a collaborative open source project, and you are using version {version} now. The source code is available [on GitHub](https://github.com/openstreetmap/iD).",open_source_help:"You can help iD by [translating](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) or [reporting bugs](https://github.com/openstreetmap/iD/issues)."},overview:{title:"Overview",navigation_h:"Navigation",navigation_drag:"You can drag the map by pressing and holding down the {leftclick} left mouse button and moving the mouse around. You can also use the `↓`, `↑`, `←`, `→` arrow keys on your keyboard.",navigation_zoom:"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons along the side of the map. You can also use the `+`, `-` keys on your keyboard.",features_h:"Map Features",features:"We use the word *features* to describe things that appear on the map, such as roads, buildings, or points of interest. Anything in the real world can be mapped as a feature on OpenStreetMap. Map features are represented on the map using *points*, *lines*, or *areas*.",nodes_ways:"In OpenStreetmap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*."},editing:{title:"Editing & Saving",select_h:"Select",select_left_click:"{leftclick} Left-click on a feature to select it. This will highlight it with a pulsing glow, and the sidebar will display details about that feature, such as its name or address.",select_right_click:"{rightclick} Right-click on a feature to display the editing menu, which shows the commands that are available, such as rotating, moving, and deleting.",multiselect_h:"Multiselect",multiselect_shift_click:"`{shift}`+{leftclick} left-click to select several features together.  This makes it easier to move or delete multiple items.",multiselect_lasso:"Another way to select multiple features is to hold down the `{shift}` key, then press and hold down the {leftclick} left mouse button and drag the mouse to draw a selection lasso. All of the points inside the lasso area will be selected.",undo_redo_h:"Undo & Redo",undo_redo:"Your edits are stored locally in your browser until you choose to save them to the OpenStreetMap server. You can undo edits by clicking the {undo} **Undo** button, and redo them by clicking the {redo} **Redo** button.",save_h:"Save",save:"Click {save} **Save** to finish your edits and send them to OpenStreetMap. You should remember to save your work frequently!",save_validation:"On the save screen, you'll have a chance to review what you've done. iD will also perform some basic checks for missing data and may offer helpful suggestions and warnings if something doesn't seem right.",upload_h:"Upload",upload:"Before uploading your changes you must enter a [changeset comment](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). Then click **Upload** to send your changes to OpenStreetMap, where they will be merged into the map and publicly visible to everyone.",backups_h:"Automatic Backups",backups:"If you can't finish your edits in one sitting, for example if your computer crashes or you close the browser tab, your edits are still saved in your browser's storage. You can come back later (on the same browser and computer), and iD will offer to restore your work.",keyboard_h:"Keyboard Shortcuts",keyboard:"You can view a list of keyboard shortcuts by pressing the `?` key."},feature_editor:{title:"Feature Editor",intro:"The *feature editor* appears alongside the map, and allows you to see and edit all of the information for the selected feature.",definitions:"The top section displays the feature's type. The middle section contains *fields* showing the feature's attributes, such as its name or address.",type_h:"Feature Type",type:"You can click on the feature type to change the feature to a different type. Everything that exists in the real world can be added to OpenStreetMap, so there are thousands of feature types to choose from.",type_picker:"The type picker displays the most common feature types, such as parks, hospitals, restaurants, roads, and buildings. You can search for anything by typing what you're looking for in the search box. You can also click the {inspect} **Info** icon next to the feature type to learn more about it.",fields_h:"Fields",fields_all_fields:"The \"All fields\" section contains all of the feature's details that you may edit. In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.",fields_example:"Each feature type will display different fields. For example, a road may display fields for its surface and speed limit, but a restaurant may display fields for the type of food it serves and the hours it is open.",fields_add_field:"You can also click the \"Add field\" dropdown to add more fields, such as a description, Wikipedia link, wheelchair access, and more.",tags_h:"Tags",tags_all_tags:"Below the fields section, you can expand the \"All tags\" section to edit any of the OpenStreetMap *tags* for the selected feature. Each tag consists of a *key* and *value*, data elements that define all of the features stored in OpenStreetMap.",tags_resources:"Editing a feature's tags requires intermediate knowledge about OpenStreetMap. You should consult resources like the [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Main_Page) or [Taginfo](https://taginfo.openstreetmap.org/) to learn more about accepted OpenStreetMap tagging practices."},points:{title:"Points",intro:"*Points* can be used to represent features such as shops, restaurants, and monuments. They mark a specific location, and describe what's there.",add_point_h:"Adding Points",add_point:"To add a point, click the {point} **Point** button on the toolbar above the map, or press the shortcut key `1`. This will change the mouse cursor to a cross symbol.",add_point_finish:"To place the new point on the map, position the mouse cursor where the point should go, then {leftclick} left-click or press `Space`.",move_point_h:"Moving Points",move_point:"To move a point, place the mouse cursor over the point, then press and hold the {leftclick} left mouse button while dragging the point to its new location.",delete_point_h:"Deleting Points",delete_point:"It's OK to delete features that don't exist in the real world. Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it.",delete_point_command:"To delete a point, {rightclick} right-click on the point to select it and show the edit menu, then use the {delete} **Delete** command."},lines:{title:"Lines",intro:"*Lines* are used to represent features such as roads, railroads, and rivers. Lines should be drawn down the center of the feature that they represent.",add_line_h:"Adding Lines",add_line:"To add a line, click the {line} **Line** button on the toolbar above the map, or press the shortcut key `2`. This will change the mouse cursor to a cross symbol.",add_line_draw:"Next, position the mouse cursor where the line should begin and {leftclick} left-click or press `Space` to begin placing nodes along the line. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.",add_line_finish:"To finish a line, press `{return}` or click again on the last node.",modify_line_h:"Modifying Lines",modify_line_dragnode:"Often you'll see lines that aren't shaped correctly, for example a road that does not match up with the background imagery. To adjust the shape of a line, first {leftclick} left-click to select it. All nodes of the line will be drawn as small circles. You can then drag the nodes to better locations.",modify_line_addnode:"You can also create new nodes along a line either by {leftclick}**x2** double-clicking on the line or by dragging the small triangles at the midpoints between nodes.",connect_line_h:"Connecting Lines",connect_line:"Having roads connected properly is important for the map and essential for providing driving directions.",connect_line_display:"The connections between roads are drawn with gray circles. The endpoints of a line are drawn with larger white circles if they don't connect to anything.",connect_line_drag:"To connect a line to another feature, drag one of the line's nodes onto the other feature until both features snap together. Tip: You can hold down the `{alt}` key to prevent nodes from connecting to other features.",connect_line_tag:"If you know that the connection has traffic lights or crosswalks, you can add them by selecting the connecting node and using the feature editor to select the correct feature's type.",disconnect_line_h:"Disconnecting Lines",disconnect_line_command:"To disconnect a road from another feature, {rightclick} right-click the connecting node and select the {disconnect} **Disconnect** command from the editing menu.",move_line_h:"Moving Lines",move_line_command:"To move an entire line, {rightclick} right-click the line and select the {move} **Move** command from the editing menu. Then move the mouse, and {leftclick} left-click to place the line in a new location.",move_line_connected:"Lines that are connected to other features will stay connected as you move the line to a new location. iD may prevent you from moving a line across another connected line.",delete_line_h:"Deleting Lines",delete_line:"If a line is entirely incorrect, for example a road that doesn't exist in the real world, it's OK to delete it. Be careful when deleting features: the background imagery you are using might be outdated, and a road that looks wrong could simply be newly built.",delete_line_command:"To delete a line, {rightclick} right-click on the line to select it and show the edit menu, then use the {delete} **Delete** command."},areas:{title:"Areas",intro:"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas. Areas should be traced around the edge of the feature that they represent, for example, around the base of a building.",point_or_area_h:"Points or Areas?",point_or_area:"Many features can be represented as points or areas. You should map buildings and property outlines as areas whenever possible. Place points inside a building area to represent businesses, amenities, and other features located inside the building.",add_area_h:"Adding Areas",add_area_command:"To add an area, click the {area} **Area** button on the toolbar above the map, or press the shortcut key `3`. This will change the mouse cursor to a cross symbol.",add_area_draw:"Next, position the mouse cursor at one of the corners of the feature and {leftclick} left-click or press `Space` to begin placing nodes around the outer edge of the area. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.",add_area_finish:"To finish an area, press `{return}` or click again on either the first or last node.",square_area_h:"Square Corners",square_area_command:"Many area features like buildings have square corners. To square the corners of an area, {rightclick} right-click the edge of the area and select the {orthogonalize} **Square** command from the editing menu.",modify_area_h:"Modifying Areas",modify_area_dragnode:"Often you'll see areas that aren't shaped correctly, for example a building that does not match up with the background imagery. To adjust the shape of an area, first {leftclick} left-click to select it. All nodes of the area will be drawn as small circles. You can then drag the nodes to better locations.",modify_area_addnode:"You can also create new nodes along an area either by {leftclick}**x2** double-clicking on the edge of the area or by dragging the small triangles at the midpoints between nodes.",delete_area_h:"Deleting Areas",delete_area:"If an area is entirely incorrect, for example a building that doesn't exist in the real world, it's OK to delete it. Be cautious when deleting features - the background imagery you are using might be outdated, and a building that looks wrong could simply be newly built.",delete_area_command:"To delete an area, {rightclick} right-click on the area to select it and show the edit menu, then use the {delete} **Delete** command."},relations:{title:"Relations",intro:"A *relation* is a special type of feature in OpenStreetMap that groups together other features. The features that belong to a relation are called *members*, and each member can have a *role* in the relation.",edit_relation_h:"Editing Relations",edit_relation:"At the bottom of the feature editor, you can expand the \"All relations\" section to see if the selected feature is a member of any relations. You can then click on the relation to select and edit it.",edit_relation_add:"To add a feature to a relation, select the feature, then click the {plus} add button in the \"All relations\" section of the feature editor. You can choose from a list of nearby relations, or choose the \"New relation...\" option.",edit_relation_delete:"You can also click the {delete} **Delete** button to remove the selected feature from the relation. If you remove all of the members from a relation, the relation will be deleted automatically.",maintain_relation_h:"Maintaining Relations",maintain_relation:"For the most part, iD will maintain relations automatically as you edit. You should take care when replacing features that might be members of relations. For example if you delete a section of road and draw a new section of road to replace it, you should add the new section to the same relations (routes, turn restrictions, etc.) as the original.",relation_types_h:"Relation Types",multipolygon_h:"Multipolygons",multipolygon:"A *multipolygon* relation is a group of one or more *outer* features and one or more inner features. The outer features define the outer edges of the multipolygon, and the inner features define sub-areas or holes cut out from the inside of the multipolygon.",multipolygon_create:"To create a multipolygon, for example a building with a hole in it, draw the outer edge as an area and the inner edge as a line or different kind of area. Then `{shift}`+{leftclick} left-click to select both features, {rightclick} right-click to show the edit menu, and select the {merge} **Merge** command.",multipolygon_merge:"Merging several lines or areas will create a new multipolygon relation with all selected areas as members. iD will choose the inner and outer roles automatically, based on which features are contained inside other features.",turn_restriction_h:"Turn restrictions",turn_restriction:"A *turn restriction* relation is a group of several road segments in an intersection. Turn restrictions consist of a *from* road, *via* node or roads, and a *to* road.",turn_restriction_field:"To edit turn restrictions, select a junction node where two or more roads meet. The feature editor will display a special \"Turn Restrictions\" field containing a model of the intersection.",turn_restriction_editing:"In the \"Turn Restrictions\" field, click to select a \"from\" road, and see whether turns are allowed or restricted to any of the \"to\" roads. You can click on the turn icons to toggle them between allowed and restricted. iD will create relations automatically and set the from, via, and to roles based on your choices.",route_h:"Routes",route:"A *route* relation is a group of one or more line features that together form a route network, like a bus route, train route, or highway route.",route_add:"To add a feature to a route relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation.",boundary_h:"Boundaries",boundary:"A *boundary* relation is a group of one or more line features that together form an administrative boundary.",boundary_add:"To add a feature to a boundary relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation."},notes:{title:"Notes",intro:"*Notes* are used to alert other users that a feature requires fixing or attention. Notes mark a specific location on the map. To view existing notes or add new ones, click the {data} **Map data** panel to enable the OpenStreetMap notes layer.",add_note_h:"Adding Notes",add_note:"To add a new note, click the {note} **Note** button on the toolbar above the map, or press the shortcut key `4`. This will change the mouse cursor to a cross symbol. To place the new note on the map, position the mouse cursor where the note should go, then {leftclick} left-click or press `Space`.",move_note:"Only new notes can be moved. To move a note, place the mouse cursor over the new note, then press and hold the {leftclick} left mouse button while dragging the note to its new location.",update_note_h:"Closing, Reopening, and Commenting",update_note:"An existing note can be updated by closing it, reopening it, or adding a comment to it. Closing a note indicates that the problem has been resolved. Reopening a note indicates that the original issue is not resolved.",save_note_h:"Saving Notes",save_note:"You must save any note edits individually by clicking the buttons below the note comments. Note edits are **not** included in changesets that you upload to OpenStreetMap."},imagery:{title:"Background Imagery",intro:"The background imagery that appears beneath the map data is an important resource for mapping. This imagery can be aerial photos collected from satellites, airplanes, and drones, or it can be scanned historical maps or other freely available source data.",sources_h:"Imagery Sources",choosing:"To see which imagery sources are available for editing, click the {layers} **Background settings** button on the side of the map.",sources:"By default, a [Bing Maps](https://www.bing.com/maps/) satellite layer is chosen as the background image. Depending on where you are editing, other imagery sources will be available. Some may be newer or have higher resolution, so it is always useful to check and see which layer is the best one to use as a mapping reference.",offsets_h:"Adjusting Imagery Offset",offset:"Imagery is sometimes offset slightly from accurate map data. If you see a lot of roads or buildings shifted from the background imagery, it may be the imagery that's incorrect, so don't move them all to match the background. Instead, you can adjust the background so that it matches the existing data by expanding the \"Adjust Imagery Offset\" section at the bottom of the Background Settings pane.",offset_change:"Click on the small triangles to adjust the imagery offset in small steps, or hold the left mouse button and drag within the gray square to slide the imagery into alignment."},streetlevel:{title:"Street Level Photos",intro:"Street level photos are useful for mapping traffic signs, businesses, and other details that you can't see from satellite and aerial images. The iD editor supports street level photos from [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com), and [OpenStreetCam](https://www.openstreetcam.org).",using_h:"Using Street Level Photos",using:"To use street level photos for mapping, click the {data} **Map data** panel on the side of the map to enable or disable the available photo layers.",photos:"When enabled, the photo layer displays a line along the sequence of photos. At higher zoom levels, a circle marks at each photo location, and at even higher zoom levels, a cone indicates the direction the camera was facing when the photo was taken.",viewer:"When you click on one of the photo locations, a photo viewer appears in the bottom corner of the map. The photo viewer contains controls to step forward and backward in the image sequence. It also shows the username of the person who captured the image, the date it was captured, and a link to view the image on the original site."},gps:{title:"GPS Traces",intro:"Collected GPS traces are a valuable source of data for OpenStreetMap. This editor supports *.gpx*, *.geojson*, and *.kml* files on your local computer. You can collect GPS traces with a smartphone, sports watch, or other GPS device.",survey:"For information on how to perform a GPS survey, read [Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).",using_h:"Using GPS Traces",using:"To use a GPS trace for mapping, drag and drop the data file onto the map editor. If it's recognized, it will be drawn on the map as a bright purple line. Click the {data} **Map data** panel on the side of the map to enable, disable, or zoom to your GPS data.",tracing:"The GPS track isn't sent to OpenStreetMap - the best way to use it is to draw on the map, using it as a guide for the new features that you add.",upload:"You can also [upload your GPS data to OpenStreetMap](https://www.openstreetmap.org/trace/create) for other users to use."},field:{restrictions:{title:"Turn Restrictions Help",about:{title:"About",about:"This field allows you to inspect and modify turn restrictions. It displays a model of the selected intersection including other nearby connected roads.",from_via_to:"A turn restriction always contains: one **FROM way**, one **TO way**, and either one **VIA node** or one or more **VIA ways**.",maxdist:"The \"{distField}\" slider controls how far to search for additional connected roads.",maxvia:"The \"{viaField}\" slider adjusts how many via ways may be included in the search. (Tip: simple is better)"},inspecting:{title:"Inspecting",about:"Hover over any **FROM** segment to see whether it has any turn restrictions. Each possible **TO** destination will be drawn with a colored shadow showing whether a restriction exists.",from_shadow:"{fromShadow} **FROM segment**",allow_shadow:"{allowShadow} **TO Allowed**",restrict_shadow:"{restrictShadow} **TO Restricted**",only_shadow:"{onlyShadow} **TO Only**",restricted:"\"Restricted\" means that there is a turn restriction, for example \"No Left Turn\".",only:"\"Only\" means that a vehicle taking that path may only make that choice, for example \"Only Straight On\"."},modifying:{title:"Modifying",about:"To modify turn restrictions, first click on any starting **FROM** segment to select it. The selected segment will pulse, and all possible **TO** destinations will appear as turn symbols.",indicators:"Then, click on a turn symbol to toggle it between \"Allowed\", \"Restricted\", and \"Only\".",allow_turn:"{allowTurn} **TO Allowed**",restrict_turn:"{restrictTurn} **TO Restricted**",only_turn:"{onlyTurn} **TO Only**"},tips:{title:"Tips",simple:"**Prefer simple restrictions over complex ones.**",simple_example:"For example, avoid creating a via-way restriction if a simpler via-node turn restriction will do.",indirect:"**Some restrictions display the text \"(indirect)\" and are drawn lighter.**",indirect_example:"These restrictions exist because of another nearby restriction. For example, an \"Only Straight On\" restriction will indirectly create \"No Turn\" restrictions for all other paths through the intersection.",indirect_noedit:"You may not edit indirect restrictions. Instead, edit the nearby direct restriction."}}}},intro:{done:"done",ok:"OK",graph:{block_number:"<value for addr:block_number>",city:"Three Rivers",county:"<value for addr:county>",district:"<value for addr:district>",hamlet:"<value for addr:hamlet>",neighbourhood:"<value for addr:neighbourhood>",postcode:"49093",province:"<value for addr:province>",quarter:"<value for addr:quarter>",state:"MI",subdistrict:"<value for addr:subdistrict>",suburb:"<value for addr:suburb>",countrycode:"us",name:{"1st-avenue":"1st Avenue","2nd-avenue":"2nd Avenue","4th-avenue":"4th Avenue","5th-avenue":"5th Avenue","6th-avenue":"6th Avenue","6th-street":"6th Street","7th-avenue":"7th Avenue","8th-avenue":"8th Avenue","9th-avenue":"9th Avenue","10th-avenue":"10th Avenue","11th-avenue":"11th Avenue","12th-avenue":"12th Avenue","access-point-employment":"Access Point Employment","adams-street":"Adams Street","andrews-elementary-school":"Andrews Elementary School","andrews-street":"Andrews Street","armitage-street":"Armitage Street","barrows-school":"Barrows School","battle-street":"Battle Street","bennett-street":"Bennett Street","bowman-park":"Bowman Park","collins-drive":"Collins Drive","conrail-railroad":"Conrail Railroad","conservation-park":"Conservation Park","constantine-street":"Constantine Street","cushman-street":"Cushman Street","dollar-tree":"Dollar Tree","douglas-avenue":"Douglas Avenue","east-street":"East Street","elm-street":"Elm Street","flower-street":"Flower Street","foster-street":"Foster Street","french-street":"French Street","garden-street":"Garden Street","gem-pawnbroker":"Gem Pawnbroker","golden-finch-framing":"Golden Finch Framing","grant-avenue":"Grant Avenue","hoffman-pond":"Hoffman Pond","hoffman-street":"Hoffman Street","hook-avenue":"Hook Avenue","jefferson-street":"Jefferson Street","kelsey-street":"Kelsey Street","lafayette-park":"LaFayette Park","las-coffee-cafe":"L.A.'s Coffee Cafe","lincoln-avenue":"Lincoln Avenue","lowrys-books":"Lowry's Books","lynns-garage":"Lynn's Garage","main-street-barbell":"Main Street Barbell","main-street-cafe":"Main Street Cafe","main-street-fitness":"Main Street Fitness","main-street":"Main Street","maple-street":"Maple Street","marina-park":"Marina Park","market-street":"Market Street","memory-isle-park":"Memory Isle Park","memory-isle":"Memory Isle","michigan-avenue":"Michigan Avenue","middle-street":"Middle Street","millard-street":"Millard Street","moore-street":"Moore Street","morris-avenue":"Morris Avenue","mural-mall":"Mural Mall","paisanos-bar-and-grill":"Paisano's Bar and Grill","paisley-emporium":"Paisley Emporium","paparazzi-tattoo":"Paparazzi Tattoo","pealer-street":"Pealer Street","pine-street":"Pine Street","pizza-hut":"Pizza Hut","portage-avenue":"Portage Avenue","portage-river":"Portage River","preferred-insurance-services":"Preferred Insurance Services","railroad-drive":"Railroad Drive","river-city-appliance":"River City Appliance","river-drive":"River Drive","river-road":"River Road","river-street":"River Street","riverside-cemetery":"Riverside Cemetery","riverwalk-trail":"Riverwalk Trail","riviera-theatre":"Riviera Theatre","rocky-river":"Rocky River","saint-joseph-river":"Saint Joseph River","scidmore-park-petting-zoo":"Scidmore Park Petting Zoo","scidmore-park":"Scidmore Park","scouter-park":"Scouter Park","sherwin-williams":"Sherwin-Williams","south-street":"South Street","southern-michigan-bank":"Southern Michigan Bank","spring-street":"Spring Street","sturgeon-river-road":"Sturgeon River Road","three-rivers-city-hall":"Three Rivers City Hall","three-rivers-elementary-school":"Three Rivers Elementary School","three-rivers-fire-department":"Three Rivers Fire Department","three-rivers-high-school":"Three Rivers High School","three-rivers-middle-school":"Three Rivers Middle School","three-rivers-municipal-airport":"Three Rivers Municipal Airport","three-rivers-post-office":"Three Rivers Post Office","three-rivers-public-library":"Three Rivers Public Library","three-rivers":"Three Rivers","unique-jewelry":"Unique Jewelry","walnut-street":"Walnut Street","washington-street":"Washington Street","water-street":"Water Street","west-street":"West Street","wheeler-street":"Wheeler Street","william-towing":"William Towing","willow-drive":"Willow Drive","wood-street":"Wood Street","world-fare":"World Fare"}},welcome:{title:"Welcome",welcome:"Welcome! This walkthrough will teach you the basics of editing on OpenStreetMap.",practice:"All of the data in this walkthrough is just for practicing, and any edits that you make in the walkthrough will not be saved.",words:"This walkthrough will introduce some new words and concepts. When we introduce a new word, we'll use *italics*.",mouse:"You can use any input device to edit the map, but this walkthrough assumes you have a mouse with left and right buttons. **If you want to attach a mouse, do so now, then click OK.**",leftclick:"When this tutorial asks you to click or double-click, we mean with the left button. On a trackpad it might be a single-click or single-finger tap. **Left-click {num} times.**",rightclick:"Sometimes we'll also ask you to right-click. This might be the same as control-click, or two-finger tap on a trackpad. Your keyboard might even have a 'menu' key that works like right-click. **Right-click {num} times.**",chapters:"So far, so good! You can use the buttons below to skip chapters at any time or to restart a chapter if you get stuck. Let's begin! **Click '{next}' to continue.**"},navigation:{title:"Navigation",drag:"The main map area shows OpenStreetMap data on top of a background.{br}You can drag the map by pressing and holding the left mouse button while moving the mouse around. You can also use the arrow keys on your keyboard. **Drag the map!**",zoom:"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons. **Zoom the map!**",features:"We use the word *features* to describe the things that appear on the map. Anything in the real world can be mapped as a feature on OpenStreetMap.",points_lines_areas:"Map features are represented using *points, lines, or areas.*",nodes_ways:"In OpenStreetMap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*.",click_townhall:"All features on the map can be selected by clicking on them. **Click on the point to select it.**",selected_townhall:"Great! The point is now selected. Selected features are drawn with a pulsing glow.",editor_townhall:"When a feature is selected, the *feature editor* is displayed alongside the map.",preset_townhall:"The top part of the feature editor shows the feature's type. This point is a {preset}.",fields_townhall:"The middle part of the feature editor contains *fields* showing the feature's attributes, such as its name and address.",close_townhall:"**Close the feature editor by hitting escape or pressing the {button} button in the upper corner.**",search_street:"You can also search for features in the current view, or worldwide. **Search for '{name}'.**",choose_street:"**Choose {name} from the list to select it.**",selected_street:"Great! {name} is now selected.",editor_street:"The fields shown for a street are different than the fields that were shown for the town hall.{br}For this selected street, the feature editor shows fields like '{field1}' and '{field2}'. **Close the feature editor by hitting escape or pressing the {button} button.**",play:"Try moving the map and clicking on some other features to see what kinds of things can be added to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},points:{title:"Points",add_point:"*Points* can be used to represent features such as shops, restaurants, and monuments.{br}They mark a specific location, and describe what's there. **Click the {button} Point button to add a new point.**",place_point:"To place the new point on the map, position your mouse cursor where the point should go, then left-click or press the spacebar. **Move the mouse pointer over this building, then left-click or press the spacebar.**",search_cafe:"There are many different features that can be represented by points. The point you just added is a cafe. **Search for '{preset}'.**",choose_cafe:"**Choose {preset} from the list.**",feature_editor:"The point is now marked as a cafe. Using the feature editor, we can add more information about the cafe.",add_name:"In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.{br}Let's pretend that you have local knowledge of this cafe, and you know its name. **Add a name for the cafe.**",add_close:"The feature editor will remember all of your changes automatically. **When you are finished adding the name, hit escape, enter, or click the {button} button to close the feature editor.**",reselect:"Often points will already exist, but have mistakes or be incomplete. We can edit existing points. **Click to select the cafe you just created.**",update:"Let's fill in some more details for this cafe. You can change its name, add a cuisine, or add an address. **Change the cafe details.**",update_close:"**When you are finished updating the cafe, hit escape, enter, or click the {button} button to close the feature editor.**",rightclick:"You can right-click on any feature to see the *edit menu*, which shows a list of editing operations that can be performed. **Right-click to select the point you created and show the edit menu.**","delete":"It's OK to delete features that don't exist in the real world.{br}Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it. **Click on the {button} button to delete the point.**",undo:"You can always undo any changes up until you save your edits to OpenStreetMap. **Click on the {button} button to undo the delete and get the point back.**",play:"Now that you know how to create and edit points, try creating a few more points for practice! **When you are ready to continue to the next chapter, click '{next}'.**"},areas:{title:"Areas",add_playground:"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas.{br}They can also be used for more detailed mapping of many features you might normally map as points. **Click the {button} Area button to add a new area.**",start_playground:"Let's add this playground to the map by drawing an area. Areas are drawn by placing *nodes* along the outer edge of the feature. **Click or press spacebar to place a starting node on one of the corners of the playground.**",continue_playground:"Continue drawing the area by placing more nodes along the playground's edge. It is OK to connect the area to the existing walking paths.{br}Tip: You can hold down the '{alt}' key to prevent nodes from connecting to other features. **Continue drawing an area for the playground.**",finish_playground:"Finish the area by pressing enter, or clicking again on either the first or last node. **Finish drawing an area for the playground.**",search_playground:"**Search for '{preset}'.**",choose_playground:"**Choose {preset} from the list.**",add_field:"This playground doesn't have an official name, so we won't add anything in the Name field.{br}Instead let's add some additional details about the playground to the Description field. **Open the Add Field list.**",choose_field:"**Choose {field} from the list.**",retry_add_field:"You didn't select the {field} field. Let's try again.",describe_playground:"**Add a description, then click the {button} button to close the feature editor.**",play:"Good job! Try drawing a few more areas, and see what other kinds of area features you can add to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},lines:{title:"Lines",add_line:"*Lines* are used to represent features such as roads, railroads, and rivers. **Click the {button} Line button to add a new line.**",start_line:"Here is a road that is missing. Let's add it!{br}In OpenStreetMap, lines should be drawn down the center of the road. You can drag and zoom the map while drawing if necessary. **Start a new line by clicking at the top end of this missing road.**",intersect:"Click or press spacebar to add more nodes to the line.{br}Roads, and many other types of lines, are part of a larger network. It is important for these lines to be connected properly in order for routing applications to work. **Click on {name} to create an intersection connecting the two lines.**",retry_intersect:"The road needs to intersect {name}. Let's try again!",continue_line:"Continue drawing the line for the new road. Remember that you can drag and zoom the map if needed.{br}When you are finished drawing, click on the last node again. **Finish drawing the road.**",choose_category_road:"**Select {category} from the list.**",choose_preset_residential:"There are many different types of roads, but this one is a residential road. **Choose the {preset} type.**",retry_preset_residential:"You didn't select the {preset} type. **Click here to choose again.**",name_road:"**Give this road a name, then hit escape, enter, or click the {button} button to close the feature editor.**",did_name_road:"Looks good! Next we will learn how to update the shape of a line.",update_line:"Sometimes you will need to change the shape of an existing line. Here is a road that doesn't look quite right.",add_node:"We can add some nodes to this line to improve its shape. One way to add a node is to double-click the line where you want to add a node. **Double-click on the line to create a new node.**",start_drag_endpoint:"When a line is selected, you can drag any of its nodes by clicking and holding down the left mouse button while you drag. **Drag the endpoint to the place where these roads should intersect.**",finish_drag_endpoint:"This spot looks good. **Release the left mouse button to finish dragging.**",start_drag_midpoint:"Small triangles are drawn at the *midpoints* between nodes. Another way to create a new node is to drag a midpoint to a new location. **Drag the midpoint triangle to create a new node along the curve of the road.**",continue_drag_midpoint:"This line is looking much better! Continue to adjust this line by double-clicking or dragging midpoints until the curve matches the road shape. **When you're happy with how the line looks, click OK.**",delete_lines:"It's OK to delete lines for roads that don't exist in the real world.{br}Here's an example where the city planned a {street} but never built it. We can improve this part of the map by deleting the extra lines.",rightclick_intersection:"The last real street is {street1}, so we will *split* {street2} at this intersection and remove everything above it. **Right click on the intersection node.**",split_intersection:"**Click on the {button} button to split {street}.**",retry_split:"You didn't click the Split button. Try again.",did_split_multi:"Good job! {street1} is now split into two pieces. The top part can be removed. **Click the top part of {street2} to select it.**",did_split_single:"**Click the top part of {street2} to select it.**",multi_select:"{selected} is now selected. Let's also select {other1}. You can shift-click to select multiple things. **Shift-click on {other2}.**",multi_rightclick:"Good! Both lines to delete are now selected. **Right-click on one of the lines to show the edit menu.**",multi_delete:"**Click on the {button} button to delete the extra lines.**",retry_delete:"You didn't click the Delete button. Try again.",play:"Great! Use the skills that you've learned in this chapter to practice editing some more lines. **When you are ready to continue to the next chapter, click '{next}'.**"},buildings:{title:"Buildings",add_building:"OpenStreetMap is the world's largest database of buildings.{br}You can help improve this database by tracing buildings that aren't already mapped. **Click the {button} Area button to add a new area.**",start_building:"Let's add this house to the map by tracing its outline.{br}Buildings should be traced around their footprint as accurately as possible. **Click or press spacebar to place a starting node on one of the corners of the building.**",continue_building:"Continue adding more nodes to trace the outline of the building. Remember that you can zoom in if you want to add more details.{br}Finish the building by pressing enter, or clicking again on either the first or last node. **Finish tracing the building.**",retry_building:"It looks like you had some trouble placing the nodes at the building corners. Try again!",choose_category_building:"**Choose {category} from the list.**",choose_preset_house:"There are many different types of buildings, but this one is clearly a house.{br}If you're not sure of the type, it's OK to just choose the generic Building type. **Choose the {preset} type.**",close:"**Hit escape or click the {button} button to close the feature editor.**",rightclick_building:"**Right-click to select the building you created and show the edit menu.**",square_building:"The house that you just added will look even better with perfectly square corners. **Click on the {button} button to square the building shape.**",retry_square:"You didn't click the Square button. Try again.",done_square:"See how the corners of the building moved into place? Let's learn another useful trick.",add_tank:"Next we'll trace this circular storage tank. **Click the {button} Area button to add a new area.**",start_tank:"Don't worry, you won't need to draw a perfect circle. Just draw an area inside the tank that touches its edge. **Click or press spacebar to place a starting node on the edge of the tank.**",continue_tank:"Add a few more nodes around the edge. The circle will be created outside the nodes that you draw.{br}Finish the area by pressing enter, or clicking again on either the first or last node. **Finish tracing the tank.**",search_tank:"**Search for '{preset}'.**",choose_tank:"**Choose {preset} from the list.**",rightclick_tank:"**Right-click to select the storage tank you created and show the edit menu.**",circle_tank:"**Click on the {button} button to make the tank a circle.**",retry_circle:"You didn't click the Circularize button. Try again.",play:"Great Job! Practice tracing a few more buildings, and try some of the other commands on the edit menu. **When you are ready to continue to the next chapter, click '{next}'.**"},startediting:{title:"Start Editing",help:"You're now ready to edit OpenStreetMap!{br}You can replay this walkthrough anytime or view more documentation by clicking the {button} Help button or pressing the '{key}' key.",shortcuts:"You can view a list of commands along with their keyboard shortcuts by pressing the '{key}' key.",save:"Don't forget to regularly save your changes!",start:"Start mapping!"}},shortcuts:{title:"Keyboard shortcuts",tooltip:"Show the keyboard shortcuts screen.",toggle:{key:"?"},key:{alt:"Alt",backspace:"Backspace",cmd:"Cmd",ctrl:"Ctrl","delete":"Delete",del:"Del",end:"End",enter:"Enter",esc:"Esc",home:"Home",option:"Option",pause:"Pause",pgdn:"PgDn",pgup:"PgUp","return":"Return",shift:"Shift",space:"Space"},gesture:{drag:"drag"},or:"-or-",browsing:{title:"Browsing",navigation:{title:"Navigation",pan:"Pan map",pan_more:"Pan map by one screenful",zoom:"Zoom in / Zoom out",zoom_more:"Zoom in / Zoom out by a lot"},help:{title:"Help",help:"Show help/documentation",keyboard:"Show keyboard shortcuts"},display_options:{title:"Display options",background:"Show background options",background_switch:"Switch back to last background",map_data:"Show map data options",fullscreen:"Enter full screen mode",sidebar:"Toggle sidebar",wireframe:"Toggle wireframe mode",minimap:"Toggle minimap"},selecting:{title:"Selecting features",select_one:"Select a single feature",select_multi:"Select multiple features",lasso:"Draw a selection lasso around features",search:"Find features matching search text"},with_selected:{title:"With feature selected",edit_menu:"Toggle edit menu"},vertex_selected:{title:"With node selected",previous:"Jump to previous node",next:"Jump to next node",first:"Jump to first node",last:"Jump to last node",change_parent:"Switch parent way"}},editing:{title:"Editing",drawing:{title:"Drawing",add_point:"'Add point' mode",add_line:"'Add line' mode",add_area:"'Add area' mode",add_note:"'Add note' mode",place_point:"Place a point or note",disable_snap:"Hold to disable point snapping",stop_line:"Finish drawing a line or area"},operations:{title:"Operations",continue_line:"Continue a line at the selected node",merge:"Combine (merge) selected features",disconnect:"Disconnect features at the selected node",detach_node:"Detach selected node from parent lines/areas",split:"Split a line into two at the selected node",reverse:"Reverse a line",move:"Move selected features",rotate:"Rotate selected features",orthogonalize:"Straighten line / Square area corners",circularize:"Circularize a closed line or area",reflect_long:"Reflect features across the longer axis",reflect_short:"Reflect features across the shorter axis","delete":"Delete selected features"},commands:{title:"Commands",copy:"Copy selected features",paste:"Paste copied features",undo:"Undo last action",redo:"Redo last action",save:"Save changes"}},tools:{title:"Tools",info:{title:"Information",all:"Toggle all information panels",background:"Toggle background panel",history:"Toggle history panel",location:"Toggle location panel",measurement:"Toggle measurement panel"}}},units:{feet:"{quantity} ft",miles:"{quantity} mi",square_feet:"{quantity} sq ft",square_miles:"{quantity} sq mi",acres:"{quantity} ac",meters:"{quantity} m",kilometers:"{quantity} km",square_meters:"{quantity} m²",square_kilometers:"{quantity} km²",hectares:"{quantity} ha",area_pair:"{area1} ({area2})",arcdegrees:"{quantity}°",arcminutes:"{quantity}′",arcseconds:"{quantity}″",north:"N",south:"S",east:"E",west:"W",coordinate:"{coordinate}{direction}",coordinate_pair:"{latitude}, {longitude}"},wikidata:{identifier:"Identifier",label:"Label",description:"Description"},presets:{categories:{"category-barrier":{name:"Barrier Features"},"category-building":{name:"Building Features"},"category-golf":{name:"Golf Features"},"category-landuse":{name:"Land Use Features"},"category-natural-area":{name:"Natural Features"},"category-natural-line":{name:"Natural Features"},"category-natural-point":{name:"Natural Features"},"category-path":{name:"Path Features"},"category-rail":{name:"Rail Features"},"category-restriction":{name:"Restriction Features"},"category-road":{name:"Road Features"},"category-route":{name:"Route Features"},"category-utility":{name:"Utility Features"},"category-water-area":{name:"Water Features"},"category-water-line":{name:"Water Features"}},fields:{access_simple:{label:"Allowed Access"},access:{label:"Allowed Access",placeholder:"Not Specified",types:{access:"All",foot:"Foot",motor_vehicle:"Motor Vehicles",bicycle:"Bicycles",horse:"Horses"},options:{yes:{title:"Allowed",description:"Access allowed by law; a right of way"},no:{title:"Prohibited",description:"Access not allowed to the general public"},permissive:{title:"Permissive",description:"Access allowed until such time as the owner revokes the permission"},"private":{title:"Private",description:"Access allowed only with permission of the owner on an individual basis"},designated:{title:"Designated",description:"Access allowed according to signs or specific local laws"},destination:{title:"Destination",description:"Access allowed only to reach a destination"},dismount:{title:"Dismount",description:"Access allowed but rider must dismount"},permit:{title:"Permit",description:"Access allowed only with a valid permit or license"}}},address:{label:"Address",placeholders:{block_number:"Block Number","block_number!jp":"Block No.",city:"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town",conscriptionnumber:"123",country:"Country",county:"County","county!jp":"District",district:"District","district!vn":"Arrondissement/Town/District",floor:"Floor",hamlet:"Hamlet",housename:"Housename",housenumber:"123","housenumber!jp":"Building No./Lot No.",neighbourhood:"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza",place:"Place",postcode:"Postcode",province:"Province","province!jp":"Prefecture",quarter:"Quarter","quarter!jp":"Ōaza/Machi",state:"State",street:"Street",subdistrict:"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet",suburb:"Suburb","suburb!jp":"Ward",unit:"Unit"}},admin_level:{label:"Admin Level"},aerialway:{label:"Type"},"aerialway/access":{label:"Access",options:{entry:"Entry",exit:"Exit",both:"Both"}},"aerialway/bubble":{label:"Bubble"},"aerialway/capacity":{label:"Capacity (per hour)",placeholder:"500, 2500, 5000..."},"aerialway/duration":{label:"Duration (minutes)",placeholder:"1, 2, 3..."},"aerialway/heating":{label:"Heated"},"aerialway/occupancy":{label:"Occupancy",placeholder:"2, 4, 8..."},"aerialway/summer/access":{label:"Access (summer)",options:{entry:"Entry",exit:"Exit",both:"Both"}},aeroway:{label:"Type"},agrarian:{label:"Products"},amenity:{label:"Type"},animal_boarding:{label:"For Animals"},animal_breeding:{label:"For Animals"},animal_shelter:{label:"For Animals"},"area/highway":{label:"Type"},artist:{label:"Artist"},artwork_type:{label:"Type"},atm:{label:"ATM"},backrest:{label:"Backrest"},barrier:{label:"Type"},"bath/open_air":{label:"Open Air"},"bath/sand_bath":{label:"Sand Bath"},"bath/type":{label:"Specialty",options:{onsen:"Japanese Onsen",foot_bath:"Foot Bath",hot_spring:"Hot Spring"}},beauty:{label:"Shop Type"},bench:{label:"Bench"},bicycle_parking:{label:"Type"},bin:{label:"Waste Bin"},blood_components:{label:"Blood Components",options:{whole:"whole blood",plasma:"plasma",platelets:"platelets",stemcells:"stem cell samples"}},board_type:{label:"Type"},booth:{label:"Booth"},boules:{label:"Type"},boundary:{label:"Type"},brand:{label:"Brand"},brewery:{label:"Draft Beers"},bridge:{label:"Type",placeholder:"Default"},"bridge/support":{label:"Type"},building_area:{label:"Building"},building:{label:"Building"},bunker_type:{label:"Type"},cables:{label:"Cables",placeholder:"1, 2, 3..."},"camera/direction":{label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},"camera/mount":{label:"Camera Mount"},"camera/type":{label:"Camera Type",options:{fixed:"Fixed",panning:"Panning",dome:"Dome"}},capacity:{label:"Capacity",placeholder:"50, 100, 200..."},cash_in:{label:"Cash In"},castle_type:{label:"Type"},clothes:{label:"Clothes"},club:{label:"Type"},collection_times:{label:"Collection Times"},colour:{label:"Color"},comment:{label:"Changeset Comment",placeholder:"Brief description of your contributions (required)"},communication_multi:{label:"Communication Types"},construction:{label:"Type"},"contact/webcam":{label:"Webcam URL",placeholder:"http://example.com/"},content:{label:"Content"},conveying:{label:"Movement Direction",options:{forward:"Forward",backward:"Backward",reversible:"Reversible"}},country:{label:"Country"},covered:{label:"Covered"},craft:{label:"Type"},"crane/type":{label:"Crane Type",options:{portal_crane:"Portal Crane","floor-mounted_crane":"Floor-mounted Crane",travel_lift:"Travel Lift"}},crop:{label:"Crops"},crossing:{label:"Type"},cuisine:{label:"Cuisines"},currency_multi:{label:"Currency Types"},cutting:{label:"Type",placeholder:"Default"},cycle_network:{label:"Network"},cycleway:{label:"Bike Lanes",placeholder:"none",types:{"cycleway:left":"Left side","cycleway:right":"Right side"},options:{none:{title:"None",description:"No bike lane"},lane:{title:"Standard bike lane",description:"A bike lane separated from auto traffic by a painted line"},shared_lane:{title:"Shared bike lane",description:"A bike lane with no separation from auto traffic"},track:{title:"Bike track",description:"A bike lane separated from traffic by a physical barrier"},share_busway:{title:"Bike lane shared with bus",description:"A bike lane shared with a bus lane"},opposite_lane:{title:"Opposite bike lane",description:"A bike lane that travels in the opposite direction of traffic"},opposite:{title:"Contraflow bike lane",description:"A bike lane that travels in both directions on a one-way street"}}},"dance/style":{label:"Dance Styles"},date:{label:"Date"},delivery:{label:"Delivery"},denomination:{label:"Denomination"},denotation:{label:"Denotation"},description:{label:"Description"},design:{label:"Design"},devices:{label:"Devices",placeholder:"1, 2, 3..."},diaper:{label:"Diaper Changing Available"},direction_cardinal:{label:"Direction",options:{N:"North",E:"East",S:"South",W:"West",NE:"Northeast",SE:"Southeast",SW:"Southwest",NW:"Northwest",NNE:"North-northeast",ENE:"East-northeast",ESE:"East-southeast",SSE:"South-southeast",SSW:"South-southwest",WSW:"West-southwest",WNW:"West-northwest",NNW:"North-northwest"}},direction_clock:{label:"Direction",options:{clockwise:"Clockwise",anticlockwise:"Counterclockwise"}},direction_vertex:{label:"Direction",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},direction:{label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},dispensing:{label:"Dispenses Prescriptions"},display:{label:"Display"},distance:{label:"Distance"},dock:{label:"Type"},drive_through:{label:"Drive-Through"},duration:{label:"Duration",placeholder:"00:00"},electrified:{label:"Electrification",placeholder:"Contact Line, Electrified Rail...",options:{contact_line:"Contact Line",rail:"Electrified Rail",yes:"Yes (unspecified)",no:"No"}},elevation:{label:"Elevation"},email:{label:"Email",placeholder:"example@example.com"},embankment:{label:"Type",placeholder:"Default"},emergency:{label:"Emergency"},entrance:{label:"Type"},except:{label:"Exceptions"},faces:{label:"Faces"},fax:{label:"Fax",placeholder:"+31 42 123 4567"},fee:{label:"Fee"},fence_type:{label:"Type"},"fire_hydrant/position":{label:"Position",options:{lane:"Lane",parking_lot:"Parking Lot",sidewalk:"Sidewalk",green:"Green"}},"fire_hydrant/type":{label:"Type",options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pond:"Pond"}},fireplace:{label:"Fireplace"},fitness_station:{label:"Equipment Type"},fixme:{label:"Fix Me"},"flag/type":{label:"Flag Type"},ford:{label:"Type",placeholder:"Default"},frequency:{label:"Operating Frequency"},from:{label:"From"},fuel_multi:{label:"Fuel Types"},fuel:{label:"Fuel"},gauge:{label:"Gauge"},gender:{label:"Gender",placeholder:"Unknown",options:{male:"Male",female:"Female",unisex:"Unisex"}},"generator/method":{label:"Method"},"generator/output/electricity":{label:"Power Output",placeholder:"50 MW, 100 MW, 200 MW..."},"generator/source":{label:"Source"},"generator/type":{label:"Type"},government:{label:"Type"},grape_variety:{label:"Grape Varieties"},handicap:{label:"Handicap",placeholder:"1-18"},handrail:{label:"Handrail"},hashtags:{label:"Suggested Hashtags",placeholder:"#example"},healthcare:{label:"Type"},"healthcare/speciality":{label:"Specialties"},height:{label:"Height (Meters)"},highway:{label:"Type"},historic:{label:"Type"},"historic/civilization":{label:"Historic Civilization"},"historic/wreck/date_sunk":{label:"Date Sunk"},"historic/wreck/visible_at_high_tide":{label:"Visible At High Tide"},"historic/wreck/visible_at_low_tide":{label:"Visible At Low Tide"},hoops:{label:"Hoops",placeholder:"1, 2, 4..."},horse_dressage:{label:"Dressage Riding",options:{"undefined":"No",equestrian:"Yes"}},horse_riding:{label:"Horseback Riding",options:{"undefined":"No",horse_riding:"Yes"}},horse_scale:{label:"Horseback Riding Difficulty",placeholder:"Difficult, Dangerous...",options:{common:"Easy: No problems or difficulties. (default)",demanding:"Use with caution: Uneven way, occasional difficult passages.",difficult:"Difficult: Way narrow and exposed. May contain obstacles to step over and narrow passages.",critical:"Borderline: Passable only for experienced riders and horses. Major obstacles. Bridges should be examined carefully.",dangerous:"Dangerous: Passable only for very experienced riders and horses and only in good weather. Dismount.",impossible:"Impassable: Way or bridge not passable for horses. Too narrow, insuffient support, obstacles like ladders. Danger of life."}},horse_stables:{label:"Riding Stable",options:{"undefined":"No",stables:"Yes"}},iata:{label:"IATA"},icao:{label:"ICAO"},incline_steps:{label:"Incline",options:{up:"Up",down:"Down"}},incline:{label:"Incline"},indoor:{label:"Indoor"},industrial:{label:"Type"},information:{label:"Type"},inscription:{label:"Inscription"},intermittent:{label:"Intermittent"},internet_access:{label:"Internet Access",options:{yes:"Yes",no:"No",wlan:"Wifi",wired:"Wired",terminal:"Terminal"}},"internet_access/fee":{label:"Internet Access Fee"},"internet_access/ssid":{label:"SSID (Network Name)"},kerb:{label:"Curb"},label:{label:"Label"},lamp_type:{label:"Type"},landuse:{label:"Type"},lanes:{label:"Lanes",placeholder:"1, 2, 3..."},language_multi:{label:"Languages"},layer:{label:"Layer",placeholder:"0"},leaf_cycle_singular:{label:"Leaf Cycle",options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous"}},leaf_cycle:{label:"Leaf Cycle",options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous",mixed:"Mixed"}},leaf_type_singular:{label:"Leaf Type",options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",leafless:"Leafless"}},leaf_type:{label:"Leaf Type",options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",mixed:"Mixed",leafless:"Leafless"}},leisure:{label:"Type"},length:{label:"Length (Meters)"},level:{label:"Level"},levels:{label:"Levels",placeholder:"2, 4, 6..."},lit:{label:"Lit"},location_pool:{label:"Location",options:{outdoor:"Outdoor",indoor:"Indoor",roof:"Rooftop"}},location:{label:"Location"},man_made:{label:"Type"},manhole:{label:"Type"},map_size:{label:"Coverage"},map_type:{label:"Type"},material:{label:"Material"},maxheight:{label:"Max Height",placeholder:"4, 4.5, 5, 14'0\", 14'6\", 15'0\""},maxspeed:{label:"Speed Limit",placeholder:"40, 50, 60..."},"maxspeed/advisory":{label:"Advisory Speed Limit",placeholder:"40, 50, 60..."},maxstay:{label:"Max Stay"},maxweight:{label:"Max Weight"},memorial:{label:"Type"},monitoring_multi:{label:"Monitoring"},"mtb/scale":{label:"Mountain Biking Difficulty",placeholder:"0, 1, 2, 3...",options:{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}},"mtb/scale/imba":{label:"IMBA Trail Difficulty",placeholder:"Easy, Medium, Difficult...",options:{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}},"mtb/scale/uphill":{label:"Mountain Biking Uphill Difficulty",placeholder:"0, 1, 2, 3...",options:{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}},name:{label:"Name",placeholder:"Common name (if any)"},natural:{label:"Natural"},network_bicycle:{label:"Network Type",placeholder:"Local, Regional, National, International",options:{lcn:"Local",rcn:"Regional",ncn:"National",icn:"International"}},network_foot:{label:"Network Type",placeholder:"Local, Regional, National, International",options:{lwn:"Local",rwn:"Regional",nwn:"National",iwn:"International"}},network_horse:{label:"Network Type",placeholder:"Local, Regional, National, International",options:{lhn:"Local",rhn:"Regional",nhn:"National",ihn:"International"}},network_road:{label:"Network"},network:{label:"Network"},note:{label:"Note"},office:{label:"Type"},oneway_yes:{label:"One Way",options:{"undefined":"Assumed to be Yes",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}},oneway:{label:"One Way",options:{"undefined":"Assumed to be No",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}},opening_hours:{label:"Hours"},operator:{label:"Operator"},outdoor_seating:{label:"Outdoor Seating"},par:{label:"Par",placeholder:"3, 4, 5..."},park_ride:{label:"Park and Ride"},parking:{label:"Type",options:{surface:"Surface","multi-storey":"Multilevel",underground:"Underground",sheds:"Sheds",carports:"Carports",garage_boxes:"Garage Boxes",lane:"Roadside Lane"}},passenger_information_display:{label:"Passenger information display"},payment_multi:{label:"Payment Types"},phases:{label:"Phases",placeholder:"1, 2, 3..."},phone:{label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty_downhill":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice (instructional)",easy:"Easy (green circle)",intermediate:"Intermediate (blue square)",advanced:"Advanced (black diamond)",expert:"Expert (double black diamond)",freeride:"Freeride (off-piste)",extreme:"Extreme (climbing equipment required)"}},"piste/difficulty_nordic":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice - Flat, no effort needed",easy:"Easy - Soft hills, short steep section",intermediate:"Intermediate - Steep section",advanced:"Advanced - Narrow, steep or icy section, sharp turn",expert:"Expert - Dangerous terrain around"}},"piste/difficulty_skitour":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice - L: <30° incline",easy:"Easy - WS: 30-35° incline",intermediate:"Intermediate - ZS: 35-40° incline",advanced:"Advanced - S: 40-45° incline",expert:"Expert - SS: 45–50° incline",freeride:"Freeride - AS: 50–55° incline",extreme:"Extreme - EX: >55° incline"}},"piste/difficulty":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice",easy:"Easy",intermediate:"Intermediate",advanced:"Advanced",expert:"Expert",freeride:"Freeride",extreme:"Extreme"}},"piste/grooming_downhill":{label:"Grooming",options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry - no grooming"}},"piste/grooming_hike":{label:"Grooming",options:{classic:"Classic - Winter Hiking",backcountry:"Backcountry - Snowshoeing"}},"piste/grooming_nordic":{label:"Grooming",options:{classic:"Classic",backcountry:"Backcountry, no grooming","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}},"piste/grooming":{label:"Grooming",options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}},"piste/type":{label:"Type",options:{downhill:"Downhill",nordic:"Nordic",skitour:"Skitour",sled:"Sled",hike:"Hike",sleigh:"Sleigh",ice_skate:"Ice Skate",snow_park:"Snow Park",playground:"Playground",connection:"Connection"}},place:{label:"Type"},plant:{label:"Plant"},"plant/output/electricity":{label:"Power Output",placeholder:"500 MW, 1000 MW, 2000 MW..."},"playground/baby":{label:"Baby Seat"},"playground/max_age":{label:"Maximum Age"},"playground/min_age":{label:"Minimum Age"},population:{label:"Population"},power_supply:{label:"Power Supply"},power:{label:"Type"},produce:{label:"Produce"},product:{label:"Products"},railway:{label:"Type"},"railway/position":{label:"Milestone Position",placeholder:"Distance to one decimal (123.4)"},"railway/signal/direction":{label:"Direction",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},rating:{label:"Power Rating"},recycling_accepts:{label:"Accepts"},recycling_type:{label:"Type",placeholder:"Container, Center",options:{container:"Container",centre:"Center"}},ref_aeroway_gate:{label:"Gate Number"},ref_golf_hole:{label:"Hole Number",placeholder:"1-18"},ref_highway_junction:{label:"Junction Number"},ref_platform:{label:"Platform Number"},ref_road_number:{label:"Road Number"},ref_route:{label:"Route Number"},ref_runway:{label:"Runway Number",placeholder:"e.g. 01L/19R"},ref_stop_position:{label:"Stop Number"},ref_taxiway:{label:"Taxiway Name",placeholder:"e.g. A5"},ref:{label:"Reference Code"},"ref/isil":{label:"ISIL Code"},relation:{label:"Type"},religion:{label:"Religion"},restriction:{label:"Type"},restrictions:{label:"Turn Restrictions"},rooms:{label:"Rooms"},route_master:{label:"Type"},route:{label:"Type"},sac_scale:{label:"Hiking Difficulty",placeholder:"Mountain Hiking, Alpine Hiking...",options:{hiking:"T1: Hiking",mountain_hiking:"T2: Mountain Hiking",demanding_mountain_hiking:"T3: Demanding Mountain Hiking",alpine_hiking:"T4: Alpine Hiking",demanding_alpine_hiking:"T5: Demanding Alpine Hiking",difficult_alpine_hiking:"T6: Difficult Alpine Hiking"}},sanitary_dump_station:{label:"Toilet Disposal"},scuba_diving:{label:"Services"},"seamark/beacon_isolated_danger/shape":{label:"Shape"},"seamark/beacon_lateral/category":{label:"Category",options:{port:"Port",starboard:"Starboard",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right"}},"seamark/beacon_lateral/colour":{label:"Color",options:{red:"Red",green:"Green",grey:"Grey"}},"seamark/beacon_lateral/shape":{label:"Shape"},"seamark/beacon_lateral/system":{label:"System",options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}},"seamark/buoy_lateral/category":{label:"Category",options:{port:"Port",starboard:"Starboard",channel_left:"Channel Left",channel_right:"Channel Right",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right",preferred_channel_port:"Preferred Channel Port",preferred_channel_starboard:"Preferred Channel Starboard"}},"seamark/buoy_lateral/colour":{label:"Color",options:{red:"Red",green:"Green","red;white;red;white":"Red-White-Red-White","green;white;green;white":"Green-White-Green-White","red;green;red":"Red-Green-Red","green;red;green":"Green-Red-Green",white:"White",yellow:"Yellow"}},"seamark/buoy_lateral/shape":{label:"Shape"},"seamark/buoy_lateral/system":{label:"System",options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}},"seamark/mooring/category":{label:"Category"},"seamark/type":{label:"Seamark"},"seamark/wreck/category":{label:"Category"},seasonal:{label:"Seasonal"},seats:{label:"Seats",placeholder:"2, 4, 6..."},second_hand:{label:"Sells Used",placeholder:"Yes, No, Only",options:{yes:"Yes",no:"No",only:"Only"}},service_rail:{label:"Service Type",options:{spur:"Spur",yard:"Yard",siding:"Siding",crossover:"Crossover"}},service_times:{label:"Service Times"},service:{label:"Type"},"service/bicycle":{label:"Services"},"service/vehicle":{label:"Services"},shelter_type:{label:"Type"},shelter:{label:"Shelter"},shop:{label:"Type"},"siren/purpose":{label:"Purpose"},"siren/type":{label:"Type",options:{pneumatic:"Pneumatic",electronic:"Electronic",other:"Other"}},site_type:{label:"Site Type"},site:{label:"Type"},smoking:{label:"Smoking",placeholder:"No, Separated, Yes...",options:{no:"No smoking anywhere",separated:"In smoking areas, not physically isolated",isolated:"In smoking areas, physically isolated",outside:"Allowed outside",yes:"Allowed everywhere",dedicated:"Dedicated to smokers (e.g. smokers' club)"}},smoothness:{label:"Smoothness",placeholder:"Thin Rollers, Wheels, Off-Road...",options:{excellent:"Thin Rollers: rollerblade, skateboard",good:"Thin Wheels: racing bike",intermediate:"Wheels: city bike, wheelchair, scooter",bad:"Robust Wheels: trekking bike, car, rickshaw",very_bad:"High Clearance: light duty off-road vehicle",horrible:"Off-Road: heavy duty off-road vehicle",very_horrible:"Specialized off-road: tractor, ATV",impassable:"Impassable / No wheeled vehicle"}},social_facility_for:{label:"People Served"},social_facility:{label:"Type"},source:{label:"Sources"},sport_ice:{label:"Sports"},sport_racing_motor:{label:"Sports"},sport_racing_nonmotor:{label:"Sports"},sport:{label:"Sports"},stars:{label:"Stars"},start_date:{label:"Start Date"},step_count:{label:"Number of Steps"},stop:{label:"Stop Type",options:{all:"All Ways",minor:"Minor Road"}},structure_waterway:{label:"Structure",placeholder:"Unknown",options:{tunnel:"Tunnel"}},structure:{label:"Structure",placeholder:"Unknown",options:{bridge:"Bridge",tunnel:"Tunnel",embankment:"Embankment",cutting:"Cutting",ford:"Ford"}},studio:{label:"Type"},substance:{label:"Substance"},substation:{label:"Type"},supervised:{label:"Supervised"},support:{label:"Support"},surface:{label:"Surface"},surveillance:{label:"Surveillance Kind"},"surveillance/type":{label:"Surveillance Type",options:{camera:"Camera",guard:"Guard",ALPR:"Automatic License Plate Reader"}},"surveillance/zone":{label:"Surveillance Zone"},swimming_pool:{label:"Type"},"switch":{label:"Type",options:{mechanical:"Mechanical",circuit_breaker:"Circuit Breaker",disconnector:"Disconnector",earthing:"Earthing"}},tactile_paving:{label:"Tactile Paving"},takeaway:{label:"Takeaway",placeholder:"Yes, No, Takeaway Only...",options:{yes:"Yes",no:"No",only:"Takeaway Only"}},to:{label:"To"},"toilets/disposal":{label:"Disposal",options:{flush:"Flush",pitlatrine:"Pit/Latrine",chemical:"Chemical",bucket:"Bucket"}},toll:{label:"Toll"},tomb:{label:"Type"},tourism_attraction:{label:"Tourism"},tourism:{label:"Type"},"tower/construction":{label:"Construction",placeholder:"Guyed, Lattice, Concealed, ..."},"tower/type":{label:"Type"},tracktype:{label:"Track Type",placeholder:"Solid, Mostly Solid, Soft...",options:{grade1:"Solid: paved or heavily compacted hardcore surface",grade2:"Mostly Solid: gravel/rock with some soft material mixed in",grade3:"Even mixture of hard and soft materials",grade4:"Mostly Soft: soil/sand/grass with some hard material mixed in",grade5:"Soft: soil/sand/grass"}},trade:{label:"Type"},traffic_calming:{label:"Type"},traffic_sign:{label:"Traffic Sign"},"traffic_sign/direction":{label:"Direction",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},traffic_signals:{label:"Type"},"traffic_signals/direction":{label:"Direction",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},trail_visibility:{label:"Trail Visibility",placeholder:"Excellent, Good, Bad...",options:{excellent:"Excellent: unambiguous path or markers everywhere",good:"Good: markers visible, sometimes require searching",intermediate:"Intermediate: few markers, path mostly visible",bad:"Bad: no markers, path sometimes invisible/pathless",horrible:"Horrible: often pathless, some orientation skills required",no:"No: pathless, excellent orientation skills required"}},transformer:{label:"Type",options:{distribution:"Distribution",generator:"Generator",converter:"Converter",traction:"Traction",auto:"Autotransformer",phase_angle_regulator:"Phase Angle Regulator",auxiliary:"Auxiliary",yes:"Unknown"}},trees:{label:"Trees"},tunnel:{label:"Type",placeholder:"Default"},usage_rail:{label:"Usage Type",options:{main:"Main",branch:"Branch",industrial:"Industrial",military:"Military",test:"Test",tourism:"Tourism"}},vending:{label:"Types of Goods"},visibility:{label:"Visibility",options:{house:"Up to 5m (16ft)",street:"5 to 20m (16 to 65ft)",area:"Over 20m (65ft)"}},"volcano/status":{label:"Volcano Status",options:{active:"Active",dormant:"Dormant",extinct:"Extinct"}},"volcano/type":{label:"Volcano Type",options:{stratovolcano:"Stratovolcano",shield:"Shield",scoria:"Scoria"}},voltage:{label:"Voltage"},"voltage/primary":{label:"Primary Voltage"},"voltage/secondary":{label:"Secondary Voltage"},"voltage/tertiary":{label:"Tertiary Voltage"},wall:{label:"Type"},water_point:{label:"Water Point"},water:{label:"Type"},waterway:{label:"Type"},website:{label:"Website",placeholder:"http://example.com/"},wetland:{label:"Type"},wheelchair:{label:"Wheelchair Access"},wholesale:{label:"Wholesale"},width:{label:"Width (Meters)"},wikidata:{label:"Wikidata"},wikipedia:{label:"Wikipedia"},windings:{label:"Windings",placeholder:"1, 2, 3..."},"windings/configuration":{label:"Windings Configuration",options:{star:"Star / Wye",delta:"Delta","open-delta":"Open Delta",zigzag:"Zig Zag",open:"Open",scott:"Scott",leblanc:"Leblanc"}}},presets:{aerialway:{name:"Aerialway",terms:"ski lift,funifor,funitel"},aeroway:{name:"Aeroway",terms:""},amenity:{name:"Amenity",terms:""},circular:{name:"Traffic Circle",terms:""},embankment:{name:"Embankment",terms:""},highway:{name:"Highway",terms:""},place:{name:"Place",terms:""},power:{name:"Power",terms:""},railway:{name:"Railway",terms:""},roundabout:{name:"Roundabout",terms:""},seamark:{name:"Seamark",terms:""},waterway:{name:"Waterway",terms:""},address:{name:"Address",terms:""},"advertising/billboard":{name:"Billboard",terms:""},"advertising/column":{name:"Advertising Column",terms:""},"aerialway/station":{name:"Aerialway Station",terms:""},"aerialway/cable_car":{name:"Cable Car",terms:"tramway,ropeway"},"aerialway/chair_lift":{name:"Chair Lift",terms:""},"aerialway/drag_lift":{name:"Drag Lift",terms:""},"aerialway/gondola":{name:"Gondola",terms:""},"aerialway/goods":{name:"Goods Aerialway",terms:""},"aerialway/magic_carpet":{name:"Magic Carpet Lift",terms:""},"aerialway/mixed_lift":{name:"Mixed Lift",terms:""},"aerialway/platter":{name:"Platter Lift",terms:"button lift,poma lift"},"aerialway/pylon":{name:"Aerialway Pylon",terms:""},"aerialway/rope_tow":{name:"Rope Tow Lift",terms:"handle tow,bugel lift"},"aerialway/t-bar":{name:"T-bar Lift",terms:"tbar"},"aeroway/aerodrome":{name:"Airport",terms:"aerodrome,aeroway,airplane,airport,jet,plane"},"aeroway/apron":{name:"Apron",terms:"ramp"},"aeroway/gate":{name:"Airport Gate",terms:""},"aeroway/hangar":{name:"Hangar",terms:""},"aeroway/helipad":{name:"Helipad",terms:"helicopter,helipad,heliport"},"aeroway/runway":{name:"Runway",terms:"landing strip"},"aeroway/taxiway":{name:"Taxiway",terms:""},"aeroway/terminal":{name:"Airport Terminal",terms:"airport,aerodrome"},"allotments/plot":{name:"Community Garden Plot",terms:""},"amenity/bus_station":{name:"Bus Station / Terminal",terms:""},"amenity/coworking_space":{name:"Coworking Space",terms:""},"amenity/ferry_terminal":{name:"Ferry Station / Terminal",terms:""},"amenity/nursing_home":{name:"Nursing Home",terms:""},"amenity/recycling":{name:"Recycling",terms:"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"amenity/register_office":{name:"Register Office",terms:""},"amenity/scrapyard":{name:"Scrap Yard",terms:""},"amenity/swimming_pool":{name:"Swimming Pool",terms:""},"amenity/animal_boarding":{name:"Animal Boarding Facility",terms:"boarding,cat,cattery,dog,horse,kennel,kitten,pet,pet boarding,pet care,pet hotel,puppy,reptile"},"amenity/animal_breeding":{name:"Animal Breeding Facility",terms:"breeding,bull,cat,cow,dog,horse,husbandry,kitten,livestock,pet breeding,puppy,reptile"},"amenity/animal_shelter":{name:"Animal Shelter",terms:"adoption,aspca,cat,dog,horse,kitten,pet care,pet rescue,puppy,raptor,reptile,rescue,spca"},"amenity/arts_centre":{name:"Arts Center",terms:""},"amenity/atm":{name:"ATM",terms:"money,cash,machine"},"amenity/bank":{name:"Bank",terms:"credit union,check,deposit,fund,investment,repository,reserve,safe,savings,stock,treasury,trust,vault"},"amenity/bar":{name:"Bar",terms:"dive,beer,bier,booze"},"amenity/bbq":{name:"Barbecue/Grill",terms:"bbq,grill"},"amenity/bench":{name:"Bench",terms:"seat"},"amenity/bicycle_parking":{name:"Bicycle Parking",terms:"bike"},"amenity/bicycle_rental":{name:"Bicycle Rental",terms:"bike"},"amenity/bicycle_repair_station":{name:"Bicycle Repair Tool Stand",terms:"bike,repair,chain,pump"},"amenity/biergarten":{name:"Biergarten",terms:"beer,bier,booze"},"amenity/boat_rental":{name:"Boat Rental",terms:""},"amenity/bureau_de_change":{name:"Currency Exchange",terms:"bureau de change,money changer"},"amenity/cafe":{name:"Cafe",terms:"bistro,coffee,tea"},"amenity/car_pooling":{name:"Car Pooling",terms:""},"amenity/car_rental":{name:"Car Rental",terms:""},"amenity/car_sharing":{name:"Car Sharing",terms:""},"amenity/car_wash":{name:"Car Wash",terms:""},"amenity/casino":{name:"Casino",terms:"gambling,roulette,craps,poker,blackjack"},"amenity/charging_station":{name:"Charging Station",terms:"EV,Electric Vehicle,Supercharger"},"amenity/childcare":{name:"Nursery/Childcare",terms:"daycare,orphanage,playgroup"},"amenity/cinema":{name:"Cinema",terms:"drive-in,film,flick,movie,theater,picture,show,screen"},"amenity/clinic":{name:"Clinic",terms:"medical,urgentcare"},"amenity/clinic/abortion":{name:"Abortion Clinic",terms:""},"amenity/clinic/fertility":{name:"Fertility Clinic",terms:"egg,fertility,reproductive,sperm,ovulation"},"amenity/clock":{name:"Clock",terms:""},"amenity/college":{name:"College Grounds",terms:"university"},"amenity/community_centre":{name:"Community Center",terms:"event,hall"},"amenity/compressed_air":{name:"Compressed Air",terms:""},"amenity/courthouse":{name:"Courthouse",terms:""},"amenity/crematorium":{name:"Crematorium",terms:"cemetery,funeral"},"amenity/dentist":{name:"Dentist",terms:"tooth,teeth"},"amenity/dive_centre":{name:"Dive Center",terms:"diving,scuba"},"amenity/doctors":{name:"Doctor",terms:"medic*,physician"},"amenity/dojo":{name:"Dojo / Martial Arts Academy",terms:"martial arts,dojang"},"amenity/drinking_water":{name:"Drinking Water",terms:"fountain,potable"},"amenity/driving_school":{name:"Driving School",terms:""},"amenity/embassy":{name:"Embassy",terms:""},"amenity/fast_food":{name:"Fast Food",terms:"restaurant,takeaway"},"amenity/fast_food/burger":{name:"Burger Fast Food",terms:"breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/chicken":{name:"Chicken Fast Food",terms:"breakfast,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/fish_and_chips":{name:"Fish & Chips Fast Food",terms:"breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table,french fries"},"amenity/fast_food/kebab":{name:"Kebab Fast Food",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/pizza":{name:"Pizza Fast Food",terms:"dine,dining,dinner,drive-in,eat,lunch,table,deep dish,thin crust,slice"},"amenity/fast_food/sandwich":{name:"Sandwich Fast Food",terms:"breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fire_station":{name:"Fire Station",terms:""},"amenity/food_court":{name:"Food Court",terms:"fast food,restaurant,food"},"amenity/fountain":{name:"Fountain",terms:""},"amenity/fuel":{name:"Gas Station",terms:"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/grave_yard":{name:"Graveyard",terms:""},"amenity/grit_bin":{name:"Grit Bin",terms:"salt,sand"},"amenity/hospital":{name:"Hospital Grounds",terms:"clinic,doctor,emergency room,health,infirmary,institution,sanatorium,sanitarium,sick,surgery,ward"},"amenity/hunting_stand":{name:"Hunting Stand",terms:"game,gun,lookout,rifle,shoot*,wild,watch"},"amenity/ice_cream":{name:"Ice Cream Shop",terms:"gelato,sorbet,sherbet,frozen,yogurt"},"amenity/internet_cafe":{name:"Internet Cafe",terms:"cybercafe,taxiphone,teleboutique,coffee,cafe,net,lanhouse"},"amenity/kindergarten":{name:"Preschool/Kindergarten Grounds",terms:"kindergarden,pre-school"},"amenity/language_school":{name:"Language School",terms:"esl"},"amenity/library":{name:"Library",terms:"book"},"amenity/love_hotel":{name:"Love Hotel",terms:""},"amenity/marketplace":{name:"Marketplace",terms:""},"amenity/monastery":{name:"Monastery Grounds",terms:"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,monastery,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"amenity/money_transfer":{name:"Money Transfer Station",terms:"money order,check,bill,currency,finance,wire transfer,cable,person to person,cash to cash,exchange"},"amenity/motorcycle_parking":{name:"Motorcycle Parking",terms:""},"amenity/music_school":{name:"Music School",terms:"school of music"},"amenity/nightclub":{name:"Nightclub",terms:"disco*,night club,dancing,dance club"},"amenity/parking_entrance":{name:"Parking Garage Entrance/Exit",terms:""},"amenity/parking_space":{name:"Parking Space",terms:""},"amenity/parking":{name:"Parking Lot",terms:"automobile parking,car lot,car parking,rv parking,truck parking,vehicle parking"},"amenity/parking/multi-storey":{name:"Multilevel Parking Garage",terms:"car,indoor parking,multistorey car park,parkade,parking building,parking deck,parking garage,parking ramp,parking structure"},"amenity/payment_centre":{name:"Payment Center",terms:"check,tax pay,bill pay,currency,finance,cash,money"},"amenity/payment_terminal":{name:"Payment Terminal",terms:"interactive kiosk,ekiosk,atm,bill pay,tax pay,phone pay,finance,cash,money transfer,card"},"amenity/pharmacy":{name:"Pharmacy",terms:"apothecary,drug*,med*,prescription"},"amenity/place_of_worship":{name:"Place of Worship",terms:"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"amenity/place_of_worship/buddhist":{name:"Buddhist Temple",terms:"stupa,vihara,monastery,temple,pagoda,zendo,dojo"},"amenity/place_of_worship/christian":{name:"Church",terms:"christian,abbey,basilica,bethel,cathedral,chancel,chantry,chapel,fold,house of God,house of prayer,house of worship,minster,mission,oratory,parish,sacellum,sanctuary,shrine,tabernacle,temple"},"amenity/place_of_worship/hindu":{name:"Hindu Temple",terms:"kovil,devasthana,mandir,kshetram,alayam,shrine,temple"},"amenity/place_of_worship/jewish":{name:"Synagogue",terms:"jewish"},"amenity/place_of_worship/muslim":{name:"Mosque",terms:"muslim"},"amenity/place_of_worship/shinto":{name:"Shinto Shrine",terms:"kami,torii"},"amenity/place_of_worship/sikh":{name:"Sikh Temple",terms:"gurudwara,temple"},"amenity/place_of_worship/taoist":{name:"Taoist Temple",terms:"daoist,monastery,temple"},"amenity/planetarium":{name:"Planetarium",terms:"museum,astronomy,observatory"},"amenity/police":{name:"Police",terms:"badge,constable,constabulary,cop,detective,fed,law,enforcement,officer,patrol"},"amenity/post_box":{name:"Mailbox",terms:"letter,post"},"amenity/post_office":{name:"Post Office",terms:"letter,mail"},"amenity/prison":{name:"Prison Grounds",terms:"cell,jail"},"amenity/pub":{name:"Pub",terms:"alcohol,drink,dive,beer,bier,booze"},"amenity/public_bath":{name:"Public Bath",terms:"onsen,foot bath,hot springs"},"amenity/public_bookcase":{name:"Public Bookcase",terms:"library,bookcrossing"},"amenity/ranger_station":{name:"Ranger Station",terms:"visitor center,visitor centre,permit center,permit centre,backcountry office,warden office,warden center"},"amenity/recycling_centre":{name:"Recycling Center",terms:"bottle,can,dump,glass,garbage,rubbish,scrap,trash"},"amenity/recycling_container":{name:"Recycling Container",terms:"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"amenity/restaurant":{name:"Restaurant",terms:"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/american":{name:"American Restaurant",terms:"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/asian":{name:"Asian Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/chinese":{name:"Chinese Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/french":{name:"French Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/german":{name:"German Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/greek":{name:"Greek Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,gyros,pitas,olives"},"amenity/restaurant/indian":{name:"Indian Restaurant",terms:"bar,breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,curry"},"amenity/restaurant/italian":{name:"Italian Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,pasta,pizza"},"amenity/restaurant/japanese":{name:"Japanese Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/mexican":{name:"Mexican Restaurant",terms:"bar,breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,tacos,burritos,enchiladas,fajitas,nachos,tortillas,salsa,tamales,quesadillas"},"amenity/restaurant/noodle":{name:"Noodle Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,ramen noodles,soup,soba noodles,cellophane noodles,rice noodles"},"amenity/restaurant/pizza":{name:"Pizza Restaurant",terms:"bar,dine,dining,dinner,drive-in,eat,lunch,table,deep dish,thin crust,slice"},"amenity/restaurant/seafood":{name:"Seafood Restaurant",terms:"bar,breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table,fish,shellfish,molluscs,crustaceans,clams,oysters,lobsters,crab,shrimp,squid,octopus"},"amenity/restaurant/steakhouse":{name:"Steakhouse",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,steak house,chop house,beef"},"amenity/restaurant/sushi":{name:"Sushi Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/thai":{name:"Thai Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/turkish":{name:"Turkish Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/vietnamese":{name:"Vietnamese Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/sanitary_dump_station":{name:"RV Toilet Disposal",terms:"Motor Home,Camper,Sanitary,Dump Station,Elsan,CDP,CTDP,Chemical Toilet"},"amenity/school":{name:"School Grounds",terms:"academy,elementary school,middle school,high school"},"amenity/shelter":{name:"Shelter",terms:"lean-to,gazebo,picnic"},"amenity/shelter/gazebo":{name:"Gazebo",terms:""},"amenity/shelter/lean_to":{name:"Lean-To",terms:""},"amenity/shelter/picnic_shelter":{name:"Picnic Shelter",terms:"pavilion"},"amenity/shelter/public_transport":{name:"Transit Shelter",terms:"bus stop,metro stop,waiting"},"amenity/shower":{name:"Shower",terms:"rain closet"},"amenity/smoking_area":{name:"Smoking Area",terms:""},"amenity/social_facility":{name:"Social Facility",terms:""},"amenity/social_facility/food_bank":{name:"Food Bank",terms:""},"amenity/social_facility/group_home":{name:"Elderly Group Home",terms:"old,senior,living,care home,assisted living"},"amenity/social_facility/homeless_shelter":{name:"Homeless Shelter",terms:"houseless,unhoused,displaced"},"amenity/social_facility/nursing_home":{name:"Nursing Home",terms:"elderly,living,nursing,old,senior,assisted living"},"amenity/studio":{name:"Studio",terms:"recording,radio,television"},"amenity/taxi":{name:"Taxi Stand",terms:"cab"},"amenity/telephone":{name:"Telephone",terms:"phone"},"amenity/theatre":{name:"Theater",terms:"theatre,performance,play,musical"},"amenity/theatre/type/amphi":{name:"Amphitheatre",terms:"open air,outdoor,greek,ampi"},"amenity/toilets":{name:"Toilets",terms:"bathroom,restroom,outhouse,privy,head,lavatory,latrine,water closet,WC,W.C."},"amenity/townhall":{name:"Town Hall",terms:"village,city,government,courthouse,municipal"},"amenity/university":{name:"University Grounds",terms:"college"},"amenity/vehicle_inspection":{name:"Vehicle Inspection",terms:"car inspection"},"amenity/vending_machine":{name:"Vending Machine",terms:""},"amenity/vending_machine/news_papers":{name:"Newspaper Vending Machine",terms:"newspaper"},"amenity/vending_machine/cigarettes":{name:"Cigarette Vending Machine",terms:"cigarette"},"amenity/vending_machine/coffee":{name:"Coffee Vending Machine",terms:"coffee"},"amenity/vending_machine/condoms":{name:"Condom Vending Machine",terms:"condom"},"amenity/vending_machine/drinks":{name:"Drink Vending Machine",terms:"drink,soda,beverage,juice,pop"},"amenity/vending_machine/electronics":{name:"Electronics Vending Machine",terms:"cable,charger,earbud,headphone,phone,tablet"},"amenity/vending_machine/elongated_coin":{name:"Flat Coin Vending Machine",terms:"coin,crush,elongated,flatten,penny,souvenir"},"amenity/vending_machine/excrement_bags":{name:"Excrement Bag Vending Machine",terms:"excrement bags,poop,dog,animal"},"amenity/vending_machine/feminine_hygiene":{name:"Feminine Hygiene Vending Machine",terms:"condom,tampon,pad,woman,women,menstrual hygiene products,personal care"},"amenity/vending_machine/food":{name:"Food Vending Machine",terms:"food"},"amenity/vending_machine/fuel":{name:"Gas Pump",terms:"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/vending_machine/ice_cream":{name:"Ice Cream Vending Machine",terms:"chocolate,ice cream,frozen,popsicle,vanilla"},"amenity/vending_machine/newspapers":{name:"Newspaper Vending Machine",terms:"newspaper"},"amenity/vending_machine/parcel_pickup_dropoff":{name:"Parcel Pickup/Dropoff Locker",terms:"mail,parcel,pickup"},"amenity/vending_machine/parcel_pickup":{name:"Parcel Pickup Locker",terms:"amazon,locker,mail,parcel,pickup"},"amenity/vending_machine/parking_tickets":{name:"Parking Ticket Vending Machine",terms:"parking,ticket"},"amenity/vending_machine/public_transport_tickets":{name:"Transit Ticket Vending Machine",terms:"bus,train,ferry,rail,ticket,transportation"},"amenity/vending_machine/stamps":{name:"Postage Vending Machine",terms:"mail,postage,stamp"},"amenity/vending_machine/sweets":{name:"Snack Vending Machine",terms:"candy,gum,chip,pretzel,cookie,cracker"},"amenity/veterinary":{name:"Veterinary",terms:"pet clinic,veterinarian,animal hospital,pet doctor"},"amenity/waste_basket":{name:"Waste Basket",terms:"bin,garbage,rubbish,litter,trash"},"amenity/waste_disposal":{name:"Garbage Dumpster",terms:"garbage,rubbish,litter,trash"},"amenity/waste_transfer_station":{name:"Waste Transfer Station",terms:"dump,garbage,recycling,rubbish,scrap,trash"},"amenity/waste/dog_excrement":{name:"Dog Excrement Bin",terms:"bin,garbage,rubbish,litter,trash,poo,dog"},"amenity/water_point":{name:"RV Drinking Water",terms:""},"amenity/watering_place":{name:"Animal Watering Place",terms:""},area:{name:"Area",terms:""},"area/highway":{name:"Road Surface",terms:""},"attraction/amusement_ride":{name:"Amusement Ride",terms:"theme park,carnival ride"},"attraction/animal":{name:"Animal",terms:"zoo,theme park,animal park,lion,tiger,bear"},"attraction/big_wheel":{name:"Big Wheel",terms:"ferris wheel,theme park,amusement ride"},"attraction/bumper_car":{name:"Bumper Car",terms:"theme park,dodgem cars,autoscooter"},"attraction/bungee_jumping":{name:"Bungee Jumping",terms:"theme park,bungy jumping,jumping platform"},"attraction/carousel":{name:"Carousel",terms:"theme park,roundabout,merry-go-round,galloper,jumper,horseabout,flying horses"},"attraction/dark_ride":{name:"Dark Ride",terms:"theme park,ghost train"},"attraction/drop_tower":{name:"Drop Tower",terms:"theme park,amusement ride,gondola,tower,big drop"},"attraction/maze":{name:"Maze",terms:"theme park,amusement ride,labyrinth"},"attraction/pirate_ship":{name:"Pirate Ship",terms:"theme park,carnival ride,amusement ride"},"attraction/river_rafting":{name:"River Rafting",terms:"theme park,aquatic park,water park,rafting simulator,river rafting ride,river rapids ride"},"attraction/roller_coaster":{name:"Roller Coaster",terms:"theme park,amusement ride"},"attraction/summer_toboggan":{name:"Summer Toboggan",terms:"alpine slide,mountain coaster"},"attraction/train":{name:"Tourist Train",terms:"theme park,rackless train,road train,Tschu-Tschu train,dotto train,park train"},"attraction/water_slide":{name:"Water Slide",terms:"theme park,aquatic park,water park,flumes,water chutes,hydroslides"},barrier:{name:"Barrier",terms:""},"barrier/entrance":{name:"Entrance",terms:""},"barrier/block":{name:"Block",terms:""},"barrier/bollard":{name:"Bollard",terms:""},"barrier/border_control":{name:"Border Control",terms:""},"barrier/cattle_grid":{name:"Cattle Grid",terms:""},"barrier/city_wall":{name:"City Wall",terms:""},"barrier/cycle_barrier":{name:"Cycle Barrier",terms:""},"barrier/ditch":{name:"Trench",terms:""},"barrier/fence":{name:"Fence",terms:""},"barrier/fence/railing":{name:"Railing",terms:"railing,handrail,guard rail"},"barrier/gate":{name:"Gate",terms:""},"barrier/guard_rail":{name:"Guard Rail",terms:"guardrail,traffic barrier,crash barrier,median barrier,roadside barrier,Armco barrier"},"barrier/hedge":{name:"Hedge",terms:""},"barrier/kerb":{name:"Curb",terms:""},"barrier/kerb/flush":{name:"Flush Curb",terms:"even curb,level curb,tactile curb"},"barrier/kerb/lowered":{name:"Lowered Curb",terms:"curb cut,curb ramp,kerb ramp,dropped kerb,pram ramp"},"barrier/kissing_gate":{name:"Kissing Gate",terms:""},"barrier/lift_gate":{name:"Lift Gate",terms:""},"barrier/retaining_wall":{name:"Retaining Wall",terms:""},"barrier/stile":{name:"Stile",terms:""},"barrier/toll_booth":{name:"Toll Booth",terms:""},"barrier/wall":{name:"Wall",terms:""},"boundary/administrative":{name:"Administrative Boundary",terms:""},"bridge/support":{name:"Bridge Support",terms:""},"bridge/support/pier":{name:"Bridge Pier",terms:""},building:{name:"Building",terms:""},"building/bunker":{name:"Bunker",terms:""},"building/entrance":{name:"Entrance/Exit",terms:""},"building/train_station":{name:"Train Station",terms:""},"building/apartments":{name:"Apartments",terms:""},"building/barn":{name:"Barn",terms:""},"building/boathouse":{name:"Boathouse",terms:""},"building/bungalow":{name:"Bungalow",terms:"home,detached"},"building/cabin":{name:"Cabin",terms:""},"building/carport":{name:"Carport",terms:"covered parking space,garage,car,porch"},"building/cathedral":{name:"Cathedral Building",terms:""},"building/chapel":{name:"Chapel Building",terms:""},"building/church":{name:"Church Building",terms:""},"building/civic":{name:"Civic Building",terms:""},"building/college":{name:"College Building",terms:"university"},"building/commercial":{name:"Commercial Building",terms:""},"building/construction":{name:"Building Under Construction",terms:""},"building/detached":{name:"Detached House",terms:"home,single,family,residence,dwelling"},"building/dormitory":{name:"Dormitory",terms:""},"building/farm_auxiliary":{name:"Farm Building",terms:""},"building/farm":{name:"Farm House",terms:""},"building/garage":{name:"Garage",terms:""},"building/garages":{name:"Garages",terms:""},"building/grandstand":{name:"Grandstand",terms:"tribune,stand,stands,bleachers"},"building/greenhouse":{name:"Greenhouse",terms:""},"building/hospital":{name:"Hospital Building",terms:""},"building/hotel":{name:"Hotel Building",terms:""},"building/house":{name:"House",terms:"home,family,residence,dwelling"},"building/hut":{name:"Hut",terms:""},"building/industrial":{name:"Industrial Building",terms:""},"building/kindergarten":{name:"Preschool/Kindergarten Building",terms:"kindergarden,pre-school"},"building/mosque":{name:"Mosque Building",terms:""},"building/pavilion":{name:"Pavilion Building",terms:"sports"},"building/public":{name:"Public Building",terms:""},"building/residential":{name:"Residential Building",terms:""},"building/retail":{name:"Retail Building",terms:""},"building/roof":{name:"Roof",terms:""},"building/ruins":{name:"Building Ruins",terms:""},"building/school":{name:"School Building",terms:"academy,elementary school,middle school,high school"},"building/semidetached_house":{name:"Semi-Detached House",terms:"home,double,duplex,twin,family,residence,dwelling"},"building/service":{name:"Service Building",terms:""},"building/shed":{name:"Shed",terms:""},"building/stable":{name:"Stable",terms:""},"building/stadium":{name:"Stadium Building",terms:""},"building/static_caravan":{name:"Static Mobile Home",terms:""},"building/temple":{name:"Temple Building",terms:""},"building/terrace":{name:"Row Houses",terms:"home,terrace,brownstone,family,residence,dwelling"},"building/transportation":{name:"Transportation Building",terms:""},"building/university":{name:"University Building",terms:"college"},"building/warehouse":{name:"Warehouse",terms:""},"camp_site/camp_pitch":{name:"Camp Pitch",terms:"tent,rv"},club:{name:"Club",terms:"social"},craft:{name:"Craft",terms:""},"craft/jeweler":{name:"Jeweler",terms:""},"craft/locksmith":{name:"Locksmith",terms:""},"craft/optician":{name:"Optician",terms:""},"craft/tailor":{name:"Tailor",terms:"clothes,suit"},"craft/basket_maker":{name:"Basket Maker",terms:""},"craft/beekeeper":{name:"Beekeeper",terms:""},"craft/blacksmith":{name:"Blacksmith",terms:""},"craft/boatbuilder":{name:"Boat Builder",terms:""},"craft/bookbinder":{name:"Bookbinder",terms:"book repair"},"craft/brewery":{name:"Brewery",terms:"alcohol,beer,beverage,bier,booze,cider"},"craft/carpenter":{name:"Carpenter",terms:"woodworker"},"craft/carpet_layer":{name:"Carpet Layer",terms:""},"craft/caterer":{name:"Caterer",terms:""},"craft/chimney_sweeper":{name:"Chimney Sweeper",terms:""},"craft/clockmaker":{name:"Clockmaker",terms:""},"craft/confectionery":{name:"Candy Maker",terms:"sweet,candy"},"craft/distillery":{name:"Distillery",terms:"alcohol,beverage,bourbon,booze,brandy,gin,hooch,liquor,mezcal,moonshine,rum,scotch,spirits,still,tequila,vodka,whiskey,whisky"},"craft/dressmaker":{name:"Dressmaker",terms:"seamstress"},"craft/electrician":{name:"Electrician",terms:"power,wire"},"craft/electronics_repair":{name:"Electronics Repair Shop",terms:""},"craft/gardener":{name:"Gardener",terms:"landscaper,grounds keeper"},"craft/glaziery":{name:"Glaziery",terms:"glass,stained-glass,window"},"craft/handicraft":{name:"Handicraft",terms:""},"craft/hvac":{name:"HVAC",terms:"heat*,vent*,air conditioning"},"craft/insulator":{name:"Insulator",terms:""},"craft/key_cutter":{name:"Key Cutter",terms:""},"craft/metal_construction":{name:"Metal Construction",terms:""},"craft/painter":{name:"Painter",terms:""},"craft/photographer":{name:"Photographer",terms:""},"craft/photographic_laboratory":{name:"Photographic Laboratory",terms:"film"},"craft/plasterer":{name:"Plasterer",terms:""},"craft/plumber":{name:"Plumber",terms:"pipe"},"craft/pottery":{name:"Pottery",terms:"ceramic"},"craft/rigger":{name:"Rigger",terms:""},"craft/roofer":{name:"Roofer",terms:""},"craft/saddler":{name:"Saddler",terms:""},"craft/sailmaker":{name:"Sailmaker",terms:""},"craft/sawmill":{name:"Sawmill",terms:"lumber"},"craft/scaffolder":{name:"Scaffolder",terms:""},"craft/sculptor":{name:"Sculptor",terms:""},"craft/shoemaker":{name:"Shoemaker",terms:"cobbler"},"craft/stonemason":{name:"Stonemason",terms:"masonry"},"craft/tiler":{name:"Tiler",terms:""},"craft/tinsmith":{name:"Tinsmith",terms:""},"craft/upholsterer":{name:"Upholsterer",terms:""},"craft/watchmaker":{name:"Watchmaker",terms:""},"craft/window_construction":{name:"Window Construction",terms:"glass"},"craft/winery":{name:"Winery",terms:""},"emergency/designated":{name:"Emergency Access Designated",terms:""},"emergency/destination":{name:"Emergency Access Destination",terms:""},"emergency/no":{name:"Emergency Access No",terms:""},"emergency/official":{name:"Emergency Access Official",terms:""},"emergency/private":{name:"Emergency Access Private",terms:""},"emergency/yes":{name:"Emergency Access Yes",terms:""},"emergency/ambulance_station":{name:"Ambulance Station",terms:"EMS,EMT,rescue"},"emergency/defibrillator":{name:"Defibrillator",terms:"AED"},"emergency/fire_alarm":{name:"Fire Alarm Call Box",terms:""},"emergency/fire_extinguisher":{name:"Fire Extinguisher",terms:""},"emergency/fire_hydrant":{name:"Fire Hydrant",terms:"fire plug"},"emergency/first_aid_kit":{name:"First Aid Kit",terms:"bandage,first aid,med,med kit,medic*,medkit"},"emergency/life_ring":{name:"Life Ring",terms:"life buoy,kisby ring,kisbie ring,perry buoy"},"emergency/lifeguard":{name:"Lifeguard",terms:"CPR,rescue"},"emergency/phone":{name:"Emergency Phone",terms:""},"emergency/siren":{name:"Siren",terms:"air raid,loud,noise,storm,tornado,warning"},"emergency/water_tank":{name:"Emergency Water Tank",terms:"water tank,cistern,reservoir"},entrance:{name:"Entrance/Exit",terms:"entrance,exit,door"},ford:{name:"Ford",terms:""},"golf/bunker":{name:"Sand Trap",terms:"hazard,bunker"},"golf/fairway":{name:"Fairway",terms:""},"golf/green":{name:"Putting Green",terms:""},"golf/hole":{name:"Golf Hole",terms:""},"golf/lateral_water_hazard_area":{name:"Lateral Water Hazard",terms:""},"golf/lateral_water_hazard_line":{name:"Lateral Water Hazard",terms:""},"golf/rough":{name:"Rough",terms:""},"golf/tee":{name:"Tee Box",terms:"teeing ground"},"golf/water_hazard_area":{name:"Water Hazard",terms:""},"golf/water_hazard_line":{name:"Water Hazard",terms:""},healthcare:{name:"Healthcare Facility",terms:"clinic,doctor,disease,health,institution,sick,surgery,wellness"},"healthcare/alternative":{name:"Alternative Medicine",terms:"acupuncture,anthroposophical,applied kinesiology,aromatherapy,ayurveda,herbalism,homeopathy,hydrotherapy,hypnosis,naturopathy,osteopathy,reflexology,reiki,shiatsu,traditional,tuina,unani"},"healthcare/alternative/chiropractic":{name:"Chiropractor",terms:"back,pain,spine"},"healthcare/audiologist":{name:"Audiologist",terms:"ear,hearing,sound"},"healthcare/birthing_center":{name:"Birthing Center",terms:"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/blood_donation":{name:"Blood Donor Center",terms:"blood bank,blood donation,blood transfusion,apheresis,plasmapheresis,plateletpheresis,stem cell donation"},"healthcare/hospice":{name:"Hospice",terms:"terminal,illness"},"healthcare/laboratory":{name:"Medical Laboratory",terms:"medical_laboratory,medical_lab,blood_check"},"healthcare/midwife":{name:"Midwife",terms:"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/occupational_therapist":{name:"Occupational Therapist",terms:"therapist,therapy"},"healthcare/optometrist":{name:"Optometrist",terms:"eye,glasses,lasik,lenses,vision"},"healthcare/physiotherapist":{name:"Physiotherapist",terms:"physical,therapist,therapy"},"healthcare/podiatrist":{name:"Podiatrist",terms:"foot,feet,nails"},"healthcare/psychotherapist":{name:"Psychotherapist",terms:"anxiety,counselor,depression,mental health,mind,suicide,therapist,therapy"},"healthcare/rehabilitation":{name:"Rehabilitation Facility",terms:"rehab,therapist,therapy"},"healthcare/speech_therapist":{name:"Speech Therapist",terms:"speech,therapist,therapy,voice"},"highway/bus_stop":{name:"Bus Stop / Platform",terms:""},"highway/bridleway":{name:"Bridle Path",terms:"bridleway,equestrian,horse,trail"},"highway/bus_guideway":{name:"Bus Guideway",terms:""},"highway/corridor":{name:"Indoor Corridor",terms:"gallery,hall,hallway,indoor,passage,passageway"},"highway/crossing/zebra-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/crossing/zebra":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/crossing/marked-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/crossing/marked":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/crossing/unmarked-raised":{name:"Unmarked Crossing (Raised)",terms:"flat top,hump,speed,slow"},"highway/crossing/unmarked":{name:"Unmarked Crossing",terms:""},"highway/cycleway":{name:"Cycle Path",terms:"bike"},"highway/elevator":{name:"Elevator",terms:"lift"},"highway/footway":{name:"Foot Path",terms:"hike,hiking,trackway,trail,walk"},"highway/footway/zebra-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/footway/zebra":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/footway/conveying":{name:"Moving Walkway",terms:"moving sidewalk,autwalk,skywalk,travolator,travelator,travellator,conveyor"},"highway/footway/marked-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/footway/marked":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/footway/sidewalk":{name:"Sidewalk",terms:"pavement,sidepath"},"highway/footway/unmarked-raised":{name:"Unmarked Crossing (Raised)",terms:"flat top,hump,speed,slow"},"highway/footway/unmarked":{name:"Unmarked Crossing",terms:""},"highway/give_way":{name:"Yield Sign",terms:"give way,yield,sign"},"highway/living_street":{name:"Living Street",terms:""},"highway/milestone":{name:"Highway Milestone",terms:"milestone,marker"},"highway/mini_roundabout":{name:"Mini-Roundabout",terms:""},"highway/motorway_junction":{name:"Motorway Junction / Exit",terms:"exit"},"highway/motorway_link":{name:"Motorway Link",terms:"exit,ramp,road,street,on ramp,off ramp"},"highway/motorway":{name:"Motorway",terms:"autobahn,expressway,freeway,highway,interstate,parkway,road,street,thruway,turnpike"},"highway/passing_place":{name:"Passing Place",terms:"turnout, pullout"},"highway/path":{name:"Path",terms:"hike,hiking,trackway,trail,walk"},"highway/pedestrian_area":{name:"Pedestrian Area",terms:"center,centre,plaza,quad,square,walkway"},"highway/pedestrian_line":{name:"Pedestrian Street",terms:"center,centre,plaza,quad,square,walkway"},"highway/primary_link":{name:"Primary Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/primary":{name:"Primary Road",terms:"road,street"},"highway/raceway":{name:"Racetrack (Motorsport)",terms:"auto*,formula one,kart,motocross,nascar,race*,track"},"highway/residential":{name:"Residential Road",terms:"road,street"},"highway/rest_area":{name:"Rest Area",terms:"rest stop"},"highway/road":{name:"Unknown Road",terms:"road,street"},"highway/secondary_link":{name:"Secondary Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/secondary":{name:"Secondary Road",terms:"road,street"},"highway/service":{name:"Service Road",terms:"road,street"},"highway/service/alley":{name:"Alley",terms:""},"highway/service/drive-through":{name:"Drive-Through",terms:""},"highway/service/driveway":{name:"Driveway",terms:""},"highway/service/emergency_access":{name:"Emergency Access",terms:""},"highway/service/parking_aisle":{name:"Parking Aisle",terms:""},"highway/services":{name:"Service Area",terms:"services,travel plaza,service station"},"highway/speed_camera":{name:"Speed Camera",terms:""},"highway/steps":{name:"Steps",terms:"stairs,staircase"},"highway/steps/conveying":{name:"Escalator",terms:"moving staircase,moving stairway,people mover"},"highway/stop":{name:"Stop Sign",terms:"stop,halt,sign"},"highway/street_lamp":{name:"Street Lamp",terms:"streetlight,street light,lamp,light,gaslight"},"highway/tertiary_link":{name:"Tertiary Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/tertiary":{name:"Tertiary Road",terms:"road,street"},"highway/track":{name:"Unmaintained Track Road",terms:"woods road,forest road,logging road,fire road,farm road,agricultural road,ranch road,carriage road,primitive,unmaintained,rut,offroad,4wd,4x4,four wheel drive,atv,quad,jeep,double track,two track"},"highway/traffic_mirror":{name:"Traffic Mirror",terms:"blind spot,convex,corner,curved,roadside,round,safety,sphere,visibility"},"highway/traffic_signals":{name:"Traffic Signals",terms:"light,stoplight,traffic light"},"highway/trunk_link":{name:"Trunk Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/trunk":{name:"Trunk Road",terms:"road,street"},"highway/turning_circle":{name:"Turning Circle",terms:"cul-de-sac"},"highway/turning_loop":{name:"Turning Loop (Island)",terms:"cul-de-sac"},"highway/unclassified":{name:"Minor/Unclassified Road",terms:"road,street"},historic:{name:"Historic Site",terms:""},"historic/archaeological_site":{name:"Archaeological Site",terms:""},"historic/boundary_stone":{name:"Boundary Stone",terms:""},"historic/castle":{name:"Castle",terms:""},"historic/memorial":{name:"Memorial",terms:"dedicatory,epitaph,remember,remembrance,memory,monument,stolperstein"},"historic/monument":{name:"Monument",terms:""},"historic/ruins":{name:"Ruins",terms:""},"historic/tomb":{name:"Tomb",terms:""},"historic/wayside_cross":{name:"Wayside Cross",terms:""},"historic/wayside_shrine":{name:"Wayside Shrine",terms:""},"historic/wreck":{name:"Shipwreck",terms:"hull,mast,maritime,remains,ship,boat"},"internet_access/wlan":{name:"Wi-Fi Hotspot",terms:"wi-fi,wifi,hotspot"},junction:{name:"Junction",terms:""},landuse:{name:"Land Use",terms:""},"landuse/farm":{name:"Farmland",terms:""},"landuse/allotments":{name:"Community Garden",terms:"allotment,garden"},"landuse/aquaculture":{name:"Aquaculture",terms:"fish farm,crustacean,algae,aquafarming,shrimp farm,oyster farm,mariculture,algaculture"},"landuse/basin":{name:"Basin",terms:""},"landuse/brownfield":{name:"Brownfield",terms:""},"landuse/cemetery":{name:"Cemetery",terms:""},"landuse/churchyard":{name:"Churchyard",terms:""},"landuse/commercial":{name:"Commercial Area",terms:""},"landuse/construction":{name:"Construction",terms:""},"landuse/farmland":{name:"Farmland",terms:"crop,grow,plant"},"landuse/farmyard":{name:"Farmyard",terms:"crop,grow,plant"},"landuse/forest":{name:"Forest",terms:"cut,forest,lumber,tree"},"landuse/garages":{name:"Garage Landuse",terms:""},"landuse/grass":{name:"Grass",terms:""},"landuse/greenfield":{name:"Greenfield",terms:""},"landuse/greenhouse_horticulture":{name:"Greenhouse Horticulture",terms:"flower,greenhouse,horticulture,grow,vivero"},"landuse/harbour":{name:"Harbor",terms:"boat"},"landuse/industrial":{name:"Industrial Area",terms:""},"landuse/industrial/scrap_yard":{name:"Scrap Yard",terms:"car,junk,metal,salvage,scrap,u-pull-it,vehicle,wreck,yard"},"landuse/industrial/slaughterhouse":{name:"Slaughterhouse",terms:"abattoir,beef,butchery,calf,chicken,cow,killing house,meat,pig,pork,poultry,shambles,stockyard"},"landuse/landfill":{name:"Landfill",terms:"dump"},"landuse/meadow":{name:"Meadow",terms:""},"landuse/military":{name:"Military Area",terms:""},"landuse/military/airfield":{name:"Military Airfield",terms:"aerodrome,aeroway,air force,airplane,airport,army,base,bomb,fight,force,guard,heli*,jet,marine,navy,plane,troop,war"},"landuse/military/barracks":{name:"Barracks",terms:"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/bunker":{name:"Military Bunker",terms:"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/checkpoint":{name:"Checkpoint",terms:"air force,army,base,force,guard,marine,navy,troop,war"},"landuse/military/danger_area":{name:"Danger Area",terms:"air force,army,base,blast,bomb,explo*,force,guard,mine,marine,navy,troop,war"},"landuse/military/naval_base":{name:"Naval Base",terms:"base,fight,force,guard,marine,navy,ship,sub,troop,war"},"landuse/military/nuclear_explosion_site":{name:"Nuclear Explosion Site",terms:"atom,blast,bomb,detonat*,nuke,site,test"},"landuse/military/obstacle_course":{name:"Obstacle Course",terms:"army,base,force,guard,marine,navy,troop,war"},"landuse/military/office":{name:"Military Office",terms:"air force,army,base,enlist,fight,force,guard,marine,navy,recruit,troop,war"},"landuse/military/range":{name:"Military Range",terms:"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/military/training_area":{name:"Training Area",terms:"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/orchard":{name:"Orchard",terms:"fruit"},"landuse/plant_nursery":{name:"Plant Nursery",terms:"flower,garden,grow,vivero"},"landuse/quarry":{name:"Quarry",terms:""},"landuse/railway":{name:"Railway Corridor",terms:"rail,train,track"},"landuse/recreation_ground":{name:"Recreation Ground",terms:"playing fields"},"landuse/religious":{name:"Religious Area",terms:""},"landuse/residential":{name:"Residential Area",terms:""},"landuse/retail":{name:"Retail Area",terms:""},"landuse/vineyard":{name:"Vineyard",terms:"grape,wine"},leisure:{name:"Leisure",terms:""},"leisure/adult_gaming_centre":{name:"Adult Gaming Center",terms:"gambling,slot machine"},"leisure/amusement_arcade":{name:"Amusement Arcade",terms:"pay-to-play games,video games,driving simulators,pinball machines"},"leisure/bandstand":{name:"Bandstand",terms:""},"leisure/beach_resort":{name:"Beach Resort",terms:""},"leisure/bird_hide":{name:"Bird Hide",terms:"machan,ornithology"},"leisure/bleachers":{name:"Bleachers",terms:"crowd,bench,sports,stand,stands,seat,seating"},"leisure/bowling_alley":{name:"Bowling Alley",terms:"bowling center"},"leisure/common":{name:"Common",terms:"open space"},"leisure/dance":{name:"Dance Hall",terms:"ballroom,jive,swing,tango,waltz"},"leisure/dancing_school":{name:"Dance School",terms:"jive,swing,tango,waltz,dance teaching"},"leisure/dog_park":{name:"Dog Park",terms:""},"leisure/firepit":{name:"Firepit",terms:"fireplace,campfire"},"leisure/fishing":{name:"Fishing Spot",terms:"angler"},"leisure/fitness_centre":{name:"Gym / Fitness Center",terms:"health,gym,leisure,studio"},"leisure/fitness_centre/yoga":{name:"Yoga Studio",terms:"studio"},"leisure/fitness_station":{name:"Outdoor Fitness Station",terms:"exercise,fitness,gym,trim trail"},"leisure/fitness_station/balance_beam":{name:"Exercise Balance Beam",terms:"balance,exercise,fitness,gym,trim trail"},"leisure/fitness_station/box":{name:"Exercise Box",terms:"box,exercise,fitness,gym,jump,trim trail"},"leisure/fitness_station/horizontal_bar":{name:"Exercise Horizontal Bar",terms:"bar,chinup,chin up,exercise,fitness,gym,pullup,pull up,trim trail"},"leisure/fitness_station/horizontal_ladder":{name:"Exercise Monkey Bars",terms:"bar,chinup,chin up,exercise,fitness,gym,ladder,monkey bars,pullup,pull up,trim trail"},"leisure/fitness_station/hyperextension":{name:"Hyperextension Station",terms:"back,exercise,extension,fitness,gym,roman chair,trim trail"},"leisure/fitness_station/parallel_bars":{name:"Parallel Bars",terms:"bar,dip,exercise,fitness,gym,trim trail"},"leisure/fitness_station/push-up":{name:"Push-Up Station",terms:"bar,exercise,fitness,gym,pushup,push up,trim trail"},"leisure/fitness_station/rings":{name:"Exercise Rings",terms:"exercise,fitness,gym,muscle up,pullup,pull up,trim trail"},"leisure/fitness_station/sign":{name:"Exercise Instruction Sign",terms:"exercise,fitness,gym,trim trail"},"leisure/fitness_station/sit-up":{name:"Sit-Up Station",terms:"crunch,exercise,fitness,gym,situp,sit up,trim trail"},"leisure/fitness_station/stairs":{name:"Exercise Stairs",terms:"exercise,fitness,gym,steps,trim trail"},"leisure/garden":{name:"Garden",terms:""},"leisure/golf_course":{name:"Golf Course",terms:"links"},"leisure/hackerspace":{name:"Hackerspace",terms:"makerspace,hackspace,hacklab"},"leisure/horse_riding":{name:"Horseback Riding Facility",terms:"equestrian,stable"},"leisure/ice_rink":{name:"Ice Rink",terms:"hockey,skating,curling"},"leisure/marina":{name:"Marina",terms:"boat"},"leisure/miniature_golf":{name:"Miniature Golf",terms:"crazy golf,mini golf,putt-putt"},"leisure/nature_reserve":{name:"Nature Reserve",terms:"protected,wildlife"},"leisure/outdoor_seating":{name:"Outdoor Seating Area",terms:"al fresco,beer garden,dining,cafe,restaurant,pub,bar,patio"},"leisure/park":{name:"Park",terms:"esplanade,estate,forest,garden,grass,green,grounds,lawn,lot,meadow,parkland,place,playground,plaza,pleasure garden,recreation area,square,tract,village green,woodland"},"leisure/picnic_table":{name:"Picnic Table",terms:"bench"},"leisure/pitch":{name:"Sport Pitch",terms:"field"},"leisure/pitch/american_football":{name:"American Football Field",terms:""},"leisure/pitch/badminton":{name:"Badminton Court",terms:""},"leisure/pitch/baseball":{name:"Baseball Field",terms:""},"leisure/pitch/basketball":{name:"Basketball Court",terms:""},"leisure/pitch/beachvolleyball":{name:"Beach Volleyball Court",terms:"volleyball"},"leisure/pitch/boules":{name:"Boules/Bocce Court",terms:"bocce,lyonnaise,pétanque"},"leisure/pitch/bowls":{name:"Bowling Green",terms:""},"leisure/pitch/cricket":{name:"Cricket Field",terms:""},"leisure/pitch/equestrian":{name:"Riding Arena",terms:"dressage,equestrian,horse,horseback,riding"},"leisure/pitch/rugby_league":{name:"Rugby League Field",terms:""},"leisure/pitch/rugby_union":{name:"Rugby Union Field",terms:""},"leisure/pitch/skateboard":{name:"Skate Park",terms:""},"leisure/pitch/soccer":{name:"Soccer Field",terms:"football"},"leisure/pitch/softball":{name:"Softball Field",terms:"softball,diamond"},"leisure/pitch/table_tennis":{name:"Ping Pong Table",terms:"table tennis,ping pong"},"leisure/pitch/tennis":{name:"Tennis Court",terms:""},"leisure/pitch/volleyball":{name:"Volleyball Court",terms:""},"leisure/playground":{name:"Playground",terms:"jungle gym,play area"},"leisure/resort":{name:"Resort",terms:""},"leisure/running_track":{name:"Racetrack (Running)",terms:"race*,running,sprint,track"},"leisure/sauna":{name:"Sauna",terms:""},"leisure/slipway":{name:"Slipway",terms:"boat launch,boat ramp,boat landing"},"leisure/sports_centre":{name:"Sports Center / Complex",terms:""},"leisure/sports_centre/swimming":{name:"Swimming Pool Facility",terms:"dive,water"},"leisure/stadium":{name:"Stadium",terms:""},"leisure/swimming_pool":{name:"Swimming Pool",terms:"dive,water,aquatics"},"leisure/track":{name:"Racetrack (Non-Motorsport)",terms:"cycle,dog,greyhound,horse,race*,track"},"leisure/water_park":{name:"Water Park",terms:"swim,pool,dive"},line:{name:"Line",terms:""},man_made:{name:"Man Made",terms:""},"man_made/adit":{name:"Adit",terms:"entrance,underground,mine,cave"},"man_made/antenna":{name:"Antenna",terms:"broadcast,cell phone,cell,communication,mobile phone,radio,television,transmission,tv"},"man_made/breakwater":{name:"Breakwater",terms:""},"man_made/bridge":{name:"Bridge",terms:""},"man_made/bunker_silo":{name:"Bunker Silo",terms:"Silage,Storage"},"man_made/chimney":{name:"Chimney",terms:""},"man_made/clearcut":{name:"Clearcut Forest",terms:"cut,forest,lumber,tree,wood"},"man_made/crane":{name:"Crane",terms:""},"man_made/cutline":{name:"Cut line",terms:""},"man_made/embankment":{name:"Embankment",terms:""},"man_made/flagpole":{name:"Flagpole",terms:""},"man_made/gasometer":{name:"Gasometer",terms:"gas holder"},"man_made/groyne":{name:"Groyne",terms:""},"man_made/lighthouse":{name:"Lighthouse",terms:""},"man_made/mast":{name:"Mast",terms:"antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"},"man_made/mast/communication":{name:"Communication Mast",terms:"antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"},"man_made/mast/communication/mobile_phone":{name:"Mobile Phone Mast",terms:"antenna,cell mast,cell phone mast,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,transmission mast,transmission tower"},"man_made/mast/communication/radio":{name:"Radio Broadcast Mast",terms:"antenna,broadcast tower,communication mast,communication tower,guyed tower,radio mast,radio tower,transmission mast,transmission tower"},"man_made/mast/communication/television":{name:"Television Broadcast Mast",terms:"antenna,broadcast tower,communication mast,communication tower,guyed tower,television mast,television tower,transmission mast,transmission tower,tv mast,tv tower"},"man_made/monitoring_station":{name:"Monitoring Station",terms:"weather,earthquake,seismology,air,gps"},"man_made/observatory":{name:"Observatory",terms:"astronomical,meteorological"},"man_made/petroleum_well":{name:"Oil Well",terms:"drilling rig,oil derrick,oil drill,oil horse,oil rig,oil pump,petroleum well,pumpjack"},"man_made/pier":{name:"Pier",terms:"dock,jetty"},"man_made/pipeline":{name:"Pipeline",terms:"oil,natural gas,water,sewer,sewage"},"man_made/pumping_station":{name:"Pumping Station",terms:""},"man_made/silo":{name:"Silo",terms:"grain,corn,wheat"},"man_made/storage_tank":{name:"Storage Tank",terms:"water,oil,gas,petrol"},"man_made/surveillance":{name:"Surveillance",terms:"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/surveillance/camera":{name:"Surveillance Camera",terms:"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/survey_point":{name:"Survey Point",terms:"trig point,triangulation pillar,trigonometrical station"},"man_made/tower":{name:"Tower",terms:""},"man_made/tower/communication":{name:"Communication Tower",terms:"antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"},"man_made/tower/observation":{name:"Observation Tower",terms:"lookout tower,fire tower"},"man_made/wastewater_plant":{name:"Wastewater Plant",terms:"sewage*,water treatment plant,reclamation plant"},"man_made/water_tower":{name:"Water Tower",terms:""},"man_made/water_well":{name:"Water Well",terms:""},"man_made/water_works":{name:"Water Works",terms:""},"man_made/watermill":{name:"Watermill",terms:"water,wheel,mill"},"man_made/windmill":{name:"Windmill",terms:"wind,wheel,mill"},"man_made/works":{name:"Factory",terms:"assembly,build,brewery,car,plant,plastic,processing,manufacture,refinery"},manhole:{name:"Manhole",terms:"cover,hole,sewer,sewage,telecom"},"manhole/drain":{name:"Storm Drain",terms:"cover,drain,hole,rain,sewer,sewage,storm"},"manhole/telecom":{name:"Telecom Manhole",terms:"cover,phone,hole,telecom,telephone,bt"},natural:{name:"Natural",terms:""},"natural/bare_rock":{name:"Bare Rock",terms:"rock"},"natural/bay":{name:"Bay",terms:""},"natural/beach":{name:"Beach",terms:"shore"},"natural/cave_entrance":{name:"Cave Entrance",terms:"cavern,hollow,grotto,shelter,cavity"},"natural/cliff":{name:"Cliff",terms:"crag,escarpment,rock face,scarp"},"natural/coastline":{name:"Coastline",terms:"shore"},"natural/fell":{name:"Fell",terms:""},"natural/glacier":{name:"Glacier",terms:""},"natural/grassland":{name:"Grassland",terms:"prairie,savanna"},"natural/heath":{name:"Heath",terms:""},"natural/mud":{name:"Mud",terms:"wetland"},"natural/peak":{name:"Peak",terms:"acme,aiguille,alp,climax,crest,crown,hill,mount,mountain,pinnacle,summit,tip,top"},"natural/reef":{name:"Reef",terms:"barrier,coral,ocean,sand,shoal"},"natural/ridge":{name:"Ridge",terms:"crest"},"natural/saddle":{name:"Saddle",terms:"pass,mountain pass,top"},"natural/sand":{name:"Sand",terms:"desert"},"natural/scree":{name:"Scree",terms:"loose rocks"},"natural/scrub":{name:"Scrub",terms:"bush,shrubs"},"natural/spring":{name:"Spring",terms:""},"natural/tree_row":{name:"Tree Row",terms:""},"natural/tree":{name:"Tree",terms:""},"natural/volcano":{name:"Volcano",terms:"mountain,crater"},"natural/water":{name:"Water",terms:""},"natural/water/lake":{name:"Lake",terms:"lakelet,loch,mere"},"natural/water/pond":{name:"Pond",terms:"lakelet,millpond,tarn,pool,mere"},"natural/water/reservoir":{name:"Reservoir",terms:""},"natural/wetland":{name:"Wetland",terms:"bog,marsh,reedbed,swamp,tidalflat"},"natural/wood":{name:"Wood",terms:"tree"},"noexit/yes":{name:"No Exit",terms:"no exit,road end,dead end"},office:{name:"Office",terms:""},"office/administrative":{name:"Administrative Office",terms:""},"office/physician":{name:"Physician",terms:""},"office/travel_agent":{name:"Travel Agency",terms:""},"office/accountant":{name:"Accountant Office",terms:""},"office/adoption_agency":{name:"Adoption Agency",terms:""},"office/advertising_agency":{name:"Advertising Agency",terms:"ad,ad agency,advert agency,advertising,marketing"},"office/architect":{name:"Architect Office",terms:""},"office/association":{name:"Nonprofit Organization Office",terms:"association,non-profit,nonprofit,organization,society"},"office/charity":{name:"Charity Office",terms:"charitable organization"},"office/company":{name:"Corporate Office",terms:""},"office/coworking":{name:"Coworking Space",terms:"coworking,office"},"office/educational_institution":{name:"Educational Institution",terms:""},"office/employment_agency":{name:"Employment Agency",terms:"job"},"office/energy_supplier":{name:"Energy Supplier Office",terms:"electricity,energy company,energy utility,gas utility"},"office/estate_agent":{name:"Real Estate Office",terms:""},"office/financial":{name:"Financial Office",terms:""},"office/forestry":{name:"Forestry Office",terms:"forest,ranger"},"office/foundation":{name:"Foundation Office",terms:""},"office/government":{name:"Government Office",terms:""},"office/government/register_office":{name:"Register Office",terms:"clerk,marriage,death,birth,certificate"},"office/government/tax":{name:"Tax and Revenue Office",terms:"fiscal authorities,revenue office,tax office"},"office/guide":{name:"Tour Guide Office",terms:"dive guide,mountain guide,tour guide"},"office/insurance":{name:"Insurance Office",terms:""},"office/it":{name:"Information Technology Office",terms:"computer,information,software,technology"},"office/lawyer":{name:"Law Office",terms:""},"office/lawyer/notary":{name:"Notary Office",terms:""},"office/moving_company":{name:"Moving Company Office",terms:"relocation"},"office/newspaper":{name:"Newspaper Office",terms:""},"office/ngo":{name:"NGO Office",terms:"ngo,non government,non-government,organization,organisation"},"office/notary":{name:"Notary Office",terms:"clerk,deeds,estate,signature,wills"},"office/political_party":{name:"Political Party",terms:""},"office/private_investigator":{name:"Private Investigator Office",terms:"PI,private eye,private detective"},"office/quango":{name:"Quasi-NGO Office",terms:"ngo,non government,non-government,organization,organisation,quasi autonomous,quasi-autonomous"},"office/religion":{name:"Religious Office",terms:""},"office/research":{name:"Research Office",terms:""},"office/surveyor":{name:"Surveyor Office",terms:""},"office/tax_advisor":{name:"Tax Advisor Office",terms:"tax,tax consultant"},"office/telecommunication":{name:"Telecom Office",terms:"communication,internet,phone,voice"},"office/therapist":{name:"Therapist Office",terms:"therapy"},"office/water_utility":{name:"Water Utility Office",terms:"water board,utility"},"piste/downhill":{name:"Downhill Piste/Ski Run",terms:"ski,alpine,snowboard,downhill,piste"},"piste/hike":{name:"Snowshoeing or Winter Hiking Trail",terms:"hike,winter hiking,snowshoe,snowshoeing,piste,ski"},"piste/ice_skate":{name:"Ice Skating Piste",terms:"ice,skating,ski,piste"},"piste/nordic":{name:"Nordic or Crosscountry Piste/Ski Trail",terms:"ski,nordic,crosscountry,skating,piste"},"piste/piste":{name:"Winter Sport Trails",terms:"ski,nordic,crosscountry,downhill,alpine,snowboard,skitour,ski touring,sled,luge,sleigh,sledge,ski-joring,husky,horse,winter hiking,snowshoe,snowshoeing,ice,skating"},"piste/skitour":{name:"Ski Touring Trail",terms:"ski,skitour,crosscountry,ski touring,piste"},"piste/sled":{name:"Sled Piste",terms:"ski,sled,luge,sleigh,sledge,piste"},"piste/sleigh":{name:"Sleigh Piste",terms:"ski,piste,sled,luge,sleigh,sledge,ski-joring,husky,horse"},"place/farm":{name:"Farm",terms:""},"place/city_block":{name:"City Block",terms:""},"place/city":{name:"City",terms:""},"place/hamlet":{name:"Hamlet",terms:""},"place/island":{name:"Island",terms:"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/islet":{name:"Islet",terms:"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/isolated_dwelling":{name:"Isolated Dwelling",terms:""},"place/locality":{name:"Locality",terms:""},"place/neighbourhood":{name:"Neighborhood",terms:"neighbourhood"},"place/plot":{name:"Plot",terms:"tract,land,lot,parcel"},"place/quarter":{name:"Sub-Borough / Quarter",terms:"boro,borough,quarter"},"place/square":{name:"Square",terms:""},"place/suburb":{name:"Borough / Suburb",terms:"boro,borough,quarter"},"place/town":{name:"Town",terms:""},"place/village":{name:"Village",terms:""},"playground/balance_beam":{name:"Play Balance Beam",terms:""},"playground/basket_spinner":{name:"Basket Spinner",terms:"basket rotator"},"playground/basket_swing":{name:"Basket Swing",terms:""},"playground/climbing_frame":{name:"Climbing Frame",terms:""},"playground/cushion":{name:"Bouncy Cushion",terms:""},"playground/horizontal_bar":{name:"Play Horizontal Bar",terms:"high bar"},"playground/rocker":{name:"Spring Rider",terms:"spring rocker,springy rocker"},"playground/roundabout":{name:"Play Roundabout",terms:"merry-go-round"},"playground/sandpit":{name:"Sandpit",terms:""},"playground/seesaw":{name:"Seesaw",terms:""},"playground/slide":{name:"Slide",terms:""},"playground/structure":{name:"Play Structure",terms:""},"playground/swing":{name:"Swing",terms:""},"playground/zipwire":{name:"Zip Wire",terms:""},point:{name:"Point",terms:""},"power/sub_station":{name:"Substation",terms:""},"power/cable/underground":{name:"Underground Power Cable",terms:""},"power/generator":{name:"Power Generator",terms:"hydro,solar,turbine,wind"},"power/generator/method/photovoltaic":{name:"Solar Panel",terms:"photovoltaic module,PV module,sunlight"},"power/generator/source/nuclear":{name:"Nuclear Reactor",terms:"fission,generator,nuclear,nuke,reactor"},"power/generator/source/wind":{name:"Wind Turbine",terms:"generator,turbine,windmill,wind"},"power/line":{name:"Power Line",terms:""},"power/minor_line":{name:"Minor Power Line",terms:""},"power/plant":{name:"Power Station Grounds",terms:"coal,gas,generat*,hydro,nuclear,power,station"},"power/pole":{name:"Power Pole",terms:""},"power/substation":{name:"Substation",terms:""},"power/switch":{name:"Power Switch",terms:""},"power/tower":{name:"High-Voltage Tower",terms:"power"},"power/transformer":{name:"Transformer",terms:""},"public_transport/linear_platform_aerialway":{name:"Aerialway Stop / Platform",terms:"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_bus":{name:"Bus Stop / Platform",terms:"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_ferry":{name:"Ferry Stop / Platform",terms:"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_light_rail":{name:"Light Rail Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/linear_platform_monorail":{name:"Monorail Stop / Platform",terms:"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/linear_platform_subway":{name:"Subway Stop / Platform",terms:"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/linear_platform_train":{name:"Train Stop / Platform",terms:"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/linear_platform_tram":{name:"Tram Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/linear_platform_trolleybus":{name:"Trolleybus Stop / Platform",terms:"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/linear_platform":{name:"Transit Stop / Platform",terms:"platform,public transit,public transportation,transit,transportation"},"public_transport/platform_aerialway":{name:"Aerialway Stop / Platform",terms:"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_bus":{name:"Bus Stop / Platform",terms:"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_ferry":{name:"Ferry Stop / Platform",terms:"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_light_rail":{name:"Light Rail Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/platform_monorail":{name:"Monorail Stop / Platform",terms:"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/platform_subway":{name:"Subway Stop / Platform",terms:"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/platform_train":{name:"Train Stop / Platform",terms:"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/platform_tram":{name:"Tram Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/platform_trolleybus":{name:"Trolleybus Stop / Platform",terms:"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/platform":{name:"Transit Stop / Platform",terms:"platform,public transit,public transportation,transit,transportation"},"public_transport/station_aerialway":{name:"Aerialway Station",terms:"aerialway,cable car,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_bus":{name:"Bus Station / Terminal",terms:"bus,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_ferry":{name:"Ferry Station / Terminal",terms:"boat,dock,ferry,pier,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_light_rail":{name:"Light Rail Station",terms:"electric,light rail,public transit,public transportation,rail,station,terminal,track,tram,trolley,transit,transportation"},"public_transport/station_monorail":{name:"Monorail Station",terms:"monorail,public transit,public transportation,rail,station,terminal,transit,transportation"},"public_transport/station_subway":{name:"Subway Station",terms:"metro,public transit,public transportation,rail,station,subway,terminal,track,transit,transportation,underground"},"public_transport/station_train_halt":{name:"Train Station (Halt / Request)",terms:"halt,public transit,public transportation,rail,station,track,train,transit,transportation,whistle stop"},"public_transport/station_train":{name:"Train Station",terms:"public transit,public transportation,rail,station,terminal,track,train,transit,transportation"},"public_transport/station_tram":{name:"Tram Station",terms:"electric,light rail,public transit,public transportation,rail,station,streetcar,terminal,track,tram,trolley,transit,transportation"},"public_transport/station_trolleybus":{name:"Trolleybus Station / Terminal",terms:"bus,electric,public transit,public transportation,station,streetcar,terminal,trackless,tram,trolley,transit,transportation"},"public_transport/station":{name:"Transit Station",terms:"public transit,public transportation,station,terminal,transit,transportation"},"public_transport/stop_area":{name:"Transit Stop Area",terms:""},"public_transport/stop_position_aerialway":{name:"Aerialway Stopping Location",terms:"aerialway,cable car,public transit,public transportation,transit,transportation"},"public_transport/stop_position_bus":{name:"Bus Stopping Location",terms:"bus,public transit,public transportation,transit,transportation"},"public_transport/stop_position_ferry":{name:"Ferry Stopping Location",terms:"boat,dock,ferry,pier,public transit,public transportation,transit,transportation"},"public_transport/stop_position_light_rail":{name:"Light Rail Stopping Location",terms:"electric,light rail,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/stop_position_monorail":{name:"Monorail Stopping Location",terms:"monorail,public transit,public transportation,rail,transit,transportation"},"public_transport/stop_position_subway":{name:"Subway Stopping Location",terms:"metro,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/stop_position_train":{name:"Train Stopping Location",terms:"public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/stop_position_tram":{name:"Tram Stopping Location",terms:"electric,light rail,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/stop_position_trolleybus":{name:"Trolleybus Stopping Location",terms:"bus,electric,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/stop_position":{name:"Transit Stopping Location",terms:"public transit,public transportation,transit,transportation"},"railway/halt":{name:"Train Station (Halt / Request)",terms:"break,interrupt,rest,wait,interruption"},"railway/platform":{name:"Train Stop / Platform",terms:""},"railway/station":{name:"Train Station",terms:"train station,station"},"railway/tram_stop":{name:"Tram Stopping Position",terms:"light rail,streetcar,tram,trolley"},"railway/abandoned":{name:"Abandoned Railway",terms:""},"railway/buffer_stop":{name:"Buffer Stop",terms:"stop,halt,buffer"},"railway/crossing":{name:"Railway Crossing (Path)",terms:"crossing,pedestrian crossing,railroad crossing,level crossing,grade crossing,path through railroad,train crossing"},"railway/derail":{name:"Railway Derailer",terms:"derailer"},"railway/disused":{name:"Disused Railway",terms:""},"railway/funicular":{name:"Funicular",terms:"venicular,cliff railway,cable car,cable railway,funicular railway"},"railway/level_crossing":{name:"Railway Crossing (Road)",terms:"crossing,railroad crossing,level crossing,grade crossing,road through railroad,train crossing"},"railway/light_rail":{name:"Light Rail",terms:"light rail,streetcar,trolley"},"railway/milestone":{name:"Railway Milestone",terms:"milestone,marker"},"railway/miniature":{name:"Miniature Railway",terms:"rideable miniature railway,narrow gauge railway,minimum gauge railway"},"railway/monorail":{name:"Monorail",terms:""},"railway/narrow_gauge":{name:"Narrow Gauge Rail",terms:"narrow gauge railway,narrow gauge railroad"},"railway/rail":{name:"Rail",terms:""},"railway/signal":{name:"Railway Signal",terms:"signal,lights"},"railway/subway_entrance":{name:"Subway Entrance",terms:"metro,transit"},"railway/subway":{name:"Subway",terms:"metro,transit"},"railway/switch":{name:"Railway Switch",terms:"switch,points"},"railway/train_wash":{name:"Train Wash",terms:"wash,clean"},"railway/tram":{name:"Tram",terms:"light rail,streetcar,tram,trolley"},relation:{name:"Relation",terms:""},"route/ferry":{name:"Ferry Route",terms:""},"seamark/beacon_isolated_danger":{name:"Danger Beacon",terms:"beacon isolated danger,isolated danger beacon,iala"},"seamark/beacon_lateral":{name:"Channel Beacon",terms:"lateral beacon,beacon lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral":{name:"Channel Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral/green":{name:"Green Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral/red":{name:"Red Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/mooring":{name:"Mooring",terms:"dolphin,pile,bollard,buoy,post"},shop:{name:"Shop",terms:""},"shop/fishmonger":{name:"Fishmonger",terms:""},"shop/furnace":{name:"Furnace Store",terms:"oven,stove"},"shop/vacant":{name:"Vacant Shop",terms:""},"shop/agrarian":{name:"Farm Supply Shop",terms:"agricultural inputs,agricultural machines,seeds,pesticides,fertilizer,agricultural tools"},"shop/alcohol":{name:"Liquor Store",terms:"alcohol,beer,booze,wine"},"shop/anime":{name:"Anime Shop",terms:"manga,japan,cosplay,figurine,dakimakura"},"shop/antiques":{name:"Antiques Shop",terms:""},"shop/appliance":{name:"Appliance Store",terms:"air conditioner,appliance,dishwasher,dryer,freezer,fridge,grill,kitchen,oven,refrigerator,stove,washer,washing machine"},"shop/art":{name:"Art Store",terms:"art*,exhibit*,gallery"},"shop/baby_goods":{name:"Baby Goods Store",terms:""},"shop/bag":{name:"Bag/Luggage Store",terms:"handbag,purse"},"shop/bakery":{name:"Bakery",terms:""},"shop/bathroom_furnishing":{name:"Bathroom Furnishing Store",terms:""},"shop/beauty":{name:"Beauty Shop",terms:"spa,salon,tanning"},"shop/beauty/nails":{name:"Nail Salon",terms:"manicure,pedicure"},"shop/beauty/tanning":{name:"Tanning Salon",terms:""},"shop/bed":{name:"Bedding/Mattress Store",terms:""},"shop/beverages":{name:"Beverage Store",terms:""},"shop/bicycle":{name:"Bicycle Shop",terms:"bike,repair"},"shop/bookmaker":{name:"Bookmaker",terms:"betting"},"shop/books":{name:"Book Store",terms:""},"shop/boutique":{name:"Boutique",terms:""},"shop/butcher":{name:"Butcher",terms:"meat"},"shop/candles":{name:"Candle Shop",terms:""},"shop/car_parts":{name:"Car Parts Store",terms:"auto"},"shop/car_repair":{name:"Car Repair Shop",terms:"auto,garage,service"},"shop/car":{name:"Car Dealership",terms:"auto"},"shop/carpet":{name:"Carpet Store",terms:"rug"},"shop/catalogue":{name:"Catalog Shop",terms:""},"shop/charity":{name:"Charity Store",terms:"thrift,op shop,nonprofit"},"shop/cheese":{name:"Cheese Store",terms:""},"shop/chemist":{name:"Drugstore",terms:"apothecary,med*,drug*,gift"},"shop/chocolate":{name:"Chocolate Store",terms:""},"shop/clothes":{name:"Clothing Store",terms:""},"shop/coffee":{name:"Coffee Store",terms:""},"shop/computer":{name:"Computer Store",terms:""},"shop/confectionery":{name:"Candy Store",terms:"sweet"},"shop/convenience":{name:"Convenience Store",terms:""},"shop/copyshop":{name:"Copy Store",terms:""},"shop/cosmetics":{name:"Cosmetics Store",terms:""},"shop/country_store":{name:"Country Store",terms:""},"shop/craft":{name:"Arts and Crafts Store",terms:"art*,paint*,frame"},"shop/curtain":{name:"Curtain Store",terms:"drape*,window"},"shop/dairy":{name:"Dairy Store",terms:"milk,egg,cheese"},"shop/deli":{name:"Deli",terms:"lunch,meat,sandwich"},"shop/department_store":{name:"Department Store",terms:""},"shop/doityourself":{name:"DIY Store",terms:""},"shop/dry_cleaning":{name:"Dry Cleaner",terms:""},"shop/e-cigarette":{name:"E-Cigarette Shop",terms:"electronic,vapor"},"shop/electronics":{name:"Electronics Store",terms:"appliance,audio,blueray,camera,computer,dvd,home theater,radio,speaker,tv,video"},"shop/erotic":{name:"Erotic Store",terms:"sex,porn"},"shop/fabric":{name:"Fabric Store",terms:"sew"},"shop/farm":{name:"Produce Stand",terms:"farm shop,farm stand"},"shop/fashion":{name:"Fashion Store",terms:""},"shop/florist":{name:"Florist",terms:"flower"},"shop/frame":{name:"Framing Shop",terms:"art*,paint*,photo*,frame"},"shop/funeral_directors":{name:"Funeral Home",terms:"undertaker,memorial home"},"shop/furniture":{name:"Furniture Store",terms:"chair,sofa,table"},"shop/garden_centre":{name:"Garden Center",terms:"landscape,mulch,shrub,tree"},"shop/gas":{name:"Bottled Gas Shop",terms:"cng,lpg,natural gas,propane,refill,tank"},"shop/gift":{name:"Gift Shop",terms:"souvenir"},"shop/greengrocer":{name:"Greengrocer",terms:"fruit,vegetable"},"shop/hairdresser_supply":{name:"Hairdresser Supply Store",terms:"barber,shampoo,conditioner"},"shop/hairdresser":{name:"Hairdresser",terms:"barber"},"shop/hardware":{name:"Hardware Store",terms:""},"shop/health_food":{name:"Health Food Shop",terms:"wholefood,vitamins,vegetarian,vegan"},"shop/hearing_aids":{name:"Hearing Aids Store",terms:""},"shop/herbalist":{name:"Herbalist",terms:""},"shop/hifi":{name:"Hifi Store",terms:"stereo,video"},"shop/houseware":{name:"Houseware Store",terms:"home,household"},"shop/interior_decoration":{name:"Interior Decoration Store",terms:""},"shop/jewelry":{name:"Jeweler",terms:"diamond,gem,ring"},"shop/kiosk":{name:"Kiosk",terms:""},"shop/kitchen":{name:"Kitchen Design Store",terms:""},"shop/laundry":{name:"Laundry",terms:""},"shop/leather":{name:"Leather Store",terms:""},"shop/locksmith":{name:"Locksmith",terms:"key,lockpick"},"shop/lottery":{name:"Lottery Shop",terms:""},"shop/mall":{name:"Mall",terms:"shopping"},"shop/massage":{name:"Massage Shop",terms:""},"shop/medical_supply":{name:"Medical Supply Store",terms:""},"shop/mobile_phone":{name:"Mobile Phone Store",terms:""},"shop/money_lender":{name:"Money Lender",terms:""},"shop/motorcycle_repair":{name:"Motorcycle Repair Shop",terms:"auto,bike,garage,motorcycle,repair,service"},"shop/motorcycle":{name:"Motorcycle Dealership",terms:"bike"},"shop/music":{name:"Music Store",terms:"CD,vinyl"},"shop/musical_instrument":{name:"Musical Instrument Store",terms:"guitar"},"shop/newsagent":{name:"Newspaper/Magazine Shop",terms:""},"shop/nutrition_supplements":{name:"Nutrition Supplements Store",terms:""},"shop/optician":{name:"Optician",terms:"eye,glasses"},"shop/organic":{name:"Organic Goods Store",terms:""},"shop/outdoor":{name:"Outdoors Store",terms:"camping,climbing,hiking"},"shop/paint":{name:"Paint Store",terms:""},"shop/party":{name:"Party Supply Store",terms:"balloons,costumes,decorations,invitations"},"shop/pastry":{name:"Pastry Shop",terms:"patisserie,cake shop,cakery"},"shop/pawnbroker":{name:"Pawn Shop",terms:""},"shop/perfumery":{name:"Perfume Store",terms:""},"shop/pet_grooming":{name:"Pet Grooming Store",terms:"dog"},"shop/pet":{name:"Pet Store",terms:"animal,cat,dog,fish,kitten,puppy,reptile"},"shop/photo":{name:"Photography Store",terms:"camera,film"},"shop/pyrotechnics":{name:"Fireworks Store",terms:""},"shop/radiotechnics":{name:"Radio/Electronic Component Store",terms:""},"shop/religion":{name:"Religious Store",terms:""},"shop/scuba_diving":{name:"Scuba Diving Shop",terms:"diving,scuba"},"shop/seafood":{name:"Seafood Shop",terms:"fishmonger"},"shop/second_hand":{name:"Consignment/Thrift Store",terms:"secondhand,second hand,resale,thrift,used"},"shop/sewing":{name:"Sewing Supply Shop",terms:"haberdashery"},"shop/shoes":{name:"Shoe Store",terms:""},"shop/sports":{name:"Sporting Goods Store",terms:""},"shop/stationery":{name:"Stationery Store",terms:"card,paper"},"shop/storage_rental":{name:"Storage Rental",terms:""},"shop/supermarket":{name:"Supermarket",terms:"grocery,store,shop"},"shop/tailor":{name:"Tailor",terms:"clothes,suit"},"shop/tattoo":{name:"Tattoo Parlor",terms:""},"shop/tea":{name:"Tea Store",terms:""},"shop/ticket":{name:"Ticket Seller",terms:""},"shop/tiles":{name:"Tile Shop",terms:""},"shop/tobacco":{name:"Tobacco Shop",terms:""},"shop/toys":{name:"Toy Store",terms:""},"shop/trade":{name:"Trade Shop",terms:""},"shop/travel_agency":{name:"Travel Agency",terms:""},"shop/tyres":{name:"Tire Store",terms:""},"shop/vacuum_cleaner":{name:"Vacuum Cleaner Store",terms:""},"shop/variety_store":{name:"Variety Store",terms:""},"shop/video_games":{name:"Video Game Store",terms:""},"shop/video":{name:"Video Store",terms:"DVD"},"shop/watches":{name:"Watches Shop",terms:""},"shop/water_sports":{name:"Watersport/Swim Shop",terms:""},"shop/weapons":{name:"Weapon Shop",terms:"ammo,gun,knife,knives"},"shop/wholesale":{name:"Wholesale Store",terms:"warehouse club,cash and carry"},"shop/window_blind":{name:"Window Blind Store",terms:""},"shop/wine":{name:"Wine Shop",terms:""},tourism:{name:"Tourism",terms:""},"tourism/alpine_hut":{name:"Alpine Hut",terms:"climbing hut"},"tourism/apartment":{name:"Guest Apartment / Condo",terms:""},"tourism/aquarium":{name:"Aquarium",terms:"fish,sea,water"},"tourism/artwork":{name:"Artwork",terms:"mural,sculpture,statue"},"tourism/artwork/mural":{name:"Mural",terms:"fresco,wall painting"},"tourism/artwork/sculpture":{name:"Sculpture",terms:"statue,figure,carving"},"tourism/artwork/statue":{name:"Statue",terms:"sculpture,figure,carving"},"tourism/attraction":{name:"Tourist Attraction",terms:""},"tourism/camp_site":{name:"Campground",terms:"tent,rv"},"tourism/caravan_site":{name:"RV Park",terms:"Motor Home,Camper"},"tourism/chalet":{name:"Holiday Cottage",terms:"holiday,holiday cottage,holiday home,vacation,vacation home"},"tourism/gallery":{name:"Art Gallery",terms:"art*,exhibit*,paint*,photo*,sculpt*"},"tourism/guest_house":{name:"Guest House",terms:"B&B,Bed and Breakfast"},"tourism/hostel":{name:"Hostel",terms:""},"tourism/hotel":{name:"Hotel",terms:""},"tourism/information":{name:"Information",terms:""},"tourism/information/board":{name:"Information Board",terms:""},"tourism/information/guidepost":{name:"Guidepost",terms:"signpost"},"tourism/information/map":{name:"Map",terms:""},"tourism/information/office":{name:"Tourist Information Office",terms:""},"tourism/motel":{name:"Motel",terms:""},"tourism/museum":{name:"Museum",terms:"art*,exhibit*,gallery,foundation,hall,institution,paint*,photo*,sculpt*"},"tourism/picnic_site":{name:"Picnic Site",terms:"camp"},"tourism/theme_park":{name:"Theme Park",terms:""},"tourism/trail_riding_station":{name:"Trail Riding Station",terms:""},"tourism/viewpoint":{name:"Viewpoint",terms:""},"tourism/wilderness_hut":{name:"Wilderness Hut",terms:"wilderness hut,backcountry hut,bothy"},"tourism/zoo":{name:"Zoo",terms:"animal"},traffic_calming:{name:"Traffic Calming",terms:"bump,hump,slow,speed"},"traffic_calming/bump":{name:"Speed Bump",terms:"hump,speed,slow"},"traffic_calming/chicane":{name:"Traffic Chicane",terms:"driveway link,speed,slow"},"traffic_calming/choker":{name:"Traffic Choker",terms:"speed,slow"},"traffic_calming/cushion":{name:"Speed Cushion",terms:"bump,hump,speed,slow"},"traffic_calming/dip":{name:"Dip",terms:"speed,slow"},"traffic_calming/hump":{name:"Speed Hump",terms:"bump,speed,slow"},"traffic_calming/island":{name:"Traffic Island",terms:"circle,roundabout,slow"},"traffic_calming/rumble_strip":{name:"Rumble Strip",terms:"audible lines,sleeper lines,growlers"},"traffic_calming/table":{name:"Speed Table",terms:"flat top,hump,speed,slow"},traffic_sign_vertex:{name:"Traffic Sign",terms:"road,highway"},traffic_sign:{name:"Traffic Sign",terms:"road,highway"},"traffic_sign/city_limit_vertex":{name:"City Limit Sign",terms:"town,village,hamlet,boundary,edge,border,road,highway"},"traffic_sign/city_limit":{name:"City Limit Sign",terms:"town,village,hamlet,boundary,edge,border,road,highway"},"traffic_sign/maxspeed_vertex":{name:"Speed Limit Sign",terms:"max speed,maximum speed,road,highway"},"traffic_sign/maxspeed":{name:"Speed Limit Sign",terms:"max speed,maximum speed,road,highway"},"type/multipolygon":{name:"Multipolygon",terms:""},"type/boundary":{name:"Boundary",terms:""},"type/boundary/administrative":{name:"Administrative Boundary",terms:""},"type/restriction":{name:"Restriction",terms:""},"type/restriction/no_left_turn":{name:"No Left Turn",terms:""},"type/restriction/no_right_turn":{name:"No Right Turn",terms:""},"type/restriction/no_straight_on":{name:"No Straight On",terms:""},"type/restriction/no_u_turn":{name:"No U-turn",terms:""},"type/restriction/only_left_turn":{name:"Only Left Turn",terms:""},"type/restriction/only_right_turn":{name:"Only Right Turn",terms:""},"type/restriction/only_straight_on":{name:"Only Straight On",terms:""},"type/restriction/only_u_turn":{name:"Only U-turn",terms:""},"type/route_master":{name:"Route Master",terms:""},"type/route":{name:"Route",terms:""},"type/route/bicycle":{name:"Cycle Route",terms:""},"type/route/bus":{name:"Bus Route",terms:""},"type/route/detour":{name:"Detour Route",terms:""},"type/route/ferry":{name:"Ferry Route",terms:""},"type/route/foot":{name:"Foot Route",terms:""},"type/route/hiking":{name:"Hiking Route",terms:""},"type/route/horse":{name:"Riding Route",terms:""},"type/route/light_rail":{name:"Light Rail Route",terms:""},"type/route/pipeline":{name:"Pipeline Route",terms:""},"type/route/piste":{name:"Piste/Ski Route",terms:""},"type/route/power":{name:"Power Route",terms:""},"type/route/road":{name:"Road Route",terms:""},"type/route/subway":{name:"Subway Route",terms:""},"type/route/train":{name:"Train Route",terms:""},"type/route/tram":{name:"Tram Route",terms:""},"type/site":{name:"Site",terms:""},"type/waterway":{name:"Waterway",terms:""},vertex:{name:"Other",terms:""},"waterway/boatyard":{name:"Boatyard",terms:""},"waterway/canal":{name:"Canal",terms:""},"waterway/dam":{name:"Dam",terms:""},"waterway/ditch":{name:"Ditch",terms:""},"waterway/dock":{name:"Wet Dock / Dry Dock",terms:"boat,ship,vessel,marine"},"waterway/drain":{name:"Drain",terms:""},"waterway/fuel":{name:"Marine Fuel Station",terms:"petrol,gas,diesel,boat"},"waterway/milestone":{name:"Waterway Milestone",terms:"milestone,marker"},"waterway/river":{name:"River",terms:"beck,branch,brook,course,creek,estuary,rill,rivulet,run,runnel,stream,tributary,watercourse"},"waterway/riverbank":{name:"Riverbank",terms:""},"waterway/sanitary_dump_station":{name:"Marine Toilet Disposal",terms:"Boat,Watercraft,Sanitary,Dump Station,Pumpout,Pump out,Elsan,CDP,CTDP,Chemical Toilet"},"waterway/stream_intermittent":{name:"Intermittent Stream",terms:"arroyo,beck,branch,brook,burn,course,creek,drift,flood,flow,gully,run,runnel,rush,spate,spritz,tributary,wadi,wash,watercourse"},"waterway/stream":{name:"Stream",terms:"beck,branch,brook,burn,course,creek,current,drift,flood,flow,freshet,race,rill,rindle,rivulet,run,runnel,rush,spate,spritz,surge,tide,torrent,tributary,watercourse"},"waterway/water_point":{name:"Marine Drinking Water",terms:""},"waterway/waterfall":{name:"Waterfall",terms:"fall"},"waterway/weir":{name:"Weir",terms:""}}},imagery:{AGIV:{attribution:{text:"Orthophoto Flanders most recent © AGIV"},name:"AGIV Flanders most recent aerial imagery"},AGIV10cm:{attribution:{text:"Orthophoto Flanders © AGIV"},name:"AGIV Flanders 2013-2015 aerial imagery 10cm"},AGIVFlandersGRB:{attribution:{text:"GRB Flanders © AGIV"},name:"AGIV Flanders GRB"},Bing:{description:"Satellite and aerial imagery.",name:"Bing aerial imagery"},"DigitalGlobe-Premium":{attribution:{text:"Terms & Feedback"},description:"DigitalGlobe-Premium is a mosaic composed of DigitalGlobe basemap with select regions filled with +Vivid or custom area of interest imagery, 50cm resolution or better, and refreshed more frequently with ongoing updates.",name:"DigitalGlobe Premium Imagery"},"DigitalGlobe-Premium-vintage":{attribution:{text:"Terms & Feedback"},description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",name:"DigitalGlobe Premium Imagery Vintage"},"DigitalGlobe-Standard":{attribution:{text:"Terms & Feedback"},description:"DigitalGlobe-Standard is a curated set of imagery covering 86% of the earth’s landmass, with 30-60cm resolution where available, backfilled by Landsat. Average age is 2.31 years, with some areas updated 2x per year.",name:"DigitalGlobe Standard Imagery"},"DigitalGlobe-Standard-vintage":{attribution:{text:"Terms & Feedback"},description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",name:"DigitalGlobe Standard Imagery Vintage"},EsriWorldImagery:{attribution:{text:"Terms & Feedback"},description:"Esri world imagery.",name:"Esri World Imagery"},EsriWorldImageryClarity:{attribution:{text:"Terms & Feedback"},description:"Esri archive imagery that may be clearer and more accurate than the default layer.",name:"Esri World Imagery (Clarity) Beta"},MAPNIK:{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},description:"The default OpenStreetMap layer.",name:"OpenStreetMap (Standard)"},Mapbox:{attribution:{text:"Terms & Feedback"},description:"Satellite and aerial imagery.",name:"Mapbox Satellite"},"OSM_Inspector-Addresses":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Addresses"},"OSM_Inspector-Geometry":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Geometry"},"OSM_Inspector-Highways":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Highways"},"OSM_Inspector-Multipolygon":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Area"},"OSM_Inspector-Places":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Places"},"OSM_Inspector-Routing":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Routing"},"OSM_Inspector-Tagging":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Tagging"},SPW_ORTHO_LAST:{name:"SPW(allonie) most recent aerial imagery"},SPW_PICC:{name:"SPW(allonie) PICC numerical imagery"},"US-TIGER-Roads-2014":{description:"At zoom level 16+, public domain map data from the US Census. At lower zooms, only changes since 2006 minus changes already incorporated into OpenStreetMap",name:"TIGER Roads 2014"},"US-TIGER-Roads-2017":{description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",name:"TIGER Roads 2017"},"US-TIGER-Roads-2018":{description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",name:"TIGER Roads 2018"},US_Forest_Service_roads_overlay:{description:"Highway: Green casing = unclassified. Brown casing = track. Surface: gravel = light brown fill, Asphalt = black, paved = gray, ground =white, concrete = blue, grass = green. Seasonal = white bars",name:"U.S. Forest Roads Overlay"},UrbISOrtho2016:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2016"},UrbISOrtho2017:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2017"},UrbISOrtho2018:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2018"},UrbisAdmFR:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbisAdm FR"},UrbisAdmNL:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbisAdm NL"},"Waymarked_Trails-Cycling":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Cycling"},"Waymarked_Trails-Hiking":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Hiking"},"Waymarked_Trails-MTB":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: MTB"},"Waymarked_Trails-Skating":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Skating"},"Waymarked_Trails-Winter_Sports":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Winter Sports"},"basemap.at":{attribution:{text:"basemap.at"},description:"Basemap of Austria, based on government data.",name:"basemap.at"},"basemap.at-orthofoto":{attribution:{text:"basemap.at"},description:"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.",name:"basemap.at Orthofoto"},"eufar-balaton":{attribution:{text:"EUFAR Balaton ortofotó 2010"},description:"1940 geo-tagged photography from Balaton Limnological Institute.",name:"EUFAR Balaton orthophotos"},"finds.jp_KBN_2500":{attribution:{text:"GSI KIBAN 2500"},description:"GSI Kiban 2500 via finds.jp. Good for tracing, but a bit older.",name:"Japan GSI KIBAN 2500"},"gsi.go.jp":{attribution:{text:"GSI Japan"},description:"Japan GSI ortho Imagery. Usually better than bing, but a bit older.",name:"Japan GSI ortho Imagery"},"gsi.go.jp_std_map":{attribution:{text:"GSI Japan"},description:"Japan GSI Standard Map. Widely covered.",name:"Japan GSI Standard Map"},"helsingborg-orto":{attribution:{text:"© Helsingborg municipality"},description:"Orthophotos from the municipality of Helsingborg 2016, public domain",name:"Helsingborg Orthophoto"},"kalmar-orto-2014":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for the north coast of the municipality of Kalmar 2014",name:"Kalmar North Orthophoto 2014"},"kalmar-orto-2016":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for the south coast of the municipality of Kalmar 2016",name:"Kalmar South Orthophoto 2016"},"kalmar-orto-2018":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for urban areas of the municipality of Kalmar 2018",name:"Kalmar Urban Orthophoto 2018"},kelkkareitit:{attribution:{text:"© Kelkkareitit.fi"},description:"Kelkkareitit.fi snowmobile trails from OSM (Nordic coverage)",name:"Nordic snowmobile overlay"},"lantmateriet-orto1960":{attribution:{text:"© Lantmäteriet, CC0"},description:"Mosaic of Swedish orthophotos from the period 1955–1965. Older and younger pictures may occur.",name:"Lantmäteriet Historic Orthophoto 1960"},"lantmateriet-orto1975":{attribution:{text:"© Lantmäteriet, CC0"},description:"Mosaic of Swedish orthophotos from the period 1970–1980. Is under construction.",name:"Lantmäteriet Historic Orthophoto 1975"},"lantmateriet-topowebb":{attribution:{text:"© Lantmäteriet, CC0"},description:"Topographic map of Sweden 1:50 000",name:"Lantmäteriet Topographic Map"},"linkoping-orto":{attribution:{text:"© Linköping municipality"},description:"Orthophotos from the municipality of Linköping 2010, open data",name:"Linköping Orthophoto"},mapbox_locator_overlay:{attribution:{text:"Terms & Feedback"},description:"Shows major features to help orient you.",name:"Locator Overlay"},openpt_map:{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},name:"OpenPT Map (overlay)"},"osm-gps":{attribution:{text:"© OpenStreetMap contributors"},description:"Public GPS traces uploaded to OpenStreetMap.",name:"OpenStreetMap GPS traces"},"osm-mapnik-black_and_white":{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},name:"OpenStreetMap (Standard Black & White)"},"osm-mapnik-german_style":{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},name:"OpenStreetMap (German Style)"},"osmse-ekonomiska":{attribution:{text:"© Lantmäteriet"},description:"Scan of \"Economic maps\" ca. 1950–1980",name:"Lantmäteriet Economic Map 1950–1980"},qa_no_address:{attribution:{text:"Simon Poole, Data ©OpenStreetMap contributors"},name:"QA No Address"},skobbler:{attribution:{text:"© Tiles: skobbler Map data: OpenStreetMap contributors"},name:"skobbler"},skoterleder:{attribution:{text:"© Skoterleder.org"},description:"Snowmobile trails",name:"Snowmobile map Sweden"},"stamen-terrain-background":{attribution:{text:"Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL"},name:"Stamen Terrain"},"stockholm-orto":{attribution:{text:"© Stockholm municipality, CC0"},description:"Orthophotos from the municipality of Stockholm 2015, CC0 license",name:"Stockholm Orthophoto"},"tf-cycle":{attribution:{text:"Maps © Thunderforest, Data © OpenStreetMap contributors"},name:"Thunderforest OpenCycleMap"},"tf-landscape":{attribution:{text:"Maps © Thunderforest, Data © OpenStreetMap contributors"},name:"Thunderforest Landscape"},"trafikverket-baninfo":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish railway network, including sidings",name:"Trafikverket Railway Network"},"trafikverket-baninfo-option":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish railway network with several options for map layers",name:"Trafikverket Railway Network options"},"trafikverket-vagnat":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB road network",name:"Trafikverket Road Network"},"trafikverket-vagnat-extra":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB extra details: Highway reference, traffic calming, rest area, bus stop, bridge, tunnel, speed camera",name:"Trafikverket Road Network extra"},"trafikverket-vagnat-navn":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB street names",name:"Trafikverket Street Names"},"trafikverket-vagnat-option":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB road network with several options for map layers",name:"Trafikverket Road Network options"}},community:{"bw-facebook":{name:"Mapping Botswana on Facebook",description:"Page of OpenStreetMap in Botswana"},"bw-twitter":{name:"Mapping Botswana on Twitter",description:"Twitter of OpenStreetMap in Botswana"},"cape-coast-youthmappers":{name:"University of Cape Coast YouthMappers",description:"Follow us on Twitter: {url}",extendedDescription:"This is the official handle for the Youth Mappers chapter of the University of Cape Coast, Ghana. we love maps, open data and helping the vulnerable."},"osm-gh-facebook":{name:"OpenStreetMap Ghana on Facebook",description:"Facebook group for people interested in OpenStreetMap.",extendedDescription:"Mappers in Ghana community, promoting OpenStreetMap and Humanitarian OpenStreetMap Team (HOT) projects in Ghana. Join us."},"osm-gh-twitter":{name:"OpenStreetMap Ghana on Twitter",description:"Follow us on Twitter: {url}"},"talk-gh":{name:"Talk-gh Mailing List",description:"Talk-gh is the official mailing list for Ghana OSM community."},"osm-mg-facebook":{name:"OpenStreetMap Madagascar Facebook Group",description:"Malagasy Facebook group for people interested in OpenStreetMap."},"talk-mg":{name:"Talk-mg Mailing List",description:"Place for OpenStreetMap contributors, communities and users in Madagascar to share and discuss."},"OSM-BGD-facebook":{name:"OpenStreetMap Bangladesh",description:"Improve OpenStreetMap in Bangladesh",extendedDescription:"Mapping in Bangladesh? Have questions, want to connect with the community here? Join us at {url}. All are welcome!"},"OSM-India-facebook":{name:"OpenStreetMap India - Participatory neighborhood mapping",description:"Improve OpenStreetMap in India",extendedDescription:"Mapping in India? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",events:{sotmasia2018:{name:"State of the Map Asia 2018",description:"Join the 2018 OpenStreetMap region-wide event at State of the Map Asia in India",where:"Indian Institute of Management, Bangalore, India"}}},"osm-india-forum":{name:"OpenStreetMap India forum",description:"OpenStreetMap India web forum"},"osm-india-github":{name:"OpenStreetMap India GitHub",description:"Code with us: {url}"},"OSM-india-mailinglist":{name:"OpenStreetMap India Mailinglist",description:"Talk-in is the official Mailinglist for Indian Community"},"osm-india-telegram":{name:"OpenStreetMap India Telegram",description:"Join our family: {url}"},"OSM-india-twitter":{name:"OpenStreetMap India Twitter",description:"We are just a tweet away: {url}"},"osm-india-website":{name:"OpenStreetMap India",description:"Mappers and OpenStreetMap users in India"},"osm-india-wiki":{name:"OpenStreetMap Wikiproject India",description:"Everything you need to know about mapping in India: {url}"},"osm-india-youtube":{name:"OpenStreetMap India Youtube",description:"Subscribe to our channel: {url}"},"OSM-India-Puducherry-Facebook":{name:"Free Software Hardware Movement - Facebook",description:"FSHM Facebook page to know about community events, activities",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap. Its FB page is the best way to keep in contact with its events."},"OSM-Puducherry-Mailing-List":{name:"Free Software Hardware Movement - Mailing List",description:"FSHM Puducherry mailing list to discuss mapping in Puducherry and other things.",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap."},"OSM-India-Puducherry-Matrix":{name:"Free Software Hardware Movement - Matrix",description:"FSHM Riot group to discuss, share and update mapping activities, events in and around Puducherry",extendedDescription:"FSHM community members share their OSM mapping updates / experiences through the Riot.im group, this group is also used to discuss things related to free software / hardware, technology and activism."},"OSM-IDN-facebook":{name:"OpenStreetMap Indonesia",description:"Improve OpenStreetMap in Indonesia",extendedDescription:"Mapping in Indonesia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-japan-facebook":{name:"OpenStreetMap Japan Community",description:"Mappers and OpenStreetMap users in Japan"},"OSM-japan-mailinglist":{name:"OpenStreetMap Japan Mailinglist",description:"Talk-ja is an Official Mailinglist for Japanese Community"},"OSM-japan-twitter":{name:"OpenStreetMap Japan Twitter",description:"Hashtag on Twitter: {url}"},"OSM-japan-website":{name:"OpenStreetMap Japan",description:"Mappers and OpenStreetMap users in Japan"},"OSM-korea-telegram":{name:"OSM Korea Telegram Channel",description:"Unofficial Channnel for OpenStreetMap contributors, communities and users in Korea to share and discuss."},"OSM-MY-facebook":{name:"OpenStreetMap Malaysia on Facebook",description:"For chat about anything related to OpenStreetMap!"},"OSM-MY-forum":{name:"OpenStreetMap Malaysia Forum",description:"Official OpenStreetMap Malaysia Forum"},"OSM-MY-matrix":{name:"OpenStreetMap Malaysia Riot channel",description:"All mappers are welcome! Sign up at {signupUrl}"},"OSM-MNG-facebook":{name:"OpenStreetMap Mongolia",description:"Improve OpenStreetMap in Mongolia",extendedDescription:"Mapping in Mongolia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-MMR-facebook":{name:"OpenStreetMap Myanmar",description:"Improve OpenStreetMap in Myanmar",extendedDescription:"Mapping in Myanmar? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-Nepal-facebook":{name:"OpenStreetMap Nepal",description:"Improve OpenStreetMap in Nepal",extendedDescription:"Mapping in Nepal? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-PH-facebook":{name:"OpenStreetMap PH Facebook",description:"Welcome to OpenStreetMap Philippines, where we encourage all fellow Filipinos to contribute to the OpenStreetMap project."},"OSM-PH-mailinglist":{name:"Talk-ph Mailing List",description:"A mailing list to discuss OpenStreetMap in the Philippines"},"OSM-PH-slack":{name:"OpenStreetMap PH Slack",description:"All are welcome! Sign up at {signupUrl}"},"OSM-PH-telegram":{name:"OpenStreetMap PH Telegram",description:"Un-official, Telegram local community of OpenStreetMap contributors and friends in the Philippines"},"OSM-RU-forum":{name:"OpenStreetMap RU forum",description:"OpenStreetMap Russia web forum"},"OSM-RU-telegram":{name:"OpenStreetMap RU telegram",description:"OpenStreetMap Russia telegram chat"},"OSM-LKA-facebook":{name:"OpenStreetMap Sri Lanka",description:"Improve OpenStreetMap in Sri Lanka",extendedDescription:"Mapping in Sri Lanka? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-TW-facebook":{name:"OpenStreetMap Taiwan Community",description:"Facebook Group for Mappers and OpenStreetMap users to discuss matters about Taiwan."},"OSM-TW-mailinglist":{name:"OpenStreetMap Taiwan Mailinglist",description:"Talk-tw is an Official Mailinglist for the Communities to dicuss matters about Taiwan"},"OSM-TH-CNX-meetup":{name:"OSM Meetup Chiang Mai",description:"Irregular meeting of the OpenStreetMap community in Chiang Mai",extendedDescription:"Members of the OpenStreetMap community meet every few months in Chiang Mai. Get in contact and check out {url} to see when the next meetup is scheduled"},"OSM-TH-facebook":{name:"OpenStreetMap TH Facebook group",description:"Facebook group for OpenStreetMappers in Thailand"},"OSM-TH-forum":{name:"OpenStreetMap TH forum",description:"OpenStreetMap Thailand web forum"},"al-forum":{name:"OSM Albania Forum",description:"OpenStreetMap Albania Forum"},"al-maptime-tirana":{name:"Maptime Tirana",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time."},"al-telegram":{name:"OSM Albania Telegram channel",description:"OpenStreetMap Albania Telegram channel"},"at-forum":{name:"OpenStreetMap Austria Forum",description:"The official forum for OpenStreetMap questions in and around Austria"},"at-mailinglist":{name:"Talk-at Mailing List",description:"Talk-at is the official mailing list for the Austrian OSM community"},"at-twitter":{name:"OpenStreetMap Austria Twitter",description:"OpenStreetMap Austria On Twitter: {url}"},"osmgraz-meetup":{name:"OSM community meetup Graz",description:"Monthly meetup of the OpenStreetMap community in Graz"},"osmgraz-twitter":{name:"OSM community Graz on twitter",description:"OpenStreetMap community in Graz on twitter"},"osm-at":{name:"OpenStreetMap Austria",description:"The platform for information on OpenStreetMap in Austria"},byosm:{name:"OpenStreetMap Belarus",description:"OpenStreetMap Belarus telegram chat"},"be-facebook":{name:"OpenStreetMap BE Community",description:"Mappers and OpenStreetMap on Facebook in Belgium"},"be-forum":{name:"OpenStreetMap BE forum",description:"OpenStreetMap Belgium web forum"},"be-irc":{name:"OpenStreetMap Belgium IRC",description:"Join #osmbe on irc.oftc.net (port 6667)",extendedDescription:"Join #osmbe on irc.oftc.net (port 6667), it is bridged with the Matrix chat channel"},"be-mailinglist":{name:"Talk-be Mailing List",description:"Talk-be is the official mailing list for the Belgian OSM community"},"be-matrix":{name:"OpenStreetMap BE Matrix channel",description:"All mappers are welcome!",extendedDescription:"Most talk is happening at the \"OpenStreetMap Belgium\" channel. You can ask anything there! The other rooms are for specific subjects."},"be-meetup":{name:"OpenStreetMap Belgium Meetup",description:"Real life meetups of everyone who is interested in OpenStreetMap",extendedDescription:"Physical meetups are great to meet other mappers, ask them questions and to learn a lot. Especially new contributors are very welcome!"},"be-twitter":{name:"OpenStreetMap Belgium Twitter",description:"OSM Belgium on Twitter: @osm_be"},"hr-facebook":{name:"OpenStreetMap Croatia Facebook group",description:"OpenStreetMap Croatia Facebook group"},"hr-irc":{name:"OpenStreetMap Croatia on IRC",description:"Join #osm-hr on irc.freenode.org (port 6667)"},"hr-mailinglist":{name:"Talk-hr Mailing List",description:"Talk-hr mailing list"},"czech-community":{name:"Czech OSM community",description:"Map portal, website and contacts on OSM members in Czechia"},"osmcz-facebook":{name:"OpenStreetMap CZ on Facebook",description:"Follow czech community on Facebook - including translated WeeklyOSM!"},"osmcz-twitter":{name:"Czech twitter @osmcz",description:"Follow czech community on Twitter - including translated WeeklyOSM!"},"talk-cz-mailinglist":{name:"Czech mailing list (talk-cz)",description:"Talk-cz is the official mailing list for Czech community"},"dk-forum":{name:"OpenStreetMap Denmark Web Forum",description:"OpenStreetMap Denmark web forum"},"dk-irc":{name:"OpenStreetMap Denmark IRC",description:"Join #osm-dk on irc.oftc.net (port 6667)"},"dk-mailinglist":{name:"Talk-dk Mailing List",description:"A mailing list to discuss OpenStreetMap in Denmark"},"fi-forum":{name:"OpenStreetMap FI forum",description:"OpenStreetMap Finland web forum"},"fi-irc":{name:"OpenStreetMap Finland IRC",description:"Join #osm-fi on irc.oftc.net (port 6667)"},"fi-mailinglist":{name:"Talk-fi Mailing List",description:"Talk-fi is the official mailing list for the Finnish OSM community"},"fr-facebook":{name:"OpenStreetMap France Facebook page",description:"OpenStreetMap France Facebook page"},"fr-forum":{name:"OpenStreetMap France web forum",description:"OpenStreetMap France web forum"},"fr-irc":{name:"OpenStreetMap France on IRC",description:"Join #osm-fr on irc.oftc.net (port 6667)"},"fr-mailinglist":{name:"Talk-fr Mailing List",description:"Talk-fr mailing list"},"fr-twitter":{name:"OpenStreetMap France on Twitter",description:"OpenStreetMap France on Twitter: {url}"},"de-berlin-mailinglist":{name:"Berlin Mailing List",description:"This is the mailing list for the Berlin OSM community"},"de-berlin-meetup":{name:"OpenStreetMap Berlin-Brandenburg Meetup",description:"Mappers and OpenStreetMap users in the Berlin area"},"de-berlin-telegram":{name:"@osmberlin on Telegram",description:"OpenStreetMap Berlin Telegram chat"},"de-berlin-twitter":{name:"OpenStreetMap Berlin Twitter",description:"Follow us on Twitter: {url}"},"de-forum":{name:"OpenStreetMap DE forum",description:"OpenStreetMap Germany web forum"},"de-irc":{name:"OpenStreetMap Germany IRC",description:"Join #osm-de on irc.oftc.net (port 6667)"},"de-mailinglist":{name:"Talk-de Mailing List",description:"Talk-de is the official mailing list for the German OSM community"},"de-ostwestfalen-lippe-mailinglist":{name:"OWL Mailing List",description:"This is the mailing list for the Ostwestfalen-Lippe OSM community"},"de-telegram":{name:"OpenStreetMap Germany Telegram",description:"Join the OpenStreetMap Germany Telegram supergroup at {url}"},"osm-de":{name:"OpenStreetMap Germany",description:"The platform for information on OpenStreetMap in Germany"},"hu-facebook":{name:"OpenStreetMap HU on Facebook",description:"Mappers and OpenStreetMap Facebook in Hungary"},"hu-forum":{name:"OpenStreetMap HU forum",description:"OpenStreetMap Hungary web forum"},"hu-meetup":{name:"OpenStreetMap Hungary Meetup",description:"The platform for organizing meetups in Hungary"},"is-facebook":{name:"OSM Iceland on Facebook",description:"Page of OpenStreetMap in Iceland"},"is-mailinglist":{name:"Talk-is Mailing List",description:"Talk-is is the official mailing list for the Icelandic OSM community"},"is-twitter":{name:"OSM Iceland on Twittter",description:"Twitter of OpenStreetMap in Iceland"},"it-facebook":{name:"OpenStreetMap Italy Facebook",description:"Join the OpenStreetMap Italy community on Facebook"},"it-irc":{name:"OpenStreetMap Italy IRC",description:"Join #osm-it on irc.oftc.net (port 6667)"},"it-mailinglist":{name:"Talk-it Mailing List",description:"Talk-it is the official mailing list for the Italian OSM community"},"it-telegram":{name:"@OpenStreetMapItalia on Telegram",description:"OpenStreetMap Italy Telegram chat"},"it-twitter":{name:"OpenStreetMap Italy Twitter",description:"Follow us on Twitter at {url}"},"OSM-Rome-meetup":{name:"Incontro Mappatori Romani",description:"Improve OpenStreetMap in the Rome area",extendedDescription:"We aim to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Lazio."},"South-Tyrol-Mailing-List":{name:"OpenStreetMap mailing list for South Tyrol",description:"OpenStreetMap Italy regional talk list for South Tyrol"},"talk-it-lazio":{name:"OpenStreetMap IT Lazio",description:"All are welcome! Sign up at {signupUrl}",extendedDescription:"Mailinglist for Rome and Lazio area."},"Trentino-Mailing-List":{name:"OpenStreetMap mailing list for Trentino",description:"OpenStreetMap Italy regional talk list for Trentino"},"kosovo-telegram":{name:"OpenStreetMap Kosovo on Telegram",description:"Semi-official all-Kosovo Telegram public group. We welcome all mappers from anywhere in any language."},"no-forum":{name:"OpenStreetMap Norway Web Forum",description:"OpenStreetMap Norway web forum"},"no-irc":{name:"OpenStreetMap Norway on IRC",description:"Chat room for mappers and OpenStreetMap users, developers and enthusiasts in Norway"},"no-mailinglist":{name:"OpenStreetMap Norway mailing list",description:"Mailing list for mappers and OpenStreetMap users, developers and enthusiasts in Norway"},"OSM-PL-facebook-group":{name:"OpenStreetMap Poland Facebook group",description:"Group for mappers and users of OpenStreetMap in Poland"},"OSM-PL-forum":{name:"OpenStreetMap Poland Forum",description:"Forum of Polish OpenStreetMap community"},"si-forum":{name:"OpenStreetMap Slovenia Forum",description:"Forum of OpenStreetMap community in Slovenia"},"si-mailinglist":{name:"OpenStreetMap Slovenia mailing list",description:"Mailing list of OpenStreetMap community in Slovenia"},"OSM-ES-mailinglist":{name:"Talk-es mailing list",description:"A mailing list to discuss OpenStreetMap in Spain"},"OSM-ES-telegram":{name:"@OSMes on Telegram",description:"OpenStreetMap Spain Telegram chat"},"osm-se":{name:"OpenStreetMap.se",description:"Provide OSM services and information for the local community in Sweden"},"se-facebook":{name:"OpenStreetMap Sweden Facebook",description:"OpenStreetMap Sweden on Facebook"},"se-forum":{name:"OpenStreetMap Sweden Web Forum",description:"OpenStreetMap Sweden web forum"},"se-irc":{name:"OpenStreetMap Sweden IRC",description:"Join #osm.se on irc.oftc.net (port 6667)"},"se-mailinglist":{name:"Talk-se Mailing List",description:"A mailing list to discuss OpenStreetMap in Sweden"},"se-twitter":{name:"OpenStreetMap Sweden on Twitter",description:"Follow us on Twitter: {url}"},"Nottingham-OSM-pub-meetup":{name:"East Midlands (Nottingham) Monthly pub meet-up",description:"Social gathering for East Midlands mappers and users",extendedDescription:"A group have been meeting since March 2011, initially in Nottingham, and, more recently in Derby, and from time to time elsewhere in the East Midlands. These are social gatherings, but are an excellent place to come and ask specific questions about OSM either in the area or in general. In the summer months we usually do some light mapping for an hour in the vicinity of our meeting place. The group as a whole has a special interest in mapping public rights of way and from time to time has mapping meetings for this purpose."},"gb-mailinglist":{name:"Talk-gb Mailing List",description:"Talk-gb is the main communication forum list for the British (including Northern Ireland) OSM community"},"mappa-mercia-group":{name:"Mappa Mercia local group",description:"A home for OpenStreetMap enthusiasts in the Midlands",extendedDescription:"Mappa Mercia is a project to grow OpenStreetMap in the West Midlands, UK. We run community events, provide training and support local organisations wishing to open up their data."},"gb-irc":{name:"OpenStreetMap United Kingdom IRC",description:"Join #osm-gb on irc.oftc.net (port 6667)",extendedDescription:"Join #osm-gb on irc.oftc.net (port 6667), please be patient and wait for a few minutes if you ask a question"},"OSM-CA-Slack":{name:"OSM-CA Slack",description:"All are welcome! Sign up at {signupUrl}."},"OSM-Vancouver-meetup":{name:"OpenStreetMap Vancouver",description:"Mappers and OpenStreetMap users in the Vancouver, BC area"},"OSM-CU-telegram":{name:"OSM Cuba on Telegram",description:"OpenStreetMap Cuba Telegram chat"},"OSM-NI-telegram":{name:"OSM Nicaragua on Telegram",description:"OpenStreetMap Nicaragua Telegram chat"},"Bay-Area-OpenStreetMappers":{name:"Bay Area OpenStreetMappers",description:"Improve OpenStreetMap in the Bay Area",extendedDescription:"This group is about growing the OpenStreetMap community here in the Bay Area. Our events are open to everyone, from open source enthusiasts, cyclists, GIS professionals, geocachers, and beyond. Anyone and everyone who is interested in maps, map making and free map data is welcome to join our group as well as attend our events."},"Central-Pennsylvania-OSM":{name:"Central Pennsylvania OSM",description:"Online mapping community based out of State College, PA"},"Code-for-San-Jose-Slack":{name:"Code for San Jose Slack",description:"All are welcome! Sign up at {signupUrl}, then join the #osm channel."},"Dallas-Fort-Worth-OSM":{name:"Dallas-Fort Worth OSM",description:"The OpenStreetMap user group for Dallas-Fort Worth",extendedDescription:"Dallas, Fort Worth, and all the cities in between are abounding with creative and tech-savvy people. The vision for this usergroup is to find new ways to use the amazing resource of OSM."},GeoPhilly:{name:"GeoPhilly",description:"Meetup for map enthusiasts in the Philadelphia area",extendedDescription:"GeoPhilly unites developers, geographers, data geeks, open source enthusiasts, civic hackers and map addicts in our shared love of maps and the stories they tell. If you use maps as part of your work or just want to learn more, this is the meetup for you!  Our events aim to be open, friendly, educational and social and range from happy hours to lightning talks or even workshops. Come create a diverse, inspiring geospatial community in the Philadelphia with us!"},MapMinnesota:{name:"MapMinnesota",description:"Mappers and OpenStreetMap enthusiasts in the Twin Cities area",extendedDescription:"Connecting OpenStreetMap enthusiasts in Minnesota and the Twin Cities!"},"Mapping-DC-meetup":{name:"Mapping DC",description:"Improve OpenStreetMap in the DC area",extendedDescription:"We are a group of volunteer mappers who aim to improve the OpenStreetMap in the DC area. We also aim to teach others about the OSM ecosystem, data analytics, cartography, and GIS. We gather every other month at meetups to focus on one area of our city."},"Maptime-ME-meetup":{name:"MaptimeME",description:"Mappers and OpenStreetMap users, around Portland, ME",extendedDescription:"Maptime is, rather literally, time for mapmaking.  Our mission is to open the doors of cartographic possibility to anyone interested by creating a time and space for collaborative learning, exploration, and map creation using mapping tools and technologies."},"MaptimeHRVA-twitter":{name:"MaptimeHRVA Twitter",description:"Follow us on Twitter at {url}"},"us-ma-mailinglist":{name:"Talk-us-massachusetts Mailing List",description:"Email mailing list for the Massachusetts OSM community"},"OpenCleveland-meetup":{name:"Open Cleveland",description:"Improve OpenStreetMap in the Cleveland area",extendedDescription:"Open Geo Cleveland aims to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Northeast Ohio. We're also a maptime chapter =)"},"OSM-Boston":{name:"OpenStreetMap Boston",description:"Mappers and OpenStreetMap users in the Boston area",extendedDescription:"OpenStreetMap is the free and open, wiki-style map of the world, with hundreds of thousands of contributions every day from people like you. Editing the map is simple, and fun! Join us both indoors and outdoors in our effort to create the best map of the Boston area and the rest of the world!"},"OSM-Central-Salish-Sea":{name:"OpenStreetMap Central Salish Sea",description:"Mappers and OpenStreetMap users around Mount Vernon, WA",extendedDescription:"OpenStreetMap is an map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more. We meet all the time to talk maps, make maps and have fun!"},"OSM-Chattanooga":{name:"OSM Chattanooga",description:"The OpenStreetMap user group for Chattanooga"},"OSM-Colorado":{name:"OpenStreetMap Colorado",description:"Mappers and OpenStreetMap users in the state of Colorado, USA",extendedDescription:"OpenStreetMap (OSM) Colorado is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties."},"OSM-NYC":{name:"OpenStreetMap NYC",description:"Mappers and OpenStreetMap users, developers and enthusiasts in the New York Metropolitan area"},"OSM-Portland-forum":{name:"OpenStreetMap PDX Google Group",description:"Forum and mailing list for OpenStreetMap users in the Portland area",extendedDescription:"This group is to facilitate improvements to OpenStreetMap in the Portland, Oregon area to support applications such as the Open Trip Planner."},"OSM-Portland":{name:"OpenStreetMap Portland",description:"Mappers and OpenStreetMap users in the Portland area",extendedDescription:"OpenStreetMap (OSM) is a map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more, and come join us at a meetup to talk maps, contribute to OSM, and have fun!"},"OSM-Seattle":{name:"OpenStreetMap Seattle",description:"Mappers and OpenStreetMap users in the Seattle area"},"OSM-SoCal":{name:"OpenStreetMap Southern California",description:"Let's have some fun, contribute something to Los Angeles, and learn about mapping!",extendedDescription:"OpenStreetMap (OSM) Southern California is for anyone interested in mapping to get together to work with OpenStreetMap.  OpenStreetMap, the Wikipedia of maps, is a free open-source map of the world being created by more than 1,000,000 volunteers around the globe.  Everyone is welcome.  If you don't know OpenStreetMap, we'll teach you. If you have an idea for a mapping project or even a field trip that the group can do, great!"},"OSM-South-Bay":{name:"OSM South Bay",description:"Map Nights hosted by Code for San Jose",extendedDescription:"Code for San Jose, the local Code for America brigade, hosts monthly Map Nights on Thursday nights in downtown San José. Meet fellow South Bay mappers, help out with local mapping projects, and hear about other civic tech projects. Programming and GIS skills are not required."},"OSM-Tampa-Bay":{name:"OpenStreetMap Tampa Bay",description:"Mappers and OpenStreetMap users in the Tampa Bay area",extendedDescription:"OSM Tampa Bay group for local residents to get together and build out the definitive map of Tampa Bay with OpenStreetMap, the free and editable map of the world.  If you're into maps, data, open source, GPS, hiking, cycling, et cetera, you'll love working with OpenStreetMap -- so join in! We'll get together and map and talk about new topics once-a-month or so."},"OSM-US-Slack":{name:"OpenStreetMap US Slack",description:"All are welcome! Sign up at {signupUrl}"},"OSM-US":{name:"OpenStreetMap US",description:"We help grow and improve OpenStreetMap in the United States.",extendedDescription:"We support OpenStreetMap by holding annual conferences, providing community resources, building partnerships, and by spreading the word. Join OpenStreetMap US here: {signupUrl}",events:{sotmus2018:{name:"State of the Map US 2018",description:"Join the OpenStreetMap community at State of the Map US in Detroit, Michigan. Connect with other mappers, businesses, government agencies, and non profits, all collaborating around the free and editable map of the world.",where:"Detroit, Michigan"}}},"OSM-Utah":{name:"OpenStreetMap Utah",description:"Mappers and OpenStreetMap users in the Salt Lake City area",extendedDescription:"Activities may include things like Learn To Map workshops, mapping parties and outdoor data collection. The events will take place in the SLC area, at least initially.  We are looking for seasoned mappers as well as people new to OSM. Join and let's do some mapping!"},"OSM-Wyoming":{name:"OpenStreetMap Wyoming",description:"Mappers and OpenStreetMap users in the state of Wyoming",extendedDescription:"OpenStreetMap (OSM) Wyoming is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties."},"PHXGeo-meetup":{name:"PHXGeo Meetup",description:"Mappers and OpenStreetMap users in the Phoenix, AZ area",extendedDescription:"This is a meetup group for those in the Phoenix area who like maps, GIS, OpenStreetMap, cartography and anything in between."},"PHXGeo-twitter":{name:"PHXGeo Twitter",description:"Follow us on Twitter at {url}"},"Western-Slope-facebook":{name:"Western Slope OSM Facebook",description:"Mappers and OpenStreetMap users around Grand Junction, CO"},"Western-Slope-meetup":{name:"Western Slope OSM Meetup",description:"Mappers and OpenStreetMap users around Grand Junction, CO",extendedDescription:"The goal of this group is to introduce OpenStreetMap to the community, develop a community of mappers, create the most amazing geodata possible using whatever method we can and finally strategize in order to get this data out into our community. Imagine accurate trail signage! Imagine further development of bike paths! Imagine anything you want, that's the joy of OpenStreetMap!"},"Maptime-Australia-Slack":{name:"Maptime Australia Slack",description:"Sign up at {signupUrl}"},"talk-au":{name:"Talk-au Mailing List",description:"Place for Aussie mappers to chat"},"OSM-AR-facebook":{name:"OpenStreetMap Argentina Facebook",description:"Join the OpenStreetMap Argentina community on Facebook",extendedDescription:"News from the local community"},"OSM-AR-forum":{name:"OpenStreetMap Argentina web forum",description:"Join the OpenStreetMap Argentina web forum",extendedDescription:"Ideal for long or important discussions. Slow response time."},"OSM-AR-irc":{name:"OpenStreetMap Argentina IRC",description:"Join #osm-ar on irc.oftc.net (port 6667)",extendedDescription:"You may find the most geeky user in the community."},"OSM-AR-mailinglist":{name:"Talk-ar Mailing List",description:"Historic mailing list. Almost unused today."},"OSM-AR-telegram":{name:"OpenStreetMap Argentina Telegram",description:"Join the OpenStreetMap Argentina community on Telegram",extendedDescription:"The most active channel in the community, ideal for chatting and getting answers to your questions instantly. Everyone is welcome!"},"OSM-AR-twitter":{name:"OpenStreetMap Argentina Twitter",description:"Follow us on Twitter at {url}",extendedDescription:"News from the local community and OpenStreetMap in general."},"OSM-BO-mailinglist":{name:"Talk-bo Mailing List",description:"Talk-bo is the official mailing list for the Bolivian OpenStreetMap community",extendedDescription:"Mapping in Bolivia? Have questions, want to connect with the community here? Join us at {url}. All are welcome!"},"Bahia-telegram":{name:"OpenStreetMap Bahia Telegram Group",description:"Join the OpenStreetMap Bahia community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"DF-telegram":{name:"OpenStreetMap Brasília Telegram Group",description:"Join the OpenStreetMap Brasília community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-br-mailinglist":{name:"Talk-br Mailing List",description:"A mailing list to discuss OpenStreetMap in Brazil"},"OSM-br-telegram":{name:"OpenStreetMap Brasil Telegram",description:"Join the OpenStreetMap Brasil community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-br-twitter":{name:"OpenStreetMap Brasil Twitter",description:"Follow us on Twitter at {url}"},"RS-telegram":{name:"OpenStreetMap Rio Grande do Sul Telegram Group",description:"Join the OpenStreetMap Rio Grande do Sul community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-facebook":{name:"OpenStreetMap Chile Facebook",description:"Join the OpenStreetMap Chile community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-mailinglist":{name:"Talk-cl Mailing List",description:"A mailing list to discuss OpenStreetMap in Chile"},"OSM-CL-telegram":{name:"OpenStreetMap Chile Telegram",description:"Join the OpenStreetMap Chile community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-twitter":{name:"OpenStreetMap Chile Twitter",description:"Follow us on Twitter at {url}"},"Maptime-Bogota":{name:"Maptime Bogotá",description:"We're a group of mappers interested in mapping in OpenStreetMap around Bogotá.",extendedDescription:"Learn to collect data in the field and digitize onto OpenStreetMap.  It is not necessary to have previous knowledge! You just need the desire to participate, learn, and have fun."},"OSM-CO-facebook":{name:"OpenStreetMap Colombia Facebook",description:"Join the OpenStreetMap Colombia community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap. Everyone is welcome!"},"OSM-CO-mailinglist":{name:"Talk-co Mailing List",description:"A mailing list to discuss OpenStreetMap in Colombia"},"OSM-CO-telegram":{name:"OSM Colombia on Telegram",description:"OpenStreetMap Colombia Telegram chat"},"OSM-CO-twitter":{name:"OpenStreetMap Colombia Twitter",description:"Follow us on Twitter at {url}"},"OSM-CO":{name:"OpenStreetMap Colombia",description:"News of the OpenStreetMap Colombia community and the OSMCo Foundation"},"OSM-EC-telegram":{name:"OSM Ecuador on Telegram",description:"OpenStreetMap Ecuador Telegram chat"},"OSM-PY-telegram":{name:"OSM Paraguay on Telegram",description:"OpenStreetMap Paraguay Telegram chat"},"OSM-PE-facebook":{name:"OpenStreetMap Peru Facebook",description:"Join the OpenStreetMap Peru community on Facebook"},"OSM-PE-mailinglist":{name:"Talk-pe Mailing List",description:"The official mailing list for the OpenStreetMap Peru community"},"OSM-PE-matrix":{name:"OpenStreetMap Peru Matrix Chat",description:"Chat with other members of the OpenStreetMap Peru community in Matrix."},"OSM-PE-telegram":{name:"OpenStreetMap Peru Telegram",description:"Join the OpenStreetMap Peru community on Telegram"},"OSM-PE-twitter":{name:"OpenStreetMap Peru Twitter",description:"Follow us on Twitter at {url}"},"OSM-PE":{name:"OpenStreetMap Peru",description:"News and resources for the OpenStreetMap Peru community"},"LATAM-Facebook":{name:"OpenStreetMap Latam Facebook",description:"OpenStreetMap Latam on Facebook"},"LATAM-Telegram":{name:"OpenStreetMap Latam Telegram",description:"OpenStreetMap Telegram for Latin America"},"LATAM-Twitter":{name:"OpenStreetMap Latam Twitter",description:"Follow us on Twitter at {url}"},"osm-latam":{name:"OpenStreetMap Latam",description:"Supporting OpenStreetMap in Latin America",events:{"sotm-latam-2018":{name:"State of the Map Latam 2018",description:"State of the Map Latam is the annual conference for all mappers and users of OpenStreetMap in Latin America. The program includes talks, panels, workshops, and mapathons related to OpenStreetMap.",where:"Buenos Aires, Argentina"}}},"OSM-Discord":{name:"OpenStreetMap Discord",description:"Get in touch with other mappers via Discord"},"OSM-Facebook":{name:"OpenStreetMap on Facebook",description:"Like us on Facebook for news and updates about OpenStreetMap."},"OSM-help":{name:"OpenStreetMap Help",description:"Ask a question and get answers on OSM's community-driven question and answer site.",extendedDescription:"{url} is for everyone who needs help with OpenStreetMap.  Whether you are a beginner mapper or have a technical question, we're here to help!"},"OSM-IRC":{name:"OpenStreetMap IRC",description:"Join #osm on irc.oftc.net (port 6667)"},"OSM-Reddit":{name:"OpenStreetMap on Reddit",description:"/r/openstreetmap/ is a great place to learn more about OpenStreetMap.  Ask us anything!"},"OSM-Telegram":{name:"OpenStreetMap Telegram",description:"Join the OpenStreetMap Telegram global supergroup at {url}"},"OSM-Twitter":{name:"OpenStreetMap Twitter",description:"Follow us on Twitter at {url}"},OSMF:{name:"OpenStreetMap Foundation",description:"OSMF is a UK-based not-for-profit that supports the OpenStreetMap Project",extendedDescription:"OSMF supports the OpenStreetMap by fundraising, maintaining the servers which power OSM, organizing the annual State of the Map conference, and coordinating the volunteers who keep OSM running. You can show your support and have a voice in the direction of OpenStreetMap by joining as an OSMF member here: {signupUrl}",events:{sotm2018:{name:"State of the Map 2018",description:"Join us for 3 days in Milan, Italy for the annual worldwide OpenStreetMap conference, bringing together everyone in the community to socialize, share, and learn.",where:"Milan, Italy"}}}}};
23654
23655   var features$2 = {botswana:{type:"Feature",id:"botswana",properties:{},geometry:{type:"Polygon",coordinates:[[[25.65423,-18.48085],[25.70131,-18.56629],[25.79198,-18.60814],[25.83557,-18.82958],[25.95414,-18.89236],[26.00296,-19.02313],[25.9925,-19.058],[26.17908,-19.52356],[26.25057,-19.57064],[26.32554,-19.57064],[26.37611,-19.62121],[26.35344,-19.64562],[26.70741,-19.87404],[26.73356,-19.91763],[26.97419,-20.00133],[27.04394,-19.99784],[27.13984,-20.06585],[27.22005,-20.07456],[27.30723,-20.22626],[27.31769,-20.45643],[27.73269,-20.4913],[27.74664,-20.70926],[27.71525,-21.07718],[27.9088,-21.2777],[28.02562,-21.55668],[28.19825,-21.5933],[28.37261,-21.59679],[28.50339,-21.65433],[28.58011,-21.62643],[28.8033,-21.71362],[29.08577,-21.80603],[29.03346,-21.90193],[29.06659,-22.02399],[29.17645,-22.07107],[29.25665,-22.05189],[29.38569,-22.19312],[29.32117,-22.21231],[29.0387,-22.23323],[29.01428,-22.27159],[28.97941,-22.31344],[28.98115,-22.34482],[28.94105,-22.45991],[28.52257,-22.59766],[28.36041,-22.58371],[28.18255,-22.70053],[28.18255,-22.74761],[28.06747,-22.89931],[27.95239,-22.9708],[27.96285,-23.03532],[27.74838,-23.24107],[27.68561,-23.21666],[27.62109,-23.23758],[27.56006,-23.36836],[27.2741,-23.49565],[27.08578,-23.66304],[27.00034,-23.70489],[26.88875,-24.10593],[26.87654,-24.26635],[26.74228,-24.31343],[26.57663,-24.45292],[26.42842,-24.64821],[25.8844,-24.77724],[25.89486,-24.88012],[25.76585,-25.17485],[25.66467,-25.48682],[25.58448,-25.64908],[25.3456,-25.78509],[25.11021,-25.76939],[25.02517,-25.71967],[24.92538,-25.81822],[24.69696,-25.83042],[24.46156,-25.74324],[24.37786,-25.76765],[24.21127,-25.67022],[23.92974,-25.64036],[23.66819,-25.44158],[23.3121,-25.26869],[22.88179,-25.50087],[22.72835,-26.01351],[22.63768,-26.10767],[22.56793,-26.2367],[22.48424,-26.21054],[22.35521,-26.33609],[22.24971,-26.35352],[22.07317,-26.63251],[21.9668,-26.67131],[21.79767,-26.66956],[21.77761,-26.69223],[21.80377,-26.78465],[21.6913,-26.87096],[21.59889,-26.8605],[21.5274,-26.86224],[21.32339,-26.84349],[21.14248,-26.87375],[21.00386,-26.84873],[20.98729,-26.81621],[20.85826,-26.80575],[20.68477,-26.92022],[20.61677,-26.79293],[20.61589,-26.68718],[20.622,-26.60461],[20.5941,-26.47558],[20.82252,-26.153],[20.78939,-25.92458],[20.63769,-25.63862],[20.63595,-25.55143],[20.36045,-25.06321],[20.25583,-24.93766],[20.11982,-24.89756],[19.98556,-24.76853],[19.99602,-21.99435],[20.9934,-22.00132],[20.99514,-18.30648],[21.45547,-18.31171],[23.10324,-17.98913],[23.31422,-17.98913],[23.43105,-18.18268],[23.54439,-18.26289],[23.60542,-18.48085],[23.77455,-18.36577],[23.91928,-18.20884],[24.18606,-18.01355],[24.36915,-17.94031],[24.47377,-17.956],[24.51038,-18.03621],[24.57839,-18.05714],[24.615,-17.98565],[24.71439,-17.89498],[24.97594,-17.77466],[25.09102,-17.82174],[25.15903,-17.76246],[25.27411,-17.79559],[25.25493,-17.91241],[25.31596,-18.06062],[25.40489,-18.1077],[25.5374,-18.37972],[25.65423,-18.48085]]]}},cape_coast_gh:{type:"Feature",id:"cape_coast_gh",properties:{},geometry:{type:"Polygon",coordinates:[[[-1.6,5],[-1.6,5.4],[-1,5.4],[-1,5],[-1.6,5]]]}},ghana:{type:"Feature",properties:{},id:"ghana",geometry:{type:"Polygon",coordinates:[[[-3.11256,5.13335],[-2.97215,5.11112],[-2.94811,5.12753],[-2.75757,5.10599],[-2.7253,5.14087],[-2.78641,5.28242],[-2.78297,5.29541],[-2.76993,5.2937],[-2.76546,5.31797],[-2.77748,5.33079],[-2.77319,5.35557],[-2.72495,5.34224],[-2.78023,5.60642],[-2.86022,5.65049],[-2.92889,5.61838],[-2.96631,5.64127],[-2.95292,5.71643],[-3.02639,5.7096],[-3.01987,5.8575],[-3.07411,5.98624],[-3.10226,6.15284],[-3.15514,6.25114],[-3.17574,6.25182],[-3.17162,6.29755],[-3.23753,6.54183],[-3.23341,6.60049],[-3.26157,6.61959],[-3.21007,6.73417],[-3.24028,6.83031],[-2.95326,7.23817],[-2.97558,7.27018],[-2.92236,7.61436],[-2.77611,7.94432],[-2.60513,8.03747],[-2.62985,8.11769],[-2.48978,8.20877],[-2.64221,9.00988],[-2.77679,9.03972],[-2.76581,9.15633],[-2.66968,9.26478],[-2.93884,10.66601],[-2.82898,11.0113],[-0.68939,11.00051],[-0.60974,10.91962],[-0.43121,11.04095],[-0.43396,11.10295],[-0.27843,11.17672],[-0.13424,11.13967],[-0.14214,11.10632],[-0.05905,11.08341],[-0.0388,11.10733],[-0.01339,11.11204],[0.02369,11.05308],[0.03296,10.97793],[-0.00549,10.96411],[-0.02266,10.81914],[-0.07141,10.76856],[-0.07999,10.69806],[-0.05905,10.63294],[0.04257,10.60257],[0.0618,10.56207],[0.14351,10.52629],[0.17097,10.42265],[0.26711,10.41151],[0.28633,10.42096],[0.34264,10.31357],[0.39757,10.31492],[0.39722,10.30546],[0.37148,10.28283],[0.35225,10.10746],[0.41817,10.06487],[0.40924,10.01822],[0.36461,10.03174],[0.34676,9.66506],[0.26779,9.64678],[0.24994,9.44771],[0.42847,9.48564],[0.56168,9.40977],[0.48203,8.80501],[0.3804,8.74122],[0.47653,8.59324],[0.65369,8.49546],[0.65781,8.42347],[0.70862,8.38339],[0.72784,8.28964],[0.60425,8.21693],[0.62004,7.70623],[0.59464,7.70283],[0.5809,7.62253],[0.52322,7.5953],[0.52734,7.45099],[0.56168,7.39243],[0.62759,7.40741],[0.66055,7.30935],[0.59395,7.11248],[0.61317,7.09306],[0.59601,7.00549],[0.52322,6.97823],[0.52322,6.94006],[0.56442,6.92234],[0.53284,6.82962],[0.65094,6.73962],[0.63446,6.63733],[0.74707,6.57048],[0.71411,6.51864],[0.90242,6.33355],[1.00405,6.33543],[1.02516,6.25319],[1.05537,6.22964],[1.1,6.17],[1.2,6.17],[1.2,4],[-3,4.5],[-3.11256,5.13335]]]}},madagascar:{type:"Feature",id:"madagascar",properties:{},geometry:{type:"Polygon",coordinates:[[[51,-15],[47.5,-26],[42,-26],[43.5,-16],[49.5,-11],[51,-15]]]}},BGD:{type:"Feature",id:"BGD",properties:{name:"Bangladesh"},geometry:{type:"Polygon",coordinates:[[[92.67272,22.04124],[92.65226,21.32405],[92.30323,21.47548],[92.36855,20.67088],[92.08289,21.1922],[92.02522,21.70157],[91.83489,22.18294],[91.41709,22.76502],[90.49601,22.80502],[90.58696,22.39279],[90.27297,21.83637],[89.84747,22.03915],[89.70205,21.85712],[89.41886,21.96618],[89.03196,22.05571],[88.87631,22.87915],[88.52977,23.63114],[88.69994,24.23372],[88.08442,24.50166],[88.30637,24.86608],[88.93155,25.23869],[88.20979,25.76807],[88.56305,26.44653],[89.35509,26.01441],[89.83248,25.96508],[89.92069,25.26975],[90.87221,25.1326],[91.7996,25.14743],[92.3762,24.97669],[91.91509,24.13041],[91.46773,24.07264],[91.15896,23.50353],[91.70647,22.98526],[91.86993,23.62435],[92.14603,23.6275],[92.67272,22.04124]]]}},india_andhrapradesh:{type:"Feature",id:"india_andhrapradesh",properties:{},geometry:{type:"Polygon",coordinates:[[[76.76365,14.98503],[76.78952,15.01589],[76.77614,15.05336],[76.80034,15.09466],[76.86072,15.05669],[76.87678,15.02859],[76.94279,15.02725],[76.98159,15.0103],[77.00077,15.02948],[77.04671,15.02904],[77.07882,15.00004],[77.1096,15.02859],[77.12744,15.09371],[77.14751,15.10753],[77.16873,15.17462],[77.14554,15.22413],[77.15223,15.29148],[77.12118,15.29418],[77.11387,15.3334],[77.07705,15.32577],[77.0421,15.36103],[77.027,15.44075],[76.97414,15.50807],[77.02697,15.5037],[77.03509,15.63815],[77.08728,15.65733],[77.08192,15.69524],[77.05293,15.72914],[77.05561,15.82458],[77.03333,15.85326],[77.07659,15.90991],[77.14448,15.94265],[77.2479,15.96378],[77.3564,15.95008],[77.42745,15.94836],[77.46652,15.93453],[77.61152,15.91691],[77.6536,15.88393],[77.72205,15.89199],[77.80554,15.87083],[77.8616,15.88138],[77.89376,15.90154],[78.00803,15.86506],[78.03641,15.90188],[78.06997,15.85048],[78.10755,15.83401],[78.17153,15.85511],[78.17371,15.89569],[78.20995,15.9197],[78.2507,15.96993],[78.2682,16.02857],[78.29785,16.01169],[78.40727,16.0756],[78.45394,16.07503],[78.55814,16.04517],[78.59917,16.08361],[78.64311,16.08312],[78.68277,16.03346],[78.73718,16.0097],[78.78267,16.02125],[78.8419,16.08707],[78.83228,16.13919],[78.87606,16.13902],[78.88876,16.0879],[78.92138,16.10307],[78.9049,16.17711],[78.92807,16.19871],[78.98352,16.21074],[79.01236,16.24173],[79.09802,16.2236],[79.12305,16.23187],[79.1593,16.20893],[79.22111,16.23251],[79.23438,16.32518],[79.21143,16.35493],[79.21112,16.44396],[79.22091,16.51631],[79.25265,16.57381],[79.37802,16.58412],[79.41773,16.57986],[79.44409,16.61796],[79.49421,16.63408],[79.53884,16.63046],[79.60613,16.67239],[79.63566,16.6594],[79.68544,16.69755],[79.72286,16.68966],[79.74673,16.72106],[79.79256,16.72485],[79.81796,16.69098],[79.84286,16.70561],[79.88555,16.68642],[79.90723,16.63408],[79.95306,16.63621],[80.00576,16.70857],[80.05536,16.74833],[80.07093,16.81323],[80.0332,16.85233],[79.99173,16.86303],[80.04569,16.96517],[80.08405,16.96339],[80.134,16.98524],[80.18217,17.04501],[80.19555,17.01825],[80.26201,17.01066],[80.28877,16.97677],[80.31553,16.91254],[80.3191,16.87106],[80.35879,16.85501],[80.37306,16.8113],[80.41856,16.84252],[80.45647,16.78989],[80.56262,16.76268],[80.6041,16.78766],[80.55593,16.81843],[80.56485,16.86883],[80.59027,16.91165],[80.53184,16.95001],[80.44264,16.9451],[80.35835,16.97052],[80.38778,17.0071],[80.36682,17.0566],[80.39001,17.07623],[80.42034,17.02494],[80.48234,17.05036],[80.49616,17.10789],[80.56039,17.13822],[80.68393,17.06865],[80.82309,17.03787],[80.85877,17.05081],[80.87714,17.10478],[80.88011,17.1644],[80.91689,17.15439],[80.91892,17.22003],[80.99838,17.19012],[81.03576,17.19196],[81.05653,17.22041],[81.16295,17.23278],[81.18035,17.25463],[81.17053,17.29656],[81.19016,17.32733],[81.26732,17.3202],[81.31385,17.37576],[81.24132,17.40667],[81.22725,17.43762],[81.17746,17.45203],[81.15755,17.47938],[81.11343,17.49477],[81.08374,17.45957],[81.01198,17.49248],[80.99962,17.53013],[80.95671,17.58749],[80.85431,17.59347],[80.86444,17.62914],[80.90266,17.63912],[80.90684,17.67993],[80.89153,17.74125],[80.94636,17.76025],[81.03556,17.74495],[81.07481,17.76038],[81.08891,17.81081],[81.15938,17.85273],[81.19194,17.84694],[81.25394,17.81215],[81.40915,17.80501],[81.47025,17.8233],[81.48096,17.80278],[81.5541,17.81616],[81.61119,17.81527],[81.66293,17.87682],[81.70307,17.86121],[81.78246,17.90982],[81.80119,17.93614],[81.89932,17.9687],[82.0019,18.02356],[82.03316,18.06597],[82.08072,18.07378],[82.14091,18.0439],[82.17228,18.04993],[82.25028,17.9883],[82.27583,17.995],[82.2667,18.04332],[82.29628,18.06899],[82.34354,18.07485],[82.33329,18.1422],[82.30608,18.19572],[82.33284,18.21579],[82.33685,18.26619],[82.37209,18.27421],[82.39305,18.30633],[82.33462,18.31703],[82.38458,18.36922],[82.36138,18.4098],[82.43513,18.48477],[82.48969,18.52285],[82.53139,18.51177],[82.54422,18.41638],[82.60918,18.37427],[82.59758,18.26516],[82.64005,18.23708],[82.67329,18.29908],[82.70644,18.30476],[82.77538,18.33958],[82.79251,18.36262],[82.78448,18.42803],[82.80742,18.44772],[82.89919,18.40074],[82.91103,18.36453],[82.98471,18.36362],[83.0002,18.38368],[83.04775,18.37883],[83.07472,18.401],[83.04552,18.44345],[83.05997,18.48603],[83.09665,18.54123],[83.05931,18.54334],[83.0336,18.57266],[83.05776,18.62215],[83.09414,18.63021],[83.15495,18.70089],[83.23099,18.75616],[83.27407,18.76523],[83.28745,18.79777],[83.36791,18.81557],[83.40661,18.84174],[83.39569,18.87914],[83.35554,18.92896],[83.36892,18.96132],[83.32119,18.97447],[83.3428,19.01449],[83.41665,19.00408],[83.45049,18.95576],[83.48237,19.00825],[83.46716,19.07746],[83.51314,19.07262],[83.52143,19.03271],[83.61209,19.10076],[83.62679,19.14969],[83.69206,19.05202],[83.71342,18.99346],[83.73398,18.98382],[83.79596,19.01607],[83.84255,18.9178],[83.85136,18.86003],[83.87788,18.82716],[84.05557,18.79246],[84.0894,18.75373],[84.16689,18.78415],[84.22422,18.79642],[84.2535,18.78262],[84.2914,18.8],[84.33966,18.80123],[84.39349,18.89211],[84.43671,18.92277],[84.42292,18.94711],[84.47894,18.99017],[84.51711,19.04634],[84.62687,19.08543],[84.61653,19.12624],[84.66828,19.13065],[84.6721,19.16552],[84.71352,19.1524],[84.70468,19.11772],[84.76857,19.08003],[85.15481,18.87834],[85.14492,18.85295],[85.05442,18.77126],[85.01176,18.69225],[84.94947,18.67649],[84.44354,18.21885],[83.98107,17.79763],[83.77893,17.63361],[83.20925,17.15734],[82.8246,16.92714],[82.20846,16.16914],[81.78413,16.05362],[81.60171,16.04774],[80.84225,15.52037],[80.65306,15.4875],[80.54735,15.42991],[80.4922,15.34128],[80.47381,15.25261],[80.48624,15.06582],[80.49835,15.0251],[80.66968,13.56514],[80.26863,13.56255],[80.24181,13.46797],[80.22545,13.48346],[80.14774,13.49443],[80.08045,13.49111],[80.08,13.52565],[80.00213,13.53964],[80.01841,13.50074],[79.97441,13.46419],[79.96622,13.38714],[79.93821,13.34898],[79.86379,13.31632],[79.8129,13.31712],[79.79245,13.29487],[79.73437,13.27843],[79.79598,13.24103],[79.75102,13.21106],[79.68369,13.24845],[79.68102,13.29448],[79.57781,13.26176],[79.54809,13.32329],[79.42941,13.33391],[79.41957,13.24971],[79.43293,13.1966],[79.39666,13.19679],[79.36005,13.17504],[79.36244,13.13752],[79.31106,13.1268],[79.28351,13.14994],[79.23853,13.1464],[79.20549,13.10147],[79.16498,13.01908],[79.06532,13.04951],[78.99361,13.08754],[78.95768,13.07478],[78.81243,13.08649],[78.75104,13.05634],[78.71387,13.06691],[78.70525,13.01518],[78.6625,13.02861],[78.63167,12.98455],[78.63629,12.92494],[78.60313,12.84933],[78.59178,12.77804],[78.55737,12.73938],[78.55312,12.69582],[78.50595,12.74103],[78.50517,12.68031],[78.46933,12.67292],[78.47136,12.62811],[78.3799,12.62235],[78.30177,12.66322],[78.27563,12.70205],[78.23857,12.6994],[78.23025,12.75702],[78.2528,12.82236],[78.25198,12.85741],[78.31411,12.85733],[78.32741,12.90272],[78.35638,12.93819],[78.38944,12.90542],[78.41213,12.94302],[78.46924,12.97546],[78.46092,13.03126],[78.5219,13.06638],[78.54509,13.11098],[78.57956,13.21461],[78.57797,13.28201],[78.51185,13.28722],[78.44649,13.30825],[78.43949,13.327],[78.36546,13.36503],[78.38151,13.40071],[78.37259,13.46181],[78.38241,13.52477],[78.40574,13.57659],[78.39268,13.5915],[78.32632,13.59445],[78.25894,13.58461],[78.20436,13.60369],[78.16645,13.65721],[78.11784,13.65587],[78.12295,13.71405],[78.09423,13.74251],[78.12795,13.78565],[78.11441,13.8625],[78.04999,13.89494],[78.04642,13.86104],[78.00476,13.87355],[77.95566,13.82664],[77.95098,13.88825],[77.98752,13.89784],[77.97015,13.95827],[77.92868,13.90698],[77.89567,13.93954],[77.83858,13.93508],[77.81494,13.91679],[77.83635,13.86863],[77.79261,13.8211],[77.6267,13.76984],[77.53033,13.69514],[77.45805,13.68671],[77.47014,13.7502],[77.45855,13.79212],[77.41662,13.80595],[77.43223,13.84163],[77.32787,13.83226],[77.31449,13.86393],[77.25829,13.84609],[77.21904,13.86794],[77.18236,13.8682],[77.15308,13.84278],[77.18088,13.78098],[77.17444,13.76135],[77.10308,13.76759],[77.06516,13.74405],[77.0277,13.77651],[77.00003,13.74482],[76.97723,13.81547],[77.01323,13.85558],[77.04239,13.9332],[76.99574,13.96114],[77.00108,13.98729],[76.93324,14.03009],[76.97878,14.07002],[76.89779,14.16518],[76.96469,14.18169],[77.02696,14.17477],[77.02154,14.13052],[77.03389,14.05587],[77.13014,14.04533],[77.1441,14.00245],[77.28518,14.01342],[77.31997,14.03126],[77.3503,13.95767],[77.35476,13.90325],[77.39713,13.90415],[77.42702,13.98353],[77.39,14.01386],[77.33291,14.02947],[77.40204,14.1102],[77.38331,14.13607],[77.39624,14.17175],[77.51711,14.17844],[77.49659,14.23419],[77.50284,14.27834],[77.45021,14.28414],[77.44887,14.31625],[77.37617,14.33081],[77.38984,14.26937],[77.28608,14.2828],[77.28786,14.33766],[77.23835,14.31759],[77.1661,14.34301],[77.13845,14.33721],[77.11838,14.29395],[77.11539,14.22104],[77.0818,14.2159],[77.05638,14.24623],[76.9426,14.2444],[76.92967,14.27651],[76.94748,14.31179],[76.9038,14.32379],[76.88373,14.35055],[76.88774,14.3947],[76.97828,14.48256],[76.91138,14.48836],[76.87481,14.47275],[76.83244,14.52761],[76.80434,14.53207],[76.76554,14.60075],[76.77639,14.68002],[76.80359,14.7398],[76.78371,14.78455],[76.83756,14.78968],[76.86771,14.96792],[76.76736,14.97267],[76.76365,14.98503]]]}},india_full:{type:"Feature",id:"india_full",properties:{name:"India"},geometry:{type:"MultiPolygon",coordinates:[[[[77.83745,35.49401],[78.91227,34.32194],[78.81109,33.5062],[79.20889,32.99439],[79.17613,32.48378],[78.45845,32.61816],[78.73889,31.51591],[79.72137,30.88272],[81.11126,30.18348],[80.47672,29.72987],[80.08843,28.79447],[81.0572,28.41609],[81.99999,27.92548],[83.30425,27.36451],[84.67502,27.2349],[85.25178,26.7262],[86.02439,26.63098],[87.22747,26.3979],[88.06024,26.41462],[88.1748,26.8104],[88.04313,27.44582],[88.12044,27.87654],[88.73033,28.08686],[88.81425,27.29932],[88.83564,27.09897],[89.74453,26.7194],[90.37328,26.87572],[91.21751,26.80865],[92.03348,26.83831],[92.10371,27.45261],[91.69666,27.77174],[92.50312,27.89688],[93.41335,28.64063],[94.56599,29.27744],[95.4048,29.03172],[96.11768,29.4528],[96.58659,28.83098],[96.24883,28.41103],[97.32711,28.26158],[97.40256,27.88254],[97.05199,27.69906],[97.134,27.08377],[96.41937,27.26459],[95.12477,26.57357],[95.15515,26.00131],[94.60325,25.16249],[94.55266,24.67524],[94.10674,23.85074],[93.32519,24.07856],[93.28633,23.04366],[93.06029,22.70311],[93.16613,22.27846],[92.67272,22.04124],[92.14603,23.6275],[91.86993,23.62435],[91.70647,22.98526],[91.15896,23.50353],[91.46773,24.07264],[91.91509,24.13041],[92.3762,24.97669],[91.7996,25.14743],[90.87221,25.1326],[89.92069,25.26975],[89.83248,25.96508],[89.35509,26.01441],[88.56305,26.44653],[88.20979,25.76807],[88.93155,25.23869],[88.30637,24.86608],[88.08442,24.50166],[88.69994,24.23372],[88.52977,23.63114],[88.87631,22.87915],[89.03196,22.05571],[88.88877,21.69059],[88.2085,21.70317],[86.9757,21.49556],[87.03317,20.74331],[86.49935,20.15164],[85.06027,19.47858],[83.94101,18.30201],[83.18922,17.67122],[82.19279,17.01664],[82.19124,16.55666],[81.69272,16.31022],[80.792,15.95197],[80.3249,15.89918],[80.02507,15.13641],[80.23327,13.83577],[80.28629,13.00626],[79.86255,12.05621],[79.858,10.35727],[79.34051,10.30885],[78.88535,9.54614],[79.18972,9.21654],[78.27794,8.93305],[77.94116,8.25296],[77.5399,7.96554],[76.59298,8.89928],[76.13006,10.29963],[75.74647,11.30825],[75.3961,11.78125],[74.86482,12.74194],[74.61672,13.99258],[74.44386,14.61722],[73.5342,15.99065],[73.11991,17.92857],[72.82091,19.20823],[72.82448,20.4195],[72.63053,21.35601],[71.17527,20.75744],[70.47046,20.87733],[69.16413,22.0893],[69.64493,22.45078],[69.3496,22.84318],[68.17664,23.69196],[68.8426,24.35913],[71.04324,24.35652],[70.8447,25.2151],[70.28287,25.72223],[70.16893,26.49187],[69.51439,26.94097],[70.6165,27.9892],[71.77767,27.91318],[72.82375,28.96159],[73.45064,29.97641],[74.42138,30.97981],[74.40593,31.69264],[75.25864,32.2711],[74.45156,32.7649],[74.10429,33.44147],[73.74995,34.3177],[74.2402,34.74889],[75.75706,34.50492],[76.87172,34.65354],[77.83745,35.49401]]]]}},india_karnataka:{type:"Feature",id:"india_karnataka",properties:{},geometry:{type:"Polygon",coordinates:[[[73.87267,14.75312],[74.17989,14.95708],[74.2532,14.95804],[74.29821,15.04123],[74.31574,15.18805],[74.27607,15.27727],[74.32187,15.34414],[74.28027,15.38891],[74.27464,15.54999],[74.24074,15.66684],[74.11652,15.65308],[74.16212,15.75075],[74.28923,15.73953],[74.36893,15.78648],[74.34579,15.84959],[74.43203,15.95338],[74.46484,16.0421],[74.37226,16.07692],[74.48045,16.14527],[74.50509,16.22265],[74.31843,16.32588],[74.33806,16.40125],[74.26427,16.53936],[74.33986,16.54825],[74.54427,16.63407],[74.6313,16.57831],[74.68877,16.71489],[74.91203,16.7883],[74.99259,16.95146],[75.09075,16.95064],[75.18186,16.84374],[75.26705,16.86247],[75.28311,16.95524],[75.46783,16.98524],[75.51065,16.94733],[75.66898,16.97766],[75.67389,17.11369],[75.62834,17.18928],[75.65739,17.27069],[75.58469,17.34963],[75.63468,17.47651],[75.77995,17.37683],[75.89432,17.40292],[75.93159,17.32197],[76.11996,17.37007],[76.22917,17.36301],[76.38171,17.31172],[76.37153,17.4341],[76.33086,17.46872],[76.41561,17.60431],[76.48659,17.66155],[76.48652,17.71358],[76.56488,17.76523],[76.66314,17.68771],[76.8094,17.8693],[76.92164,17.94103],[76.9513,18.05843],[76.92422,18.14531],[77.14325,18.20848],[77.20119,18.27828],[77.24726,18.41311],[77.31257,18.43674],[77.41407,18.39352],[77.3672,18.30846],[77.46332,18.26219],[77.57345,18.24294],[77.59821,18.0861],[77.64737,17.99934],[77.6208,17.9031],[77.5709,17.86625],[77.53999,17.72825],[77.45138,17.69052],[77.44541,17.58272],[77.6912,17.50865],[77.53911,17.44295],[77.52471,17.36431],[77.45747,17.34038],[77.3772,17.14285],[77.46328,17.11129],[77.50069,17.01255],[77.45223,16.91995],[77.47617,16.7804],[77.46008,16.61106],[77.37653,16.48644],[77.25617,16.47308],[77.28927,16.408],[77.41673,16.36775],[77.52418,16.3753],[77.59655,16.31743],[77.49303,16.25534],[77.51178,15.92828],[77.2479,15.96378],[77.07659,15.90991],[77.03509,15.63815],[77.027,15.44075],[77.0421,15.36103],[77.15223,15.29148],[77.16873,15.17462],[77.1096,15.02859],[76.98159,15.0103],[76.87678,15.02859],[76.80034,15.09466],[76.76736,14.97267],[76.86771,14.96792],[76.83756,14.78968],[76.77639,14.68002],[76.76554,14.60075],[76.87481,14.47275],[76.88373,14.35055],[76.94748,14.31179],[76.9426,14.2444],[77.05638,14.24623],[77.1661,14.34301],[77.28608,14.2828],[77.38984,14.26937],[77.44887,14.31625],[77.50284,14.27834],[77.51711,14.17844],[77.39624,14.17175],[77.40204,14.1102],[77.33291,14.02947],[77.42702,13.98353],[77.35476,13.90325],[77.31997,14.03126],[77.1441,14.00245],[77.03389,14.05587],[77.02696,14.17477],[76.89779,14.16518],[76.97878,14.07002],[76.93324,14.03009],[77.04239,13.9332],[76.97723,13.81547],[77.06516,13.74405],[77.17444,13.76135],[77.18236,13.8682],[77.32787,13.83226],[77.43223,13.84163],[77.47014,13.7502],[77.53033,13.69514],[77.6267,13.76984],[77.79261,13.8211],[77.89567,13.93954],[77.95098,13.88825],[78.04999,13.89494],[78.11441,13.8625],[78.11784,13.65587],[78.20436,13.60369],[78.40574,13.57659],[78.37068,13.46984],[78.40217,13.31113],[78.58854,13.26912],[78.5219,13.06638],[78.46924,12.97546],[78.35684,12.94022],[78.31447,12.8595],[78.25248,12.85994],[78.23196,12.76495],[78.08636,12.80344],[77.99036,12.80553],[77.93327,12.8876],[77.81099,12.8303],[77.74108,12.67162],[77.60006,12.6661],[77.58743,12.51473],[77.63575,12.48605],[77.61553,12.36799],[77.52722,12.27746],[77.51993,12.19264],[77.60853,12.20409],[77.73432,12.17555],[77.77447,12.12033],[77.67932,11.97287],[77.60217,11.93627],[77.49513,11.94251],[77.42332,11.77259],[77.29576,11.80871],[77.11315,11.77337],[77.01458,11.81306],[76.90977,11.79343],[76.8262,11.60485],[76.56305,11.62046],[76.51399,11.70565],[76.41621,11.67255],[76.20482,11.86247],[76.1155,11.8579],[76.11204,11.97862],[76.00455,11.93123],[75.86924,11.95161],[75.79654,12.0533],[75.63883,12.14712],[75.5804,12.1556],[75.4863,12.29074],[75.43456,12.29653],[75.37427,12.46113],[75.22345,12.56714],[75.1619,12.66883],[75.06067,12.66842],[75.00958,12.79255],[74.8591,12.76032],[74.64061,12.65899],[74.51827,12.99543],[74.32397,13.82179],[73.87267,14.75312]]]}},india_kerala:{type:"Feature",id:"india_kerala",properties:{},geometry:{type:"Polygon",coordinates:[[[74.64061,12.65899],[74.8591,12.76032],[74.88399,12.75347],[74.95843,12.78474],[75.00958,12.79255],[74.99766,12.73819],[75.05297,12.71899],[75.06067,12.66842],[75.11342,12.67842],[75.1619,12.66883],[75.14362,12.63805],[75.18287,12.63181],[75.22345,12.56714],[75.23683,12.56625],[75.28071,12.61847],[75.29121,12.59649],[75.27114,12.55367],[75.28095,12.51799],[75.33492,12.49034],[75.3573,12.46234],[75.39003,12.49736],[75.41661,12.49293],[75.4241,12.46603],[75.39599,12.45143],[75.37427,12.46113],[75.36747,12.41202],[75.38331,12.39011],[75.42333,12.37233],[75.41374,12.34763],[75.43456,12.29653],[75.4863,12.29074],[75.51484,12.25818],[75.53759,12.20064],[75.5804,12.1556],[75.63883,12.14712],[75.66604,12.09583],[75.68727,12.10816],[75.73047,12.07283],[75.75506,12.08318],[75.79833,12.08006],[75.79654,12.0533],[75.82391,12.01308],[75.82999,11.98372],[75.86924,11.95161],[76.00455,11.93123],[76.03621,11.9406],[76.07903,11.96914],[76.11204,11.97862],[76.1155,11.8579],[76.15528,11.87128],[76.20482,11.86247],[76.22662,11.80542],[76.27964,11.81018],[76.30774,11.78297],[76.31799,11.75041],[76.34252,11.73748],[76.41129,11.75913],[76.42399,11.72006],[76.40338,11.70748],[76.41621,11.67255],[76.44345,11.63744],[76.42497,11.62329],[76.37992,11.6224],[76.37056,11.59341],[76.29786,11.56442],[76.2711,11.59296],[76.2256,11.56442],[76.24255,11.52874],[76.24478,11.49439],[76.32105,11.44489],[76.33354,11.45871],[76.39063,11.42794],[76.44861,11.38155],[76.53826,11.35167],[76.54532,11.30094],[76.52349,11.27236],[76.45271,11.23905],[76.44934,11.20462],[76.51048,11.21163],[76.53385,11.19671],[76.60091,11.20654],[76.62971,11.19413],[76.69784,11.23906],[76.72537,11.22534],[76.72765,11.19388],[76.69301,11.17193],[76.69124,11.14472],[76.73852,11.12108],[76.74788,11.07514],[76.73718,11.04749],[76.69507,11.02252],[76.68644,10.98934],[76.66047,10.96052],[76.64932,10.92395],[76.73272,10.88113],[76.77286,10.88158],[76.81746,10.86195],[76.85983,10.79996],[76.88838,10.79996],[76.8973,10.77096],[76.875,10.70674],[76.85537,10.67507],[76.87277,10.62958],[76.80497,10.62646],[76.80854,10.59434],[76.82995,10.58498],[76.81746,10.43869],[76.8072,10.41505],[76.83932,10.35974],[76.82944,10.30749],[76.9018,10.26001],[76.90974,10.23668],[76.93976,10.23927],[76.98194,10.22077],[77.04075,10.25298],[77.06496,10.29751],[77.11964,10.31782],[77.17683,10.35777],[77.23655,10.35242],[77.21441,10.30577],[77.25054,10.25359],[77.25544,10.22549],[77.28042,10.20721],[77.26769,10.12222],[77.23784,10.12768],[77.20426,10.11207],[77.21976,10.07801],[77.26184,10.03015],[77.25908,9.9945],[77.27231,9.96404],[77.24834,9.95177],[77.21305,9.87549],[77.23646,9.85946],[77.22277,9.82317],[77.24656,9.80841],[77.20553,9.69439],[77.17963,9.65641],[77.16816,9.61495],[77.21264,9.60207],[77.23711,9.58089],[77.27684,9.57498],[77.3042,9.59951],[77.36511,9.54996],[77.3997,9.49683],[77.39331,9.45986],[77.36661,9.46037],[77.33693,9.40901],[77.33713,9.36507],[77.32506,9.33664],[77.28329,9.30039],[77.28844,9.27469],[77.26509,9.18184],[77.26714,9.15394],[77.24693,9.12483],[77.21199,9.101],[77.18667,9.04329],[77.16025,9.03584],[77.14986,9.01008],[77.17354,8.99121],[77.19759,8.95104],[77.19567,8.9236],[77.2559,8.8781],[77.25798,8.83758],[77.2292,8.78679],[77.19607,8.74588],[77.17517,8.73703],[77.20586,8.68645],[77.21552,8.64836],[77.27872,8.56521],[77.26344,8.50713],[77.20618,8.47859],[77.22506,8.44602],[77.18854,8.43476],[77.15375,8.37722],[77.14974,8.32192],[77.12209,8.32281],[77.09077,8.2973],[76.92132,8.09605],[76.6728,8.34299],[76.46487,8.59279],[76.22556,8.95652],[75.91159,10.04616],[75.68288,10.55908],[75.58764,10.89204],[75.55244,11.04304],[75.25797,11.51227],[75.53645,11.69255],[75.53089,11.70357],[75.25113,11.52458],[74.97117,11.94518],[74.71236,12.49398],[74.64061,12.65899]]]}},india_maharashtra:{type:"Feature",id:"india_maharashtra",properties:{name:"Maharashtra"},geometry:{type:"Polygon",coordinates:[[[72.53789,20.1498],[72.80202,20.12516],[72.87472,20.22596],[72.97061,20.21213],[72.97329,20.13096],[73.18604,20.05291],[73.29353,20.15371],[73.31137,20.20723],[73.43,20.20634],[73.41484,20.38162],[73.47594,20.49491],[73.51787,20.67019],[73.62224,20.62514],[73.63428,20.58232],[73.74801,20.56716],[73.84658,20.62336],[73.88538,20.72951],[73.93846,20.76073],[73.94515,20.84012],[73.79279,21.06787],[73.68111,21.15233],[73.82249,21.17195],[73.83231,21.2674],[73.94827,21.29773],[73.96879,21.39228],[74.10883,21.44803],[74.30776,21.48014],[74.2917,21.55864],[73.97926,21.54124],[73.86085,21.49576],[73.82294,21.60057],[73.88583,21.64517],[73.89029,21.71073],[73.83231,21.81064],[74.04684,21.92259],[74.14585,21.95425],[74.28991,21.93597],[74.38848,22.02026],[74.52764,21.90876],[74.50578,21.78254],[74.59053,21.66435],[74.83048,21.61038],[74.86438,21.63402],[75.05795,21.56489],[75.11504,21.45963],[75.21985,21.41101],[75.38443,21.38559],[75.46828,21.39406],[75.83267,21.38336],[75.95934,21.39629],[76.05255,21.35259],[76.09849,21.37399],[76.15915,21.25892],[76.16851,21.08587],[76.3826,21.07963],[76.45262,21.11486],[76.48741,21.19604],[76.61676,21.19871],[76.66091,21.28256],[76.62434,21.33519],[76.73227,21.40878],[76.79159,21.48996],[76.79516,21.59745],[76.90131,21.60101],[76.9972,21.68174],[77.1212,21.72545],[77.20728,21.69423],[77.27998,21.76113],[77.47756,21.77005],[77.57122,21.62688],[77.56721,21.52965],[77.45749,21.55641],[77.41869,21.52073],[77.48692,21.37756],[77.93873,21.38693],[78.16932,21.49843],[78.21526,21.55374],[78.3,21.58496],[78.41329,21.57782],[78.43024,21.50155],[78.50874,21.52831],[78.58501,21.48683],[78.932,21.48728],[78.91327,21.59254],[79.1278,21.62822],[79.22102,21.69646],[79.48862,21.67416],[79.50602,21.59031],[79.57604,21.54348],[79.73259,21.60235],[79.85703,21.53099],[80.06665,21.55686],[80.18842,21.63402],[80.26022,21.62019],[80.36905,21.52296],[80.41142,21.43822],[80.51936,21.3896],[80.63532,21.25],[80.45736,21.17284],[80.42391,21.0096],[80.46539,20.92709],[80.54166,20.93378],[80.54344,20.79195],[80.57823,20.67866],[80.50776,20.65458],[80.51177,20.585],[80.62239,20.60373],[80.58581,20.39544],[80.61659,20.32587],[80.38288,20.24157],[80.4141,20.19028],[80.54032,20.11],[80.54567,19.98734],[80.46048,19.82812],[80.66476,19.69075],[80.65673,19.61225],[80.82755,19.56274],[80.88553,19.50922],[80.84271,19.36605],[80.74905,19.28666],[80.67864,19.33089],[80.60751,19.31353],[80.58732,19.39674],[80.48071,19.3355],[80.39329,19.24591],[80.39154,19.1836],[80.3302,19.13746],[80.26929,18.94468],[80.35176,18.84592],[80.24684,18.70149],[80.10826,18.68928],[79.94712,18.78372],[79.95979,18.85795],[79.93945,19.0406],[79.85699,19.09508],[79.94349,19.16387],[79.92836,19.24777],[79.97469,19.38922],[79.92536,19.49855],[79.87599,19.5041],[79.75713,19.60733],[79.63608,19.57639],[79.60249,19.51309],[79.5317,19.55241],[79.42494,19.53529],[79.22736,19.61468],[79.22023,19.5286],[79.1725,19.46081],[79.08018,19.53261],[79.00213,19.54198],[78.89954,19.66954],[78.84245,19.65839],[78.82963,19.75513],[78.60098,19.81809],[78.48728,19.79375],[78.28109,19.90236],[78.3514,19.78327],[78.32909,19.71548],[78.26933,19.69184],[78.29475,19.60621],[78.29564,19.46794],[78.20778,19.43583],[78.16318,19.3551],[78.16675,19.2436],[78.03473,19.2436],[77.92412,19.3444],[77.84428,19.30426],[77.81484,19.13745],[77.74304,19.06118],[77.75106,18.98357],[77.83714,18.95414],[77.90751,18.8295],[77.83749,18.80764],[77.74829,18.60515],[77.65541,18.5316],[77.59709,18.54762],[77.54937,18.3875],[77.55171,18.29114],[77.46332,18.26219],[77.3672,18.30846],[77.41407,18.39352],[77.31257,18.43674],[77.2452,18.41278],[77.19913,18.27795],[77.14119,18.20815],[77.03495,18.18076],[76.95329,18.18881],[76.92422,18.14531],[76.9513,18.05843],[76.9075,18.00923],[76.92164,17.94103],[76.8094,17.8693],[76.66314,17.68771],[76.56488,17.76523],[76.48652,17.71358],[76.48659,17.66155],[76.41561,17.60431],[76.33086,17.46872],[76.37153,17.4341],[76.38171,17.31172],[76.22917,17.36301],[76.11996,17.37007],[75.93159,17.32197],[75.89432,17.40292],[75.77995,17.37683],[75.63468,17.47651],[75.58469,17.34963],[75.65739,17.27069],[75.62834,17.18928],[75.67389,17.11369],[75.66898,16.97766],[75.51065,16.94733],[75.46783,16.98524],[75.28311,16.95524],[75.26705,16.86247],[75.18186,16.84374],[75.09075,16.95064],[74.99259,16.95146],[74.96287,16.87942],[74.90306,16.86241],[74.91203,16.7883],[74.68877,16.71489],[74.6313,16.57831],[74.56843,16.55445],[74.54427,16.63407],[74.33986,16.54825],[74.26427,16.53936],[74.33806,16.40125],[74.31843,16.32588],[74.50509,16.22265],[74.48045,16.14527],[74.37226,16.07692],[74.46484,16.0421],[74.43203,15.95338],[74.34579,15.84959],[74.36893,15.78648],[74.28923,15.73953],[74.16212,15.75075],[74.11652,15.65308],[74.02811,15.60433],[73.97592,15.62887],[73.94515,15.74126],[73.88226,15.74929],[73.68072,15.72057],[73.32871,15.60794],[72.98859,16.57559],[72.71294,17.97077],[72.60935,19.26366],[72.53789,20.1498]]]}},india_puducherry:{type:"Feature",id:"india_puducherry",properties:{name:"Puducherry"},geometry:{type:"Polygon",coordinates:[[[79.87782,12.04973],[79.84726,11.95536],[79.83593,11.90229],[79.81979,11.85761],[79.81464,11.79006],[79.79645,11.7736],[79.77036,11.77191],[79.74564,11.78065],[79.6804,11.7988],[79.61655,11.82434],[79.58702,11.88549],[79.65672,11.93152],[79.64745,11.9594],[79.6423,12.0138],[79.66599,12.03865],[79.72813,12.04201],[79.79885,12.0457],[79.8452,12.05644],[79.87782,12.04973]]]}},india_tamilnadu:{type:"Feature",id:"india_tamilnadu",properties:{},geometry:{type:"Polygon",coordinates:[[[76.23882,11.52666],[76.42497,11.62329],[76.48321,11.69182],[76.56305,11.62046],[76.8262,11.60485],[76.90977,11.79343],[77.01458,11.81306],[77.11315,11.77337],[77.29576,11.80871],[77.33679,11.76902],[77.42332,11.77259],[77.49513,11.94251],[77.60217,11.93627],[77.67932,11.97287],[77.77447,12.12033],[77.73432,12.17555],[77.60853,12.20409],[77.51993,12.19264],[77.52722,12.27746],[77.61553,12.36799],[77.63575,12.48605],[77.58743,12.51473],[77.60006,12.6661],[77.74108,12.67162],[77.79267,12.74643],[77.81099,12.8303],[77.93327,12.8876],[77.99036,12.80553],[78.08636,12.80344],[78.23196,12.76495],[78.2273,12.71513],[78.36824,12.61165],[78.54754,12.68569],[78.62559,12.9194],[78.61355,12.97872],[78.70231,13.05633],[78.80801,13.07774],[78.97973,13.0764],[79.15278,13.00727],[79.1889,13.08443],[79.25625,13.13661],[79.34679,13.13482],[79.45292,13.33852],[79.53513,13.33423],[79.58006,13.24544],[79.68442,13.25659],[79.92572,13.33598],[79.96184,13.45149],[80.06933,13.53757],[80.15229,13.4787],[80.25978,13.44748],[80.68273,13.45353],[80.58546,12.88895],[80.57389,12.78634],[80.43092,12.33305],[80.32877,12.14],[80.20563,11.84284],[79.85031,11.95606],[79.74742,12.0054],[79.69629,11.95142],[79.76493,11.85315],[80.17499,11.74816],[80.13891,11.5158],[80.22104,11.03359],[80.22222,10.98402],[79.85413,10.97539],[79.73705,10.98906],[79.70405,10.91904],[79.85166,10.82788],[80.22599,10.82479],[80.03964,10.09642],[79.66744,9.97318],[79.55982,9.92323],[79.37812,9.6665],[79.42037,9.35343],[79.56652,9.25796],[79.57134,9.08722],[79.49634,8.89762],[79.37403,8.97879],[79.06914,9.02225],[78.73928,8.93257],[78.54484,8.84743],[78.46298,8.3509],[78.36123,8.16045],[78.10363,8.04096],[77.66766,7.85864],[76.92132,8.09605],[77.09077,8.2973],[77.14974,8.32192],[77.20618,8.47859],[77.27872,8.56521],[77.21552,8.64836],[77.19607,8.74588],[77.25798,8.83758],[77.14986,9.01008],[77.26714,9.15394],[77.28844,9.27469],[77.33693,9.40901],[77.3997,9.49683],[77.3042,9.59951],[77.27684,9.57498],[77.16816,9.61495],[77.24656,9.80841],[77.21305,9.87549],[77.26184,10.03015],[77.28042,10.20721],[77.17683,10.35777],[77.06496,10.29751],[76.98194,10.22077],[76.82944,10.30749],[76.81746,10.43869],[76.82995,10.58498],[76.8973,10.77096],[76.81746,10.86195],[76.64932,10.92395],[76.73718,11.04749],[76.72765,11.19388],[76.44934,11.20462],[76.52349,11.27236],[76.53826,11.35167],[76.39063,11.42794],[76.25772,11.47343],[76.23882,11.52666]]]}},india_telengana:{type:"Feature",id:"india_telengana",properties:{},geometry:{type:"Polygon",coordinates:[[[77.23521,16.47123],[77.29413,16.47453],[77.37516,16.48768],[77.37501,16.50885],[77.41861,16.51735],[77.42586,16.57007],[77.46147,16.58589],[77.45871,16.61229],[77.47627,16.64839],[77.43775,16.64241],[77.42132,16.66752],[77.46657,16.6772],[77.47337,16.71709],[77.42692,16.72829],[77.44309,16.76259],[77.4748,16.78164],[77.45754,16.82843],[77.46322,16.84476],[77.45223,16.91995],[77.48061,16.97751],[77.478,17.00152],[77.50069,17.01255],[77.49527,17.04601],[77.46328,17.11129],[77.40575,17.12751],[77.3772,17.14285],[77.36157,17.16669],[77.37179,17.19944],[77.39294,17.1981],[77.40662,17.2372],[77.45894,17.28058],[77.43826,17.29144],[77.45747,17.34038],[77.45274,17.37335],[77.50349,17.35735],[77.52471,17.36431],[77.53972,17.40645],[77.53911,17.44295],[77.57779,17.43051],[77.60849,17.44332],[77.61732,17.47261],[77.65946,17.48011],[77.69188,17.47463],[77.6912,17.50865],[77.66304,17.5217],[77.59762,17.53374],[77.59603,17.56309],[77.55361,17.55007],[77.52751,17.57308],[77.49462,17.56675],[77.44541,17.58272],[77.45732,17.63263],[77.45138,17.69052],[77.49398,17.7153],[77.53999,17.72825],[77.56532,17.74838],[77.55654,17.76872],[77.50997,17.78724],[77.51604,17.80424],[77.55572,17.81934],[77.5709,17.86625],[77.6208,17.9031],[77.61974,17.93865],[77.65529,17.97047],[77.64737,17.99934],[77.5862,18.01459],[77.55377,18.03572],[77.54914,18.06475],[77.59821,18.0861],[77.59705,18.15205],[77.57179,18.19195],[77.58611,18.21875],[77.57345,18.24294],[77.60614,18.28059],[77.57018,18.29238],[77.56676,18.31792],[77.51948,18.34914],[77.54937,18.3875],[77.56007,18.43522],[77.59709,18.54762],[77.64035,18.55386],[77.65775,18.5271],[77.71216,18.55431],[77.73669,18.55476],[77.74829,18.60515],[77.72956,18.64262],[77.73268,18.67607],[77.74963,18.6899],[77.78664,18.6841],[77.83749,18.80764],[77.90751,18.8295],[77.90895,18.86137],[77.88264,18.86984],[77.86524,18.91043],[77.82421,18.9131],[77.83714,18.95414],[77.79611,18.95146],[77.80057,18.98447],[77.75106,18.98357],[77.74081,19.03041],[77.74304,19.06118],[77.77693,19.07322],[77.78942,19.10534],[77.83179,19.09195],[77.81484,19.13745],[77.84205,19.18294],[77.82822,19.19008],[77.85097,19.25743],[77.88398,19.25832],[77.88442,19.27928],[77.84562,19.28597],[77.84428,19.30426],[77.89602,19.31987],[77.92412,19.3444],[77.96916,19.31095],[78.00172,19.29846],[78.02938,19.27304],[78.03473,19.2436],[78.1101,19.24851],[78.1333,19.232],[78.16675,19.2436],[78.16675,19.28106],[78.18057,19.33369],[78.16318,19.3551],[78.17121,19.39747],[78.20778,19.43583],[78.23543,19.43182],[78.25684,19.4559],[78.29564,19.46794],[78.2787,19.5393],[78.29475,19.57365],[78.29475,19.60621],[78.27111,19.65661],[78.26933,19.69184],[78.29966,19.69273],[78.32909,19.71548],[78.3514,19.78327],[78.3224,19.84125],[78.2778,19.85151],[78.27921,19.88196],[78.3679,19.8814],[78.38128,19.83858],[78.41205,19.8252],[78.45978,19.81851],[78.47762,19.79531],[78.50973,19.82386],[78.5686,19.8136],[78.58734,19.8194],[78.67966,19.79175],[78.70018,19.769],[78.72203,19.78149],[78.76842,19.7806],[78.79116,19.76008],[78.82774,19.76097],[78.84691,19.69898],[78.84245,19.65839],[78.87457,19.65705],[78.89954,19.66954],[78.9379,19.66553],[78.95262,19.65125],[78.94637,19.61914],[78.97626,19.56384],[79.00213,19.54198],[79.03513,19.54733],[79.08018,19.53261],[79.08821,19.51477],[79.12389,19.50318],[79.1725,19.46081],[79.2064,19.46973],[79.19034,19.49381],[79.22023,19.5286],[79.23361,19.57945],[79.22736,19.61468],[79.35492,19.56339],[79.39729,19.53529],[79.42494,19.53529],[79.45394,19.49961],[79.4972,19.52013],[79.5317,19.55241],[79.55367,19.52413],[79.60249,19.51309],[79.61596,19.55941],[79.63608,19.57639],[79.71198,19.58528],[79.75713,19.60733],[79.81825,19.57293],[79.82378,19.55743],[79.87599,19.5041],[79.92536,19.49855],[79.97171,19.42013],[79.97469,19.38922],[79.94937,19.29163],[79.9293,19.24996],[79.92636,19.20252],[79.94349,19.16387],[79.88262,19.13295],[79.85699,19.09508],[79.8741,19.04152],[79.92544,19.05312],[79.93945,19.0406],[79.9397,18.98616],[79.95302,18.96934],[79.95979,18.85795],[79.91056,18.82565],[79.94712,18.78372],[79.99276,18.76905],[80.03276,18.74654],[80.10826,18.68928],[80.24684,18.70149],[80.27513,18.72272],[80.30656,18.68345],[80.33809,18.59903],[80.379,18.60937],[80.38851,18.5972],[80.45022,18.62656],[80.48858,18.62656],[80.514,18.61318],[80.53184,18.58598],[80.59562,18.54896],[80.63264,18.51863],[80.65093,18.47224],[80.6991,18.43612],[80.74281,18.32194],[80.74459,18.30231],[80.7883,18.24968],[80.73344,18.21891],[80.73478,18.17163],[80.79811,18.16628],[80.81774,18.18724],[80.81729,18.22515],[80.85922,18.22605],[80.84807,18.1975],[80.86189,18.13283],[80.9007,18.13461],[80.95422,18.16717],[80.9725,18.14353],[80.94931,18.12302],[80.94396,18.08109],[80.96225,18.03158],[80.98455,17.92276],[80.99436,17.91428],[81.00417,17.83846],[81.03227,17.78985],[81.07375,17.78628],[81.08891,17.81081],[81.15938,17.85273],[81.19194,17.84694],[81.25394,17.81215],[81.40915,17.80501],[81.47025,17.8233],[81.48096,17.80278],[81.5541,17.81616],[81.56882,17.82776],[81.61119,17.81527],[81.64286,17.83935],[81.66293,17.87682],[81.68835,17.88485],[81.70307,17.86121],[81.75838,17.89332],[81.79272,17.85273],[81.78246,17.83177],[81.72939,17.81928],[81.68478,17.77067],[81.62323,17.76264],[81.5764,17.72607],[81.57105,17.68771],[81.50281,17.59003],[81.52377,17.57264],[81.50147,17.53919],[81.49345,17.44865],[81.44171,17.38175],[81.41584,17.36168],[81.37168,17.35722],[81.32262,17.38933],[81.28917,17.33759],[81.26732,17.3202],[81.19016,17.32733],[81.17053,17.29656],[81.18035,17.25463],[81.16295,17.23278],[81.11835,17.22475],[81.02603,17.18684],[80.99124,17.1797],[80.93058,17.20513],[80.90516,17.20111],[80.91318,17.14581],[80.87037,17.14625],[80.8552,17.11146],[80.86412,17.09585],[80.85877,17.05081],[80.82309,17.03787],[80.72586,17.06463],[80.68393,17.06865],[80.65673,17.08782],[80.56039,17.13822],[80.51936,17.10834],[80.49616,17.10789],[80.48234,17.05036],[80.42034,17.02494],[80.39001,17.07623],[80.36682,17.0566],[80.38778,17.0071],[80.35835,16.97052],[80.44264,16.9451],[80.48769,16.91745],[80.49126,16.94822],[80.53184,16.95001],[80.59027,16.91165],[80.5867,16.87374],[80.56485,16.86883],[80.55593,16.81843],[80.6041,16.78766],[80.56262,16.76268],[80.51088,16.76982],[80.45647,16.78989],[80.45245,16.81531],[80.41856,16.84252],[80.37306,16.8113],[80.35879,16.85501],[80.3191,16.87106],[80.31553,16.91254],[80.28877,16.97677],[80.26201,17.01066],[80.23569,17.00219],[80.19555,17.01825],[80.18217,17.04501],[80.134,16.98524],[80.08405,16.96339],[80.04569,16.96517],[80.03722,16.93663],[80.00957,16.90719],[79.99173,16.86303],[80.0332,16.85233],[80.04168,16.82602],[80.07093,16.81323],[80.054,16.74194],[80.02722,16.71251],[80.00576,16.70857],[79.95306,16.63621],[79.90723,16.63408],[79.88555,16.68642],[79.84286,16.70561],[79.81796,16.69098],[79.79256,16.72485],[79.74673,16.72106],[79.72286,16.68966],[79.68544,16.69755],[79.6621,16.68835],[79.63566,16.6594],[79.60613,16.67239],[79.53884,16.63046],[79.49421,16.63408],[79.44409,16.61796],[79.41773,16.57986],[79.37802,16.58412],[79.31162,16.57554],[79.27926,16.5816],[79.24543,16.57009],[79.24388,16.53515],[79.22091,16.51631],[79.21526,16.4846],[79.23202,16.46035],[79.21112,16.44396],[79.21143,16.35493],[79.23438,16.32518],[79.22111,16.23251],[79.1593,16.20893],[79.12305,16.23187],[79.09802,16.2236],[79.05373,16.23827],[79.01236,16.24173],[78.98352,16.21074],[78.92807,16.19871],[78.9049,16.17711],[78.92481,16.13259],[78.92138,16.10307],[78.88876,16.0879],[78.87606,16.13902],[78.83228,16.13919],[78.8419,16.08707],[78.82164,16.05227],[78.78267,16.02125],[78.73718,16.0097],[78.68277,16.03346],[78.64311,16.08312],[78.59917,16.08361],[78.55814,16.04517],[78.45394,16.07503],[78.40727,16.0756],[78.36075,16.04605],[78.32341,16.033],[78.29785,16.01169],[78.2682,16.02857],[78.25445,16.01627],[78.2507,15.96993],[78.20995,15.9197],[78.17371,15.89569],[78.17153,15.85511],[78.13252,15.8549],[78.10755,15.83401],[78.06997,15.85048],[78.03641,15.90188],[78.00803,15.86506],[77.97903,15.87982],[77.93428,15.88216],[77.89376,15.90154],[77.8616,15.88138],[77.80554,15.87083],[77.72205,15.89199],[77.689,15.87914],[77.6536,15.88393],[77.61152,15.91691],[77.58504,15.91532],[77.51178,15.92828],[77.52058,15.95112],[77.51562,16.00803],[77.49612,16.03679],[77.50848,16.07885],[77.49242,16.12134],[77.48889,16.16443],[77.50036,16.1925],[77.49303,16.25534],[77.59655,16.31743],[77.58991,16.33381],[77.54011,16.35849],[77.52418,16.3753],[77.4865,16.38299],[77.41673,16.36775],[77.37791,16.38517],[77.35761,16.3815],[77.28927,16.408],[77.26056,16.45344],[77.23521,16.47123]]]}},IDN:{type:"Feature",id:"IDN",properties:{},geometry:{type:"Polygon",coordinates:[[[109.538,1.92671],[109.58606,1.79192],[109.68554,1.78179],[109.66224,1.61881],[109.82759,1.48148],[109.93117,1.42466],[109.97919,1.29865],[110.09758,1.19756],[110.1922,1.18303],[110.30096,0.99575],[110.39497,0.99668],[110.49064,0.87637],[110.59486,0.858],[110.85815,0.94998],[110.9055,1.02835],[111.19759,1.06475],[111.22607,1.08799],[111.40504,1.0094],[111.48916,1.03442],[111.52219,0.95868],[111.66704,1.04281],[111.82599,0.98538],[111.934,1.10284],[112.13391,1.13752],[112.22581,1.39272],[112.20003,1.43709],[112.5171,1.57395],[112.77536,1.56153],[112.87744,1.58118],[113.05767,1.55877],[113.106,1.44495],[113.35493,1.35908],[113.41908,1.28549],[113.53549,1.32127],[113.63068,1.21597],[113.81508,1.30294],[113.85093,1.38715],[113.97573,1.45005],[114.14945,1.46149],[114.2027,1.4213],[114.41581,1.51111],[114.52646,1.44179],[114.58583,1.44665],[114.61498,1.57508],[114.71115,1.67148],[114.69469,1.81063],[114.74372,1.86954],[114.87834,1.91463],[114.80632,2.02438],[114.78024,2.14454],[114.79949,2.24936],[114.90604,2.25697],[114.95039,2.35132],[115.09508,2.41123],[115.13965,2.4776],[115.23743,2.50599],[115.09278,2.69409],[115.14115,2.74432],[115.11387,2.83327],[115.15001,2.90895],[115.24912,2.9667],[115.48328,3.01964],[115.56423,3.17109],[115.51617,3.26111],[115.53779,3.36201],[115.6344,3.45571],[115.57652,3.6094],[115.57965,3.74752],[115.61864,3.84247],[115.58177,3.88792],[115.64991,3.98828],[115.70731,4.19935],[115.8296,4.24118],[115.8779,4.39102],[116.00607,4.34818],[116.07901,4.27643],[116.18028,4.38255],[116.34851,4.39138],[116.43275,4.32567],[116.53602,4.37566],[116.61942,4.33622],[116.89887,4.36704],[116.97351,4.34488],[117.28899,4.31595],[117.52934,4.1615],[117.8992,4.16585],[117.95861,4.19058],[118.26478,4.09696],[127.3,5.2],[129,2.7],[141,-2.4],[141,-6.3],[140.83,-6.7],[141.02,-6.95],[141.02,-9.5],[128.5,-9.5],[127.3,-8.2],[125,-8.5],[123.96,-9.2],[124.11,-9.42],[124.22,-9.37],[124.269,-9.4],[124.287,-9.5],[124.358,-9.48564],[124.355,-9.43281],[124.383,-9.361],[124.444,-9.31899],[124.48,-9.15],[124.95,-8.9],[124.94064,-9.03565],[124.99695,-9.06413],[125.11368,-8.98275],[125.18234,-9.03293],[125.18234,-9.17396],[124.98459,-9.19429],[124.99283,-9.28646],[125.04913,-9.33254],[125.16,-9.7],[123,-11.4],[100,-7],[93.5,6.3],[96.6,6.1],[103,1.4],[103.75,1.14],[103.9,1.2],[104.5,1.3],[105,3],[108,5.1],[109.64501,2.08141],[109.62041,1.98321],[109.538,1.92671]]]}},japan:{type:"Feature",id:"japan",properties:{},geometry:{type:"Polygon",coordinates:[[[141.11938,45.69083],[142.28497,45.56863],[145.39307,44.48867],[145.57983,44.11125],[145.27222,43.79291],[145.47821,43.46289],[145.68695,43.4589],[145.91217,43.39108],[145.44903,42.69934],[143.91094,41.8376],[142.48272,39.3181],[142.1751,38.15265],[141.38409,35.69383],[140.94463,35.21056],[140.55908,32.1198],[139.38457,31.87843],[138.98907,33.1752],[138.01025,34.29807],[135.99976,33.17434],[133.53882,32.71336],[132.48516,32.06483],[131.56128,31.04352],[131.03497,29.53613],[129.94629,27.50827],[127.78301,25.4442],[126.47461,25.42343],[125.86487,24.52713],[124.92657,23.88678],[123.37921,23.82053],[122.67883,24.31456],[122.7293,24.64795],[124.67834,25.02588],[125.36602,25.52354],[126.24493,26.35342],[127.56329,27.13828],[128.57403,28.73003],[128.74981,31.46703],[128.36426,32.62087],[128.92559,33.76174],[129.21021,34.62417],[129.56177,34.84086],[136.69739,37.9312],[139.1209,38.85762],[139.04297,42.04929],[140.13165,43.58114],[140.5711,45.64549],[141.11938,45.69083]]]}},korea:{type:"Feature",id:"korea",properties:{},geometry:{type:"Polygon",coordinates:[[[125,33],[124,39.5],[124.38171,40.12429],[124.87061,40.47202],[126.04614,40.95294],[126.60095,41.57231],[126.90308,41.79179],[127.24915,41.50446],[128.19397,41.41802],[128.28186,41.56614],[128.0127,42.0097],[128.8751,42.04521],[129.2926,42.43967],[129.67438,42.45589],[129.87762,43],[130.19348,42.92023],[130.31433,42.66224],[130.50385,42.59555],[130.68237,42.2895],[131.3,36.6],[127.3,33],[125,33]]]}},malaysia:{type:"Feature",id:"malaysia",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[109.538,1.92671],[109.62041,1.98321],[109.64501,2.08141],[113.8,4.8],[114.26015,4.50701],[114.33278,4.34889],[114.31645,4.26363],[114.45418,4.24183],[114.49579,4.14668],[114.6492,4.00624],[114.80762,4.14929],[114.85775,4.26957],[114.87758,4.42656],[114.82955,4.42966],[114.80229,4.67536],[114.85851,4.79751],[114.97133,4.80824],[115.02238,4.74977],[115.09879,4.4685],[115.15547,4.38302],[115.24582,4.34118],[115.28924,4.60384],[115.2375,4.79584],[115.15038,4.87204],[115.15825,5.02512],[115,5.3],[116.9,7.6],[117.5,7.4],[119.35011,5.53088],[119.43909,5.11578],[118.83773,4.45269],[118.26478,4.09696],[117.95861,4.19058],[117.8992,4.16585],[117.52934,4.1615],[117.28899,4.31595],[116.97351,4.34488],[116.89887,4.36704],[116.61942,4.33622],[116.53602,4.37566],[116.43275,4.32567],[116.34851,4.39138],[116.18028,4.38255],[116.07901,4.27643],[116.00607,4.34818],[115.8779,4.39102],[115.8296,4.24118],[115.70731,4.19935],[115.64991,3.98828],[115.58177,3.88792],[115.61864,3.84247],[115.57965,3.74752],[115.57652,3.6094],[115.6344,3.45571],[115.53779,3.36201],[115.51617,3.26111],[115.56423,3.17109],[115.48328,3.01964],[115.24912,2.9667],[115.15001,2.90895],[115.11387,2.83327],[115.14115,2.74432],[115.09278,2.69409],[115.23743,2.50599],[115.13965,2.4776],[115.09508,2.41123],[114.95039,2.35132],[114.90604,2.25697],[114.79949,2.24936],[114.78024,2.14454],[114.80632,2.02438],[114.87834,1.91463],[114.74372,1.86954],[114.69469,1.81063],[114.71115,1.67148],[114.61498,1.57508],[114.58583,1.44665],[114.52646,1.44179],[114.41581,1.51111],[114.2027,1.4213],[114.14945,1.46149],[113.97573,1.45005],[113.85093,1.38715],[113.81508,1.30294],[113.63068,1.21597],[113.53549,1.32127],[113.41908,1.28549],[113.35493,1.35908],[113.106,1.44495],[113.05767,1.55877],[112.87744,1.58118],[112.77536,1.56153],[112.5171,1.57395],[112.20003,1.43709],[112.22581,1.39272],[112.13391,1.13752],[111.934,1.10284],[111.82599,0.98538],[111.66704,1.04281],[111.52219,0.95868],[111.48916,1.03442],[111.40504,1.0094],[111.22607,1.08799],[111.19759,1.06475],[110.9055,1.02835],[110.85815,0.94998],[110.59486,0.858],[110.49064,0.87637],[110.39497,0.99668],[110.30096,0.99575],[110.1922,1.18303],[110.09758,1.19756],[109.97919,1.29865],[109.93117,1.42466],[109.82759,1.48148],[109.66224,1.61881],[109.68554,1.78179],[109.58606,1.79192],[109.538,1.92671]]],[[[99.45833,6.30667],[99.51167,6.48167],[99.68908,6.47146],[99.91691,6.5233],[100.07588,6.40615],[100.15906,6.48065],[100.17157,6.69376],[100.32605,6.6597],[100.36648,6.53967],[100.4962,6.52128],[100.66237,6.45103],[100.73937,6.49207],[100.81258,6.44219],[100.83515,6.29654],[100.90398,6.23379],[100.98414,6.27884],[101.0943,6.26044],[101.12667,6.19264],[101.0868,5.9109],[101.03707,5.91804],[100.98946,5.78393],[101.1192,5.67031],[101.25999,5.71155],[101.27615,5.81155],[101.39691,5.87241],[101.48454,5.86993],[101.58131,5.93436],[101.66236,5.86871],[101.69082,5.75576],[101.79332,5.75066],[101.94402,5.87247],[101.94265,5.98109],[102.05204,6.0785],[102.08029,6.22537],[102.2,6.5],[103.6,5.8],[104.8,2.5],[104.5,1.5],[104.31571,1.28352],[104.12518,1.27582],[104.07647,1.43092],[103.89786,1.42794],[103.81267,1.47847],[103.67389,1.42814],[103.56667,1.1955],[103,1.325],[99,4.5],[99.45833,6.30667]]]]}},MNG:{type:"Feature",id:"MNG",properties:{name:"Mongolia"},geometry:{type:"Polygon",coordinates:[[[87.75126,49.2972],[88.80557,49.47052],[90.71367,50.33181],[92.23471,50.80217],[93.10422,50.49529],[94.14757,50.48054],[94.81595,50.01343],[95.81403,49.97747],[97.25973,49.72606],[98.23176,50.4224],[97.82574,51.011],[98.86149,52.04737],[99.98173,51.63401],[100.88948,51.51686],[102.06522,51.25992],[102.25591,50.51056],[103.67655,50.08997],[104.62155,50.27533],[105.88659,50.40602],[106.8888,50.2743],[107.86818,49.79371],[108.47517,49.28255],[109.40245,49.29296],[110.66201,49.13013],[111.58123,49.37797],[112.89774,49.54357],[114.36246,50.2483],[114.96211,50.14025],[115.4857,49.80518],[116.6788,49.88853],[116.1918,49.1346],[115.48528,48.13538],[115.74284,47.72655],[116.30895,47.85341],[117.29551,47.69771],[118.06414,48.06673],[118.86657,47.74706],[119.77282,47.04806],[119.66327,46.69268],[118.87433,46.80541],[117.4217,46.67273],[116.71787,46.3882],[115.9851,45.72724],[114.46033,45.33982],[113.46391,44.80889],[112.43606,45.01165],[111.87331,45.10208],[111.34838,44.45744],[111.66774,44.07318],[111.82959,43.74312],[111.12968,43.40683],[110.4121,42.87123],[109.2436,42.51945],[107.74477,42.48152],[106.12932,42.13433],[104.96499,41.59741],[104.52228,41.90835],[103.31228,41.90747],[101.83304,42.51487],[100.84587,42.6638],[99.51582,42.52469],[97.45176,42.74889],[96.3494,42.72563],[95.76246,43.31945],[95.30688,44.24133],[94.68893,44.35233],[93.48073,44.97547],[92.13389,45.11508],[90.94554,45.28607],[90.58577,45.71972],[90.97081,46.88815],[90.28083,47.69355],[88.8543,48.06908],[88.01383,48.59946],[87.75126,49.2972]]]}},MMR:{type:"Feature",id:"MMR",properties:{name:"Myanmar"},geometry:{type:"Polygon",coordinates:[[[92.10937,20.85881],[92.3291,21.49396],[92.68066,21.28937],[92.63672,22.08564],[92.98828,22.06528],[93.18604,22.22809],[93.14209,23.09994],[93.38379,23.22115],[93.36182,24.1267],[94.19678,23.92601],[94.70215,25.04579],[94.57031,25.26457],[95.20752,26.03704],[95.05371,26.49024],[97.66846,28.51697],[98.65723,27.50827],[98.56934,25.85922],[97.62451,24.8665],[97.73438,23.88584],[98.83301,24.14675],[98.85498,23.18076],[99.49219,23.05952],[99.1626,22.04491],[100.0415,21.96342],[100.32715,21.49396],[101.09619,21.71868],[101.16211,21.41216],[99.99756,20.36523],[97.91016,19.49766],[97.53662,18.29195],[98.83301,16.21467],[98.50342,15.32657],[98.21777,15.11455],[98.65723,14.24309],[99.18457,13.66734],[99.22852,12.85465],[99.66797,11.65224],[98.4375,9.90392],[97.77832,14.34955],[97.00928,16.80454],[95.42725,15.55954],[94.021,16.04581],[94.21875,18.0832],[92.10937,20.85881]]]}},NPL:{type:"Feature",id:"NPL",properties:{name:"Nepal"},geometry:{type:"Polygon",coordinates:[[[88.12044,27.87654],[88.04313,27.44582],[88.1748,26.8104],[88.06024,26.41462],[87.22747,26.3979],[86.02439,26.63098],[85.25178,26.7262],[84.67502,27.2349],[83.30425,27.36451],[81.99999,27.92548],[81.0572,28.41609],[80.08843,28.79447],[80.47672,29.72987],[81.11126,30.18348],[81.5258,30.42272],[82.32751,30.11527],[83.33711,29.46373],[83.89899,29.32023],[84.23458,28.83989],[85.01164,28.64277],[85.82332,28.20358],[86.95452,27.97426],[88.12044,27.87654]]]}},philippines:{type:"Feature",id:"philippines",properties:{},geometry:{type:"Polygon",coordinates:[[[114.93896,8.23324],[122.01416,21.71868],[127.6062,7.39515],[125.50781,5.14566],[118.89954,4.41761],[119.49829,5.28789],[117.53174,7.39515],[114.93896,8.23324]]]}},russia:{type:"Feature",id:"russia",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[22.7311,54.32754],[20.89224,54.31253],[19.66064,54.42608],[19.88848,54.86616],[21.26845,55.19048],[22.31572,55.0153],[22.75776,54.85657],[22.65105,54.58274],[22.7311,54.32754]]],[[[-180,83],[-169,66.5],[-171,64],[-180,64],[-180,83]]],[[[180,83],[180,64.97971],[179.99281,64.97433],[178.7072,64.53493],[177.41128,64.60821],[178.313,64.07593],[178.90825,63.25197],[179.37034,62.98262],[179.48636,62.56894],[179.22825,62.3041],[177.3643,62.5219],[174.56929,61.76915],[173.68013,61.65261],[172.15,60.95],[170.6985,60.33618],[170.33085,59.88177],[168.90046,60.57355],[166.29498,59.78855],[165.84,60.16],[164.87674,59.7316],[163.53929,59.86871],[163.21711,59.21101],[162.01733,58.24328],[162.05297,57.83912],[163.19191,57.61503],[163.05794,56.15924],[162.12958,56.12219],[161.70146,55.28568],[162.11749,54.85514],[160.36877,54.34433],[160.02173,53.20257],[158.53094,52.95868],[158.23118,51.94269],[156.78979,51.01105],[156.42,51.7],[155.99182,53.15895],[155.43366,55.38103],[155.91442,56.76792],[156.75815,57.3647],[156.81035,57.83204],[158.36433,58.05575],[160.15064,59.31477],[161.87204,60.343],[163.66969,61.1409],[164.47355,62.55061],[163.25842,62.46627],[162.65791,61.6425],[160.12148,60.54423],[159.30232,61.77396],[156.72068,61.43442],[154.21806,59.75818],[155.04375,59.14495],[152.81185,58.88385],[151.26573,58.78089],[151.33815,59.50396],[149.78371,59.65573],[148.54481,59.16448],[145.48722,59.33637],[142.19782,59.03998],[138.95848,57.08805],[135.12619,54.72959],[136.70171,54.60355],[137.19342,53.97732],[138.1647,53.75501],[138.80463,54.25455],[139.90151,54.18968],[141.34531,53.08957],[141.37923,52.23877],[140.59742,51.23967],[140.51308,50.04553],[140.06193,48.44671],[138.55472,46.99965],[138.21971,46.30795],[136.86232,45.1435],[135.51535,43.989],[134.86939,43.39821],[133.53687,42.81147],[132.90627,42.79849],[132.27807,43.28456],[130.93587,42.55274],[130.78,42.22],[130.64,42.395],[130.63387,42.90302],[131.14469,42.92999],[131.28856,44.11152],[131.02519,44.96796],[131.88345,45.32116],[133.09712,45.14409],[133.76964,46.11693],[134.11235,47.21248],[134.50081,47.57845],[135.02631,48.47823],[133.3736,48.18344],[132.50669,47.78896],[130.98726,47.79013],[130.58229,48.72969],[129.39782,49.4406],[127.6574,49.76027],[127.28746,50.7398],[126.93916,51.35389],[126.5644,51.78426],[125.94635,52.7928],[125.06821,53.16105],[123.57147,53.4588],[122.24575,53.43173],[121.00308,53.2514],[120.17709,52.75389],[120.72579,52.51623],[120.7382,51.96411],[120.18208,51.64355],[119.27939,50.58292],[119.28846,50.14288],[117.87924,49.51098],[116.6788,49.88853],[115.4857,49.80518],[114.96211,50.14025],[114.36246,50.2483],[112.89774,49.54357],[111.58123,49.37797],[110.66201,49.13013],[109.40245,49.29296],[108.47517,49.28255],[107.86818,49.79371],[106.8888,50.2743],[105.88659,50.40602],[104.62158,50.27532],[103.67655,50.08997],[102.25589,50.51056],[102.06521,51.25991],[100.88948,51.51686],[99.98173,51.63401],[98.86149,52.04737],[97.82574,51.011],[98.23176,50.4224],[97.25976,49.72605],[95.81402,49.97746],[94.81595,50.01343],[94.14757,50.48054],[93.10421,50.49529],[92.23471,50.80217],[90.71367,50.33181],[88.80557,49.47052],[87.75126,49.2972],[87.35997,49.21498],[86.82936,49.82668],[85.54127,49.69286],[85.11556,50.1173],[84.41638,50.3114],[83.93511,50.88925],[83.383,51.06918],[81.94599,50.8122],[80.56845,51.38834],[80.03556,50.86475],[77.80092,53.40442],[76.52518,54.177],[76.8911,54.49052],[74.38482,53.54685],[73.42568,53.48981],[73.50852,54.03562],[72.22415,54.37665],[71.18013,54.13329],[70.86527,55.16973],[69.06817,55.38525],[68.1691,54.97039],[65.66687,54.60125],[65.17853,54.35423],[61.4366,54.00625],[60.97807,53.66499],[61.69999,52.98],[60.73999,52.71999],[60.92727,52.44755],[59.96753,51.96042],[61.588,51.27266],[61.33742,50.79907],[59.93281,50.84219],[59.64228,50.54544],[58.36332,51.06364],[56.77798,51.04355],[55.71694,50.62171],[54.53288,51.02624],[52.32872,51.71865],[50.76665,51.69276],[48.70238,50.60513],[48.57784,49.87476],[47.54948,50.4547],[46.7516,49.35601],[47.04367,49.15204],[46.46645,48.39415],[47.31524,47.71585],[48.05725,47.74377],[48.69473,47.07563],[48.59325,46.56104],[49.10116,46.39933],[48.64541,45.80629],[47.67591,45.64149],[46.68201,44.6092],[47.59094,43.66016],[47.49252,42.98658],[48.58437,41.80888],[47.98728,41.40582],[47.81567,41.15142],[47.37331,41.21973],[46.68607,41.82714],[46.40495,41.86068],[45.7764,42.09244],[45.47028,42.50278],[44.53762,42.71199],[43.93121,42.55496],[43.75599,42.74083],[42.3944,43.2203],[40.92219,43.38215],[40.07697,43.5531],[39.95501,43.435],[38.68,44.28],[37.53912,44.65721],[36.67546,45.24469],[37.40317,45.40451],[38.23295,46.24087],[37.67372,46.63657],[39.14767,47.04475],[39.1212,47.26336],[38.22354,47.10219],[38.25511,47.5464],[38.77057,47.82562],[39.73828,47.89894],[39.89562,48.23241],[39.67465,48.78382],[40.08079,49.30743],[40.06904,49.60105],[38.59499,49.92646],[38.01063,49.91566],[37.39346,50.38395],[36.62617,50.22559],[35.35612,50.5772],[35.37791,50.77394],[35.02218,51.20757],[34.22482,51.25599],[34.14198,51.56641],[34.39173,51.76888],[33.7527,52.33508],[32.71576,52.23846],[32.41206,52.28869],[32.15944,52.06125],[31.78597,52.10168],[31.54002,52.74205],[31.3052,53.074],[31.49764,53.16743],[32.30452,53.13273],[32.69364,53.35142],[32.4056,53.61805],[31.73127,53.79403],[31.79142,53.97464],[31.38447,54.15706],[30.75753,54.81177],[30.97184,55.08155],[30.87391,55.55098],[29.89629,55.78946],[29.37157,55.67009],[29.22951,55.91834],[28.17671,56.16913],[27.85528,56.75933],[27.77002,57.24426],[27.28818,57.47453],[27.71669,57.7919],[27.42015,58.72457],[28.1317,59.30083],[27.98112,59.47537],[29.1177,60.02805],[28.07,60.50352],[30.21111,61.78003],[31.13999,62.35769],[31.51609,62.86769],[30.03587,63.55281],[30.44468,64.20445],[29.54443,64.94867],[30.21765,65.80598],[29.05459,66.94429],[29.97743,67.6983],[28.44594,68.36461],[28.59193,69.06478],[35,71],[40,83],[180,83]]]]}},LKA:{type:"Feature",id:"LKA",properties:{name:"Sri Lanka"},geometry:{type:"Polygon",coordinates:[[[81.78796,7.52306],[81.63732,6.48177],[81.21802,6.19714],[80.34836,5.96837],[79.87247,6.76346],[79.69517,8.20084],[80.1478,9.82408],[80.83882,9.26843],[81.30432,8.56421],[81.78796,7.52306]]]}},taiwan:{type:"Feature",id:"taiwan",properties:{},geometry:{type:"Polygon",coordinates:[[[119,23.5],[121.7,26],[122.5,25.5],[121.8,21.8],[120,21.5],[119,23.5]]]}},thailand_cnx:{type:"Feature",id:"thailand_cnx",properties:{},geometry:{type:"Polygon",coordinates:[[[98.4375,18.2319],[98.4375,19.2255],[99.5306,19.2255],[99.5306,18.2319],[98.4375,18.2319]]]}},thailand_full:{type:"Feature",id:"thailand_full",properties:{},geometry:{type:"Polygon",coordinates:[[[97.50366,8.39358],[97.7124,9.60075],[99.47021,11.8566],[98.05298,14.84923],[98.32764,16.15137],[97.21802,18.39623],[97.38281,19.73568],[100.2832,20.66363],[101.37085,19.69431],[101.40381,18.27109],[104.08447,18.58377],[105.76538,16.06693],[105.52368,14.15788],[102.854,13.82741],[103.00781,11.69527],[102.12891,5.81276],[101.11542,5.4875],[100.66498,6.42448],[99.13788,6.34806],[97.50366,8.39358]]]}},"al-tirana":{type:"Feature",id:"al-tirana",properties:{},geometry:{type:"Polygon",coordinates:[[[19.77796,41.36244],[19.78028,41.36267],[19.78123,41.36014],[19.78004,41.35915],[19.78099,41.35803],[19.77752,41.35682],[19.78082,41.35409],[19.77658,41.35122],[19.78029,41.34936],[19.7832,41.35026],[19.7899,41.34976],[19.79536,41.34793],[19.80046,41.3502],[19.81074,41.35213],[19.81874,41.35044],[19.82238,41.35173],[19.83428,41.35186],[19.84174,41.35434],[19.84682,41.3589],[19.84829,41.35842],[19.85095,41.36008],[19.85159,41.35903],[19.8561,41.35843],[19.85488,41.3545],[19.85784,41.35167],[19.85518,41.35228],[19.85275,41.35145],[19.85276,41.34956],[19.85151,41.34955],[19.85462,41.34419],[19.85876,41.33995],[19.8642,41.33947],[19.86465,41.33789],[19.86829,41.33772],[19.86999,41.33882],[19.87262,41.33794],[19.87259,41.33606],[19.87543,41.3355],[19.87644,41.33126],[19.87554,41.33042],[19.87232,41.33102],[19.87095,41.32999],[19.86659,41.33088],[19.86535,41.32664],[19.86164,41.32543],[19.85813,41.3214],[19.85489,41.32066],[19.85575,41.31876],[19.84532,41.314],[19.84458,41.31212],[19.85095,41.30156],[19.84975,41.29748],[19.8457,41.29559],[19.83906,41.29791],[19.82955,41.29568],[19.82738,41.29791],[19.82504,41.29827],[19.82605,41.29986],[19.82333,41.30509],[19.82032,41.30525],[19.81821,41.3037],[19.81168,41.30787],[19.81162,41.31002],[19.80709,41.31302],[19.79827,41.31487],[19.79767,41.31238],[19.79374,41.313],[19.78954,41.31035],[19.7852,41.31117],[19.78057,41.3142],[19.77976,41.31244],[19.78765,41.30887],[19.78369,41.30473],[19.77721,41.30247],[19.77515,41.30039],[19.77077,41.30363],[19.76019,41.29972],[19.75706,41.30651],[19.75854,41.30874],[19.75473,41.31208],[19.75643,41.31314],[19.75571,41.31548],[19.76586,41.3199],[19.76813,41.32266],[19.77017,41.32139],[19.76811,41.31882],[19.76922,41.31754],[19.77559,41.31854],[19.77323,41.32284],[19.77378,41.32422],[19.77893,41.32349],[19.77968,41.32518],[19.78451,41.32399],[19.78734,41.32541],[19.78321,41.33328],[19.78343,41.33578],[19.77659,41.33783],[19.78083,41.34567],[19.76839,41.35239],[19.75832,41.35489],[19.76053,41.35931],[19.75484,41.3598],[19.75767,41.36542],[19.76169,41.36185],[19.76434,41.36249],[19.76411,41.36393],[19.76775,41.36369],[19.76857,41.36459],[19.77145,41.364],[19.77204,41.36125],[19.77796,41.36244]]]}},albania:{type:"Feature",id:"albania",properties:{},geometry:{type:"Polygon",coordinates:[[[19.39087,41.86138],[19.40186,42.09007],[19.27002,42.18376],[19.69849,42.67436],[19.81384,42.46399],[20.07202,42.55713],[20.25879,42.33824],[20.34668,42.32606],[20.51697,42.23665],[20.61584,41.92272],[20.52795,41.71803],[20.56091,41.57847],[20.44556,41.54559],[20.56091,41.40566],[20.50049,41.3397],[20.58289,41.09177],[20.65979,41.07521],[20.71472,40.90521],[20.95642,40.92181],[20.98389,40.7431],[21.07178,40.60978],[20.95093,40.47202],[20.85205,40.47202],[20.68726,40.10329],[20.43457,40.07387],[20.33569,39.99396],[20.43457,39.82119],[20.38513,39.77899],[20.28625,39.8001],[20.31921,39.72831],[20.20386,39.63954],[19.97314,39.69451],[20.0116,39.86759],[19.86328,40.04444],[19.35791,40.2921],[19.25354,40.51798],[19.4458,40.3298],[19.50073,40.43859],[19.31396,40.65564],[19.41833,40.90936],[19.53918,40.92181],[19.4458,41.00063],[19.43481,41.15384],[19.50623,41.2489],[19.4458,41.32733],[19.41284,41.4139],[19.51721,41.52092],[19.45129,41.60312],[19.52271,41.57847],[19.58862,41.62366],[19.59961,41.7836],[19.39087,41.86138]]]}},austria:{type:"Feature",id:"austria",properties:{},geometry:{type:"Polygon",coordinates:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]]}},graz:{type:"Feature",id:"graz",properties:{},geometry:{type:"Polygon",coordinates:[[[15.26276,46.94182],[15.26276,47.16918],[15.62943,47.16918],[15.62943,46.94182],[15.26276,46.94182]]]}},belarus:{type:"Feature",id:"belarus",properties:{},geometry:{type:"Polygon",coordinates:[[[23.19351,52.37811],[23.38715,52.57134],[23.67554,52.61806],[23.87329,52.72215],[23.75656,53.20027],[23.42148,53.83956],[23.43521,53.97467],[24.33609,53.99082],[24.73022,54.03762],[24.70825,54.16967],[24.95682,54.18253],[25.48004,54.37176],[25.63385,54.95239],[26.53748,55.24468],[26.27655,55.26973],[26.48804,55.71009],[26.89728,55.87993],[27.56195,55.82597],[27.56195,55.97226],[27.98218,56.20976],[29.64935,55.96304],[30.28107,55.89303],[30.95398,55.64815],[31.20941,54.67065],[32.47009,53.7617],[32.83539,53.3866],[32.22839,53.02635],[31.51978,53.16159],[31.84662,52.06262],[30.8139,51.93411],[30.4953,51.21032],[27.71301,51.46085],[25.85083,51.88666],[24.5874,51.81541],[23.51898,51.41634],[23.45581,51.99841],[23.15918,52.1874],[23.19351,52.37811]]]}},belgium:{type:"Feature",id:"belgium",properties:{},geometry:{type:"Polygon",coordinates:[[[3.08167,51.55146],[3.30963,51.43346],[3.36834,51.36996],[3.37761,51.35956],[3.37589,51.34841],[3.38482,51.34337],[3.38722,51.33887],[3.38688,51.33286],[3.36096,51.31527],[3.3819,51.30207],[3.37641,51.29928],[3.36782,51.29681],[3.38293,51.28726],[3.38327,51.2806],[3.37915,51.27824],[3.38121,51.27598],[3.39031,51.27416],[3.39598,51.26686],[3.40439,51.26449],[3.40937,51.25923],[3.41795,51.26127],[3.42138,51.25848],[3.4267,51.25482],[3.42894,51.24709],[3.44679,51.24279],[3.52592,51.24677],[3.51425,51.2878],[3.52927,51.28935],[3.53434,51.28474],[3.53811,51.28479],[3.54266,51.29177],[3.55717,51.29187],[3.5588,51.2959],[3.56163,51.29644],[3.56489,51.29569],[3.5727,51.29225],[3.57253,51.29107],[3.57571,51.28946],[3.57905,51.28951],[3.58206,51.28876],[3.58214,51.29247],[3.58618,51.29316],[3.58026,51.29869],[3.58987,51.30663],[3.62626,51.29413],[3.64145,51.28914],[3.64411,51.29069],[3.6581,51.29096],[3.6781,51.28345],[3.67905,51.28168],[3.69063,51.28173],[3.69424,51.27668],[3.71801,51.27217],[3.71827,51.27368],[3.72273,51.274],[3.75054,51.27061],[3.75286,51.27104],[3.75681,51.26986],[3.76342,51.26261],[3.76848,51.26106],[3.77123,51.26218],[3.77355,51.2646],[3.79698,51.25665],[3.79071,51.24553],[3.79063,51.21608],[3.80453,51.2143],[3.80796,51.21398],[3.82479,51.21086],[3.8356,51.21516],[3.85225,51.21484],[3.85895,51.21291],[3.89002,51.22473],[3.89568,51.21968],[3.89482,51.2143],[3.88298,51.20764],[3.88762,51.20301],[3.89345,51.20527],[3.89929,51.20398],[3.91542,51.20989],[3.91388,51.21764],[3.92349,51.21989],[3.93105,51.22194],[3.9374,51.21398],[3.94323,51.21721],[3.95748,51.21764],[3.96023,51.22527],[3.97654,51.22667],[3.9846,51.2357],[3.99473,51.23914],[4.00469,51.24311],[4.01636,51.24623],[4.03851,51.24687],[4.04125,51.24397],[4.05842,51.24505],[4.06082,51.24773],[4.16365,51.29391],[4.23815,51.35345],[4.22373,51.35881],[4.21686,51.36878],[4.21635,51.37435],[4.33685,51.37842],[4.34235,51.35988],[4.35093,51.35967],[4.36861,51.35795],[4.38543,51.35592],[4.39505,51.35753],[4.42114,51.36707],[4.42818,51.36642],[4.42337,51.37242],[4.42904,51.37521],[4.38852,51.40702],[4.38097,51.42137],[4.38904,51.42597],[4.39093,51.43304],[4.3935,51.43486],[4.39161,51.44416],[4.37891,51.44502],[4.37719,51.44716],[4.38131,51.45165],[4.38509,51.4508],[4.44157,51.47005],[4.46354,51.4723],[4.47487,51.47978],[4.48654,51.4786],[4.53856,51.48416],[4.55074,51.47283],[4.53238,51.44877],[4.53701,51.42522],[4.57512,51.43411],[4.63469,51.42651],[4.64087,51.42372],[4.65048,51.42747],[4.6673,51.42779],[4.66473,51.44556],[4.69236,51.45326],[4.70146,51.46845],[4.71416,51.47026],[4.71519,51.47304],[4.72781,51.48486],[4.74524,51.48988],[4.74721,51.49368],[4.74781,51.49651],[4.75047,51.49945],[4.75648,51.50196],[4.77253,51.50682],[4.79485,51.5034],[4.82025,51.49784],[4.82643,51.48609],[4.84737,51.48352],[4.84291,51.46449],[4.84909,51.46085],[4.84463,51.4478],[4.83089,51.44438],[4.83742,51.42683],[4.8563,51.41805],[4.88171,51.43325],[4.91741,51.4127],[4.93389,51.42083],[4.90162,51.44053],[4.9387,51.46192],[4.97646,51.44545],[5.02419,51.48523],[5.03225,51.48919],[5.04187,51.4878],[5.04135,51.48053],[5.04856,51.47433],[5.08032,51.47475],[5.10658,51.43047],[5.07294,51.39358],[5.11765,51.36149],[5.12074,51.35592],[5.13268,51.3475],[5.13525,51.31608],[5.1622,51.31135],[5.17241,51.31688],[5.19001,51.32069],[5.19585,51.32123],[5.19988,51.32348],[5.24331,51.30594],[5.2276,51.26841],[5.23842,51.26208],[5.26357,51.26782],[5.29584,51.26267],[5.31567,51.26449],[5.33755,51.26428],[5.34107,51.26686],[5.34399,51.27309],[5.34554,51.27668],[5.4172,51.2632],[5.43222,51.27706],[5.43806,51.27695],[5.44132,51.2827],[5.46398,51.28549],[5.47608,51.29209],[5.47608,51.29536],[5.48226,51.29923],[5.48201,51.301],[5.51625,51.29612],[5.52011,51.28957],[5.54363,51.27298],[5.55711,51.26718],[5.55874,51.2631],[5.55745,51.25316],[5.55651,51.24472],[5.56131,51.22301],[5.63667,51.20355],[5.65401,51.19812],[5.65513,51.1936],[5.65212,51.1929],[5.65753,51.1865],[5.66834,51.18671],[5.67624,51.18548],[5.67761,51.18435],[5.6856,51.18542],[5.68946,51.18623],[5.69815,51.1842],[5.70201,51.18397],[5.70165,51.18275],[5.70645,51.18248],[5.70815,51.18223],[5.70987,51.1812],[5.71431,51.1839],[5.7177,51.18475],[5.72948,51.18601],[5.73031,51.18553],[5.73274,51.18564],[5.73274,51.18615],[5.7345,51.18657],[5.73993,51.18757],[5.74576,51.19032],[5.75769,51.18618],[5.75821,51.1851],[5.76731,51.18413],[5.77821,51.1787],[5.77477,51.17337],[5.7801,51.17289],[5.78078,51.17208],[5.77992,51.17052],[5.77673,51.1702],[5.77585,51.17028],[5.77321,51.16967],[5.77274,51.16925],[5.77192,51.16924],[5.77093,51.1698],[5.76993,51.16905],[5.77059,51.16458],[5.77383,51.16453],[5.77385,51.16558],[5.77638,51.16565],[5.77701,51.16306],[5.7775,51.16298],[5.77808,51.16353],[5.77975,51.16356],[5.78025,51.15935],[5.77797,51.15803],[5.77677,51.15554],[5.77829,51.15502],[5.77907,51.15319],[5.78456,51.15421],[5.79005,51.15798],[5.79512,51.15798],[5.80095,51.15954],[5.80027,51.16094],[5.80361,51.1632],[5.80619,51.16352],[5.8134,51.16051],[5.8146,51.16325],[5.82473,51.16874],[5.83434,51.16314],[5.83589,51.15905],[5.84078,51.15819],[5.84129,51.15523],[5.8564,51.15071],[5.86258,51.14446],[5.85674,51.14037],[5.85159,51.13671],[5.84816,51.12938],[5.83374,51.12744],[5.82241,51.12249],[5.81211,51.11387],[5.82275,51.11171],[5.84026,51.10611],[5.83683,51.0936],[5.82584,51.08929],[5.80559,51.09102],[5.81142,51.07851],[5.80421,51.07031],[5.80868,51.06233],[5.797,51.05564],[5.77709,51.05693],[5.76576,51.03384],[5.78568,51.02412],[5.77263,51.01354],[5.77332,51.00555],[5.76885,50.99345],[5.7589,50.98912],[5.74654,50.97767],[5.72765,50.9647],[5.72834,50.95843],[5.73761,50.96145],[5.75306,50.96232],[5.76851,50.9541],[5.7589,50.94567],[5.73521,50.92446],[5.73177,50.91061],[5.7177,50.90563],[5.70362,50.9078],[5.70122,50.89545],[5.68954,50.88224],[5.68096,50.87726],[5.67169,50.87574],[5.65453,50.87054],[5.64766,50.86274],[5.64766,50.84757],[5.65453,50.83435],[5.66448,50.82437],[5.6971,50.81353],[5.71838,50.80333],[5.72113,50.77642],[5.78018,50.79639],[5.82962,50.77294],[5.9079,50.77381],[6.00403,50.76947],[6.04248,50.76252],[6.05621,50.75123],[6.129,50.73385],[6.16745,50.69037],[6.21689,50.66252],[6.2471,50.65991],[6.28143,50.64424],[6.28693,50.62333],[6.27045,50.59631],[6.24847,50.58542],[6.24058,50.56078],[6.22719,50.5538],[6.21586,50.54965],[6.20419,50.53591],[6.21552,50.52063],[6.22993,50.50295],[6.23989,50.50513],[6.2598,50.50338],[6.27766,50.50731],[6.29139,50.50076],[6.3089,50.50513],[6.3216,50.49923],[6.35078,50.49377],[6.35765,50.48722],[6.34838,50.47936],[6.35147,50.46188],[6.37756,50.45925],[6.38065,50.44657],[6.37619,50.40786],[6.36383,50.39561],[6.35387,50.38028],[6.36246,50.37634],[6.41155,50.34415],[6.41499,50.33363],[6.40675,50.31982],[6.38718,50.31763],[6.36829,50.3025],[6.35765,50.30338],[6.33018,50.31565],[6.31645,50.31478],[6.30444,50.30601],[6.29585,50.29044],[6.29414,50.27354],[6.27628,50.26411],[6.22856,50.25511],[6.21483,50.25094],[6.20659,50.24062],[6.19869,50.23403],[6.17947,50.23139],[6.18221,50.22678],[6.17672,50.22151],[6.19251,50.21206],[6.19801,50.18437],[6.19217,50.17646],[6.15166,50.16656],[6.15509,50.15491],[6.16058,50.14633],[6.15578,50.13554],[6.14376,50.13224],[6.13243,50.12454],[6.10737,50.13378],[6.11012,50.16282],[6.09947,50.16502],[6.08677,50.15425],[6.06583,50.14875],[6.02943,50.15579],[6.01639,50.17294],[5.97931,50.16898],[5.96832,50.12542],[5.94566,50.12278],[5.90378,50.10473],[5.89073,50.06948],[5.86876,50.06243],[5.87837,50.03289],[5.83168,50.01039],[5.84404,49.99935],[5.84747,49.98214],[5.81932,49.95785],[5.78773,49.95255],[5.77263,49.91144],[5.74722,49.89994],[5.7843,49.88977],[5.7946,49.87473],[5.76645,49.86012],[5.75203,49.834],[5.76645,49.80121],[5.79941,49.79855],[5.84404,49.74977],[5.83923,49.72847],[5.87906,49.72892],[5.89622,49.70672],[5.87563,49.67963],[5.91176,49.66218],[5.90567,49.65779],[5.9073,49.65479],[5.90429,49.65213],[5.90507,49.64735],[5.90567,49.64262],[5.90876,49.63868],[5.89854,49.63362],[5.89374,49.63573],[5.88524,49.6319],[5.88799,49.62645],[5.87837,49.62],[5.87829,49.61305],[5.8776,49.60737],[5.84996,49.59675],[5.85202,49.58824],[5.86318,49.58773],[5.86524,49.58974],[5.86962,49.59013],[5.87279,49.58913],[5.87502,49.58295],[5.87073,49.58134],[5.87288,49.57961],[5.87314,49.57677],[5.87451,49.5736],[5.86387,49.56965],[5.86164,49.56603],[5.85288,49.56347],[5.85168,49.56185],[5.84661,49.5608],[5.84773,49.55896],[5.84722,49.55567],[5.84224,49.55233],[5.8267,49.54933],[5.82524,49.55066],[5.82026,49.54599],[5.81623,49.54599],[5.81245,49.54582],[5.80765,49.5486],[5.79941,49.54816],[5.78859,49.55194],[5.77263,49.56141],[5.76181,49.55963],[5.75941,49.54203],[5.7407,49.53724],[5.73521,49.53813],[5.72971,49.54225],[5.7189,49.53802],[5.70156,49.5378],[5.6904,49.54392],[5.67993,49.54348],[5.67787,49.54715],[5.66757,49.54682],[5.66002,49.5505],[5.64526,49.54437],[5.62878,49.53579],[5.6262,49.52287],[5.62346,49.5144],[5.61298,49.50292],[5.60217,49.50671],[5.59359,49.51953],[5.56904,49.52565],[5.56372,49.52409],[5.55462,49.52744],[5.54192,49.51384],[5.50329,49.50504],[5.4875,49.50526],[5.48458,49.50113],[5.47085,49.49322],[5.46209,49.49679],[5.46055,49.50738],[5.45214,49.51083],[5.44304,49.51841],[5.46158,49.52788],[5.46209,49.53735],[5.4372,49.55283],[5.45368,49.56542],[5.44458,49.56586],[5.43549,49.56887],[5.42673,49.5899],[5.42862,49.59358],[5.41523,49.59947],[5.40871,49.60748],[5.39892,49.6096],[5.39652,49.6146],[5.3742,49.62128],[5.37025,49.62105],[5.36047,49.62428],[5.34897,49.62895],[5.34279,49.61505],[5.33781,49.61427],[5.32957,49.61494],[5.32064,49.61271],[5.31378,49.6096],[5.31034,49.61071],[5.30863,49.61694],[5.30279,49.62317],[5.30245,49.62962],[5.30794,49.63851],[5.31738,49.64807],[5.33043,49.65318],[5.30708,49.67085],[5.29284,49.67607],[5.27962,49.68496],[5.2791,49.6884],[5.26829,49.69495],[5.25782,49.69295],[5.2482,49.68529],[5.24117,49.68429],[5.24134,49.68851],[5.23104,49.69007],[5.2173,49.6864],[5.21421,49.68784],[5.20666,49.69451],[5.19722,49.69062],[5.18932,49.6924],[5.17542,49.6924],[5.16306,49.69218],[5.1622,49.6995],[5.1646,49.71083],[5.15963,49.71438],[5.15327,49.71671],[5.15087,49.71249],[5.14263,49.70739],[5.14006,49.71194],[5.13147,49.71205],[5.12529,49.71105],[5.12032,49.71704],[5.12358,49.72637],[5.11723,49.73757],[5.09302,49.76297],[5.08796,49.76475],[5.08452,49.76186],[5.07963,49.76164],[5.07611,49.76109],[5.07139,49.75987],[5.06727,49.76081],[5.06144,49.76192],[5.06092,49.76624],[5.04908,49.76741],[5.00599,49.7816],[5.00547,49.7832],[5.00504,49.78719],[5.00041,49.79312],[4.99741,49.79379],[4.99603,49.79506],[4.99715,49.79672],[4.99672,49.79955],[4.9938,49.79977],[4.98539,49.79888],[4.97895,49.79972],[4.96977,49.8011],[4.96779,49.79756],[4.96179,49.79717],[4.95569,49.80027],[4.94865,49.79811],[4.94814,49.79473],[4.94368,49.79035],[4.94213,49.79035],[4.94132,49.79226],[4.93887,49.7926],[4.93286,49.78977],[4.9329,49.78825],[4.93114,49.78661],[4.92939,49.78686],[4.92102,49.78805],[4.91793,49.78708],[4.91269,49.78573],[4.90475,49.78492],[4.89947,49.78597],[4.89741,49.78836],[4.88913,49.78769],[4.88724,49.78786],[4.88244,49.79049],[4.87939,49.79249],[4.87591,49.79282],[4.87068,49.79268],[4.87188,49.78922],[4.87081,49.78839],[4.86227,49.78805],[4.85712,49.78966],[4.85201,49.79035],[4.84909,49.79368],[4.8563,49.79722],[4.86076,49.80354],[4.86214,49.81373],[4.87364,49.81883],[4.86712,49.82071],[4.86712,49.82625],[4.86506,49.83444],[4.8654,49.83964],[4.85304,49.84042],[4.84943,49.84894],[4.84789,49.86278],[4.84463,49.8703],[4.85561,49.87096],[4.87484,49.89618],[4.87347,49.90459],[4.87999,49.90879],[4.87553,49.92006],[4.85424,49.92957],[4.84325,49.94636],[4.82849,49.94724],[4.78558,49.9563],[4.78523,49.9828],[4.80995,49.99626],[4.81647,50.02671],[4.83021,50.04127],[4.81441,50.04788],[4.8127,50.06794],[4.8357,50.07014],[4.83192,50.09085],[4.84291,50.10363],[4.86626,50.10318],[4.85836,50.1164],[4.88274,50.13664],[4.87072,50.14875],[4.8278,50.14963],[4.82025,50.15579],[4.76875,50.1296],[4.75262,50.10539],[4.70352,50.08424],[4.70112,50.01502],[4.69803,49.99229],[4.63383,49.98037],[4.56963,49.96712],[4.53255,49.94857],[4.51401,49.93973],[4.44122,49.93178],[4.35745,49.94327],[4.31145,49.95564],[4.22974,49.94945],[4.18785,49.95034],[4.16725,49.96801],[4.12331,49.97286],[4.12193,50.01215],[4.14734,50.05273],[4.18167,50.05493],[4.22012,50.07301],[4.1906,50.10252],[4.18922,50.1263],[4.16382,50.1219],[4.11644,50.13158],[4.13841,50.21734],[4.20708,50.25555],[4.1827,50.27025],[4.16382,50.28298],[4.15901,50.27596],[4.17309,50.2685],[4.17309,50.25994],[4.16519,50.25401],[4.13258,50.25489],[4.1312,50.26433],[4.13017,50.27091],[4.11644,50.27464],[4.12262,50.2821],[4.1185,50.2957],[4.09653,50.30864],[4.07696,50.30579],[4.07215,50.31807],[4.05533,50.32946],[4.03679,50.33998],[4.02512,50.35291],[3.98598,50.33911],[3.95748,50.33845],[3.8974,50.32267],[3.88264,50.32377],[3.88092,50.33494],[3.85448,50.33911],[3.84933,50.34875],[3.82942,50.35028],[3.82633,50.34217],[3.80711,50.3413],[3.80608,50.35072],[3.74256,50.34393],[3.73604,50.31149],[3.72437,50.30272],[3.70583,50.29921],[3.68076,50.31894],[3.66428,50.34152],[3.65227,50.37087],[3.66634,50.39123],[3.66325,50.42143],[3.65398,50.4551],[3.62995,50.46712],[3.60832,50.49006],[3.59974,50.48657],[3.55476,50.48853],[3.49915,50.47936],[3.48198,50.48635],[3.50945,50.52085],[3.4758,50.52478],[3.45726,50.50513],[3.43735,50.49945],[3.36662,50.48416],[3.27324,50.52609],[3.25951,50.60154],[3.2341,50.65251],[3.24097,50.67862],[3.24783,50.70037],[3.19565,50.70776],[3.1311,50.77642],[3.06725,50.76296],[2.99652,50.74428],[2.95807,50.67035],[2.82898,50.68602],[2.68341,50.77816],[2.57629,50.81114],[2.5708,50.93939],[2.51862,51.05866],[2.36755,51.2516],[3.08167,51.55146]]]}},be_brussels:{type:"Feature",id:"be_brussels",properties:{},geometry:{type:"Polygon",coordinates:[[[4.37973,50.76382],[4.37853,50.76811],[4.34522,50.77337],[4.34205,50.77164],[4.32952,50.77381],[4.31621,50.78624],[4.31458,50.79454],[4.30282,50.79709],[4.29802,50.80593],[4.28901,50.80691],[4.2854,50.80506],[4.27579,50.80696],[4.27218,50.81011],[4.25802,50.80935],[4.25519,50.8151],[4.24403,50.81548],[4.24343,50.82182],[4.25227,50.82697],[4.25107,50.83288],[4.25467,50.83695],[4.27193,50.84036],[4.28094,50.84215],[4.28042,50.85721],[4.27802,50.85911],[4.27699,50.86713],[4.28274,50.87227],[4.29561,50.88094],[4.29553,50.88262],[4.29149,50.88495],[4.29004,50.88982],[4.30634,50.89274],[4.31647,50.89605],[4.32892,50.90249],[4.34025,50.90411],[4.34857,50.90341],[4.36213,50.9033],[4.3726,50.90032],[4.38119,50.90319],[4.38462,50.91093],[4.39578,50.91407],[4.41543,50.91342],[4.41655,50.90757],[4.4296,50.90103],[4.43595,50.89502],[4.43106,50.89014],[4.44007,50.87845],[4.43183,50.87628],[4.4253,50.86615],[4.44599,50.85992],[4.44968,50.85591],[4.46238,50.85396],[4.46899,50.84573],[4.46959,50.83537],[4.47972,50.82036],[4.45947,50.81661],[4.45921,50.80626],[4.48238,50.79617],[4.4817,50.79134],[4.46427,50.78645],[4.435,50.775],[4.43028,50.77517],[4.38917,50.76377],[4.37973,50.76382]]]}},be_flanders:{type:"Feature",id:"be_flanders",properties:{},geometry:{type:"Polygon",coordinates:[[[2.52239,51.10172],[3.12606,51.34118],[3.17493,51.38246],[3.37615,51.38784],[3.41065,51.3304],[3.40202,51.28548],[3.49114,51.2567],[3.48251,51.30345],[3.57737,51.32322],[3.81309,51.27289],[3.82172,51.23691],[3.93095,51.23691],[4.05456,51.27469],[4.20116,51.35195],[4.16954,51.38067],[4.34202,51.39502],[4.36502,51.46491],[4.53749,51.50072],[4.57199,51.47924],[4.56049,51.44879],[4.63811,51.45058],[4.75022,51.52397],[4.83645,51.50787],[5.0808,51.49893],[5.13541,51.447],[5.10667,51.39143],[5.26477,51.31783],[5.26477,51.28727],[5.4085,51.29267],[5.48612,51.32501],[5.58098,51.28368],[5.58385,51.23511],[5.76783,51.2045],[5.87706,51.16125],[5.70459,50.80293],[5.90581,50.78657],[5.93743,50.73202],[5.90293,50.70108],[5.81382,50.69379],[5.61547,50.76112],[5.50049,50.712],[5.2044,50.7029],[5.16416,50.67558],[5.03768,50.70108],[4.98881,50.75021],[4.91694,50.72656],[4.79046,50.76658],[4.68122,50.77021],[4.66973,50.73566],[4.2874,50.67922],[3.91083,50.6774],[3.71823,50.75203],[3.65499,50.712],[3.53426,50.71018],[3.51413,50.74112],[3.45664,50.74384],[3.37328,50.69562],[3.31004,50.70745],[3.28991,50.73657],[3.16487,50.74294],[3.13181,50.77203],[3.08007,50.76021],[2.87453,50.7393],[2.89609,50.71109],[2.87453,50.69562],[2.79692,50.7029],[2.69918,50.8002],[2.62013,50.79747],[2.56982,50.8583],[2.56695,50.92358],[2.60288,50.94985],[2.5497,50.99601],[2.52239,51.10172]]]}},be_wallonia:{type:"Feature",id:"be_wallonia",properties:{},geometry:{type:"Polygon",coordinates:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]]]}},croatia:{type:"Feature",id:"croatia",properties:{},geometry:{type:"Polygon",coordinates:[[[18.55316,42.39709],[18.487,42.33],[16,42.2],[13,45],[13.48,45.55],[13.6,45.46],[13.67282,45.45244],[13.78445,45.47445],[13.87695,45.43477],[13.98354,45.46061],[13.95607,45.5049],[13.99868,45.52812],[14.07402,45.49231],[14.19361,45.48114],[14.23361,45.51383],[14.33098,45.47073],[14.4841,45.54339],[14.55276,45.65149],[15.16462,45.43061],[15.36301,45.48661],[15.28061,45.60731],[15.34584,45.65341],[15.24587,45.72718],[15.55939,45.85272],[15.68573,45.84315],[15.71043,46.04506],[15.61913,46.08657],[15.60059,46.16509],[15.67131,46.23068],[15.78049,46.21928],[15.79422,46.26439],[16.073,46.34266],[16.04759,46.3891],[16.15145,46.40378],[16.30028,46.38152],[16.24191,46.49508],[16.36894,46.55083],[16.66077,46.45725],[16.72462,46.39715],[16.86058,46.35783],[16.97456,46.22688],[17.17232,46.1551],[17.31102,45.97167],[17.58087,45.93874],[17.66574,45.84483],[17.86118,45.77993],[18.15765,45.79625],[18.43522,45.74655],[18.68019,45.91486],[18.77838,45.88666],[18.82507,45.91724],[18.9164,45.70714],[18.96652,45.66972],[18.89717,45.56551],[18.94817,45.54136],[19.01686,45.56369],[19.10858,45.5144],[19.08125,45.47585],[19.00341,45.48553],[18.99315,45.44969],[19.03735,45.40735],[18.9792,45.37883],[19.09424,45.3367],[19.10972,45.30469],[19.2687,45.24886],[19.42108,45.23622],[19.45198,45.16219],[19.2041,45.17236],[19.14345,45.119],[19.09331,45.13091],[19.08464,45.11852],[19.11231,45.08359],[19.1011,44.98811],[19.16343,44.94855],[19.06865,44.88961],[18.99843,44.89696],[19.01991,44.84386],[18.83764,44.84591],[18.75065,44.90197],[18.73803,44.94119],[18.75375,44.95245],[18.78491,44.94261],[18.77858,44.98426],[18.72157,44.98326],[18.66267,45.04785],[18.46602,45.05359],[18.41889,45.09637],[18.22841,45.09274],[18.2011,45.0684],[18.11746,45.06832],[18.0011,45.14282],[17.93745,45.09903],[17.93891,45.07086],[17.84756,45.03242],[17.66404,45.12204],[17.59713,45.09425],[17.16882,45.13674],[16.92275,45.23503],[16.81812,45.17296],[16.5105,45.20898],[16.46738,45.13326],[16.40374,45.10639],[16.36047,44.99622],[16.29175,44.9865],[16.11145,45.08758],[15.99747,45.21978],[15.81894,45.2072],[15.77283,45.16143],[15.80439,45.1121],[15.75505,45.05587],[15.78598,44.96966],[15.7338,44.9371],[15.78598,44.84029],[15.74818,44.81311],[15.82858,44.72686],[15.90458,44.75089],[16.14789,44.48088],[16.15253,44.38405],[16.39709,44.06983],[17.1476,43.49677],[17.22656,43.49776],[17.282,43.47769],[17.30151,43.4393],[17.26227,43.39108],[17.37488,43.2502],[17.44734,43.1998],[17.43805,43.18365],[17.63424,43.09863],[17.71339,42.97351],[17.53967,42.93531],[17.64267,42.88351],[17.67975,42.92174],[17.7903,42.89961],[17.80815,42.92073],[17.85896,42.89458],[17.90239,42.81647],[18.24898,42.61375],[18.3609,42.61526],[18.44437,42.56076],[18.43575,42.48273],[18.55316,42.39709]]]}},czechia:{type:"Feature",id:"czechia",properties:{},geometry:{type:"Polygon",coordinates:[[[14.3811,51.06902],[15.13916,51.08282],[16.42456,50.70863],[16.68823,50.32442],[16.78711,50.49246],[17.75391,50.35247],[18.58887,49.96536],[18.92944,49.51808],[18.1604,48.98022],[17.00684,48.61839],[15.13916,48.85749],[14.67773,48.55298],[13.85376,48.58206],[12.00806,50.05008],[11.92017,50.35948],[14.3811,51.06902]]]}},denmark:{type:"Feature",id:"denmark",properties:{},geometry:{type:"Polygon",coordinates:[[[7.99805,55.11608],[7.9541,56.94497],[10.62378,57.94401],[12.65625,56.01681],[12.65625,55.91535],[12.82928,55.5566],[12.60956,55.42122],[12.66449,55.25095],[14.82605,55.37911],[15.28198,55.22902],[15.11719,54.85448],[12.87598,54.85922],[12.07672,54.44769],[10.849,54.73414],[10.67871,54.58002],[9.88083,54.83708],[9.73972,54.82265],[9.60823,54.8525],[9.63158,54.87996],[9.59038,54.88668],[9.4994,54.83886],[9.43176,54.82601],[9.41013,54.84242],[9.38198,54.83827],[9.37443,54.82047],[9.34422,54.80108],[9.25152,54.80979],[9.23985,54.84993],[9.13822,54.87483],[9.06338,54.87048],[8.90167,54.90386],[8.85532,54.89517],[8.82408,54.90662],[8.79765,54.90445],[8.77602,54.893],[8.72761,54.89181],[8.67645,54.91195],[8.66066,54.90859],[8.55698,54.92063],[8.47355,55.05537],[7.99805,55.11608]]]}},finland:{type:"Feature",id:"finland",properties:{},geometry:{type:"Polygon",coordinates:[[[24.16992,65.34851],[23.90625,66.14274],[23.68652,66.44311],[23.99414,66.80922],[23.51074,67.27204],[23.37891,67.44123],[23.73047,67.97463],[20.74219,69.03714],[21.18164,69.28726],[21.70898,69.27171],[22.45605,68.73638],[23.15918,68.65655],[23.90625,68.8318],[25.00488,68.59249],[25.40039,68.87936],[25.75195,68.95839],[25.97168,69.70287],[26.45508,69.96044],[27.20215,69.90012],[27.50977,70.0506],[27.86133,70.08056],[28.38867,69.82447],[29.04785,69.71811],[29.26758,69.53452],[28.87207,69.225],[29.0918,69.02141],[28.52051,68.89519],[28.78418,68.84767],[28.52051,68.56038],[28.69629,68.17156],[29.26758,68.0733],[30.05859,67.69277],[29.17969,67.0503],[29.0918,66.8956],[30.14648,65.73063],[29.66309,65.20147],[29.70703,64.79285],[30.05859,64.79285],[30.10254,64.41592],[30.4541,64.30182],[30.05859,63.74363],[31.59668,63.01511],[30.27832,61.89758],[27.81738,60.56538],[27.33398,60.19616],[24.65332,59.88894],[21.84082,59.46741],[20.43457,59.46741],[19.11621,60.19616],[19.2041,60.58697],[20.08301,60.75916],[20.69824,61.14324],[20.96191,61.73153],[19.99512,63.27318],[21.44531,63.66576],[22.93945,64.20638],[23.24707,64.51064],[23.81836,64.66152],[24.16992,65.34851]]]}},france:{type:"Feature",id:"france",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[9.9,42.64836],[9.9,42.02785],[9.63227,41.43244],[9.36968,41.35052],[9.32602,41.3036],[9.27311,41.29196],[9.07196,41.26129],[8.94186,41.27688],[8.8742,41.26232],[8.84542,41.26311],[8.78782,41.25725],[7.3114,41.4242],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24593,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.26331,50.92504],[1.76605,51.17762],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.26696,43.39308],[9.8,43.1],[9.9,42.64836]]]]}},"de-berlin-brandenburg":{type:"Feature",id:"de-berlin-brandenburg",properties:{},geometry:{type:"Polygon",coordinates:[[[11.32141,53.11711],[12.09595,53.36694],[12.88147,53.20274],[13.78235,53.50765],[14.16687,53.41608],[14.10645,53.28164],[14.29871,53.27507],[14.41956,53.32431],[14.19434,52.93871],[14.19434,52.82932],[14.57336,52.60972],[14.57336,52.36218],[14.71619,52.05249],[14.61182,51.84257],[14.76563,51.54975],[14.36462,51.519],[14.1449,51.54975],[13.99109,51.36835],[13.2605,51.39578],[13.07373,51.65211],[13.13965,51.86971],[12.67273,52.01532],[12.40356,52.03222],[12.22229,52.14697],[12.32117,52.50619],[12.16736,52.51956],[12.23877,52.87245],[11.60156,52.96849],[11.32141,53.11711]]]}},"de-ostwestfalen-lippe":{type:"Feature",id:"de-ostwestfalen-lippe",properties:{},geometry:{type:"Polygon",coordinates:[[[8.04337,52.05756],[8.42583,52.19919],[8.43846,52.35394],[8.30866,52.39929],[8.28438,52.4581],[8.67096,52.56967],[9.22028,52.49616],[9.06097,52.28328],[9.47365,51.86716],[9.46266,51.64103],[9.26285,51.46641],[9.15648,51.43569],[8.80348,51.43218],[8.54444,51.46003],[8.42239,51.55658],[8.31076,51.72252],[8.12645,51.86844],[8.04337,52.05756]]]}},germany:{type:"Feature",id:"germany",properties:{},geometry:{type:"Polygon",coordinates:[[[7.05048,52.62973],[7.21252,53.20274],[6.56982,53.61858],[8.30772,55.1467],[8.6483,54.96421],[9.45305,54.83313],[9.95018,54.82838],[11.99913,54.44689],[13.3889,54.89162],[14.15245,54.47562],[14.26231,53.78037],[14.44359,53.27096],[14.36119,53.0668],[14.16344,52.97097],[14.13597,52.84508],[14.62486,52.60555],[14.5919,52.35463],[14.71825,52.24042],[14.74571,52.06516],[14.60838,51.83153],[14.74571,51.69554],[14.76768,51.54206],[14.98741,51.43261],[15.03136,51.27824],[14.94347,51.04744],[14.85558,50.88138],[14.77867,50.81548],[14.64684,50.85017],[14.5974,50.99215],[14.32823,51.07506],[14.32823,50.88138],[13.01537,50.49508],[12.48253,50.38663],[12.33421,50.18305],[12.1804,50.30952],[12.12547,50.25686],[12.22984,50.09856],[12.55394,49.92912],[12.4276,49.75199],[12.5045,49.68807],[12.77916,49.35286],[12.93297,49.36002],[13.03185,49.28841],[13.57018,48.96489],[13.80089,48.81319],[13.75694,48.52297],[13.52074,48.58842],[13.45482,48.57388],[13.40538,48.36994],[13.23509,48.28959],[12.99889,48.24571],[12.75169,48.12118],[12.9879,47.86385],[12.91649,47.71623],[13.04832,47.72362],[13.09776,47.67186],[13.0648,47.50885],[12.93846,47.47173],[12.77367,47.5793],[12.8286,47.60894],[12.70226,47.70144],[12.1859,47.70514],[12.16942,47.62005],[11.86729,47.60524],[11.63109,47.59412],[11.25755,47.40114],[10.98839,47.40486],[10.88402,47.52369],[10.67528,47.55707],[10.45006,47.54594],[10.46654,47.41973],[10.34019,47.3081],[10.19737,47.27457],[10.21385,47.38998],[10.10948,47.3751],[10.08202,47.46431],[9.84581,47.55336],[9.40636,47.55336],[9.09874,47.68388],[8.90236,47.65521],[8.85292,47.70329],[8.80348,47.74025],[8.76915,47.71993],[8.80486,47.70329],[8.79524,47.68388],[8.7307,47.69867],[8.73482,47.7227],[8.71284,47.7384],[8.7513,47.76887],[8.69637,47.76425],[8.65654,47.8067],[8.63594,47.76518],[8.61122,47.80947],[8.57002,47.79286],[8.48763,47.77902],[8.41621,47.71808],[8.41347,47.68111],[8.46428,47.65891],[8.53706,47.67001],[8.60985,47.67741],[8.63457,47.64966],[8.59886,47.64319],[8.61122,47.6219],[8.56865,47.60061],[8.56865,47.6219],[8.52745,47.64041],[8.45879,47.60801],[8.50273,47.58672],[8.38463,47.57004],[8.33107,47.57375],[8.29399,47.61542],[8.2061,47.62653],[8.10173,47.56819],[7.96852,47.5617],[7.92046,47.55429],[7.89024,47.59505],[7.8257,47.58949],[7.81197,47.56726],[7.6815,47.54038],[7.6403,47.56448],[7.69386,47.5756],[7.6815,47.59412],[7.64854,47.60061],[7.61421,47.58394],[7.50641,47.70237],[7.79205,48.60749],[8.22876,48.97481],[6.84174,49.17093],[6.37482,49.48597],[6.53961,49.80963],[6.1441,50.01833],[6.19835,50.21119],[6.41808,50.35159],[6.19835,50.63117],[6.02257,50.77034],[6.02257,51.07506],[6.24229,51.37778],[5.97862,51.81456],[6.1496,51.90022],[6.44073,51.85105],[6.828,51.95611],[6.68518,52.05587],[7.04773,52.23957],[6.99554,52.45768],[6.70166,52.48445],[6.72913,52.64973],[7.05048,52.62973]]]}},hungary:{type:"Feature",id:"hungary",properties:{},geometry:{type:"Polygon",coordinates:[[[18.43643,45.73111],[17.67426,45.83454],[17.57675,45.92823],[17.35153,45.94303],[17.14966,46.16081],[16.52756,46.50028],[16.3147,46.86582],[16.11969,46.86582],[16.28448,46.99337],[16.48224,47.01584],[16.5152,47.1505],[16.42731,47.2177],[16.43829,47.41136],[16.66763,47.44852],[16.67587,47.60616],[16.43829,47.65614],[16.54816,47.75964],[16.71844,47.73563],[16.75003,47.68111],[17.08099,47.70791],[17.04254,47.86293],[17.09473,47.96234],[17.20734,48.02484],[17.75665,47.74486],[18.71246,47.76702],[18.85529,47.82606],[18.77838,47.87767],[18.75641,47.98808],[18.82233,48.04687],[19.50348,48.1056],[19.55566,48.25028],[19.92096,48.14227],[20.34943,48.30329],[20.54718,48.54389],[20.82184,48.58751],[21.14044,48.50751],[21.47003,48.58751],[21.70074,48.36902],[21.8367,48.34073],[22.2171,48.42282],[22.38327,48.24205],[22.50549,48.24845],[22.61948,48.1056],[22.83371,48.11843],[22.90649,47.95406],[22.59064,47.75779],[22.48077,47.81131],[22.42584,47.74486],[22.32147,47.75779],[22.02759,47.51442],[22.03033,47.38161],[21.9397,47.3658],[21.48926,46.75868],[21.52908,46.73233],[21.4151,46.61737],[21.33133,46.61549],[21.10611,46.23875],[20.79575,46.27863],[20.7106,46.15035],[20.25055,46.13227],[19.82758,46.16461],[19.54742,46.17793],[19.51447,46.1018],[18.80997,45.87567],[18.70285,45.91294],[18.43643,45.73111]]]}},iceland:{type:"Feature",id:"iceland",properties:{},geometry:{type:"Polygon",coordinates:[[[-25.21,65.81],[-23.17,66.89],[-19.51,66.29],[-19.09,67.46],[-17.98,67.34],[-17.38,66.83],[-14.01,66.72],[-12.36,64.54],[-17.21,62.92],[-23.63,63.15],[-25.21,65.81]]]}},italy:{type:"Feature",id:"italy",properties:{},geometry:{type:"Polygon",coordinates:[[[7.6,43.5],[7.49542,43.86523],[7.69043,44.0718],[7.69043,44.19796],[7.42676,44.15068],[6.9873,44.26094],[6.85547,44.55916],[7.03125,44.73113],[7.00928,44.87144],[6.72363,44.91814],[6.5918,45.12005],[7.09717,45.25942],[7.14111,45.41388],[6.96533,45.61404],[6.76758,45.79817],[7.03125,45.9053],[7.55859,45.9817],[7.77832,45.93587],[8.12988,46.13417],[8.08594,46.30141],[8.48145,46.46813],[8.61328,46.13417],[8.81104,46.10371],[9.05273,45.8288],[9.07471,46.11894],[9.27246,46.25585],[9.25049,46.43786],[9.44824,46.49839],[9.49219,46.31658],[9.68994,46.31658],[9.95361,46.36209],[10.06348,46.17983],[10.17334,46.25585],[10.0415,46.453],[10.08545,46.60417],[10.26123,46.66452],[10.45898,46.49839],[10.50293,46.61926],[10.39307,46.70974],[10.41504,46.86019],[10.61279,46.87521],[11.03027,46.76997],[11.16211,46.93526],[11.27197,46.99524],[11.53564,47.01023],[11.7334,46.99524],[12.2168,47.10004],[12.15088,46.93526],[12.43652,46.70974],[12.96387,46.61926],[13.73291,46.54375],[13.71094,46.42271],[13.40332,46.33176],[13.40332,46.22545],[13.66699,46.17983],[13.51318,46.05799],[13.64502,45.96642],[13.5791,45.85941],[13.93066,45.64477],[13.82629,45.5756],[13.6,45.6294],[12.9,45.4],[12.8,45],[18.9,40.3],[18.5,39],[15,36],[11,38],[9.6,43.2],[7.6,43.5]]]}},IT_Lazio:{type:"Feature",id:"IT_Lazio",properties:{},geometry:{type:"Polygon",coordinates:[[[13.23814,42.1301],[13.19363,42.15923],[13.17062,42.15169],[13.12434,42.17797],[13.08798,42.17886],[13.08575,42.14318],[13.0317,42.12309],[13.01946,42.07634],[13.05545,42.01736],[13.10194,42.00898],[13.10589,42.02698],[13.36437,41.92475],[13.384,41.90419],[13.35751,41.8694],[13.38052,41.81709],[13.4169,41.83467],[13.50508,41.8016],[13.52044,41.77297],[13.57182,41.7543],[13.66214,41.81144],[13.70555,41.78747],[13.72956,41.7989],[13.7629,41.7488],[13.81162,41.75426],[13.85645,41.73124],[13.89541,41.73405],[13.98311,41.66238],[14.01182,41.60835],[13.99895,41.57448],[14.02596,41.55567],[14.00526,41.53875],[14.0275,41.52321],[13.97291,41.49404],[13.99278,41.48208],[13.9779,41.46249],[13.90257,41.42273],[13.86123,41.41763],[13.8886,41.40081],[13.8688,41.36272],[13.88974,41.29748],[13.82898,41.28154],[13.83083,41.2502],[13.77126,41.24136],[13.45667,40.77769],[11.52381,41.03693],[11.44922,42.37798],[11.48889,42.43937],[11.61771,42.43604],[11.61626,42.48862],[11.56011,42.51595],[11.58852,42.54226],[11.57917,42.56803],[11.61401,42.55723],[11.64337,42.56635],[11.71111,42.61091],[11.73597,42.60666],[11.74975,42.63965],[11.80478,42.644],[11.77554,42.70951],[11.80156,42.70719],[11.81949,42.74543],[11.74602,42.78576],[11.77424,42.82107],[11.80685,42.79485],[11.8137,42.82267],[11.84851,42.84008],[11.90558,42.8325],[11.92743,42.78092],[11.97948,42.76459],[11.96293,42.72669],[11.9301,42.71295],[11.94133,42.6833],[12.03,42.64324],[12.10666,42.66464],[12.12406,42.64929],[12.16101,42.67691],[12.20434,42.66046],[12.24292,42.62906],[12.22819,42.61077],[12.24626,42.60256],[12.23866,42.57218],[12.27504,42.55991],[12.26676,42.53347],[12.29027,42.51904],[12.27477,42.50921],[12.30735,42.4973],[12.29041,42.49164],[12.32537,42.49476],[12.35123,42.47365],[12.39017,42.49819],[12.41905,42.49765],[12.41244,42.46756],[12.43038,42.45802],[12.41368,42.45517],[12.41365,42.4256],[12.4636,42.42909],[12.44469,42.39882],[12.51169,42.40311],[12.52874,42.36445],[12.60642,42.40245],[12.61481,42.46511],[12.64109,42.4678],[12.6495,42.44331],[12.67465,42.44242],[12.74156,42.47053],[12.71114,42.50079],[12.89273,42.5635],[12.88052,42.60935],[13.00524,42.61622],[13.02522,42.64],[13.06423,42.62427],[13.13,42.66053],[13.14645,42.64714],[13.17506,42.66707],[13.19025,42.73363],[13.25415,42.72145],[13.2645,42.74019],[13.28589,42.74049],[13.35851,42.69533],[13.35059,42.66968],[13.37022,42.6507],[13.4092,42.64383],[13.39493,42.59223],[13.29421,42.5705],[13.28454,42.58349],[13.24686,42.57367],[13.19228,42.58849],[13.15673,42.54102],[13.17934,42.48031],[13.11708,42.44489],[13.19508,42.39017],[13.15427,42.35797],[13.22737,42.32031],[13.23563,42.27871],[13.28229,42.23874],[13.33653,42.22338],[13.34238,42.19939],[13.3808,42.18142],[13.34871,42.17689],[13.35488,42.16769],[13.32819,42.16483],[13.30621,42.13923],[13.23814,42.1301]]]}},IT_Roma_Capitale:{type:"Feature",id:"IT_Roma_Capitale",properties:{},geometry:{type:"Polygon",coordinates:[[[11.6,42.16],[12.28,42.2],[12.52,42.31],[13.27,41.92],[13.15,41.58],[12.6,41.16],[11.6,42.16]]]}},south_tyrol:{type:"Feature",id:"south_tyrol",properties:{},geometry:{type:"Polygon",coordinates:[[[10.45624,46.86582],[10.73639,46.89211],[10.82977,46.80946],[10.96161,46.81322],[11.1319,46.99149],[11.49067,47.01233],[11.68121,47.04018],[11.7691,47.01023],[12.16736,47.115],[12.28546,47.08322],[12.18384,46.98213],[12.30469,46.85831],[12.37335,46.73421],[12.49969,46.67017],[12.34039,46.61737],[12.08771,46.64944],[12.0163,46.52297],[11.8515,46.49272],[11.66336,46.48657],[11.56929,46.34077],[11.399,46.25585],[11.18958,46.21072],[11.13739,46.2867],[11.20193,46.44732],[10.91904,46.42603],[10.61966,46.43833],[10.44113,46.49036],[10.36766,46.68854],[10.45624,46.86582]]]}},trentino:{type:"Feature",id:"trentino",properties:{},geometry:{type:"Polygon",coordinates:[[[10.49332,46.35641],[10.59219,46.46624],[10.76317,46.49697],[10.84076,46.45536],[11.07971,46.54469],[11.23627,46.50123],[11.21086,46.32559],[11.1779,46.27341],[11.23352,46.2473],[11.32416,46.30235],[11.5583,46.40378],[11.62628,46.5069],[11.83502,46.54233],[11.91399,46.44306],[11.85356,46.34124],[11.99158,46.18363],[11.84464,46.08466],[11.72791,46.07704],[11.69907,45.95592],[11.51093,45.97979],[11.28845,45.8814],[11.21567,45.76273],[11.16074,45.68316],[10.90256,45.66013],[10.82016,45.71097],[10.84076,45.81827],[10.51529,45.76752],[10.41504,46.00269],[10.51941,46.2112],[10.49332,46.35641]]]}},kosovo:{type:"Feature",id:"kosovo",properties:{},geometry:{type:"Polygon",coordinates:[[[20.68323,41.85101],[20.64878,41.8621],[20.62895,41.87788],[20.59321,41.87344],[20.5834,41.88906],[20.57131,41.92032],[20.61548,41.94279],[20.61932,41.97284],[20.60727,41.98358],[20.58959,42.03994],[20.56682,42.05515],[20.55,42.08081],[20.5618,42.12415],[20.51171,42.21912],[20.4557,42.26696],[20.40232,42.28017],[20.39286,42.29328],[20.35016,42.30573],[20.34327,42.32034],[20.32919,42.32272],[20.30564,42.30975],[20.28975,42.31841],[20.25651,42.31381],[20.23897,42.32339],[20.24172,42.33451],[20.23137,42.34709],[20.24041,42.36756],[20.20299,42.40034],[20.2216,42.42031],[20.18897,42.44976],[20.18995,42.46123],[20.16241,42.50248],[20.09905,42.52756],[20.07781,42.55062],[20.05218,42.55643],[20.0611,42.56636],[20.07983,42.63561],[20.09833,42.65387],[20.02597,42.70293],[20.01357,42.73718],[20.0294,42.76543],[20.05828,42.77918],[20.17177,42.77208],[20.25749,42.77015],[20.26633,42.81006],[20.26709,42.81838],[20.40458,42.85177],[20.48421,42.87209],[20.52629,42.8857],[20.48117,42.92979],[20.48712,42.94371],[20.52036,42.97599],[20.538,42.97944],[20.54736,42.96696],[20.56759,43.00047],[20.59714,43.01791],[20.61815,43.00738],[20.63582,43.01263],[20.65529,43.03791],[20.66666,43.05941],[20.65555,43.06668],[20.65535,43.07614],[20.69024,43.09046],[20.68474,43.11734],[20.6571,43.13426],[20.60822,43.17079],[20.59313,43.19966],[20.59288,43.20807],[20.60326,43.21586],[20.61577,43.20947],[20.6759,43.21404],[20.71781,43.23861],[20.72976,43.25396],[20.78861,43.2509],[20.79902,43.26973],[20.82402,43.27416],[20.88056,43.23237],[20.89633,43.2064],[20.89185,43.19741],[20.86038,43.18418],[20.88322,43.17221],[20.968,43.12786],[20.97317,43.13725],[21.00171,43.14304],[21.02916,43.13467],[21.05505,43.11374],[21.0768,43.12108],[21.0795,43.1332],[21.09221,43.14057],[21.11813,43.11808],[21.14314,43.11815],[21.15722,43.09497],[21.14943,43.08237],[21.15915,43.04152],[21.17346,43.02927],[21.17228,43.01229],[21.18865,43.01181],[21.19528,43.02655],[21.20838,43.03051],[21.24098,43.01253],[21.25156,42.98139],[21.24127,42.95446],[21.27793,42.90132],[21.30679,42.91192],[21.33168,42.90934],[21.34717,42.90549],[21.36699,42.87815],[21.44,42.87777],[21.44185,42.85103],[21.43,42.84464],[21.42818,42.80712],[21.41748,42.77388],[21.39541,42.75691],[21.39835,42.75158],[21.45096,42.75723],[21.46671,42.74511],[21.48212,42.7524],[21.53015,42.73143],[21.56111,42.74322],[21.59623,42.731],[21.59439,42.7097],[21.67045,42.68104],[21.68037,42.6972],[21.73393,42.71782],[21.7767,42.72243],[21.77888,42.69807],[21.80449,42.65599],[21.77972,42.64209],[21.77173,42.62838],[21.77008,42.60166],[21.75125,42.58434],[21.75095,42.55505],[21.72961,42.54235],[21.70728,42.54294],[21.70222,42.53272],[21.71414,42.51308],[21.69423,42.49888],[21.67446,42.49033],[21.67458,42.48071],[21.62857,42.45056],[21.65142,42.40951],[21.62852,42.37199],[21.57112,42.35813],[21.5391,42.36425],[21.53133,42.33801],[21.56671,42.3189],[21.59596,42.27006],[21.58272,42.25167],[21.52186,42.23975],[21.50594,42.2651],[21.44573,42.27489],[21.43843,42.25552],[21.44638,42.23142],[21.43208,42.22775],[21.39412,42.24212],[21.3493,42.20076],[21.33667,42.1989],[21.33915,42.18753],[21.30895,42.13871],[21.32219,42.10706],[21.30296,42.10363],[21.29279,42.10824],[21.25722,42.08817],[21.23557,42.08617],[21.21595,42.09461],[21.20791,42.12657],[21.16719,42.1714],[21.16274,42.19266],[21.11303,42.20093],[21.05269,42.16308],[21.02143,42.14681],[20.92263,42.12229],[20.89259,42.09216],[20.83556,42.08285],[20.79199,42.07669],[20.76879,42.04106],[20.77208,41.95756],[20.77892,41.91873],[20.74544,41.8779],[20.68323,41.85101]]]}},norway:{type:"Feature",id:"norway",properties:{},geometry:{type:"Polygon",coordinates:[[[25.98816,69.6179],[25.24109,68.60752],[20.42908,68.97318],[16.9519,67.9499],[13.77686,64.59561],[14.28223,64.47279],[14.08447,63.99524],[13.02979,64.10101],[12.00806,63.2633],[12.14813,61.6586],[12.87323,61.31245],[12.67548,61.0636],[12.26074,61.00241],[12.60681,60.50593],[12.49146,60.08128],[12.17285,59.88756],[11.87622,59.84895],[11.94214,59.69547],[11.6922,59.58998],[11.84601,59.25044],[11.64276,58.89471],[11.45325,58.88194],[11.44775,59.00168],[11.34888,59.11254],[11.18134,59.08009],[11.06186,58.97054],[8,57.5],[3,57.5],[3,83],[40,83],[35,71],[29.61365,69.28629],[27.98767,69.99711],[25.98816,69.6179]]]}},poland:{type:"Feature",id:"poland",properties:{},geometry:{type:"Polygon",coordinates:[[[14.03,52.84],[14.34,53.26],[14.13,54.16],[15.95,54.52],[16.31,54.76],[17.13,54.97],[18.29,55.08],[18.9,54.98],[19.69,54.5],[21.47,54.37],[22.9,54.46],[23.39,54.3],[24.01,53.17],[24.03,52.71],[23.29,52.3],[23.74,52.09],[23.64,51.61],[24.24,50.86],[24.11,50.41],[23.78,50.34],[22.77,49.55],[22.96,48.97],[22.18,49.1],[21.6,49.38],[20.93,49.24],[20.47,49.34],[20.12,49.13],[19.76,49.14],[19.45,49.51],[18.94,49.34],[18.48,49.85],[17.83,49.92],[17.54,50.21],[17.06,50.35],[17.08,50.18],[16.65,50.05],[16.11,50.41],[16.3,50.6],[16.01,50.54],[15.34,50.73],[15.14,50.93],[14.78,50.82],[14.94,51.27],[14.5,51.81],[14.66,52.05],[14.53,52.57],[14.03,52.84]]]}},slovenia:{type:"Feature",id:"slovenia",properties:{},geometry:{type:"Polygon",coordinates:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.37688,45.56647],[13.63953,45.6426],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]]}},spain:{type:"Feature",id:"spain",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-19,29],[-13,30],[-13,29],[-14,27.8],[-19,27],[-19,29]]],[[[-8.89106,41.82289],[-10,44],[-4,44],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[5,40],[4,39],[-2.2,36.5],[-5.6,35.95],[-6,36],[-7.37535,37.15354],[-7.40832,37.16822],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]]]}},sweden:{type:"Feature",id:"sweden",properties:{},geometry:{type:"Polygon",coordinates:[[[10.57159,58.2445],[10.63202,58.9245],[11.35712,59.12804],[11.53839,58.91174],[11.62079,58.92308],[11.75812,59.24341],[11.65649,59.61777],[11.85974,59.7121],[11.82129,59.84481],[11.95862,59.91098],[12.15363,59.91235],[12.44476,60.0895],[12.48322,60.32151],[12.56012,60.50458],[12.36511,60.71217],[12.19482,61.01572],[12.64801,61.09415],[12.82928,61.34276],[12.55463,61.55018],[12.42828,61.54495],[12.12341,61.71331],[12.28546,62.26664],[12.03278,62.60851],[12.10968,62.74718],[12.06024,62.89772],[12.18658,62.99765],[11.95587,63.28183],[12.18109,63.47873],[12.1344,63.59012],[12.659,63.9856],[12.90619,64.0722],[13.20831,64.10461],[13.9801,64.03014],[14.06525,64.46214],[13.60382,64.56968],[14.26025,65.11608],[14.31519,65.23831],[14.45251,65.31412],[14.47998,65.62656],[14.57886,65.80953],[14.49097,66.15163],[14.99634,66.17161],[15.4248,66.29337],[15.33691,66.51107],[16.04004,66.93221],[16.37512,67.06743],[16.35864,67.21467],[16.06201,67.42015],[16.1499,67.52957],[16.37512,67.55266],[16.70471,67.91688],[17.25952,68.13067],[17.88025,67.99523],[18.09448,68.19809],[18.06702,68.54432],[18.39661,68.58848],[19.00085,68.52019],[19.89075,68.39109],[20.13245,68.48798],[19.89075,68.55637],[20.28076,68.78613],[19.99512,69.06268],[20.62134,69.08033],[20.86853,69.03518],[21.24756,68.8437],[21.92322,68.60652],[22.90649,68.39514],[23.73596,67.96639],[23.5437,67.8362],[23.62061,67.47492],[23.79639,67.44544],[23.81287,67.26992],[23.63159,67.23806],[24.04358,66.82868],[23.91174,66.57448],[23.71399,66.31986],[24.22485,65.97333],[24.04358,65.64469],[21.00586,63.63894],[18.57239,61.83023],[19.18762,60.53297],[19.11346,60.18387],[19.66827,59.82687],[19.90173,58.07788],[18.78662,56.9869],[16.73218,56.05977],[15.0238,55.72711],[14.36462,55.31977],[13.1163,55.22276],[12.7002,55.30414],[12.82654,55.57834],[12.84851,55.72402],[12.79358,55.83214],[12.6123,56.0751],[12.49146,56.13331],[12.07947,56.30435],[11.35437,57.67185],[10.57159,58.2445]]]}},east_midlands_uk:{type:"Feature",id:"east_midlands_uk",properties:{},geometry:{type:"Polygon",coordinates:[[[0.03031,53.53488],[0.28564,53.56315],[0.48889,53.10722],[0.27299,52.82421],[0.24507,52.7845],[0.27219,52.77279],[0.18631,52.73533],[0.14206,52.7399],[0.08901,52.72361],[0.06361,52.72737],[0.04413,52.71436],[0.04883,52.68175],[0.02104,52.66476],[-0.03129,52.66151],[-0.06373,52.67521],[-0.08777,52.66676],[-0.10221,52.67218],[-0.14108,52.65149],[-0.18003,52.66054],[-0.19288,52.65242],[-0.20605,52.66805],[-0.26064,52.65139],[-0.28925,52.67025],[-0.335,52.67485],[-0.35023,52.66159],[-0.40569,52.64802],[-0.45065,52.65411],[-0.49897,52.63931],[-0.52006,52.64143],[-0.55014,52.61223],[-0.54419,52.59287],[-0.55813,52.59447],[-0.57192,52.58579],[-0.58149,52.59587],[-0.58865,52.58679],[-0.60303,52.58857],[-0.66093,52.56893],[-0.69783,52.5457],[-0.71564,52.52237],[-0.75723,52.51093],[-0.77488,52.51826],[-0.82013,52.51552],[-0.86871,52.52699],[-0.88346,52.51395],[-0.88214,52.49315],[-0.89806,52.4869],[-0.88241,52.47127],[-0.90065,52.45994],[-0.94219,52.46777],[-0.95192,52.47741],[-1.0007,52.47092],[-1.04452,52.44573],[-1.03429,52.43627],[-1.04987,52.42225],[-1.08439,52.43628],[-1.12928,52.41609],[-1.14947,52.39701],[-1.20141,52.39648],[-1.30715,52.49423],[-1.52226,52.57033],[-1.52716,52.58272],[-1.56075,52.59612],[-1.55447,52.61472],[-1.57139,52.6353],[-1.54714,52.64218],[-1.54245,52.65362],[-1.55281,52.66845],[-1.58965,52.68724],[-1.59082,52.69801],[-1.65505,52.69878],[-1.65662,52.72173],[-1.70372,52.7298],[-1.69687,52.75272],[-1.66654,52.78471],[-1.61113,52.78139],[-1.61435,52.78826],[-1.58887,52.79985],[-1.59183,52.80947],[-1.6105,52.81639],[-1.58536,52.8317],[-1.62672,52.85441],[-1.69028,52.86445],[-1.70061,52.86057],[-1.70435,52.86666],[-1.72527,52.85964],[-1.77712,52.88377],[-1.79092,52.88023],[-1.80186,52.88613],[-1.81171,52.88058],[-1.83295,52.8869],[-1.85422,52.93063],[-1.82982,52.94565],[-1.82678,52.97707],[-1.76257,52.99965],[-1.75775,53.01698],[-1.75978,53.03869],[-1.7847,53.04991],[-1.77566,53.05933],[-1.79424,53.08837],[-1.78373,53.10281],[-1.82144,53.13579],[-1.81254,53.15432],[-1.8393,53.1769],[-1.87403,53.19536],[-1.95671,53.21373],[-1.96237,53.22622],[-1.9896,53.21572],[-1.97486,53.23106],[-2.00948,53.26065],[-2.00679,53.35457],[-2.009,53.36201],[-2.03173,53.36573],[-2.03385,53.37517],[-2.00464,53.38633],[-1.99233,53.41519],[-2.02371,53.42055],[-2.02738,53.43233],[-2.01366,53.43988],[-2.00422,53.43592],[-2.00823,53.44155],[-1.98579,53.45523],[-1.98809,53.48033],[-1.97428,53.48838],[-1.97159,53.50434],[-1.92197,53.50995],[-1.92678,53.52095],[-1.91189,53.53803],[-1.89411,53.5336],[-1.87349,53.54041],[-1.84182,53.51989],[-1.82223,53.52108],[-1.80428,53.537],[-1.77188,53.53384],[-1.74155,53.54105],[-1.72318,53.55991],[-1.66945,53.5532],[-1.65103,53.56166],[-1.61581,53.56305],[-1.59636,53.57692],[-1.59109,53.60677],[-1.55023,53.60421],[-1.53078,53.59311],[-1.51867,53.5997],[-1.49656,53.59736],[-1.49512,53.60317],[-1.48371,53.59485],[-1.44763,53.61272],[-1.40036,53.59865],[-1.3767,53.60646],[-1.35612,53.59535],[-1.35143,53.58106],[-1.30782,53.57535],[-1.25803,53.59198],[-1.24825,53.61634],[-1.21778,53.62429],[-1.21602,53.642],[-1.1886,53.63583],[-1.15503,53.64319],[-1.13504,53.63254],[-1.12095,53.64688],[-0.99046,53.6612],[-0.94448,53.65868],[-0.86533,53.63769],[-0.89792,53.58325],[-0.90111,53.5687],[-0.89099,53.56654],[-0.90126,53.54788],[-0.89233,53.53738],[-0.94654,53.52732],[-0.95001,53.51363],[-0.93209,53.51065],[-0.93557,53.5025],[-0.90047,53.47513],[-0.92046,53.46446],[-0.87373,53.46146],[-0.87192,53.46629],[-0.79748,53.45504],[-0.78436,53.46336],[-0.78439,53.47665],[-0.77157,53.47918],[-0.76811,53.4989],[-0.75211,53.50051],[-0.73959,53.51991],[-0.62449,53.51282],[-0.62975,53.45819],[-0.55179,53.4595],[-0.47175,53.47485],[-0.48663,53.48045],[-0.48838,53.50484],[-0.40507,53.51759],[-0.40814,53.53208],[-0.43066,53.54631],[-0.50123,53.53744],[-0.46702,53.54894],[-0.429,53.5745],[-0.41967,53.56375],[-0.33594,53.5586],[-0.30342,53.59077],[-0.30093,53.61636],[-0.24847,53.59364],[-0.25139,53.58463],[-0.23466,53.58623],[-0.22255,53.56799],[-0.19169,53.56844],[-0.21988,53.53258],[-0.21059,53.53168],[-0.20408,53.51174],[-0.2106,53.48626],[-0.18856,53.48451],[-0.1818,53.46862],[-0.15368,53.46565],[-0.14923,53.44667],[-0.13188,53.43591],[-0.12034,53.43357],[-0.08221,53.45112],[-0.10786,53.46987],[-0.0898,53.47765],[-0.09548,53.48596],[-0.07526,53.48931],[-0.06493,53.51878],[-0.01452,53.51538],[0.03031,53.53488]]]}},"england-west-midlands":{type:"Feature",id:"england-west-midlands",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.28493,52.44175],[-3.12706,52.96995],[-1.95817,53.27605],[-1.1222,52.36367],[-1.59859,51.90733],[-2.65611,51.7761],[-3.10848,51.95414],[-3.28493,52.44175]]]}},london_uk:{type:"Feature",id:"london_uk",properties:{},geometry:{type:"Polygon",coordinates:[[[0.23926,51.43251],[0.23923,51.43329],[0.23926,51.43251],[0.23717,51.4241],[0.205,51.39919],[0.18385,51.37628],[0.16188,51.36621],[0.15614,51.3539],[0.1603,51.31026],[0.14958,51.30173],[0.14213,51.29098],[0.06692,51.27361],[-0.01594,51.26864],[-0.05766,51.2586],[-0.10949,51.25943],[-0.16628,51.26848],[-0.19872,51.25854],[-0.22666,51.2587],[-0.27352,51.28757],[-0.31813,51.30077],[-0.33644,51.31532],[-0.40313,51.30581],[-0.44436,51.31987],[-0.47985,51.3302],[-0.50762,51.37142],[-0.53414,51.39494],[-0.54109,51.42774],[-0.53264,51.43923],[-0.5152,51.46248],[-0.49617,51.48894],[-0.50203,51.53945],[-0.5278,51.55474],[-0.53166,51.5611],[-0.53569,51.57289],[-0.53596,51.5778],[-0.53455,51.58275],[-0.53376,51.58792],[-0.51516,51.6337],[-0.49776,51.65205],[-0.4901,51.66912],[-0.45924,51.67692],[-0.44684,51.69442],[-0.42579,51.71213],[-0.39306,51.715],[-0.38079,51.71654],[-0.34459,51.70948],[-0.2838,51.71515],[-0.26707,51.71395],[-0.23509,51.69056],[-0.22093,51.68445],[-0.17729,51.68441],[-0.10644,51.69165],[-0.05899,51.68257],[0.02324,51.678],[0.0691,51.68854],[0.10856,51.68336],[0.19863,51.65015],[0.25714,51.61353],[0.28187,51.57813],[0.29039,51.55903],[0.26811,51.50265],[0.26882,51.49783],[0.26782,51.49042],[0.2659,51.47443],[0.25509,51.46053],[0.23586,51.44791],[0.23926,51.43251]]]}},united_kingdom:{type:"Feature",id:"united_kingdom",properties:{name:"United Kingdom",source:"OpenStreetMap"},geometry:{type:"Polygon",coordinates:[[[-7.24863,55.06999],[-6.96705,55.19847],[-6.59182,55.36664],[-9.93166,58.01975],[0.32957,61.43878],[2.43894,51.64531],[0.72508,50.42953],[-7.66848,49.03788],[-5.93264,51.46771],[-5.4053,53.54032],[-6.07527,54.0096],[-6.28173,54.11135],[-6.309,54.10669],[-6.31788,54.09098],[-6.33629,54.09472],[-6.33993,54.11189],[-6.3662,54.11374],[-6.36237,54.0766],[-6.37492,54.06914],[-6.37907,54.06909],[-6.37911,54.06907],[-6.37918,54.06902],[-6.39105,54.05885],[-6.41198,54.06306],[-6.44345,54.05649],[-6.45607,54.07252],[-6.47779,54.07709],[-6.4713,54.0663],[-6.51051,54.05268],[-6.53187,54.05968],[-6.55772,54.04917],[-6.58643,54.05757],[-6.59499,54.04462],[-6.62381,54.03646],[-6.66426,54.06917],[-6.66202,54.09283],[-6.64506,54.096],[-6.66127,54.12266],[-6.64886,54.12138],[-6.63961,54.13187],[-6.63436,54.16317],[-6.66539,54.19316],[-6.70601,54.20005],[-6.72106,54.18197],[-6.74076,54.18192],[-6.75617,54.19926],[-6.77562,54.19895],[-6.80097,54.21317],[-6.80042,54.2211],[-6.81617,54.22302],[-6.82774,54.26149],[-6.87804,54.27924],[-6.87229,54.28794],[-6.859,54.28191],[-6.85087,54.29728],[-6.87594,54.34641],[-6.90626,54.3503],[-6.91129,54.37474],[-6.93074,54.37575],[-6.9237,54.38284],[-6.95963,54.39221],[-6.98165,54.40946],[-6.99601,54.40538],[-7.0291,54.42137],[-7.05724,54.41108],[-7.07234,54.38839],[-7.10979,54.36824],[-7.10388,54.35574],[-7.15344,54.33501],[-7.18882,54.33765],[-7.17974,54.32046],[-7.17949,54.30924],[-7.19789,54.31106],[-7.21219,54.29962],[-7.17302,54.28613],[-7.17937,54.2726],[-7.16092,54.27371],[-7.14225,54.25559],[-7.15893,54.24396],[-7.14594,54.23957],[-7.14503,54.22473],[-7.17104,54.2176],[-7.18808,54.22492],[-7.1986,54.21578],[-7.22085,54.21581],[-7.23182,54.20557],[-7.24806,54.20446],[-7.24915,54.19817],[-7.233,54.19784],[-7.25942,54.19225],[-7.25828,54.17737],[-7.24028,54.1697],[-7.25812,54.16451],[-7.26296,54.13741],[-7.29195,54.11911],[-7.30891,54.13211],[-7.28551,54.13626],[-7.30149,54.14421],[-7.28379,54.15386],[-7.27997,54.16797],[-7.2913,54.17196],[-7.33956,54.14672],[-7.30533,54.12336],[-7.31867,54.11329],[-7.32713,54.12458],[-7.34602,54.11645],[-7.3632,54.1316],[-7.39181,54.12013],[-7.37279,54.13963],[-7.42078,54.13705],[-7.40959,54.15646],[-7.44192,54.15409],[-7.46841,54.14081],[-7.47919,54.12227],[-7.5281,54.13574],[-7.54738,54.12214],[-7.56576,54.12659],[-7.57454,54.14151],[-7.61043,54.14378],[-7.62966,54.1703],[-7.66425,54.18797],[-7.67659,54.18196],[-7.68829,54.20197],[-7.68543,54.20776],[-7.7394,54.20353],[-7.74858,54.20942],[-7.80368,54.20707],[-7.81173,54.20073],[-7.86017,54.21728],[-7.86046,54.26026],[-7.87322,54.27945],[-7.86187,54.29343],[-7.88087,54.29188],[-7.9017,54.30143],[-7.91095,54.29595],[-7.9616,54.31247],[-8.00093,54.35846],[-8.03129,54.35671],[-8.05733,54.36572],[-8.08416,54.39741],[-8.16026,54.44028],[-8.14291,54.45092],[-8.17751,54.46476],[-8.11467,54.46903],[-8.11324,54.4764],[-8.09148,54.47653],[-8.09868,54.48433],[-8.08933,54.48708],[-8.04265,54.48763],[-8.04185,54.50638],[-8.00601,54.54594],[-7.9703,54.54705],[-7.94973,54.53363],[-7.85055,54.53313],[-7.82402,54.54427],[-7.83325,54.55223],[-7.79659,54.57163],[-7.79341,54.58188],[-7.76212,54.58588],[-7.75151,54.59878],[-7.69725,54.61007],[-7.70877,54.63495],[-7.74165,54.61797],[-7.75797,54.62503],[-7.77236,54.62149],[-7.81366,54.64411],[-7.82828,54.63305],[-7.85213,54.63078],[-7.85669,54.65057],[-7.89164,54.65594],[-7.9099,54.66828],[-7.91381,54.67596],[-7.89766,54.68701],[-7.92089,54.69596],[-7.91804,54.70282],[-7.8796,54.70269],[-7.83665,54.73642],[-7.81761,54.73378],[-7.8047,54.7186],[-7.78875,54.71964],[-7.75006,54.70428],[-7.73551,54.71683],[-7.7116,54.72611],[-7.69723,54.72356],[-7.63657,54.75151],[-7.60944,54.74415],[-7.59117,54.74438],[-7.57919,54.75047],[-7.57865,54.74191],[-7.5698,54.74384],[-7.54826,54.74101],[-7.53859,54.751],[-7.54804,54.75711],[-7.54795,54.78835],[-7.52847,54.80757],[-7.47096,54.8348],[-7.44188,54.87561],[-7.45258,54.89849],[-7.44727,54.93524],[-7.39202,54.94545],[-7.4072,54.95521],[-7.4027,54.96689],[-7.40705,54.98294],[-7.39135,54.99774],[-7.40558,55.00332],[-7.37023,55.03476],[-7.34516,55.05083],[-7.31828,55.04507],[-7.29947,55.0561],[-7.28944,55.04771],[-7.27251,55.06357],[-7.24863,55.06999]]]}},canada_full:{type:"Feature",id:"canada_full",properties:{},geometry:{type:"Polygon",coordinates:[[[-140.99854,69.64945],[-120.9375,78.7335],[-91.05469,82.7432],[-75.58594,83.40004],[-63.45703,83.15311],[-59.32617,82.37915],[-63.76465,81.42049],[-67.19238,80.79583],[-73.21289,78.85307],[-74.9707,76.33114],[-61.34766,70.75797],[-50.1416,46.67959],[-65.98389,42.85181],[-66.95892,44.48769],[-66.9397,44.81692],[-67.13745,45.15493],[-67.26379,45.18591],[-67.31873,45.1278],[-67.43958,45.21881],[-67.44507,45.58329],[-67.79114,45.67164],[-67.78015,47.07012],[-68.19763,47.35743],[-68.39539,47.35743],[-68.37891,47.29413],[-68.90625,47.17478],[-69.06006,47.23449],[-69.08203,47.43552],[-69.22485,47.46524],[-70.00488,46.70974],[-70.05981,46.41514],[-70.18066,46.36209],[-70.3125,46.21025],[-70.24658,46.14178],[-70.3125,45.97406],[-70.26855,45.91294],[-70.42236,45.80583],[-70.42236,45.72152],[-70.71899,45.49865],[-70.62012,45.38302],[-70.80688,45.4293],[-70.85083,45.22848],[-71.00464,45.3367],[-71.1145,45.25169],[-71.26831,45.29035],[-71.41113,45.24395],[-71.5155,45.0153],[-74.81689,45.0153],[-75.31128,44.84808],[-75.7782,44.51218],[-75.82214,44.4377],[-76.43188,44.09942],[-76.79993,43.63011],[-78.68683,43.63806],[-79.19495,43.45292],[-79.07204,43.26521],[-79.05693,43.25671],[-79.04594,43.13807],[-79.06998,43.12103],[-79.06311,43.11652],[-79.05693,43.10951],[-79.07616,43.08393],[-79.07684,43.07691],[-79.01505,43.06839],[-78.99719,43.05785],[-79.02672,43.02071],[-79.01779,42.98456],[-78.98003,42.97099],[-78.96423,42.95843],[-78.93402,42.95542],[-78.91136,42.93883],[-78.90518,42.90011],[-78.93127,42.82361],[-80.07935,42.38289],[-81.27686,42.20818],[-82.39197,41.68112],[-82.68311,41.67701],[-83.07861,41.86547],[-83.15552,42.03909],[-83.12531,42.12064],[-83.13904,42.23462],[-83.07587,42.31185],[-82.98523,42.33418],[-82.81219,42.37478],[-82.63916,42.56117],[-82.59521,42.54903],[-82.52655,42.61375],[-82.41669,43.00063],[-82.13379,43.59631],[-82.51831,45.34442],[-83.59772,45.82114],[-83.43567,45.99696],[-83.57162,46.10847],[-83.65402,46.12275],[-83.76663,46.10466],[-83.82843,46.11989],[-83.89984,46.06084],[-83.95615,46.05989],[-83.974,46.1018],[-84.00833,46.11609],[-84.00696,46.14559],[-84.07974,46.18934],[-84.10995,46.24065],[-84.0976,46.25585],[-84.11545,46.26724],[-84.12094,46.31564],[-84.10309,46.32038],[-84.13467,46.36115],[-84.14841,46.42082],[-84.10995,46.50359],[-84.12781,46.531],[-84.14085,46.53241],[-84.17313,46.52722],[-84.19373,46.54092],[-84.226,46.53525],[-84.26582,46.49603],[-84.2926,46.49225],[-84.34135,46.50595],[-84.37225,46.50879],[-84.44023,46.49036],[-84.47662,46.45489],[-84.55353,46.45867],[-84.76776,46.62492],[-84.84741,46.88272],[-88.38501,48.31243],[-89.32983,47.96786],[-93.21899,48.64743],[-93.80127,48.5166],[-93.83423,48.63291],[-94.6637,48.75257],[-94.8175,49.32691],[-95.15259,49.38595],[-95.15533,49.00184],[-123.31879,49.00004],[-122.99469,48.7761],[-123.2666,48.69096],[-123.11279,48.37815],[-123.44238,48.22467],[-124.7168,48.49477],[-128.49609,48.74895],[-131.2207,53.61858],[-130.75928,54.73731],[-129.99023,55.27912],[-130.07813,56.10881],[-131.74805,56.63206],[-135.53833,59.80063],[-137.47192,58.90465],[-138.67493,59.78958],[-138.6969,59.90822],[-139.20227,60.09772],[-139.08142,60.35141],[-139.71863,60.33239],[-139.98779,60.18523],[-140.46021,60.30791],[-140.52063,60.22618],[-141.01501,60.30519],[-140.99854,69.64945]]]}},ottawa_gatineau:{type:"Feature",id:"ottawa_gatineau",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.23413,45.50827],[-76.12839,45.55829],[-75.26184,45.58041],[-75.13412,45.39652],[-75.42938,45.32512],[-75.35385,45.17816],[-75.82489,44.93564],[-76.34537,45.36855],[-76.23413,45.50827]]]}},vancouver_metro:{type:"Feature",id:"vancouver_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.32,49],[-123.45,49.38],[-123.26,49.47],[-122.24,49.27],[-122.2,49],[-123.32,49]]]}},cuba:{type:"Feature",id:"cuba",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.5,21.75],[-83.5,23.5],[-80,23.5],[-73.5,20.4],[-74.5,19.5],[-78,19.5],[-85.5,21.75]]]}},nicaragua:{type:"Feature",id:"nicaragua",properties:{},geometry:{type:"Polygon",coordinates:[[[-88,13],[-87.56104,13.13298],[-87.36877,12.99921],[-86.97876,13.02597],[-86.88538,13.28272],[-86.7041,13.29876],[-86.77002,13.76873],[-86.31409,13.77407],[-86.1438,14.046],[-86.01746,14.05133],[-85.75378,13.89141],[-85.16602,14.31761],[-84.96277,14.80144],[-84.4574,14.63674],[-83.39722,15.03499],[-82.5,14.9],[-82.8,12],[-83.676,10.95],[-83.66,10.8],[-83.92,10.7],[-84.688,11.076],[-84.91,10.945],[-85.615,11.215],[-85.7,11.06],[-86,11.06],[-88,13]]]}},boston_metro:{type:"Feature",id:"boston_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-70.5,41.91],[-71,41.91],[-71.42,42.05],[-71.57,42.18],[-71.64,42.4],[-71.57,42.52],[-71.35,42.64],[-71.1,42.7],[-70.5,42.7],[-70.5,41.91]]]}},central_pa:{type:"Feature",id:"central_pa",properties:{},geometry:{type:"Polygon",coordinates:[[[-78.7,41.5],[-77,41.5],[-76,40],[-76,39.72],[-79.3,39.72],[-78.7,41.5]]]}},chattanooga:{type:"Feature",id:"chattanooga",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.634,34.743],[-85.634,35.282],[-84.933,35.282],[-84.933,34.743],[-85.634,34.743]]]}},cleveland:{type:"Feature",id:"cleveland",properties:{},geometry:{type:"Polygon",coordinates:[[[-82.5,41.5],[-80.95,42],[-80.95,41],[-82.5,41],[-82.5,41.5]]]}},colorado:{type:"Feature",id:"colorado",properties:{},geometry:{type:"Polygon",coordinates:[[[-109.05,37],[-109.05,41],[-102.05,41],[-102.05,37],[-109.05,37]]]}},dc_metro:{type:"Feature",id:"dc_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.04437,38.70266],[-77.27783,38.69409],[-77.57172,38.91668],[-77.61017,39.1258],[-77.27509,39.21523],[-77.08694,39.21204],[-76.87546,39.05119],[-76.69968,38.97863],[-76.71066,38.77657],[-76.84662,38.7048],[-77.04437,38.70266]]]}},dfw_metro:{type:"Feature",id:"dfw_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-97.75,32.25],[-97.75,33.4],[-96,33.4],[-96,32.25],[-97.75,32.25]]]}},grand_junction_co:{type:"Feature",id:"grand_junction_co",properties:{},geometry:{type:"Polygon",coordinates:[[[-109,39.4],[-108.1,39.4],[-107.8,39.16],[-107.8,38.7],[-108.1,38.5],[-109,39],[-109,39.4]]]}},hrva:{type:"Feature",id:"hrva",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.85486,36.53392],[-76.85486,37.35488],[-75.8194,37.35488],[-75.8194,36.53392],[-76.85486,36.53392]]]}},la_metro:{type:"Feature",id:"la_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-118.5,33.7],[-118.68,34.23],[-118.5,34.35],[-118,34.2],[-117.3,34.2],[-117.2,34.1],[-117.37,33.9],[-117.74,33.5],[-118.5,33.7]]]}},massachusetts:{type:"Feature",id:"massachusetts",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.53149,42.9725],[-69.40063,42.9725],[-69.40063,40.98819],[-71.55396,41.04622],[-71.53198,41.91863],[-73.70728,41.91045],[-73.53149,42.9725]]]}},minneapolis_st_paul_metro:{type:"Feature",id:"minneapolis_st_paul_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-93.801,44.578],[-93.801,45.348],[-92.666,45.348],[-92.666,44.578],[-93.801,44.578]]]}},mt_vernon_wa:{type:"Feature",id:"mt_vernon_wa",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.3,49],[-122,49],[-122,48],[-123.2,48.4],[-123.3,49]]]}},nyc_metro:{type:"Feature",id:"nyc_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.73,40.64],[-73.95,41.38],[-73.6,40.95],[-73.25,41],[-73.25,40.6],[-74.43,40.43],[-74.73,40.64]]]}},philly_metro:{type:"Feature",id:"philly_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.7,40.3],[-75.3,40.4],[-74.7,40.3],[-74.45,40.1],[-74.9,39.55],[-75.5,39.55],[-75.8,39.7218],[-76.23,39.7211],[-75.7,40.3]]]}},phoenix:{type:"Feature",id:"phoenix",properties:{},geometry:{type:"Polygon",coordinates:[[[-113,32.7],[-113,34],[-111.1,34],[-111.1,32.7],[-113,32.7]]]}},portland_me:{type:"Feature",id:"portland_me",properties:{},geometry:{type:"Polygon",coordinates:[[[-70.5,42.9],[-71,43.3],[-71,44.2],[-69.6,44.5],[-69,44],[-70.5,42.9]]]}},portland_or:{type:"Feature",id:"portland_or",properties:{},geometry:{type:"Polygon",coordinates:[[[-124.4,44.8],[-124.4,46.3],[-121.5,46.3],[-121.5,44.8],[-124.4,44.8]]]}},salt_lake_city:{type:"Feature",id:"salt_lake_city",properties:{},geometry:{type:"Polygon",coordinates:[[[-112.6,40.75],[-112.3,41.4],[-111.5,41.4],[-111.1,40.3],[-112,39.75],[-112.6,40.75]]]}},seattle:{type:"Feature",id:"seattle",properties:{},geometry:{type:"Polygon",coordinates:[[[-122.15,47.26],[-122.33,47.26],[-122.54,47.33],[-122.52,47.46],[-122.45,47.55],[-122.45,47.8],[-121.2,47.8],[-121.43,47.38],[-121.43,47.14],[-121.94,47.14],[-122,47.17],[-122,47.17],[-122.1,47.19],[-122.15,47.26]]]}},sf_bay_area:{type:"Feature",id:"sf_bay_area",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.5,38.5],[-122.8,38.8],[-121.7,38.2],[-121.5,36.9],[-123,36.9],[-123.5,38.5]]]}},south_sf_bay_area:{type:"Feature",id:"south_sf_bay_area",properties:{},geometry:{type:"Polygon",coordinates:[[[-121.4566,37.48249],[-121.21628,37.17673],[-121.20529,36.95757],[-121.49368,36.95757],[-121.5596,36.8928],[-121.98257,37.12419],[-122.27234,37.39635],[-122.13501,37.48903],[-121.4566,37.48249]]]}},st_louis:{type:"Feature",id:"st_louis",properties:{},geometry:{type:"Polygon",coordinates:[[[-90.28,39.1],[-89.57,39.05],[-89.57,38.18],[-90.58,38],[-91.37,38.2],[-91.37,38.75],[-90.28,39.1]]]}},tampa_bay:{type:"Feature",id:"tampa_bay",properties:{},geometry:{type:"Polygon",coordinates:[[[-83,28.2],[-82.2,28.2],[-82.2,27.55],[-83,27.55],[-83,28.2]]]}},usa_full:{type:"Feature",id:"usa_full",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-124.76179,48.41301],[-123.22752,48.18499],[-123.32289,49.00429],[-96.01312,49.00605],[-95.11054,49.412],[-93.99811,49.00671],[-89.43531,47.98378],[-88.34922,48.29633],[-87.50645,48.01427],[-83.2814,46.13885],[-82.17616,43.58854],[-82.66248,41.68895],[-79.00601,42.80053],[-79.15798,43.44626],[-78.76239,43.62496],[-76.90231,43.80246],[-75.07988,44.98029],[-72.02225,45.00598],[-71.41227,45.25488],[-70.46149,46.21766],[-69.25051,47.51223],[-67.75966,47.099],[-66.94528,44.71049],[-69.84893,43.26199],[-69.87974,40.99205],[-72.00202,40.99125],[-74.02112,39.57279],[-75.41474,35.05319],[-80.02453,32.01613],[-79.89011,26.85507],[-80.02,24.0071],[-84.01601,24.00527],[-84.01656,25.01258],[-81.99666,25.01349],[-81.9972,25.98268],[-84.01879,28.99618],[-86.02775,30.00475],[-88.01625,30.00389],[-88.01567,28.99443],[-90.90285,28.85645],[-93.74053,29.47421],[-95.55633,28.58761],[-96.80617,27.79782],[-96.95553,25.98216],[-97.43502,25.8266],[-98.01091,25.9928],[-99.23511,26.4476],[-100.00624,28.00822],[-101.25529,29.48105],[-102.1514,29.74757],[-102.71736,29.39206],[-103.25189,28.89087],[-104.58819,29.69979],[-105.02053,30.5361],[-106.20525,31.4467],[-106.28689,31.56133],[-106.42932,31.75206],[-106.48421,31.74645],[-106.53072,31.78209],[-108.18711,31.77551],[-108.19927,31.326],[-111.00893,31.33601],[-114.86123,32.47999],[-117.67593,32.46302],[-119.97759,33.00641],[-122.53697,36.85661],[-124.99343,40.05576],[-124.60595,45.90245],[-124.76179,48.41301]]],[[[-160.57876,22.50629],[-159.00937,22.50702],[-157.50474,21.9985],[-156.29276,21.22259],[-154.68902,19.88057],[-154.62178,18.7587],[-155.99619,18.77902],[-157.50832,20.9958],[-158.74706,21.24398],[-160.57822,21.49846],[-160.57876,22.50629]]],[[[-167.1572,68.722],[-164.9717,68.9947],[-163.0218,69.9707],[-160.4136,70.7398],[-156.1769,71.5633],[-140.9684,69.9535],[-140.9874,61.0119],[-139.1716,60.4127],[-138.0072,59.9918],[-135.123,59.7566],[-131.9759,56.9995],[-130.0071,57.0001],[-130.0044,54.0043],[-133.9948,54.0032],[-138.515,57.9986],[-138.516,58.9953],[-151.5013,58.992],[-151.5003,57.9988],[-151.9963,55.9992],[-158.0191,55.0028],[-159.0076,55.0025],[-162.4025,53.9567],[-171.4689,51.8215],[-177.9993,51.2554],[-178.0001,52.2446],[-173.8197,59.7401],[-172.5143,63.8767],[-169.0075,64.9988],[-169.0087,66.0015],[-168.0022,66.0018],[-164.8554,67.0255],[-167.1572,68.722]]],[[[-68.2,17.8],[-67.9,18.67],[-65.33,18.57],[-64.64,18.36],[-64.32,17.38],[-68.2,17.8]]],[[[146.2,15.4],[144.8,12.9],[144.2,13.2],[145.7,15.6],[146.2,15.4]]],[[[180,52.2],[180,51],[172,52.5],[172,53.5],[180,52.2]]]]}},wyoming:{type:"Feature",id:"wyoming",properties:{},geometry:{type:"Polygon",coordinates:[[[-111.05,41],[-111.05,45],[-104.05,45],[-104.05,41],[-111.05,41]]]}},australia_full:{type:"Feature",id:"australia_full",properties:{},geometry:{type:"Polygon",coordinates:[[[146.07422,-44.43378],[131.66016,-44.65302],[124.54102,-41.44273],[116.45508,-39.36828],[108.80859,-39.16414],[103.18359,-27.60567],[95.27344,-24.04646],[96.30615,-11.15685],[106.25977,-9.92557],[116.47705,-13.98738],[122.77222,-11.65224],[126.43066,-11.48002],[129.26514,-9.92557],[134.89014,-9.92557],[139.46045,-10.14193],[141.55334,-9.99861],[141.7868,-9.77132],[142.229,-9.67115],[142.72614,-9.552],[143.30017,-9.39216],[144.24774,-9.24851],[144.44824,-9.59533],[149.5459,-12.68321],[154.90723,-18.02053],[156.42334,-21.55528],[158.02734,-24.68695],[160.0708,-26.03704],[167.34375,-26.6671],[170.354,-29.11378],[168.2666,-30.63791],[160.15869,-34.03445],[152.18262,-38.41056],[149.94141,-43.51669],[146.07422,-44.43378]]]}},argentina:{type:"Feature",id:"argentina",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.14602,-49.18818],[-72.91615,-48.93261],[-72.53201,-48.80072],[-72.58755,-48.48542],[-72.22624,-48.32339],[-72.49784,-47.96155],[-72.33315,-47.44938],[-71.86801,-47.23376],[-71.94851,-46.80983],[-71.64665,-46.68783],[-71.79939,-46.19141],[-71.6147,-45.97522],[-71.79762,-45.62288],[-71.46813,-45.4921],[-71.32472,-45.306],[-71.56043,-44.97863],[-72.04094,-44.90019],[-72.07396,-44.78023],[-71.46969,-44.73753],[-71.23704,-44.79082],[-71.13226,-44.4711],[-71.36469,-44.38958],[-71.80731,-44.42036],[-71.84736,-44.11002],[-71.64902,-43.94552],[-71.75129,-43.78527],[-71.60784,-43.62836],[-71.93082,-43.45685],[-71.76157,-43.1645],[-72.14281,-42.8979],[-72.1812,-42.69735],[-72.023,-42.41766],[-72.17288,-42.14043],[-71.72931,-42.12447],[-71.91021,-41.34113],[-71.8196,-41.06038],[-71.96387,-40.71955],[-71.8414,-40.4521],[-71.65704,-40.36426],[-71.82818,-40.20778],[-71.59266,-39.90123],[-71.67811,-39.56486],[-71.39497,-39.34179],[-71.42542,-38.92164],[-70.92524,-38.76298],[-70.84044,-38.54138],[-70.97623,-38.44222],[-70.98292,-38.10477],[-71.21191,-37.68901],[-71.11983,-37.4585],[-71.21555,-37.27261],[-71.09237,-37.11444],[-71.11982,-36.69792],[-71.03513,-36.47333],[-70.71285,-36.42687],[-70.70501,-36.27229],[-70.42451,-36.15581],[-70.38755,-35.60868],[-70.43201,-35.31842],[-70.58358,-35.27831],[-70.36203,-35.13645],[-70.21683,-34.61145],[-70.01089,-34.41389],[-70.03094,-34.28805],[-69.79507,-34.24304],[-69.90417,-33.77143],[-69.7705,-33.3611],[-70.00282,-33.32294],[-70.08089,-33.02919],[-70.00121,-32.8846],[-70.17038,-32.62555],[-70.14899,-32.46585],[-70.31918,-32.27335],[-70.35277,-32.0257],[-70.2106,-31.95769],[-70.46072,-31.84116],[-70.56691,-31.60016],[-70.49734,-31.12216],[-70.40805,-31.16633],[-70.23998,-30.61575],[-70.11719,-30.43102],[-69.89853,-30.35557],[-69.87492,-29.7043],[-70.01808,-29.38321],[-69.78724,-29.13008],[-69.68114,-28.47172],[-69.45679,-28.18357],[-69.17254,-27.97088],[-68.94231,-27.52325],[-68.8412,-27.15464],[-68.29854,-27.0389],[-68.2638,-26.91623],[-68.58734,-26.49294],[-68.55754,-26.2871],[-68.38108,-26.17822],[-68.57599,-25.42894],[-68.4999,-25.16149],[-68.34279,-25.1124],[-68.56789,-24.79739],[-68.26201,-24.40457],[-67.32231,-24.0344],[-66.99052,-23.00044],[-67.18066,-22.8138],[-67.02827,-22.54089],[-66.78247,-22.43778],[-66.73899,-22.23893],[-66.28793,-22.08605],[-66.24277,-21.79408],[-66.07589,-21.83493],[-65.74764,-22.10912],[-64.99322,-22.08239],[-64.53579,-22.29137],[-64.29933,-22.86509],[-64.24332,-22.56039],[-63.93139,-22],[-62.80617,-22],[-62.7913,-22.16193],[-62.3009,-22.48659],[-62.20671,-22.70418],[-61.73612,-23.23432],[-61.08824,-23.61393],[-60.9899,-23.81808],[-60.37353,-24.024],[-60.03941,-24.01156],[-59.47554,-24.33261],[-59.35397,-24.47821],[-58.67243,-24.83192],[-58.24167,-24.92801],[-57.76089,-25.17193],[-57.555,-25.4484],[-57.74064,-25.65045],[-57.89112,-25.9662],[-58.08473,-26.11185],[-58.22103,-26.41403],[-58.18996,-26.64518],[-58.31991,-26.85821],[-58.64913,-27.12662],[-58.59905,-27.29984],[-57.87482,-27.27527],[-57.48754,-27.44418],[-56.96564,-27.50202],[-56.84926,-27.6063],[-56.60117,-27.42102],[-56.3749,-27.58903],[-56.29432,-27.42003],[-56.06276,-27.306],[-55.73692,-27.44516],[-55.6057,-27.16241],[-55.42284,-26.99528],[-54.78695,-26.63111],[-54.61874,-26.20893],[-54.67933,-25.99524],[-54.65698,-25.67619],[-54.5842,-25.58952],[-54.4812,-25.62543],[-54.108,-25.495],[-53.86217,-25.65902],[-53.83619,-25.97166],[-53.6411,-26.21559],[-53.73094,-26.5097],[-53.67249,-26.91252],[-53.84355,-27.16453],[-53.959,-27.15804],[-54.21736,-27.38603],[-54.673,-27.57],[-54.814,-27.533],[-54.936,-27.772],[-55.38728,-27.98524],[-55.76677,-28.23982],[-55.69902,-28.42637],[-55.88091,-28.4715],[-56.29651,-28.80272],[-56.42475,-29.07897],[-56.59315,-29.12516],[-56.70164,-29.35913],[-57.328,-29.972],[-57.64923,-30.20184],[-57.63687,-30.33197],[-57.85924,-30.47701],[-57.8096,-30.91332],[-58.08141,-31.45457],[-57.98082,-31.58691],[-58.20653,-31.86773],[-58.10645,-32.24002],[-58.20464,-32.46055],[-58.0841,-32.99782],[-58.36693,-33.12177],[-58.49375,-33.57857],[-58.29507,-34.17809],[-57.9345,-34.4519],[-55.9,-35.6],[-57,-39],[-61,-41],[-63.5,-55],[-66.67094,-55.11906],[-67.27285,-54.90511],[-67.95071,-54.87373],[-68.60967,-54.91369],[-68.60676,-52.65902],[-68.41869,-52.3325],[-69.19014,-52.15044],[-69.48632,-52.15165],[-69.9955,-52.00074],[-71.92259,-51.99991],[-72.29907,-51.69791],[-72.28621,-50.65987],[-72.72636,-50.61667],[-73.06995,-50.78909],[-73.32848,-50.5716],[-73.52199,-50.15397],[-73.44481,-49.79226],[-73.53933,-49.49825],[-73.47299,-49.20464],[-73.14602,-49.18818]]]}},bolivia:{type:"Feature",id:"bolivia",properties:{},geometry:{type:"Polygon",coordinates:[[[-60.17487,-16.26675],[-58.32092,-16.31948],[-58.47336,-16.74472],[-58.39371,-17.18081],[-57.79152,-17.55501],[-57.71187,-17.73103],[-57.55463,-18.22348],[-57.72079,-18.89914],[-57.70775,-19.0381],[-58.11768,-19.75313],[-57.85675,-19.96754],[-58.15338,-20.15201],[-58.17535,-19.83066],[-59.07074,-19.28846],[-59.97025,-19.29494],[-61.78848,-19.65358],[-62.57401,-21.99972],[-63.93082,-22.00736],[-64.24942,-22.60957],[-64.31808,-22.8806],[-64.56528,-22.36595],[-64.62021,-22.21856],[-64.99649,-22.08628],[-65.77446,-22.10027],[-65.92552,-21.93222],[-66.04774,-21.91884],[-66.04225,-21.86022],[-66.2273,-21.78437],[-66.3121,-22.1219],[-66.74057,-22.23635],[-66.7955,-22.44213],[-67.18002,-22.81353],[-67.56351,-22.90085],[-67.81174,-22.87934],[-68.17566,-21.3252],[-68.405,-20.9499],[-68.54095,-20.92681],[-68.55606,-20.7285],[-68.43796,-20.63857],[-68.74557,-20.46369],[-68.72772,-20.08173],[-68.56293,-20.05077],[-68.53134,-19.85779],[-68.69064,-19.74667],[-68.41873,-19.41544],[-68.9296,-18.97448],[-69.12186,-18.14128],[-69.46793,-17.50852],[-69.46793,-17.37489],[-69.63547,-17.27787],[-69.01199,-16.66053],[-69.03877,-16.58487],[-68.93509,-16.2061],[-69.16718,-16.22259],[-69.40201,-15.62634],[-69.13422,-15.23516],[-69.35806,-14.96933],[-68.97903,-14.21979],[-68.87466,-12.88745],[-68.65768,-12.49088],[-69.57264,-10.94456],[-68.74806,-11.00835],[-68.75167,-11.01762],[-68.75201,-11.03716],[-68.76592,-11.04963],[-68.70815,-11.14253],[-68.54576,-11.11036],[-68.24295,-10.95872],[-68.08502,-10.69165],[-67.86736,-10.64036],[-67.71629,-10.71459],[-67.6775,-10.60341],[-67.65947,-10.61792],[-67.58446,-10.50402],[-67.43614,-10.44966],[-67.40593,-10.38314],[-67.31461,-10.37774],[-67.32216,-10.32438],[-67.1953,-10.32277],[-67.18869,-10.33983],[-67.17093,-10.33814],[-66.57921,-9.90392],[-65.86441,-9.75981],[-65.56503,-9.82477],[-65.44968,-9.67318],[-65.29449,-9.85589],[-65.39474,-10.54722],[-65.35629,-10.78474],[-65.2684,-10.88658],[-65.29861,-11.32656],[-65.14481,-11.70939],[-64.36752,-12.4587],[-63.67538,-12.46675],[-61.64841,-13.53453],[-61.06339,-13.52919],[-60.4303,-13.88608],[-60.23804,-15.09864],[-60.57312,-15.09599],[-60.24353,-15.47221],[-60.17487,-16.26675]]]}},bahia:{id:"bahia",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-46.26343,-11.52309],[-46.40625,-11.53923],[-46.51062,-11.50425],[-46.604,-11.3481],[-46.61224,-11.25653],[-46.46668,-11.1811],[-46.42822,-11.02208],[-46.32935,-10.9331],[-46.19751,-10.65521],[-45.84045,-10.47701],[-45.82672,-10.35275],[-45.74707,-10.34194],[-45.70038,-10.26087],[-45.72784,-10.15815],[-45.59326,-10.09326],[-45.41199,-10.43379],[-45.45593,-10.55262],[-45.37903,-10.72538],[-45.15381,-10.8387],[-44.90112,-10.90883],[-44.60999,-10.66601],[-44.34631,-10.54182],[-44.13757,-10.63362],[-44.05518,-10.39057],[-43.96179,-10.42839],[-43.78601,-10.15275],[-43.69263,-10.03918],[-43.69812,-9.95262],[-43.64868,-9.82274],[-43.76404,-9.76861],[-43.8794,-9.54117],[-43.68713,-9.41655],[-43.4729,-9.24851],[-43.3081,-9.37861],[-43.04443,-9.36235],[-42.8302,-9.60617],[-42.33581,-9.31899],[-41.90735,-9.23767],[-41.7865,-9.09125],[-41.40198,-8.71136],[-41.14929,-8.70593],[-41.03943,-8.83351],[-41.01471,-8.82808],[-40.92407,-8.83894],[-40.8197,-9.07226],[-40.68237,-9.14277],[-40.66864,-9.26478],[-40.7428,-9.30002],[-40.75653,-9.42197],[-40.62744,-9.47615],[-40.53131,-9.41384],[-40.47363,-9.39758],[-40.42694,-9.34338],[-40.36102,-9.37319],[-40.29785,-9.09396],[-40.23468,-9.04243],[-40.14679,-9.10481],[-40.07813,-9.05057],[-39.98749,-9.05599],[-39.8996,-8.95833],[-39.90509,-8.82808],[-39.68262,-8.77923],[-39.70459,-8.67063],[-39.65241,-8.65977],[-39.41345,-8.50769],[-39.2926,-8.54843],[-39.23492,-8.6299],[-38.96576,-8.76837],[-38.86963,-8.76837],[-38.71307,-8.83622],[-38.68835,-8.90678],[-38.66913,-8.98275],[-38.61694,-8.96376],[-38.60596,-8.86065],[-38.5675,-8.81723],[-38.47687,-8.84708],[-38.50983,-8.94205],[-38.42194,-9.037],[-38.33679,-8.97461],[-38.28461,-9.00716],[-38.31757,-9.06684],[-38.21045,-9.36235],[-38.04565,-9.4599],[-38.02368,-9.8498],[-37.89185,-9.96885],[-37.74902,-10.31492],[-37.8479,-10.37977],[-37.78198,-10.64981],[-37.93579,-10.73617],[-38.13354,-10.6822],[-38.26538,-10.79014],[-38.02368,-11.31848],[-37.73804,-11.57691],[-37.3645,-11.48002],[-38.50159,-18.11975],[-39.65515,-18.35453],[-40.25391,-17.96828],[-40.23193,-17.79053],[-40.61646,-17.38209],[-40.51758,-16.89917],[-40.13306,-16.45716],[-39.90234,-16.04581],[-40.68237,-15.68651],[-41.08887,-15.73939],[-41.35254,-15.73939],[-41.37451,-15.49603],[-41.80298,-15.09334],[-42.04468,-15.18878],[-43.24219,-14.67925],[-43.50586,-14.78551],[-43.92334,-14.63674],[-43.7915,-14.31761],[-44.35181,-14.24309],[-44.65942,-14.38148],[-45.78003,-15.13576],[-46.10962,-15.29478],[-46.06567,-14.87047],[-45.92285,-14.38148],[-46.24146,-14.14723],[-46.32935,-13.11158],[-46.38428,-12.02858],[-46.26343,-11.52309]]]}},brazil:{type:"Feature",id:"brazil",properties:{},geometry:{type:"Polygon",coordinates:[[[-51.56433,4.29711],[-28.4491,1.04914],[-37.67761,-21.04862],[-52.94861,-34.05721],[-53.56384,-33.71063],[-53.58581,-33.23409],[-53.16833,-32.81036],[-54.11316,-32.08723],[-55.73914,-30.85036],[-56.11267,-31.18931],[-56.11267,-30.90694],[-57.0575,-30.14988],[-57.23328,-30.32073],[-57.73865,-30.26381],[-55.98083,-28.5411],[-54.94812,-27.68839],[-53.80554,-27.18136],[-53.7616,-26.73089],[-53.87146,-26.00249],[-54.20105,-25.88394],[-54.6405,-25.88394],[-54.28894,-24.13171],[-55.43701,-24.18685],[-55.87647,-22.3704],[-58.07373,-22.08564],[-58.24402,-20.06109],[-57.71668,-17.98396],[-58.43628,-17.18278],[-58.50769,-16.38866],[-60.1831,-16.29905],[-60.26001,-15.14637],[-60.49072,-14.09396],[-60.94116,-13.63531],[-61.85303,-13.5926],[-63.58887,-12.56529],[-64.22058,-12.55992],[-65.20386,-11.8996],[-65.4126,-9.74154],[-66.82983,-10.1203],[-68.17566,-10.92501],[-70.6366,-11.18379],[-70.6366,-9.62783],[-71.42761,-9.97426],[-72.74597,-9.88769],[-73.97644,-7.10634],[-72.70752,-4.67498],[-70.15869,-4.23686],[-69.67529,-1.03266],[-70.19714,1.75205],[-67.56042,1.83989],[-66.94519,0.69761],[-63.78113,1.83989],[-64.84131,4.36832],[-63.25378,3.59566],[-60.24353,5.20584],[-60.03479,4.98698],[-59.57886,3.81493],[-59.89746,3.26118],[-60.05676,2.76199],[-59.9469,2.2626],[-59.77661,2.23515],[-59.77661,1.75754],[-58.64502,1.55987],[-55.87647,2.61384],[-53.10791,2.35041],[-51.56433,4.29711]]]}},df_br:{id:"df_br",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-48.20114,-15.49868],[-47.42111,-15.5],[-47.38953,-15.56484],[-47.32361,-15.58865],[-47.33047,-15.63891],[-47.31125,-15.73278],[-47.36755,-15.83189],[-47.3703,-15.927],[-47.36893,-15.99698],[-47.30988,-16.04317],[-48.27805,-16.04713],[-48.24921,-15.94152],[-48.2753,-15.93096],[-48.29041,-15.83189],[-48.22998,-15.77772],[-48.21899,-15.71163],[-48.24097,-15.70898],[-48.23547,-15.66535],[-48.22449,-15.63097],[-48.20251,-15.62568],[-48.20114,-15.49868]]]}},rs_br:{id:"rs_br",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-50.56791,-28.32331],[-49.64837,-28.40599],[-49.62152,-28.67722],[-49.82288,-28.81257],[-49.86986,-29.14725],[-49.40674,-29.43409],[-50.66187,-31.5221],[-51.51429,-32.07544],[-52.0244,-32.51232],[-52.32644,-33.22264],[-53.199,-34.04411],[-53.65541,-33.63156],[-53.50103,-32.61414],[-55.57503,-31.01726],[-56.0113,-31.18392],[-56.20595,-30.78112],[-56.93084,-30.18535],[-57.2463,-30.36505],[-57.57519,-30.33029],[-57.71614,-30.18535],[-57.40068,-29.91811],[-57.23959,-29.67347],[-56.02473,-28.4178],[-55.70255,-28.08671],[-54.40043,-27.2008],[-53.38022,-26.97372],[-51.97071,-27.23661],[-51.03103,-27.74271],[-50.56791,-28.32331]]]}},chile:{type:"Feature",id:"chile",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-110,-28],[-110,-26],[-109,-26],[-109,-28],[-110,-28]],[[-69.46999,-17.50394],[-69.67049,-17.66692],[-69.80164,-17.65253],[-69.83047,-17.71337],[-69.82704,-17.75196],[-69.80919,-17.8023],[-69.75494,-17.98135],[-69.82018,-18.1191],[-69.86618,-18.17325],[-69.96918,-18.26065],[-70.19165,-18.33106],[-72.5,-18.3],[-78,-53],[-68,-58],[-65.80412,-55.20392],[-67.30412,-54.90395],[-68.60412,-54.90395],[-68.60412,-52.65417],[-68.42212,-52.39063],[-68.42268,-52.33665],[-68.57786,-52.32931],[-68.58833,-52.31016],[-68.84205,-52.28181],[-69.19421,-52.15445],[-69.49016,-52.15561],[-70.00412,-52.00423],[-71.92097,-52.00391],[-71.95221,-51.97896],[-72.04212,-51.96756],[-71.93324,-51.91854],[-72.03255,-51.8118],[-72.32412,-51.60426],[-72.34531,-50.65403],[-73.32687,-50.52827],[-73.51742,-49.89065],[-72.98733,-48.99351],[-72.68005,-48.89271],[-72.53174,-48.77746],[-72.56195,-48.50569],[-72.24472,-48.34986],[-72.46788,-47.7451],[-72.0504,-47.34557],[-71.87325,-47.12505],[-71.9426,-46.81204],[-71.64974,-46.68289],[-71.82037,-46.1256],[-71.64459,-46.00936],[-71.75291,-45.55168],[-71.47104,-45.49829],[-71.54383,-45.40436],[-71.3895,-45.35287],[-71.33354,-45.28286],[-71.41148,-45.19486],[-71.56494,-44.98326],[-72.03323,-44.88409],[-72.03495,-44.76989],[-71.24908,-44.80425],[-71.07056,-44.47985],[-71.81213,-44.30714],[-71.58417,-43.64303],[-71.8856,-43.45765],[-71.72596,-43.19066],[-72.14344,-42.90363],[-72.04765,-42.54322],[-72.04182,-42.40546],[-72.17194,-42.14686],[-71.73051,-42.11516],[-71.92612,-40.72332],[-71.80252,-40.42081],[-71.70639,-40.425],[-71.66794,-40.30571],[-71.77643,-40.268],[-71.39465,-38.92843],[-70.90816,-38.67251],[-71.189,-37.74167],[-71.04858,-36.49087],[-70.95932,-36.50246],[-70.37876,-36.04743],[-70.43884,-35.32549],[-70.58441,-35.27646],[-70.53875,-35.20551],[-70.3791,-35.17241],[-69.87854,-34.15614],[-69.8703,-33.57458],[-69.78207,-33.33282],[-69.86721,-33.28663],[-69.99561,-33.3268],[-70.08453,-33.03716],[-70.3125,-32.12562],[-70.22736,-31.93934],[-70.46185,-31.84548],[-70.53102,-31.3724],[-70.07904,-30.38828],[-69.88678,-30.35747],[-69.81262,-30.14869],[-69.93347,-30.10118],[-69.94308,-29.24087],[-68.78609,-27.10803],[-68.56567,-27.17525],[-68.25256,-26.96492],[-68.57666,-26.49147],[-68.5437,-26.27987],[-68.37067,-26.17639],[-68.48328,-25.15399],[-68.32397,-25.09928],[-68.5437,-24.79047],[-68.46405,-24.62829],[-68.24432,-24.39338],[-67.32216,-24.03768],[-66.98639,-23.00012],[-67.17728,-22.81416],[-67.55768,-22.89642],[-67.81586,-22.86099],[-68.19489,-21.27018],[-68.405,-20.93964],[-68.53546,-20.8524],[-68.47504,-20.64949],[-68.72772,-20.46948],[-68.73322,-20.38454],[-68.67279,-20.34591],[-68.76549,-20.08237],[-68.56842,-20.05658],[-68.52997,-19.85262],[-68.68309,-19.72793],[-68.40225,-19.41091],[-68.92548,-18.97253],[-69.11087,-18.1328],[-69.06143,-18.06231],[-69.29352,-17.96698],[-69.30931,-17.9121],[-69.30794,-17.83956],[-69.34708,-17.7343],[-69.47205,-17.61065],[-69.46999,-17.50394]]]]}},bogota:{type:"Feature",id:"bogota",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.38,4.7],[-74.17,5],[-73.75,5],[-73.9,4.37],[-74.25,4.31],[-74.38,4.7]]]}},colombia:{type:"Feature",id:"colombia",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.8,11.8],[-71.3,12.7],[-70.9,11.9],[-71.98242,11.65762],[-72.2406,11.14607],[-72.45483,11.10295],[-72.8833,10.43379],[-72.94922,9.83898],[-73.31177,9.20514],[-72.99866,9.29189],[-72.94373,9.09125],[-72.76245,9.12379],[-72.65259,8.61633],[-72.39716,8.36098],[-72.34497,8.00484],[-72.4054,8.04563],[-72.49054,7.945],[-72.4411,7.89875],[-72.45209,7.53676],[-72.43835,7.40605],[-72.18567,7.38426],[-72.14996,7.32161],[-72.18018,7.24532],[-72.03461,7.0273],[-71.12,7.02457],[-71.09528,6.98641],[-70.9964,6.98641],[-70.77942,7.09817],[-70.5542,7.07636],[-70.30701,6.93461],[-70.11475,6.98095],[-69.43016,6.10778],[-69.34914,6.13987],[-69.31,6.0873],[-69.23378,6.08047],[-69.17404,6.15011],[-69.03877,6.22384],[-68.66455,6.14055],[-67.80762,6.288],[-67.45056,6.21155],[-67.47803,6.10232],[-67.40662,6.00946],[-67.60437,5.7909],[-67.63184,5.4629],[-67.82959,5.31524],[-67.79114,4.28068],[-67.62085,3.74915],[-67.5,3.78204],[-67.29126,3.36537],[-67.86255,2.82234],[-67.58789,2.79491],[-67.1759,2.33395],[-66.85181,1.23037],[-67.08801,1.16172],[-67.16766,1.83989],[-67.34894,1.97715],[-67.36816,2.22417],[-67.44781,2.21868],[-67.56866,2.054],[-67.80487,1.98813],[-67.91199,1.81793],[-68.18939,2.01009],[-68.2663,1.85087],[-68.16193,1.73008],[-69.83459,1.71361],[-69.8291,1.08209],[-69.19739,1.06561],[-69.15344,0.62621],[-69.48303,0.73057],[-69.79065,0.58776],[-70.02686,0.57128],[-70.04059,-0.19226],[-69.60937,-0.50262],[-69.55719,-0.65367],[-69.61212,-0.7498],[-69.41986,-1.03541],[-69.40338,-1.37041],[-69.9321,-4.21974],[-69.94995,-4.23275],[-70.06531,-4.08071],[-70.1841,-3.93893],[-70.28641,-3.82246],[-70.35027,-3.80054],[-70.50613,-3.87796],[-70.71075,-3.793],[-70.04883,-2.75102],[-70.8783,-2.23241],[-71.41113,-2.37786],[-71.75171,-2.19124],[-72.36694,-2.48762],[-72.63336,-2.36688],[-72.67456,-2.4595],[-72.93274,-2.4492],[-73.1813,-2.22692],[-73.10028,-2.0842],[-73.14697,-1.79597],[-73.55347,-1.69439],[-73.47382,-1.55437],[-73.64136,-1.26607],[-73.85834,-1.22763],[-74.27582,-0.97774],[-74.42139,-0.51086],[-74.79492,-0.23621],[-75.20142,-0.06592],[-75.27832,-0.12909],[-75.80566,0.04669],[-76.09955,0.32959],[-76.32751,0.42572],[-76.40991,0.37903],[-76.41266,0.23621],[-76.96198,0.27191],[-77.11029,0.36529],[-77.53601,0.40649],[-77.48383,0.65093],[-77.69257,0.73606],[-77.66441,0.81296],[-77.7166,0.85141],[-77.74544,0.83562],[-77.77565,0.83974],[-77.80861,0.82738],[-77.8196,0.80678],[-77.96173,0.82257],[-78.19794,0.94478],[-78.19931,0.99284],[-78.28308,1.05325],[-78.2515,1.08346],[-78.31741,1.19193],[-78.43002,1.1425],[-78.55499,1.2496],[-78.61816,1.24685],[-80,2.5],[-77.7,7.7],[-77.55524,7.51498],[-77.32178,7.87971],[-77.17896,7.93956],[-77.5,8.5],[-75.8,11.8]]]}},ecuador:{type:"Feature",id:"ecuador",properties:{},geometry:{type:"Polygon",coordinates:[[[-82,-3],[-80,2.2],[-77.86079,0.80404],[-77.72072,0.85484],[-77.66287,0.81794],[-77.66424,0.80884],[-77.67385,0.80215],[-77.67729,0.79099],[-77.66184,0.78979],[-77.68587,0.77365],[-77.6972,0.74241],[-77.67523,0.73778],[-77.5573,0.65058],[-77.47353,0.6626],[-77.52159,0.44837],[-76.47583,0.20874],[-76.32202,0.4422],[-76.0199,0.30487],[-75.81665,0.09064],[-75.26733,-0.1181],[-75.31265,-0.16617],[-75.50629,-0.21698],[-75.22888,-0.56441],[-75.20279,-0.97362],[-75.28931,-0.99147],[-75.36072,-0.95027],[-75.64087,-1.62576],[-76.63376,-2.59052],[-77.84637,-3],[-78.2872,-3.42158],[-79.01917,-5.01844],[-79.24301,-4.96581],[-79.62753,-4.42656],[-79.79233,-4.48954],[-80.12535,-4.29784],[-80.36018,-4.49775],[-80.44584,-4.45086],[-80.44739,-4.37692],[-80.33409,-4.21841],[-80.45013,-4.20968],[-80.44928,-4.13024],[-80.48035,-4.09445],[-80.47297,-4.05079],[-80.44739,-3.99719],[-80.39915,-3.98281],[-80.29701,-4.01843],[-80.12878,-3.89718],[-80.16106,-3.86704],[-80.19264,-3.60256],[-80.21633,-3.582],[-80.20706,-3.54705],[-80.21745,-3.5],[-80.22878,-3.50181],[-80.2335,-3.4899],[-80.2456,-3.48759],[-80.24545,-3.48481],[-80.24416,-3.48461],[-80.24386,-3.48247],[-80.24313,-3.48142],[-80.24393,-3.47881],[-80.24079,-3.47723],[-80.2438,-3.46463],[-80.22217,-3.44047],[-80.25238,-3.41],[-82,-3]]]}},paraguay:{type:"Feature",id:"paraguay",properties:{},geometry:{type:"Polygon",coordinates:[[[-54.25873,-24.35961],[-54.58403,-25.58921],[-54.65681,-25.67588],[-54.67916,-25.99493],[-54.61857,-26.20862],[-54.78678,-26.6308],[-55.42267,-26.99497],[-55.60553,-27.1621],[-55.73675,-27.44486],[-55.78857,-27.44309],[-55.89775,-27.34371],[-55.97809,-27.35591],[-56.06259,-27.30569],[-56.29415,-27.41973],[-56.37473,-27.58873],[-56.601,-27.42072],[-56.84909,-27.606],[-56.96547,-27.50172],[-57.48737,-27.44388],[-57.87465,-27.27496],[-58.59888,-27.29953],[-58.64896,-27.12631],[-58.31974,-26.8579],[-58.18979,-26.64487],[-58.22086,-26.41372],[-58.08456,-26.11154],[-57.89095,-25.96589],[-57.74047,-25.65014],[-57.55483,-25.44809],[-57.76072,-25.17162],[-58.2415,-24.9277],[-58.67226,-24.83161],[-59.3538,-24.4779],[-59.47537,-24.3323],[-60.03924,-24.01125],[-60.37336,-24.02369],[-60.98973,-23.81777],[-61.08807,-23.61362],[-61.73595,-23.234],[-62.20654,-22.70386],[-62.30073,-22.48627],[-62.64387,-22.24906],[-62.26072,-21.05983],[-62.26622,-20.56305],[-61.92152,-20.08915],[-61.73647,-19.63289],[-59.97488,-19.29332],[-59.06988,-19.28619],[-58.20814,-19.80515],[-57.83186,-20.9842],[-57.92507,-21.63334],[-57.88113,-21.68734],[-57.90602,-21.71294],[-57.97194,-22.07832],[-56.81013,-22.27099],[-56.56363,-22.20044],[-56.49462,-22.08659],[-56.39677,-22.07641],[-56.26631,-22.24811],[-56.01774,-22.29259],[-55.8526,-22.28227],[-55.78935,-22.38413],[-55.74034,-22.38913],[-55.75132,-22.47989],[-55.7472,-22.50653],[-55.72347,-22.5514],[-55.69845,-22.56298],[-55.69365,-22.57788],[-55.62361,-22.62986],[-55.38191,-24.00601],[-54.65973,-23.82806],[-54.31366,-24.01762],[-54.25873,-24.35961]]]}},peru:{type:"Feature",id:"peru",properties:{},geometry:{type:"Polygon",coordinates:[[[-83,-3],[-80.25238,-3.41],[-80.22217,-3.44047],[-80.2438,-3.46463],[-80.24079,-3.47723],[-80.24393,-3.47881],[-80.24313,-3.48142],[-80.24386,-3.48247],[-80.24416,-3.48461],[-80.24545,-3.48481],[-80.2456,-3.48759],[-80.2335,-3.4899],[-80.22878,-3.50181],[-80.21745,-3.5001],[-80.20706,-3.54705],[-80.21633,-3.582],[-80.19264,-3.60256],[-80.16106,-3.86704],[-80.12878,-3.89718],[-80.29701,-4.01843],[-80.39915,-3.98281],[-80.44739,-3.99719],[-80.47297,-4.05079],[-80.48035,-4.09445],[-80.44928,-4.13024],[-80.45013,-4.20968],[-80.33409,-4.21841],[-80.44739,-4.37692],[-80.44584,-4.45086],[-80.36018,-4.49775],[-80.12535,-4.29784],[-79.79233,-4.48954],[-79.62753,-4.42656],[-79.24301,-4.96581],[-79.01917,-5.01844],[-78.2872,-3.42158],[-77.84637,-3],[-76.63376,-2.59052],[-75.64087,-1.62576],[-75.36072,-0.95027],[-75.56534,-0.13806],[-75.15884,-0.06665],[-74.40628,-0.55553],[-72.92862,-2.39505],[-70.9552,-2.25162],[-70.02686,-2.70987],[-70.70595,-3.78478],[-70.49789,-3.88142],[-70.32349,-3.8088],[-69.95819,-4.23211],[-69.94446,-4.29784],[-69.99802,-4.37316],[-70.10376,-4.29164],[-70.19028,-4.35946],[-71.82999,-4.5662],[-72.86133,-5.25507],[-73.94348,-7.4932],[-72.19116,-9.95803],[-70.61188,-9.57638],[-70.62149,-10.96681],[-69.57161,-10.94557],[-68.65494,-12.49629],[-69.01886,-13.62196],[-68.83896,-14.22445],[-69.38141,-14.86251],[-69.14795,-15.24444],[-69.39926,-15.6151],[-69.19189,-16.17449],[-69.10177,-16.22555],[-68.96152,-16.19456],[-68.78952,-16.34254],[-68.98865,-16.42357],[-69.04015,-16.57368],[-69.01886,-16.65198],[-69.61075,-17.26542],[-69.46896,-17.37423],[-69.46827,-17.49919],[-69.66654,-17.66071],[-69.81262,-17.67281],[-69.75,-18],[-70,-18.27],[-75,-19],[-83,-3]]]}},latam:{type:"Feature",id:"latam",properties:{},geometry:{type:"Polygon",coordinates:[[[-123,14],[-117.45574,32.58935],[-117.23326,32.52453],[-116.43813,32.58992],[-115.96571,32.62752],[-115.48953,32.66395],[-114.71211,32.7179],[-114.7455,32.65614],[-114.79837,32.6067],[-114.81091,32.49615],[-111.06611,31.33282],[-109.5397,31.33311],[-108.86816,31.33165],[-108.2131,31.33135],[-108.21447,31.78655],[-106.52962,31.78363],[-106.51966,31.77225],[-106.50867,31.76116],[-106.4867,31.74715],[-106.4716,31.75123],[-106.46851,31.75912],[-106.45409,31.76554],[-106.43898,31.75678],[-106.41426,31.75007],[-106.37959,31.7305],[-106.37409,31.71269],[-106.35075,31.69575],[-106.33289,31.65835],[-106.30543,31.6224],[-106.28002,31.56186],[-106.24741,31.54314],[-106.21101,31.47347],[-106.17805,31.45766],[-106.14956,31.43335],[-106.00502,31.38881],[-105.76607,31.16816],[-105.38292,30.84683],[-104.9121,30.63644],[-104.67293,29.91804],[-104.39415,29.56151],[-103.20921,28.98742],[-102.4182,29.81056],[-101.4514,29.77242],[-100.96779,29.34866],[-100.9005,29.31454],[-100.69725,29.14257],[-100.62309,28.91322],[-100.51598,28.749],[-100.51186,28.70474],[-100.50293,28.66227],[-100.40337,28.58271],[-100.01472,28.06956],[-99.53957,27.59837],[-99.53339,27.57859],[-99.51279,27.5655],[-99.52103,27.55607],[-99.52824,27.49731],[-99.5018,27.50066],[-99.48601,27.49426],[-99.47777,27.48299],[-99.48498,27.4635],[-99.49596,27.44857],[-99.48669,27.39067],[-99.53476,27.31321],[-99.44344,27.25951],[-99.45717,27.03222],[-99.07127,26.42692],[-98.9978,26.39248],[-98.46771,26.21028],[-98.25966,26.09194],[-98.08388,26.05061],[-97.95067,26.06172],[-97.79205,26.05185],[-97.57919,25.95002],[-97.51328,25.89073],[-97.46315,25.87899],[-97.41783,25.83821],[-97.34367,25.92594],[-97,26],[-81,24],[-73.5,20.5],[-64,20],[-29,0],[-29,-20],[-63,-51],[-62,-57],[-72,-57],[-113,-30],[-123,14]]]}}};
23656
23657   var resources = {"bw-facebook":{id:"bw-facebook",type:"facebook",featureId:"botswana",countryCodes:["bw"],languageCodes:["en","tn"],name:"Mapping Botswana on Facebook",description:"Page of OpenStreetMap in Botswana",url:"https://www.facebook.com/MappingBotswana/",contacts:[{name:"info@openstreetmap.org.bw",email:"info@openstreetmap.org.bw"}]},"bw-twitter":{id:"bw-twitter",type:"twitter",featureId:"botswana",countryCodes:["bw"],languageCodes:["en","tn"],name:"Mapping Botswana on Twitter",description:"Twitter of OpenStreetMap in Botswana",url:"https://twitter.com/mappingbotswana",contacts:[{name:"info@openstreetmap.org.bw",email:"info@openstreetmap.org.bw"}]},"cape-coast-youthmappers":{id:"cape-coast-youthmappers",featureId:"cape_coast_gh",type:"twitter",name:"University of Cape Coast YouthMappers",countryCodes:["gh"],languageCodes:["en"],description:"Follow us on Twitter: {url}",extendedDescription:"This is the official handle for the Youth Mappers chapter of the University of Cape Coast, Ghana. we love maps, open data and helping the vulnerable.",url:"https://twitter.com/YouthmappersUCC",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-gh-facebook":{id:"osm-gh-facebook",featureId:"ghana",type:"facebook",name:"OpenStreetMap Ghana on Facebook",countryCodes:["gh"],languageCodes:["en"],description:"Facebook group for people interested in OpenStreetMap.",extendedDescription:"Mappers in Ghana community, promoting OpenStreetMap and Humanitarian OpenStreetMap Team (HOT) projects in Ghana. Join us.",url:"https://www.facebook.com/OSMGhana/",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-gh-twitter":{id:"osm-gh-twitter",featureId:"ghana",type:"twitter",name:"OpenStreetMap Ghana on Twitter",countryCodes:["gh"],languageCodes:["en"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/osmghana",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"talk-gh":{id:"talk-gh",featureId:"ghana",type:"mailinglist",name:"Talk-gh Mailing List",countryCodes:["gh"],languageCodes:["en"],description:"Talk-gh is the official mailing list for Ghana OSM community.",url:"https://lists.openstreetmap.org/listinfo/talk-gh",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-mg-facebook":{id:"osm-mg-facebook",featureId:"madagascar",type:"facebook",name:"OpenStreetMap Madagascar Facebook Group",countryCodes:["mg"],languageCodes:["mg","fr"],description:"Malagasy Facebook group for people interested in OpenStreetMap.",url:"https://www.facebook.com/groups/1601381123461284/",contacts:[{name:"Brice Ramamonjy",email:"rafaby21@gmail.com"},{name:"Dolly Andriatsiferana",email:"privatemajory@gmail.com"}]},"talk-mg":{id:"talk-mg",featureId:"madagascar",type:"mailinglist",countryCodes:["mg"],languageCodes:["mg","fr"],name:"Talk-mg Mailing List",description:"Place for OpenStreetMap contributors, communities and users in Madagascar to share and discuss.",url:"https://lists.openstreetmap.org/listinfo/talk-mg",contacts:[{name:"Brice Ramamonjy",email:"rafaby21@gmail.com"},{name:"Dolly Andriatsiferana",email:"privatemajory@gmail.com"}]},"OSM-BGD-facebook":{id:"OSM-BGD-facebook",featureId:"BGD",type:"facebook",name:"OpenStreetMap Bangladesh",description:"Improve OpenStreetMap in Bangladesh",extendedDescription:"Mapping in Bangladesh? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://www.facebook.com/groups/osmbd/",contacts:[{name:"Ahasanul Hoque",email:"hoque.ahasan@gmail.com"}]},"OSM-India-facebook":{id:"OSM-India-facebook",featureId:"india_full",type:"facebook",name:"OpenStreetMap India - Participatory neighborhood mapping",description:"Improve OpenStreetMap in India",extendedDescription:"Mapping in India? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://www.facebook.com/groups/mappingindia/",contacts:[{name:"Jinal Foflia",email:"fofliajinal@gmail.com"},{name:"Arun Ganesh",email:"arun.planemad@gmail.com"}],events:[{id:"sotmasia2018",i18n:true,name:"State of the Map Asia 2018",description:"Join the 2018 OpenStreetMap region-wide event at State of the Map Asia in India",where:"Indian Institute of Management, Bangalore, India",when:"2018-11-17",url:"http://stateofthemap.asia/"}]},"osm-india-forum":{id:"osm-india-forum",featureId:"india_full",type:"forum",countryCodes:["in"],name:"OpenStreetMap India forum",description:"OpenStreetMap India web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=65",contacts:[{name:"OpenStreetMap India",email:"openstreetmapindia@gmail.com"}]},"osm-india-github":{id:"osm-india-github",featureId:"india_full",type:"github",name:"OpenStreetMap India GitHub",description:"Code with us: {url}",url:"https://github.com/osm-in",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"OSM-india-mailinglist":{id:"OSM-india-mailinglist",featureId:"india_full",type:"mailinglist",name:"OpenStreetMap India Mailinglist",description:"Talk-in is the official Mailinglist for Indian Community",url:"https://lists.openstreetmap.org/listinfo/talk-in",contacts:[{name:"Arun Ganesh",email:"arun.planemad@gmail.com"}]},"osm-india-telegram":{id:"osm-india-telegram",featureId:"india_full",type:"telegram",name:"OpenStreetMap India Telegram",description:"Join our family: {url}",url:"https://t.me/OSMIndia",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"OSM-india-twitter":{id:"OSM-india-twitter",featureId:"india_full",type:"twitter",name:"OpenStreetMap India Twitter",description:"We are just a tweet away: {url}",url:"https://twitter.com/osm_in",contacts:[{name:"Jinal Foflia",email:"fofliajinal@gmail.com"}]},"osm-india-website":{id:"osm-india-website",featureId:"india_full",type:"osm",name:"OpenStreetMap India",countryCodes:["in"],description:"Mappers and OpenStreetMap users in India",url:"https://openstreetmap.in/",contacts:[{name:" OpenStreetMap India",email:"openstreetmapindia@gmail.com"}]},"osm-india-wiki":{id:"osm-india-wiki",featureId:"india_full",type:"wiki",name:"OpenStreetMap Wikiproject India",description:"Everything you need to know about mapping in India: {url}",url:"https://wiki.openstreetmap.org/wiki/WikiProject_India",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"osm-india-youtube":{id:"osm-india-youtube",featureId:"india_full",type:"youtube",name:"OpenStreetMap India Youtube",description:"Subscribe to our channel: {url}",url:"https://www.youtube.com/channel/UCu5sKaPU04x0RJkgGkoFORw",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"OSM-India-Puducherry-Facebook":{id:"OSM-India-Puducherry-Facebook",featureId:"india_puducherry",type:"facebook",name:"Free Software Hardware Movement - Facebook",description:"FSHM Facebook page to know about community events, activities",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap. Its FB page is the best way to keep in contact with its events.",url:"https://www.facebook.com/FSHMP",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"OSM-Puducherry-Mailing-List":{id:"OSM-Puducherry-Mailing-List",featureId:"india_puducherry",type:"mailinglist",name:"Free Software Hardware Movement - Mailing List",description:"FSHM Puducherry mailing list to discuss mapping in Puducherry and other things.",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap.",url:"https://www.freelists.org/archive/puduvailug/",signupUrl:"https://www.freelists.org/list/puduvailug",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"OSM-India-Puducherry-Matrix":{id:"OSM-India-Puducherry-Matrix",featureId:"india_puducherry",type:"matrix",name:"Free Software Hardware Movement - Matrix",description:"FSHM Riot group to discuss, share and update mapping activities, events in and around Puducherry",extendedDescription:"FSHM community members share their OSM mapping updates / experiences through the Riot.im group, this group is also used to discuss things related to free software / hardware, technology and activism.",url:"https://riot.im/app/#/room/#fshm:matrix.org",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"OSM-IDN-facebook":{id:"OSM-IDN-facebook",featureId:"IDN",type:"facebook",name:"OpenStreetMap Indonesia",description:"Improve OpenStreetMap in Indonesia",extendedDescription:"Mapping in Indonesia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/osm.id/",contacts:[{name:"Yantisa Akhadi",email:"yantisa.akhadi@hotosm.org"}]},"OSM-japan-facebook":{id:"OSM-japan-facebook",featureId:"japan",type:"facebook",name:"OpenStreetMap Japan Community",countryCodes:["jp"],languageCodes:["jp"],description:"Mappers and OpenStreetMap users in Japan",url:"https://www.facebook.com/groups/osmjapan/",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-japan-mailinglist":{id:"OSM-japan-mailinglist",featureId:"japan",type:"mailinglist",name:"OpenStreetMap Japan Mailinglist",countryCodes:["jp"],languageCodes:["jp"],description:"Talk-ja is an Official Mailinglist for Japanese Community",url:"https://lists.openstreetmap.org/listinfo/talk-ja",contacts:[{name:"OSMF Japan",email:"info@osmf.jp"}]},"OSM-japan-twitter":{id:"OSM-japan-twitter",featureId:"japan",type:"twitter",name:"OpenStreetMap Japan Twitter",countryCodes:["jp"],languageCodes:["jp"],description:"Hashtag on Twitter: {url}",url:"https://twitter.com/hashtag/osmjp",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-japan-website":{id:"OSM-japan-website",featureId:"japan",type:"group",name:"OpenStreetMap Japan",countryCodes:["jp"],languageCodes:["jp"],description:"Mappers and OpenStreetMap users in Japan",url:"https://openstreetmap.jp/",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-korea-telegram":{id:"OSM-korea-telegram",featureId:"korea",type:"telegram",countryCodes:["ko"],languageCodes:["ko","en"],name:"OSM Korea Telegram Channel",description:"Unofficial Channnel for OpenStreetMap contributors, communities and users in Korea to share and discuss.",url:"https://t.me/osmKorea",contacts:[{name:"Yongmin Hong",email:"revi@pobox.com"},{name:"Max N",email:"abonnements@revolwear.com"}]},"OSM-MY-facebook":{id:"OSM-MY-facebook",featureId:"malaysia",type:"facebook",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia on Facebook",description:"For chat about anything related to OpenStreetMap!",url:"https://www.facebook.com/groups/openstreetmapMY/",contacts:[{name:"Mohd Saidin",email:"projekopenstreetmap@hotmail.com"}]},"OSM-MY-forum":{id:"OSM-MY-forum",featureId:"malaysia",type:"forum",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia Forum",description:"Official OpenStreetMap Malaysia Forum",url:"https://forum.openstreetmap.org/viewforum.php?id=60",contacts:[{name:"Mohd Saidin",email:"projekopenstreetmap@hotmail.com"}]},"OSM-MY-matrix":{id:"OSM-MY-matrix",featureId:"malaysia",type:"matrix",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia Riot channel",description:"All mappers are welcome! Sign up at {signupUrl}",signupUrl:"https://riot.im/app/#/register",url:"https://riot.im/app/#/room/#OpenstreetmapMalaysia:matrix.org",contacts:[{name:"Ahmad Amsyar",email:"OfficiallyAhmad@protonmail.ch"}]},"OSM-MNG-facebook":{id:"OSM-MNG-facebook",featureId:"MNG",type:"facebook",name:"OpenStreetMap Mongolia",description:"Improve OpenStreetMap in Mongolia",extendedDescription:"Mapping in Mongolia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/OSM.Mongolia/",contacts:[{name:" ",email:"talk-mn@openstreetmap.org"}]},"OSM-MMR-facebook":{id:"OSM-MMR-facebook",featureId:"MMR",type:"facebook",name:"OpenStreetMap Myanmar",description:"Improve OpenStreetMap in Myanmar",extendedDescription:"Mapping in Myanmar? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/osmmm/",contacts:[{name:"Yan Naung Oak",email:"yan@phandeeyar.org"},{name:"Patrick Oswald",email:"patrickoswald.omm@gmail.com"},{name:"Set Khaing Oo",email:"setkhaing@phandeeyar.org"}]},"OSM-Nepal-facebook":{id:"OSM-Nepal-facebook",featureId:"NPL",type:"facebook",name:"OpenStreetMap Nepal",description:"Improve OpenStreetMap in Nepal",extendedDescription:"Mapping in Nepal? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/mapkathmandu/",contacts:[{name:"Kshitiz Khanal",email:"khanal1990@gmail.com"}]},"OSM-PH-facebook":{id:"OSM-PH-facebook",featureId:"philippines",type:"facebook",countryCodes:["ph"],name:"OpenStreetMap PH Facebook",description:"Welcome to OpenStreetMap Philippines, where we encourage all fellow Filipinos to contribute to the OpenStreetMap project.",url:"https://www.facebook.com/OSMPH/",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-mailinglist":{id:"OSM-PH-mailinglist",featureId:"philippines",type:"mailinglist",countryCodes:["ph"],name:"Talk-ph Mailing List",description:"A mailing list to discuss OpenStreetMap in the Philippines",url:"https://lists.openstreetmap.org/pipermail/talk-ph/",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-slack":{id:"OSM-PH-slack",featureId:"philippines",type:"slack",countryCodes:["ph"],name:"OpenStreetMap PH Slack",description:"All are welcome! Sign up at {signupUrl}",signupUrl:"https://osmph-chat.herokuapp.com/",url:"https://osmph.slack.com",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-telegram":{id:"OSM-PH-telegram",featureId:"philippines",type:"telegram",countryCodes:["ph"],languageCodes:["tl","en"],name:"OpenStreetMap PH Telegram",description:"Un-official, Telegram local community of OpenStreetMap contributors and friends in the Philippines",url:"https://t.me/osmph",contacts:[{name:"Erwin Olario",email:"govvin@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-RU-forum":{id:"OSM-RU-forum",type:"forum",featureId:"russia",countryCodes:["ru"],languageCodes:["ru"],name:"OpenStreetMap RU forum",description:"OpenStreetMap Russia web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=21",contacts:[{name:"Ilya Zverev",email:"ilya@zverev.info"}]},"OSM-RU-telegram":{id:"OSM-RU-telegram",type:"telegram",featureId:"russia",countryCodes:["ru"],languageCodes:["ru"],name:"OpenStreetMap RU telegram",description:"OpenStreetMap Russia telegram chat",url:"https://t.me/ruosm",contacts:[{name:"Ilya Zverev",email:"ilya@zverev.info"}]},"OSM-LKA-facebook":{id:"OSM-LKA-facebook",featureId:"LKA",type:"facebook",name:"OpenStreetMap Sri Lanka",description:"Improve OpenStreetMap in Sri Lanka",extendedDescription:"Mapping in Sri Lanka? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/142058222659672/",contacts:[{name:"Karan Suthakaran",email:"karansuthakaran@yahoo.com"}]},"OSM-TW-facebook":{id:"OSM-TW-facebook",featureId:"taiwan",type:"facebook",name:"OpenStreetMap Taiwan Community",countryCodes:["tw"],languageCodes:["zh-tw"],description:"Facebook Group for Mappers and OpenStreetMap users to discuss matters about Taiwan.",url:"https://www.facebook.com/groups/OpenStreetMap.TW/",contacts:[{name:"Nobody 沒有人 (Public mail)",email:"hiboard@openstreetmap.tw"}]},"OSM-TW-mailinglist":{id:"OSM-TW-mailinglist",featureId:"taiwan",type:"mailinglist",name:"OpenStreetMap Taiwan Mailinglist",countryCodes:["tw"],languageCodes:["zh-tw","en"],description:"Talk-tw is an Official Mailinglist for the Communities to dicuss matters about Taiwan",url:"https://lists.openstreetmap.org/listinfo/talk-tw",contacts:[{name:"Nobody 沒有人 (Public email)",email:"hiboard@openstreetmap.tw"}]},"OSM-TH-CNX-meetup":{id:"OSM-TH-CNX-meetup",featureId:"thailand_cnx",type:"meetup",countryCodes:["th"],languageCodes:["en"],name:"OSM Meetup Chiang Mai",description:"Irregular meeting of the OpenStreetMap community in Chiang Mai",extendedDescription:"Members of the OpenStreetMap community meet every few months in Chiang Mai. Get in contact and check out {url} to see when the next meetup is scheduled",url:"https://forum.openstreetmap.org/viewforum.php?id=46",contacts:[{name:"Team Chiang Mai",email:"meetup-cnx@openstreetmap.in.th"}]},"OSM-TH-facebook":{id:"OSM-TH-facebook",featureId:"thailand_full",type:"facebook",countryCodes:["th"],languageCodes:["en","th"],name:"OpenStreetMap TH Facebook group",description:"Facebook group for OpenStreetMappers in Thailand",url:"https://www.facebook.com/groups/thaiosm/",contacts:[{name:"Theppitak Karoonboonyanan",email:"theppitak@gmail.com"}]},"OSM-TH-forum":{id:"OSM-TH-forum",featureId:"thailand_full",type:"forum",countryCodes:["th"],languageCodes:["en","th"],name:"OpenStreetMap TH forum",description:"OpenStreetMap Thailand web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=46",contacts:[{name:"Stephan Knauss",email:"osm@stephans-server.de"}]},"al-forum":{id:"al-forum",featureId:"albania",type:"forum",countryCodes:["al"],languageCodes:["sq","en"],name:"OSM Albania Forum",description:"OpenStreetMap Albania Forum",url:"https://forum.openstreetmap.org/viewforum.php?id=91",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"al-maptime-tirana":{id:"al-maptime-tirana",featureId:"al-tirana",type:"group",countryCodes:["al"],languageCodes:["sq","en"],name:"Maptime Tirana",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time.",url:"http://maptime.io/tirana/",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"al-telegram":{id:"al-telegram",featureId:"albania",type:"telegram",countryCodes:["al"],languageCodes:["sq","en"],name:"OSM Albania Telegram channel",description:"OpenStreetMap Albania Telegram channel",url:"https://telegram.me/OpenStreetMapAL",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"at-forum":{id:"at-forum",featureId:"austria",type:"forum",name:"OpenStreetMap Austria Forum",countryCodes:["at"],languageCodes:["en","de"],description:"The official forum for OpenStreetMap questions in and around Austria",url:"https://forum.openstreetmap.org/viewforum.php?id=89",contacts:[{name:"emga",email:"emgaosm@gmail.com"}]},"at-mailinglist":{id:"at-mailinglist",featureId:"austria",type:"mailinglist",name:"Talk-at Mailing List",countryCodes:["at"],languageCodes:["de"],description:"Talk-at is the official mailing list for the Austrian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-at",contacts:[{name:"AT community",email:"info@openstreetmap.at"}]},"at-twitter":{id:"at-twitter",featureId:"austria",type:"twitter",name:"OpenStreetMap Austria Twitter",countryCodes:["at"],languageCodes:["de"],description:"OpenStreetMap Austria On Twitter: {url}",url:"https://twitter.com/osm_at",contacts:[{name:"AT Community",email:"info@openstreetmap.at"}]},"osmgraz-meetup":{id:"osmgraz-meetup",featureId:"graz",type:"meetup",countryCodes:["at"],languageCodes:["de","en"],name:"OSM community meetup Graz",description:"Monthly meetup of the OpenStreetMap community in Graz",url:"https://wiki.openstreetmap.org/wiki/Graz/Stammtisch",contacts:[{name:"Michael Maier",email:"michael.maier@secure.mailbox.org"}]},"osmgraz-twitter":{id:"osmgraz-twitter",featureId:"graz",type:"twitter",countryCodes:["at"],languageCodes:["de","en"],name:"OSM community Graz on twitter",description:"OpenStreetMap community in Graz on twitter",url:"https://twitter.com/osmgraz",contacts:[{name:"Michael Maier",email:"michael.maier@secure.mailbox.org"}]},"osm-at":{id:"osm-at",featureId:"austria",type:"group",countryCodes:["at"],languageCodes:["de"],name:"OpenStreetMap Austria",description:"The platform for information on OpenStreetMap in Austria",url:"https://www.openstreetmap.at/",contacts:[{name:"AT community",email:"info@openstreetmap.at"}]},byosm:{id:"byosm",type:"telegram",featureId:"belarus",languageCodes:["ru","be","en"],name:"OpenStreetMap Belarus",description:"OpenStreetMap Belarus telegram chat",url:"https://t.me/byosm",contacts:[{name:"Darafei Praliaskouski",email:"me@komzpa.net"}]},"be-facebook":{id:"be-facebook",featureId:"belgium",type:"facebook",name:"OpenStreetMap BE Community",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Mappers and OpenStreetMap on Facebook in Belgium",url:"https://www.facebook.com/groups/1419016881706058/",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-forum":{id:"be-forum",type:"forum",featureId:"belgium",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap BE forum",description:"OpenStreetMap Belgium web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=29",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-irc":{id:"be-irc",featureId:"belgium",type:"irc",name:"OpenStreetMap Belgium IRC",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Join #osmbe on irc.oftc.net (port 6667)",extendedDescription:"Join #osmbe on irc.oftc.net (port 6667), it is bridged with the Matrix chat channel",url:"https://webchat.oftc.net/?channels=osmbe",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-mailinglist":{id:"be-mailinglist",featureId:"belgium",type:"mailinglist",name:"Talk-be Mailing List",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Talk-be is the official mailing list for the Belgian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-be",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-matrix":{id:"be-matrix",featureId:"belgium",type:"matrix",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap BE Matrix channel",description:"All mappers are welcome!",extendedDescription:"Most talk is happening at the \"OpenStreetMap Belgium\" channel. You can ask anything there! The other rooms are for specific subjects.",url:"https://riot.im/app/#/group/+osmbe:matrix.org",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-meetup":{id:"be-meetup",featureId:"belgium",type:"meetup",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap Belgium Meetup",description:"Real life meetups of everyone who is interested in OpenStreetMap",extendedDescription:"Physical meetups are great to meet other mappers, ask them questions and to learn a lot. Especially new contributors are very welcome!",url:"https://meetup.com/OpenStreetMap-Belgium/",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-twitter":{id:"be-twitter",featureId:"belgium",type:"twitter",name:"OpenStreetMap Belgium Twitter",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"OSM Belgium on Twitter: @osm_be",url:"https://twitter.com/osm_be",contacts:[{name:"BE community",email:"community@osm.be"}]},"hr-facebook":{id:"hr-facebook",featureId:"croatia",type:"facebook",name:"OpenStreetMap Croatia Facebook group",countryCodes:["hr"],languageCodes:["hr"],description:"OpenStreetMap Croatia Facebook group",url:"https://www.facebook.com/groups/541098862671461",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"hr-irc":{id:"hr-irc",featureId:"croatia",type:"irc",name:"OpenStreetMap Croatia on IRC",countryCodes:["hr"],languageCodes:["hr"],description:"Join #osm-hr on irc.freenode.org (port 6667)",url:"https://webchat.freenode.net/?url=irc://irc.freenode.net/osm-hr",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"hr-mailinglist":{id:"hr-mailinglist",featureId:"croatia",type:"mailinglist",name:"Talk-hr Mailing List",countryCodes:["hr"],languageCodes:["hr"],description:"Talk-hr mailing list",url:"https://lists.openstreetmap.org/listinfo/talk-hr",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"czech-community":{id:"czech-community",featureId:"czechia",type:"group",name:"Czech OSM community",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Map portal, website and contacts on OSM members in Czechia",url:"https://openstreetmap.cz/komunita",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"osmcz-facebook":{id:"osmcz-facebook",featureId:"czechia",type:"facebook",name:"OpenStreetMap CZ on Facebook",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Follow czech community on Facebook - including translated WeeklyOSM!",url:"https://www.facebook.com/osmcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"osmcz-twitter":{id:"osmcz-twitter",featureId:"czechia",type:"twitter",name:"Czech twitter @osmcz",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Follow czech community on Twitter - including translated WeeklyOSM!",url:"https://twitter.com/osmcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"talk-cz-mailinglist":{id:"talk-cz-mailinglist",featureId:"czechia",type:"mailinglist",name:"Czech mailing list (talk-cz)",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Talk-cz is the official mailing list for Czech community",url:"https://openstreetmap.cz/talkcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"dk-forum":{id:"dk-forum",type:"forum",featureId:"denmark",countryCodes:["dk"],languageCodes:["da"],name:"OpenStreetMap Denmark Web Forum",description:"OpenStreetMap Denmark web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=48",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"dk-irc":{id:"dk-irc",featureId:"denmark",type:"irc",name:"OpenStreetMap Denmark IRC",countryCodes:["dk"],languageCodes:["da"],description:"Join #osm-dk on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-dk",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"dk-mailinglist":{id:"dk-mailinglist",featureId:"denmark",type:"mailinglist",name:"Talk-dk Mailing List",countryCodes:["dk"],languageCodes:["da"],description:"A mailing list to discuss OpenStreetMap in Denmark",url:"https://lists.openstreetmap.org/listinfo/talk-dk",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"fi-forum":{id:"fi-forum",featureId:"finland",type:"forum",countryCodes:["fi"],languageCodes:["fi"],name:"OpenStreetMap FI forum",description:"OpenStreetMap Finland web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=15",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fi-irc":{id:"fi-irc",featureId:"finland",type:"irc",name:"OpenStreetMap Finland IRC",countryCodes:["fi"],languageCodes:["fi"],description:"Join #osm-fi on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-fi",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fi-mailinglist":{id:"fi-mailinglist",featureId:"finland",type:"mailinglist",name:"Talk-fi Mailing List",countryCodes:["fi"],languageCodes:["fi"],description:"Talk-fi is the official mailing list for the Finnish OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-fi",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fr-facebook":{id:"fr-facebook",featureId:"france",type:"facebook",name:"OpenStreetMap France Facebook page",countryCodes:["fr"],languageCodes:["fr"],description:"OpenStreetMap France Facebook page",url:"https://www.facebook.com/osmfr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-forum":{id:"fr-forum",type:"forum",featureId:"france",countryCodes:["fr"],languageCodes:["fr"],name:"OpenStreetMap France web forum",description:"OpenStreetMap France web forum",url:"https://forum.openstreetmap.fr/",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-irc":{id:"fr-irc",featureId:"france",type:"irc",name:"OpenStreetMap France on IRC",countryCodes:["fr"],languageCodes:["fr"],description:"Join #osm-fr on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-mailinglist":{id:"fr-mailinglist",featureId:"france",type:"mailinglist",name:"Talk-fr Mailing List",countryCodes:["fr"],languageCodes:["fr"],description:"Talk-fr mailing list",url:"https://lists.openstreetmap.org/listinfo/talk-fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-twitter":{id:"fr-twitter",featureId:"france",type:"twitter",name:"OpenStreetMap France on Twitter",countryCodes:["fr"],languageCodes:["fr"],description:"OpenStreetMap France on Twitter: {url}",url:"https://twitter.com/osm_fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"de-berlin-mailinglist":{id:"de-berlin-mailinglist",featureId:"de-berlin-brandenburg",type:"mailinglist",name:"Berlin Mailing List",countryCodes:["de"],languageCodes:["de"],description:"This is the mailing list for the Berlin OSM community",url:"https://lists.openstreetmap.de/listinfo/berlin",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-berlin-meetup":{id:"de-berlin-meetup",featureId:"de-berlin-brandenburg",type:"meetup",name:"OpenStreetMap Berlin-Brandenburg Meetup",countryCodes:["de"],languageCodes:["de"],description:"Mappers and OpenStreetMap users in the Berlin area",url:"https://www.meetup.com/OSM-Berlin-Brandenburg/",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-berlin-telegram":{id:"de-berlin-telegram",featureId:"de-berlin-brandenburg",type:"telegram",name:"@osmberlin on Telegram",countryCodes:["de"],languageCodes:["de"],description:"OpenStreetMap Berlin Telegram chat",url:"https://t.me/osmberlin",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-berlin-twitter":{id:"de-berlin-twitter",featureId:"de-berlin-brandenburg",type:"twitter",name:"OpenStreetMap Berlin Twitter",countryCodes:["de"],languageCodes:["de"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/osmberlin",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-forum":{id:"de-forum",featureId:"germany",type:"forum",countryCodes:["de"],languageCodes:["de"],name:"OpenStreetMap DE forum",description:"OpenStreetMap Germany web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=14",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-irc":{id:"de-irc",featureId:"germany",type:"irc",name:"OpenStreetMap Germany IRC",countryCodes:["de"],languageCodes:["de"],description:"Join #osm-de on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-de",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-mailinglist":{id:"de-mailinglist",featureId:"germany",type:"mailinglist",name:"Talk-de Mailing List",countryCodes:["de"],languageCodes:["de"],description:"Talk-de is the official mailing list for the German OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-de",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-ostwestfalen-lippe-mailinglist":{id:"de-ostwestfalen-lippe-mailinglist",featureId:"de-ostwestfalen-lippe",type:"mailinglist",name:"OWL Mailing List",countryCodes:["de"],languageCodes:["de"],description:"This is the mailing list for the Ostwestfalen-Lippe OSM community",url:"https://gt.owl.de/mailman/listinfo/osm",contacts:[{name:"Florian Lohoff",email:"osm-owner@gt.owl.de"}]},"de-telegram":{id:"de-telegram",featureId:"germany",type:"telegram",name:"OpenStreetMap Germany Telegram",countryCodes:["de"],languageCodes:["de"],description:"Join the OpenStreetMap Germany Telegram supergroup at {url}",url:"https://t.me/OSM_de",contacts:[{name:"Max N",email:"abonnements@revolwear.com"}]},"osm-de":{id:"osm-de",featureId:"germany",type:"group",countryCodes:["de"],languageCodes:["de"],name:"OpenStreetMap Germany",description:"The platform for information on OpenStreetMap in Germany",url:"https://www.openstreetmap.de/",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"hu-facebook":{id:"hu-facebook",featureId:"hungary",type:"facebook",name:"OpenStreetMap HU on Facebook",countryCodes:["hu"],languageCodes:["hu"],description:"Mappers and OpenStreetMap Facebook in Hungary",url:"https://www.facebook.com/groups/osm.hu/",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"hu-forum":{id:"hu-forum",featureId:"hungary",type:"forum",countryCodes:["hu"],languageCodes:["hu"],name:"OpenStreetMap HU forum",description:"OpenStreetMap Hungary web forum",url:"https://groups.google.com/forum/#!forum/openstreetmap-hungary",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"hu-meetup":{id:"hu-meetup",featureId:"hungary",type:"meetup",countryCodes:["hu"],languageCodes:["hu"],name:"OpenStreetMap Hungary Meetup",description:"The platform for organizing meetups in Hungary",url:"https://www.meetup.com/OpenStreetMap-Hungary",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"is-facebook":{id:"is-facebook",type:"facebook",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"OSM Iceland on Facebook",description:"Page of OpenStreetMap in Iceland",url:"https://www.facebook.com/osmiceland/",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"is-mailinglist":{id:"is-mailinglist",type:"mailinglist",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"Talk-is Mailing List",description:"Talk-is is the official mailing list for the Icelandic OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-is",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"is-twitter":{id:"is-twitter",type:"twitter",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"OSM Iceland on Twittter",description:"Twitter of OpenStreetMap in Iceland",url:"https://twitter.com/openstreetmapis",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"it-facebook":{id:"it-facebook",featureId:"italy",type:"facebook",name:"OpenStreetMap Italy Facebook",countryCodes:["it"],languageCodes:["it"],description:"Join the OpenStreetMap Italy community on Facebook",url:"https://www.facebook.com/OpenStreetMap.Italia/",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-irc":{id:"it-irc",featureId:"italy",type:"irc",name:"OpenStreetMap Italy IRC",countryCodes:["it"],languageCodes:["it"],description:"Join #osm-it on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-it",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-mailinglist":{id:"it-mailinglist",featureId:"italy",type:"mailinglist",name:"Talk-it Mailing List",countryCodes:["it"],languageCodes:["it"],description:"Talk-it is the official mailing list for the Italian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-it",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-telegram":{id:"it-telegram",type:"telegram",featureId:"italy",countryCodes:["it"],languageCodes:["it"],name:"@OpenStreetMapItalia on Telegram",description:"OpenStreetMap Italy Telegram chat",url:"https://t.me/OpenStreetMapItalia",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-twitter":{id:"it-twitter",featureId:"italy",type:"twitter",name:"OpenStreetMap Italy Twitter",countryCodes:["it"],languageCodes:["it"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapIt",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"OSM-Rome-meetup":{id:"OSM-Rome-meetup",featureId:"IT_Roma_Capitale",type:"group",name:"Incontro Mappatori Romani",countryCodes:["it"],languageCodes:["it"],description:"Improve OpenStreetMap in the Rome area",extendedDescription:"We aim to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Lazio.",url:"https://wiki.openstreetmap.org/wiki/Rome/Incontro",contacts:[{name:"Martin Koppenhoefer",email:"dieterdreist@gmail.com"}]},"South-Tyrol-Mailing-List":{id:"South-Tyrol-Mailing-List",featureId:"south_tyrol",type:"mailinglist",countryCodes:["it"],languageCodes:["de","it","lld","en"],name:"OpenStreetMap mailing list for South Tyrol",description:"OpenStreetMap Italy regional talk list for South Tyrol",url:"https://lists.openstreetmap.org/listinfo/talk-it-southtyrol",contacts:[{name:"Martin Raifer",email:"tyr.asd@gmail.com"}]},"talk-it-lazio":{id:"talk-it-lazio",featureId:"IT_Lazio",type:"mailinglist",countryCodes:["it"],languageCodes:["it"],name:"OpenStreetMap IT Lazio",description:"All are welcome! Sign up at {signupUrl}",extendedDescription:"Mailinglist for Rome and Lazio area.",signupUrl:"https://lists.openstreetmap.org/listinfo/talk-it-lazio",url:"https://lists.openstreetmap.org/listinfo/talk-it-lazio",contacts:[{name:"Martin Koppenhoefer",email:"dieterdreist@gmail.com"}]},"Trentino-Mailing-List":{id:"Trentino-Mailing-List",featureId:"trentino",type:"mailinglist",countryCodes:["it"],languageCodes:["it"],name:"OpenStreetMap mailing list for Trentino",description:"OpenStreetMap Italy regional talk list for Trentino",url:"https://lists.openstreetmap.org/listinfo/talk-it-trentino",contacts:[{name:"Luca Delucchi",email:"lucadeluge@gmail.com"}]},"kosovo-telegram":{id:"kosovo-telegram",type:"telegram",featureId:"kosovo",countryCodes:["xk"],languageCodes:["sq","sr","en"],name:"OpenStreetMap Kosovo on Telegram",description:"Semi-official all-Kosovo Telegram public group. We welcome all mappers from anywhere in any language.",url:"https://t.me/osmkosovo",contacts:[{name:"Guillaume Rischard",email:"guillaumenospam@openstreetmapnospam.lu"}]},"no-forum":{id:"no-forum",type:"forum",featureId:"norway",countryCodes:["no"],languageCodes:["no"],name:"OpenStreetMap Norway Web Forum",description:"OpenStreetMap Norway web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=68",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}]},"no-irc":{id:"no-irc",featureId:"norway",type:"irc",name:"OpenStreetMap Norway on IRC",countryCodes:["no"],languageCodes:["no"],description:"Chat room for mappers and OpenStreetMap users, developers and enthusiasts in Norway",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}],url:"https://webchat.oftc.net/?channels=osm-no"},"no-mailinglist":{id:"no-mailinglist",featureId:"norway",type:"mailinglist",name:"OpenStreetMap Norway mailing list",countryCodes:["no"],languageCodes:["no"],description:"Mailing list for mappers and OpenStreetMap users, developers and enthusiasts in Norway",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}],url:"https://lists.nuug.no/mailman/listinfo/kart"},"OSM-PL-facebook-group":{id:"OSM-PL-facebook-group",type:"facebook",featureId:"poland",countryCodes:["pl"],languageCodes:["pl"],name:"OpenStreetMap Poland Facebook group",description:"Group for mappers and users of OpenStreetMap in Poland",url:"https://www.facebook.com/groups/500589303317858/",contacts:[{name:"Michał Brzozowski",email:"www.haxor@gmail.com"}]},"OSM-PL-forum":{id:"OSM-PL-forum",type:"forum",featureId:"poland",countryCodes:["pl"],languageCodes:["pl","en"],name:"OpenStreetMap Poland Forum",description:"Forum of Polish OpenStreetMap community",url:"https://forum.openstreetmap.org/viewforum.php?id=23",contacts:[{name:"Daniel Koć",email:"daniel@xn--ko-wla.pl"},{name:"Ryszard Mikke",email:"ryszard.mikke@gmail.com"}]},"si-forum":{id:"si-forum",type:"forum",featureId:"slovenia",countryCodes:["si"],languageCodes:["sl","en"],name:"OpenStreetMap Slovenia Forum",description:"Forum of OpenStreetMap community in Slovenia",url:"https://forum.openstreetmap.org/viewforum.php?id=58",contacts:[{name:"OpenStreetMap Slovenia",email:"talk-si@openstreetmap.org"}]},"si-mailinglist":{id:"si-mailinglist",type:"mailinglist",featureId:"slovenia",countryCodes:["si"],languageCodes:["sl","en"],name:"OpenStreetMap Slovenia mailing list",description:"Mailing list of OpenStreetMap community in Slovenia",url:"https://lists.openstreetmap.org/listinfo/talk-si",contacts:[{name:"OpenStreetMap Slovenia",email:"talk-si@openstreetmap.org"}]},"OSM-ES-mailinglist":{id:"OSM-ES-mailinglist",type:"mailinglist",featureId:"spain",languageCodes:["es"],name:"Talk-es mailing list",description:"A mailing list to discuss OpenStreetMap in Spain",url:"https://lists.openstreetmap.org/listinfo/talk-es",contacts:[{name:"Iván Sánchez",email:"ivansanchez@escomposlinux.org"}]},"OSM-ES-telegram":{id:"OSM-ES-telegram",type:"telegram",featureId:"spain",languageCodes:["es"],name:"@OSMes on Telegram",description:"OpenStreetMap Spain Telegram chat",url:"https://t.me/OSMes",contacts:[{name:"Jorge Sanz",email:"sanchi2@gmail.com"}]},"osm-se":{id:"osm-se",featureId:"sweden",type:"group",countryCodes:["se"],languageCodes:["sv"],name:"OpenStreetMap.se",description:"Provide OSM services and information for the local community in Sweden",url:"http://openstreetmap.se/",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-facebook":{id:"se-facebook",featureId:"sweden",type:"facebook",name:"OpenStreetMap Sweden Facebook",countryCodes:["se"],languageCodes:["sv"],description:"OpenStreetMap Sweden on Facebook",url:"https://www.facebook.com/groups/osmsweden/",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-forum":{id:"se-forum",type:"forum",featureId:"sweden",countryCodes:["se"],languageCodes:["sv"],name:"OpenStreetMap Sweden Web Forum",description:"OpenStreetMap Sweden web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=4",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-irc":{id:"se-irc",featureId:"sweden",type:"irc",name:"OpenStreetMap Sweden IRC",countryCodes:["se"],languageCodes:["sv"],description:"Join #osm.se on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm.se",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-mailinglist":{id:"se-mailinglist",featureId:"sweden",type:"mailinglist",name:"Talk-se Mailing List",countryCodes:["se"],languageCodes:["sv"],description:"A mailing list to discuss OpenStreetMap in Sweden",url:"https://lists.openstreetmap.org/listinfo/talk-se",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-twitter":{id:"se-twitter",featureId:"sweden",type:"twitter",name:"OpenStreetMap Sweden on Twitter",countryCodes:["se"],languageCodes:["sv"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/openstreetmapse",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"Nottingham-OSM-pub-meetup":{id:"Nottingham-OSM-pub-meetup",featureId:"east_midlands_uk",type:"group",name:"East Midlands (Nottingham) Monthly pub meet-up",countryCodes:["gb"],languageCodes:["en"],description:"Social gathering for East Midlands mappers and users",extendedDescription:"A group have been meeting since March 2011, initially in Nottingham, and, more recently in Derby, and from time to time elsewhere in the East Midlands. These are social gatherings, but are an excellent place to come and ask specific questions about OSM either in the area or in general. In the summer months we usually do some light mapping for an hour in the vicinity of our meeting place. The group as a whole has a special interest in mapping public rights of way and from time to time has mapping meetings for this purpose.",url:"https://wiki.openstreetmap.org/wiki/Nottingham/Pub-meetup",contacts:[{name:"Jerry Clough",email:"SK53.osm@gmail.com"}]},"gb-mailinglist":{id:"gb-mailinglist",featureId:"united_kingdom",type:"mailinglist",name:"Talk-gb Mailing List",countryCodes:["gb"],languageCodes:["en","cy"],description:"Talk-gb is the main communication forum list for the British (including Northern Ireland) OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-gb",contacts:[{name:"UK mailing list",email:"talk-gb-owner@lists.openstreetmap.org"}]},"mappa-mercia-group":{id:"mappa-mercia-group",featureId:"england-west-midlands",type:"group",countryCodes:["gb"],languageCodes:["en"],name:"Mappa Mercia local group",description:"A home for OpenStreetMap enthusiasts in the Midlands",extendedDescription:"Mappa Mercia is a project to grow OpenStreetMap in the West Midlands, UK. We run community events, provide training and support local organisations wishing to open up their data.",url:"http://www.mappa-mercia.org/",contacts:[{name:"Brian Prangle",email:"community@mappa-mercia.org"}]},"gb-irc":{id:"gb-irc",featureId:"united_kingdom",type:"irc",name:"OpenStreetMap United Kingdom IRC",countryCodes:["gb"],languageCodes:["en","cy"],description:"Join #osm-gb on irc.oftc.net (port 6667)",extendedDescription:"Join #osm-gb on irc.oftc.net (port 6667), please be patient and wait for a few minutes if you ask a question",url:"https://webchat.oftc.net/?channels=osm-gb",contacts:[{name:"UK mailing list",email:"talk-gb-owner@lists.openstreetmap.org"}]},"OSM-CA-Slack":{id:"OSM-CA-Slack",featureId:"canada_full",type:"slack",countryCodes:["ca"],languageCodes:["en","fr"],name:"OSM-CA Slack",description:"All are welcome! Sign up at {signupUrl}.",signupUrl:"https://slackinviteosmcanada.herokuapp.com/",url:"https://osm-ca.slack.com/",contacts:[{name:"Denis Carriere",email:"carriere.denis@gmail.com"}]},"OSM-Vancouver-meetup":{id:"OSM-Vancouver-meetup",featureId:"vancouver_metro",type:"meetup",name:"OpenStreetMap Vancouver",countryCodes:["ca"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Vancouver, BC area",url:"https://www.meetup.com/OpenStreetMap-Vancouver/",contacts:[{name:"Paul Norman",email:"penorman@mac.com"},{name:"Peter Chin",email:"bpchin@gmail.com"}],events:[{name:"April Metrotown Mappy Hour",description:"Mappy Hour is the time and place for discussion of OpenStreetMap, from surveying data to consuming data. Beginners welcome. Bring your questions.",when:"2018-04-27 18:30",where:"Firefighters' Public House, 6515 Bonsor Avenue, Burnaby, BC",url:"https://www.meetup.com/OpenStreetMap-Vancouver/events/qzsbsmyxgbkc/"}]},"OSM-CU-telegram":{id:"OSM-CU-telegram",type:"telegram",featureId:"cuba",countryCodes:["cu"],languageCodes:["es"],name:"OSM Cuba on Telegram",description:"OpenStreetMap Cuba Telegram chat",url:"https://telegram.me/OSM_Cuba",contacts:[{name:"Talk-cu Owner",email:"talk-cu-owner@openstreetmap.org"}]},"OSM-NI-telegram":{id:"OSM-NI-telegram",type:"telegram",featureId:"nicaragua",countryCodes:["ni"],languageCodes:["es"],name:"OSM Nicaragua on Telegram",description:"OpenStreetMap Nicaragua Telegram chat",url:"https://telegram.me/MapaNica",contacts:[{name:"Talk-ni Owner",email:"talk-ni-owner@openstreetmap.org"}]},"Bay-Area-OpenStreetMappers":{id:"Bay-Area-OpenStreetMappers",featureId:"sf_bay_area",type:"meetup",name:"Bay Area OpenStreetMappers",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the Bay Area",extendedDescription:"This group is about growing the OpenStreetMap community here in the Bay Area. Our events are open to everyone, from open source enthusiasts, cyclists, GIS professionals, geocachers, and beyond. Anyone and everyone who is interested in maps, map making and free map data is welcome to join our group as well as attend our events.",url:"https://www.meetup.com/Bay-Area-OpenStreetMappers/",contacts:[{name:"Ben Discoe",email:"bdiscoe@gmail.com"}]},"Central-Pennsylvania-OSM":{id:"Central-Pennsylvania-OSM",featureId:"central_pa",type:"facebook",name:"Central Pennsylvania OSM",countryCodes:["us"],languageCodes:["en"],description:"Online mapping community based out of State College, PA",url:"https://www.facebook.com/CentralPennsylvaniaOSM",contacts:[{name:"Sterling Quinn",email:"sdq107@psu.edu"}]},"Code-for-San-Jose-Slack":{id:"Code-for-San-Jose-Slack",featureId:"south_sf_bay_area",type:"slack",countryCodes:["us"],languageCodes:["en"],name:"Code for San Jose Slack",description:"All are welcome! Sign up at {signupUrl}, then join the #osm channel.",signupUrl:"https://slackin-c4sj.herokuapp.com/",url:"https://codeforsanjose.slack.com/",contacts:[{name:"OSM Bay Area mailing list",email:"talk-us-sfbay@openstreetmap.org"}]},"Dallas-Fort-Worth-OSM":{id:"Dallas-Fort-Worth-OSM",featureId:"dfw_metro",type:"group",name:"Dallas-Fort Worth OSM",countryCodes:["us"],languageCodes:["en"],description:"The OpenStreetMap user group for Dallas-Fort Worth",extendedDescription:"Dallas, Fort Worth, and all the cities in between are abounding with creative and tech-savvy people. The vision for this usergroup is to find new ways to use the amazing resource of OSM.",url:"http://dfwosm.org/",contacts:[{name:"Andrew Matheny",email:"andrewdmatheny@gmail.com"}]},GeoPhilly:{id:"GeoPhilly",featureId:"philly_metro",type:"meetup",name:"GeoPhilly",countryCodes:["us"],languageCodes:["en"],description:"Meetup for map enthusiasts in the Philadelphia area",extendedDescription:"GeoPhilly unites developers, geographers, data geeks, open source enthusiasts, civic hackers and map addicts in our shared love of maps and the stories they tell. If you use maps as part of your work or just want to learn more, this is the meetup for you!  Our events aim to be open, friendly, educational and social and range from happy hours to lightning talks or even workshops. Come create a diverse, inspiring geospatial community in the Philadelphia with us!",url:"https://www.meetup.com/GeoPhilly/",contacts:[{name:"Dan Ford",email:"dford@azavea.com"}]},MapMinnesota:{id:"MapMinnesota",featureId:"minneapolis_st_paul_metro",type:"meetup",name:"MapMinnesota",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap enthusiasts in the Twin Cities area",extendedDescription:"Connecting OpenStreetMap enthusiasts in Minnesota and the Twin Cities!",url:"https://www.meetup.com/Map-Minnesota/",contacts:[{name:"Ian Dees",email:"ian.dees@gmail.com"}]},"Mapping-DC-meetup":{id:"Mapping-DC-meetup",featureId:"dc_metro",type:"meetup",name:"Mapping DC",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the DC area",extendedDescription:"We are a group of volunteer mappers who aim to improve the OpenStreetMap in the DC area. We also aim to teach others about the OSM ecosystem, data analytics, cartography, and GIS. We gather every other month at meetups to focus on one area of our city.",url:"https://mappingdc.org/",contacts:[{name:"Brian DeRocher",email:"brian@derocher.org"}],events:[{name:"April Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-04-10 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxgbnb/"},{name:"June Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-06-12 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxjbqb/"},{name:"August Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-08-14 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxlbsb/"},{name:"October Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-10-09 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxnbmb/"}]},"Maptime-ME-meetup":{id:"Maptime-ME-meetup",featureId:"portland_me",type:"meetup",name:"MaptimeME",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users, around Portland, ME",extendedDescription:"Maptime is, rather literally, time for mapmaking.  Our mission is to open the doors of cartographic possibility to anyone interested by creating a time and space for collaborative learning, exploration, and map creation using mapping tools and technologies.",url:"https://www.meetup.com/MaptimeME/",contacts:[{name:"Malcolm Toon",email:"malcolm@foreflight.com"}]},"MaptimeHRVA-twitter":{id:"MaptimeHRVA-twitter",featureId:"hrva",type:"twitter",name:"MaptimeHRVA Twitter",countryCodes:["us"],languageCodes:["en"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/maptimehrva",contacts:[{name:"Jonah Adkins",email:"jonahadkins@gmail.com"}]},"us-ma-mailinglist":{id:"us-ma-mailinglist",featureId:"massachusetts",type:"mailinglist",name:"Talk-us-massachusetts Mailing List",countryCodes:["us"],languageCodes:["en"],description:"Email mailing list for the Massachusetts OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-us-massachusetts",contacts:[{name:"Alan Bragg",email:"alan.ruth.bragg@gmail.com"}]},"OpenCleveland-meetup":{id:"OpenCleveland-meetup",featureId:"cleveland",type:"meetup",name:"Open Cleveland",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the Cleveland area",extendedDescription:"Open Geo Cleveland aims to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Northeast Ohio. We're also a maptime chapter =)",url:"https://www.meetup.com/open-cleveland/",contacts:[{name:"Will Skora",email:"skorasaurus@gmail.com"},{name:"Anastasia Diamond-Ortiz",email:"anastasia.diamond@gmail.com"}],events:[{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-04-18 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxgbxb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-04-25 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxgbhc/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-02 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbdb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-09 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbmb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-16 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbvb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-23 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbfc/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-30 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbnc/"}]},"OSM-Boston":{id:"OSM-Boston",featureId:"boston_metro",type:"meetup",name:"OpenStreetMap Boston",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Boston area",extendedDescription:"OpenStreetMap is the free and open, wiki-style map of the world, with hundreds of thousands of contributions every day from people like you. Editing the map is simple, and fun! Join us both indoors and outdoors in our effort to create the best map of the Boston area and the rest of the world!",url:"https://www.meetup.com/OpenStreetMap-Boston/",contacts:[{name:"Lars Ahlzen",email:"lars@ahlzen.com"}]},"OSM-Central-Salish-Sea":{id:"OSM-Central-Salish-Sea",featureId:"mt_vernon_wa",type:"meetup",name:"OpenStreetMap Central Salish Sea",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Mount Vernon, WA",extendedDescription:"OpenStreetMap is an map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more. We meet all the time to talk maps, make maps and have fun!",url:"https://www.meetup.com/OpenStreetMap-Central-Salish-Sea/",contacts:[{name:"Clifford Snow",email:"clifford@snowandsnow.us"}]},"OSM-Chattanooga":{id:"OSM-Chattanooga",featureId:"chattanooga",type:"facebook",name:"OSM Chattanooga",countryCodes:["us"],languageCodes:["en"],description:"The OpenStreetMap user group for Chattanooga",url:"https://www.facebook.com/groups/123483951073256",contacts:[{name:"Jenny Park",email:"tennessee@tpl.org"},{name:"Randal Hale",email:"rjhale@northrivergeographic.com"}]},"OSM-Colorado":{id:"OSM-Colorado",featureId:"colorado",type:"meetup",name:"OpenStreetMap Colorado",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the state of Colorado, USA",extendedDescription:"OpenStreetMap (OSM) Colorado is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties.",url:"https://www.meetup.com/OSM-Colorado/",contacts:[{name:"Russell Deffner",email:"russdeffner@gmail.com"}]},"OSM-NYC":{id:"OSM-NYC",featureId:"nyc_metro",type:"meetup",name:"OpenStreetMap NYC",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users, developers and enthusiasts in the New York Metropolitan area",url:"https://www.meetup.com/osm-nyc/",contacts:[{name:"Jeff Ferzoco",email:"jferzoco@carto.com"}]},"OSM-Portland-forum":{id:"OSM-Portland-forum",featureId:"portland_or",type:"forum",name:"OpenStreetMap PDX Google Group",countryCodes:["us"],languageCodes:["en"],description:"Forum and mailing list for OpenStreetMap users in the Portland area",extendedDescription:"This group is to facilitate improvements to OpenStreetMap in the Portland, Oregon area to support applications such as the Open Trip Planner.",url:"https://groups.google.com/group/osm-pdx",contacts:[{name:"Madeline Steele",email:"madeline.steele@gmail.com"}]},"OSM-Portland":{id:"OSM-Portland",featureId:"portland_or",type:"meetup",name:"OpenStreetMap Portland",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Portland area",extendedDescription:"OpenStreetMap (OSM) is a map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more, and come join us at a meetup to talk maps, contribute to OSM, and have fun!",url:"https://www.meetup.com/OpenStreetMap-Portland/",contacts:[{name:"Madeline Steele",email:"madeline.steele@gmail.com"}]},"OSM-Seattle":{id:"OSM-Seattle",featureId:"seattle",type:"meetup",name:"OpenStreetMap Seattle",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Seattle area",url:"https://www.meetup.com/OpenStreetMap-Seattle/",contacts:[{name:"Clifford Snow",email:"clifford@snowandsnow.us"},{name:"Chase Stephens",email:"seattlefyi@gmail.com"},{name:"Paul McCombs",email:"pablo@imperium.org"}]},"OSM-SoCal":{id:"OSM-SoCal",featureId:"la_metro",type:"meetup",name:"OpenStreetMap Southern California",countryCodes:["us"],languageCodes:["en"],description:"Let's have some fun, contribute something to Los Angeles, and learn about mapping!",extendedDescription:"OpenStreetMap (OSM) Southern California is for anyone interested in mapping to get together to work with OpenStreetMap.  OpenStreetMap, the Wikipedia of maps, is a free open-source map of the world being created by more than 1,000,000 volunteers around the globe.  Everyone is welcome.  If you don't know OpenStreetMap, we'll teach you. If you have an idea for a mapping project or even a field trip that the group can do, great!",url:"https://www.meetup.com/OSM-Southern-California/",contacts:[{name:"Charlotte Wolter",email:"techlady@techlady.com"}]},"OSM-South-Bay":{id:"OSM-South-Bay",featureId:"south_sf_bay_area",type:"meetup",name:"OSM South Bay",countryCodes:["us"],languageCodes:["en"],description:"Map Nights hosted by Code for San Jose",extendedDescription:"Code for San Jose, the local Code for America brigade, hosts monthly Map Nights on Thursday nights in downtown San José. Meet fellow South Bay mappers, help out with local mapping projects, and hear about other civic tech projects. Programming and GIS skills are not required.",url:"https://www.meetup.com/Code-for-San-Jose/",contacts:[{name:"OSM Bay Area mailing list",email:"talk-us-sfbay@openstreetmap.org"}]},"OSM-Tampa-Bay":{id:"OSM-Tampa-Bay",featureId:"tampa_bay",type:"meetup",name:"OpenStreetMap Tampa Bay",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Tampa Bay area",extendedDescription:"OSM Tampa Bay group for local residents to get together and build out the definitive map of Tampa Bay with OpenStreetMap, the free and editable map of the world.  If you're into maps, data, open source, GPS, hiking, cycling, et cetera, you'll love working with OpenStreetMap -- so join in! We'll get together and map and talk about new topics once-a-month or so.",url:"https://www.meetup.com/osmtampabay/",contacts:[{name:"Coleman McCormick",email:"cmccormick@gmail.com"}]},"OSM-US-Slack":{id:"OSM-US-Slack",featureId:"usa_full",type:"slack",countryCodes:["us"],languageCodes:["en"],name:"OpenStreetMap US Slack",description:"All are welcome! Sign up at {signupUrl}",signupUrl:"https://slack.openstreetmap.us/",url:"https://osmus.slack.com",contacts:[{name:"Ian Dees",email:"ian@openstreetmap.us"},{name:"Clifford Snow",email:"clifford@snowandsnow.us"}]},"OSM-US":{id:"OSM-US",featureId:"usa_full",type:"group",countryCodes:["us"],languageCodes:["en"],name:"OpenStreetMap US",description:"We help grow and improve OpenStreetMap in the United States.",extendedDescription:"We support OpenStreetMap by holding annual conferences, providing community resources, building partnerships, and by spreading the word. Join OpenStreetMap US here: {signupUrl}",signupUrl:"https://www.openstreetmap.us/join",url:"https://www.openstreetmap.us/",contacts:[{name:"Ian Dees",email:"ian@openstreetmap.us"},{name:"Bryan Housel",email:"bryan@openstreetmap.us"}],events:[{id:"sotmus2018",i18n:true,name:"State of the Map US 2018",description:"Join the OpenStreetMap community at State of the Map US in Detroit, Michigan. Connect with other mappers, businesses, government agencies, and non profits, all collaborating around the free and editable map of the world.",where:"Detroit, Michigan",when:"2018-oct-05",url:"https://2018.stateofthemap.us/"}]},"OSM-Utah":{id:"OSM-Utah",featureId:"salt_lake_city",type:"meetup",name:"OpenStreetMap Utah",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Salt Lake City area",extendedDescription:"Activities may include things like Learn To Map workshops, mapping parties and outdoor data collection. The events will take place in the SLC area, at least initially.  We are looking for seasoned mappers as well as people new to OSM. Join and let's do some mapping!",url:"https://www.meetup.com/OpenStreetMap-Utah/",contacts:[{name:"Martijn van Exel",email:"m@rtijn.org"}]},"OSM-Wyoming":{id:"OSM-Wyoming",featureId:"wyoming",type:"meetup",name:"OpenStreetMap Wyoming",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the state of Wyoming",extendedDescription:"OpenStreetMap (OSM) Wyoming is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties.",url:"https://www.meetup.com/OSM-Wyoming/",contacts:[{name:"Russell Deffner",email:"russdeffner@gmail.com"}]},"PHXGeo-meetup":{id:"PHXGeo-meetup",featureId:"phoenix",type:"meetup",name:"PHXGeo Meetup",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Phoenix, AZ area",extendedDescription:"This is a meetup group for those in the Phoenix area who like maps, GIS, OpenStreetMap, cartography and anything in between.",url:"https://www.meetup.com/PHXGeo/",contacts:[{name:"Ryan Arp",email:"ryan@arpconsultinggroup.com"}]},"PHXGeo-twitter":{id:"PHXGeo-twitter",featureId:"phoenix",type:"twitter",name:"PHXGeo Twitter",countryCodes:["us"],languageCodes:["en"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/phxgeo",contacts:[{name:"Ryan Arp",email:"ryan@arpconsultinggroup.com"}]},"Western-Slope-facebook":{id:"Western-Slope-facebook",featureId:"grand_junction_co",type:"facebook",name:"Western Slope OSM Facebook",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Grand Junction, CO",url:"https://www.facebook.com/wsosm/",contacts:[{name:"Aaron Young",email:"aaron@kaartgroup.com"}]},"Western-Slope-meetup":{id:"Western-Slope-meetup",featureId:"grand_junction_co",type:"meetup",name:"Western Slope OSM Meetup",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Grand Junction, CO",extendedDescription:"The goal of this group is to introduce OpenStreetMap to the community, develop a community of mappers, create the most amazing geodata possible using whatever method we can and finally strategize in order to get this data out into our community. Imagine accurate trail signage! Imagine further development of bike paths! Imagine anything you want, that's the joy of OpenStreetMap!",url:"https://www.meetup.com/Western-Slope-OpenStreetMap/",contacts:[{name:"Aaron Young",email:"aaron@kaartgroup.com"}]},"Maptime-Australia-Slack":{id:"Maptime-Australia-Slack",featureId:"australia_full",type:"slack",countryCodes:["au"],languageCodes:["en"],name:"Maptime Australia Slack",description:"Sign up at {signupUrl}",signupUrl:"https://bit.ly/maptimeau",url:"https://maptimeaustralia.slack.com",contacts:[{name:"David Dean",email:"ddean@ieee.org"},{name:"Philip Mallis",email:"philip.mallis@unimelb.edu.au"},{name:"Edoardo Neerhut",email:"ed@mapillary.com"}]},"talk-au":{id:"talk-au",featureId:"australia_full",type:"mailinglist",countryCodes:["au"],languageCodes:["en"],name:"Talk-au Mailing List",description:"Place for Aussie mappers to chat",url:"https://lists.openstreetmap.org/listinfo/talk-au",contacts:[{name:"Ben Kelley",email:"ben.kelley@gmail.com"},{name:"Steve Bennett",email:"stevagewp@gmail.com"},{name:"Ian Sergeant",email:"inas66+osm@gmail.com"}]},"OSM-AR-facebook":{id:"OSM-AR-facebook",featureId:"argentina",type:"facebook",name:"OpenStreetMap Argentina Facebook",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina community on Facebook",extendedDescription:"News from the local community",url:"https://www.facebook.com/OpenStreetMapArgentina/",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-forum":{id:"OSM-AR-forum",featureId:"argentina",type:"forum",name:"OpenStreetMap Argentina web forum",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina web forum",extendedDescription:"Ideal for long or important discussions. Slow response time.",url:"https://forum.openstreetmap.org/viewforum.php?id=49",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-irc":{id:"OSM-AR-irc",featureId:"argentina",type:"irc",name:"OpenStreetMap Argentina IRC",countryCodes:["ar"],languageCodes:["es"],description:"Join #osm-ar on irc.oftc.net (port 6667)",extendedDescription:"You may find the most geeky user in the community.",url:"https://webchat.oftc.net/?channels=osm-ar",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-mailinglist":{id:"OSM-AR-mailinglist",featureId:"argentina",type:"mailinglist",name:"Talk-ar Mailing List",countryCodes:["ar"],languageCodes:["es"],description:"Historic mailing list. Almost unused today.",url:"https://lists.openstreetmap.org/pipermail/talk-ar/",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-telegram":{id:"OSM-AR-telegram",featureId:"argentina",type:"telegram",name:"OpenStreetMap Argentina Telegram",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina community on Telegram",extendedDescription:"The most active channel in the community, ideal for chatting and getting answers to your questions instantly. Everyone is welcome!",url:"https://telegram.me/osm_ar",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-twitter":{id:"OSM-AR-twitter",featureId:"argentina",type:"twitter",name:"OpenStreetMap Argentina Twitter",countryCodes:["ar"],languageCodes:["es"],description:"Follow us on Twitter at {url}",extendedDescription:"News from the local community and OpenStreetMap in general.",url:"https://twitter.com/OpenStreetMapAr",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-BO-mailinglist":{id:"OSM-BO-mailinglist",featureId:"bolivia",type:"mailinglist",name:"Talk-bo Mailing List",countryCodes:["bo"],languageCodes:["es"],description:"Talk-bo is the official mailing list for the Bolivian OpenStreetMap community",extendedDescription:"Mapping in Bolivia? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://lists.openstreetmap.org/pipermail/talk-bo/",contacts:[{name:"Marco Antonio",email:"marcoantoniofrias@gmail.com"}]},"Bahia-telegram":{id:"Bahia-telegram",featureId:"bahia",type:"telegram",name:"OpenStreetMap Bahia Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Bahia community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMBA",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"DF-telegram":{id:"DF-telegram",featureId:"df_br",type:"telegram",name:"OpenStreetMap Brasília Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Brasília community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/osmbsb",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"OSM-br-mailinglist":{id:"OSM-br-mailinglist",featureId:"brazil",type:"mailinglist",name:"Talk-br Mailing List",countryCodes:["br"],languageCodes:["pt"],description:"A mailing list to discuss OpenStreetMap in Brazil",url:"https://lists.openstreetmap.org/pipermail/talk-br/",contacts:[{name:"Arlindo Pereira",email:"nighto@gmail.com"}]},"OSM-br-telegram":{id:"OSM-br-telegram",featureId:"brazil",type:"telegram",name:"OpenStreetMap Brasil Telegram",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Brasil community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMBrasil_Comunidade",contacts:[{name:"Vitor George",email:"vitor.george@gmail.com"}],events:[{id:"webinar_mundogeo",name:"Webinar: OpenStreetMap em Prefeituras e Empresas",description:"Participe do webinar sobre como utilizar o OpenStreeMap em prefeituras e empresas.",where:"Online",when:"2018-05-02 14:30",url:"http://mundogeo.com/webinar/webinar.html"},{id:"mundogeo",name:"Painel OpenStreetMap no MundoGeo #connect",description:"Participe do painel sobre o OpenStreetMap no MundoGeo #connect.",where:"São Paulo, SP, Brasil",when:"2018-05-16 11:00",url:"http://mundogeoconnect.com/2018/atividades-especiais/"}]},"OSM-br-twitter":{id:"OSM-br-twitter",featureId:"brazil",type:"twitter",name:"OpenStreetMap Brasil Twitter",countryCodes:["br"],languageCodes:["pt"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapBR",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"RS-telegram":{id:"RS-telegram",featureId:"rs_br",type:"telegram",name:"OpenStreetMap Rio Grande do Sul Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Rio Grande do Sul community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/osmrs",contacts:[{name:"No one",email:"nobody@nowhere.org"}]},"OSM-CL-facebook":{id:"OSM-CL-facebook",featureId:"chile",type:"facebook",name:"OpenStreetMap Chile Facebook",countryCodes:["cl"],languageCodes:["es"],description:"Join the OpenStreetMap Chile community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://www.facebook.com/OpenStreetMap-Chile-145127198882915/",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-mailinglist":{id:"OSM-CL-mailinglist",featureId:"chile",type:"mailinglist",name:"Talk-cl Mailing List",countryCodes:["cl"],languageCodes:["es"],description:"A mailing list to discuss OpenStreetMap in Chile",url:"https://lists.openstreetmap.org/pipermail/talk-cl/",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-telegram":{id:"OSM-CL-telegram",featureId:"chile",type:"telegram",name:"OpenStreetMap Chile Telegram",countryCodes:["cl"],languageCodes:["es"],description:"Join the OpenStreetMap Chile community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMcl",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-twitter":{id:"OSM-CL-twitter",featureId:"chile",type:"twitter",name:"OpenStreetMap Chile Twitter",countryCodes:["cl"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmCL",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"Maptime-Bogota":{id:"Maptime-Bogota",featureId:"bogota",type:"meetup",name:"Maptime Bogotá",countryCodes:["co"],languageCodes:["es"],description:"We're a group of mappers interested in mapping in OpenStreetMap around Bogotá.",extendedDescription:"Learn to collect data in the field and digitize onto OpenStreetMap.  It is not necessary to have previous knowledge! You just need the desire to participate, learn, and have fun.",url:"https://www.meetup.com/Maptime-Colombia-OSM/",contacts:[{name:"Andrés Gómez Casanova",email:"angoca@gmail.com"}]},"OSM-CO-facebook":{id:"OSM-CO-facebook",featureId:"colombia",type:"facebook",name:"OpenStreetMap Colombia Facebook",countryCodes:["co"],languageCodes:["es"],description:"Join the OpenStreetMap Colombia community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap. Everyone is welcome!",url:"https://www.facebook.com/groups/OsmCol/",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-mailinglist":{id:"OSM-CO-mailinglist",featureId:"colombia",type:"mailinglist",name:"Talk-co Mailing List",countryCodes:["co"],languageCodes:["es"],description:"A mailing list to discuss OpenStreetMap in Colombia",url:"https://lists.openstreetmap.org/pipermail/talk-co/",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-telegram":{id:"OSM-CO-telegram",type:"telegram",featureId:"colombia",countryCodes:["co"],languageCodes:["es"],name:"OSM Colombia on Telegram",description:"OpenStreetMap Colombia Telegram chat",url:"https://telegram.me/osmco",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-twitter":{id:"OSM-CO-twitter",featureId:"colombia",type:"twitter",name:"OpenStreetMap Colombia Twitter",countryCodes:["co"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapCo",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO":{id:"OSM-CO",featureId:"colombia",type:"group",countryCodes:["co"],languageCodes:["es"],name:"OpenStreetMap Colombia",description:"News of the OpenStreetMap Colombia community and the OSMCo Foundation",url:"https://blog.openstreetmap.co/s657",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-EC-telegram":{id:"OSM-EC-telegram",type:"telegram",featureId:"ecuador",languageCodes:["es"],countryCodes:["ec"],name:"OSM Ecuador on Telegram",description:"OpenStreetMap Ecuador Telegram chat",url:"https://telegram.me/MappingEcuador",contacts:[{name:"Talk-ec Owner",email:"talk-ec-owner@openstreetmap.org"}]},"OSM-PY-telegram":{id:"OSM-PY-telegram",type:"telegram",featureId:"paraguay",languageCodes:["es"],countryCodes:["py"],name:"OSM Paraguay on Telegram",description:"OpenStreetMap Paraguay Telegram chat",url:"https://telegram.me/osm_py",contacts:[{name:"Talk-py Owner",email:"talk-py-owner@openstreetmap.org"}]},"OSM-PE-facebook":{id:"OSM-PE-facebook",featureId:"peru",type:"facebook",name:"OpenStreetMap Peru Facebook",countryCodes:["pe"],languageCodes:["es"],description:"Join the OpenStreetMap Peru community on Facebook",url:"https://www.facebook.com/Osmpe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-mailinglist":{id:"OSM-PE-mailinglist",featureId:"peru",type:"mailinglist",name:"Talk-pe Mailing List",countryCodes:["pe"],languageCodes:["es"],description:"The official mailing list for the OpenStreetMap Peru community",url:"https://lists.openstreetmap.org/pipermail/talk-pe/",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-matrix":{id:"OSM-PE-matrix",featureId:"peru",type:"matrix",name:"OpenStreetMap Peru Matrix Chat",countryCodes:["pe"],languageCodes:["es"],description:"Chat with other members of the OpenStreetMap Peru community in Matrix.",url:"https://matrix.to/#/#osmpe:matrix.org",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-telegram":{id:"OSM-PE-telegram",featureId:"peru",type:"telegram",name:"OpenStreetMap Peru Telegram",countryCodes:["pe"],languageCodes:["es"],description:"Join the OpenStreetMap Peru community on Telegram",url:"https://telegram.me/osmPe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-twitter":{id:"OSM-PE-twitter",featureId:"peru",type:"twitter",name:"OpenStreetMap Peru Twitter",countryCodes:["pe"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmpe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE":{id:"OSM-PE",featureId:"peru",type:"group",name:"OpenStreetMap Peru",countryCodes:["ar"],languageCodes:["es"],description:"News and resources for the OpenStreetMap Peru community",url:"http://osmpe.ourproject.org/",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"LATAM-Facebook":{id:"LATAM-Facebook",featureId:"latam",type:"facebook",languageCodes:["es","pt"],name:"OpenStreetMap Latam Facebook",description:"OpenStreetMap Latam on Facebook",url:"https://www.facebook.com/osmlatam/",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"LATAM-Telegram":{id:"LATAM-Telegram",featureId:"latam",type:"telegram",languageCodes:["es","pt"],name:"OpenStreetMap Latam Telegram",description:"OpenStreetMap Telegram for Latin America",url:"https://t.me/OSMLatam",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"LATAM-Twitter":{id:"LATAM-Twitter",featureId:"latam",type:"twitter",languageCodes:["es","pt"],name:"OpenStreetMap Latam Twitter",description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmlatam",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"osm-latam":{id:"osm-latam",featureId:"latam",type:"group",languageCodes:["es","pt"],name:"OpenStreetMap Latam",description:"Supporting OpenStreetMap in Latin America",url:"https://osmlatam.org/",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}],events:[{id:"sotm-latam-2018",i18n:true,name:"State of the Map Latam 2018",description:"State of the Map Latam is the annual conference for all mappers and users of OpenStreetMap in Latin America. The program includes talks, panels, workshops, and mapathons related to OpenStreetMap.",where:"Buenos Aires, Argentina",when:"2018-sep-24",url:"https://state.osmlatam.org/"}]},"OSM-Discord":{id:"OSM-Discord",type:"discord",languageCodes:["en"],name:"OpenStreetMap Discord",description:"Get in touch with other mappers via Discord",url:"https://discord.gg/SRZUYUz",contacts:[{name:"Austin Harrison",email:"jaustinharrison@gmail.com"}]},"OSM-Facebook":{id:"OSM-Facebook",type:"facebook",languageCodes:["en"],name:"OpenStreetMap on Facebook",description:"Like us on Facebook for news and updates about OpenStreetMap.",url:"https://www.facebook.com/OpenStreetMap",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},"OSM-help":{id:"OSM-help",type:"forum",languageCodes:["en"],name:"OpenStreetMap Help",description:"Ask a question and get answers on OSM's community-driven question and answer site.",extendedDescription:"{url} is for everyone who needs help with OpenStreetMap.  Whether you are a beginner mapper or have a technical question, we're here to help!",url:"https://help.openstreetmap.org/",contacts:[{name:"OSMF Operations",email:"operations@osmfoundation.org"}]},"OSM-IRC":{id:"OSM-IRC",type:"irc",languageCodes:["en"],name:"OpenStreetMap IRC",description:"Join #osm on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},"OSM-Reddit":{id:"OSM-Reddit",type:"reddit",languageCodes:["en"],name:"OpenStreetMap on Reddit",description:"/r/openstreetmap/ is a great place to learn more about OpenStreetMap.  Ask us anything!",url:"https://www.reddit.com/r/openstreetmap/",contacts:[{name:"Serge Wroclawski",email:"emacsen@gmail.com"}]},"OSM-Telegram":{id:"OSM-Telegram",type:"telegram",languageCodes:["en"],name:"OpenStreetMap Telegram",description:"Join the OpenStreetMap Telegram global supergroup at {url}",url:"https://t.me/OpenStreetMapOrg",contacts:[{name:"Max N",email:"abonnements@revolwear.com"}]},"OSM-Twitter":{id:"OSM-Twitter",type:"twitter",languageCodes:["en"],name:"OpenStreetMap Twitter",description:"Follow us on Twitter at {url}",url:"https://twitter.com/openstreetmap",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},OSMF:{id:"OSMF",type:"group",languageCodes:["en","nl","fr","it","jp","ru"],name:"OpenStreetMap Foundation",description:"OSMF is a UK-based not-for-profit that supports the OpenStreetMap Project",extendedDescription:"OSMF supports the OpenStreetMap by fundraising, maintaining the servers which power OSM, organizing the annual State of the Map conference, and coordinating the volunteers who keep OSM running. You can show your support and have a voice in the direction of OpenStreetMap by joining as an OSMF member here: {signupUrl}",url:"https://wiki.osmfoundation.org/wiki/Main_Page",signupUrl:"https://join.osmfoundation.org/",contacts:[{name:"OSMF Board",email:"board@osmfoundation.org"}],events:[{id:"sotm2018",i18n:true,name:"State of the Map 2018",description:"Join us for 3 days in Milan, Italy for the annual worldwide OpenStreetMap conference, bringing together everyone in the community to socialize, share, and learn.",where:"Milan, Italy",when:"2018-jul-28",url:"https://2018.stateofthemap.org/"}]}};
23658
23659   var dataImagery = [{id:"sjcgis.org-Aerials_2013_WM",name:"2013 aerial imagery for San Juan County WA",type:"tms",template:"https://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2013_WM/MapServer/tile/{zoom}/{y}/{x}",endDate:"2013-06-01T00:00:00.000Z",startDate:"2013-05-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-123.02167,48.44667],[-122.94666,48.44781],[-122.90151,48.41307],[-122.80263,48.40771],[-122.79199,48.4428],[-122.80881,48.47866],[-122.73912,48.49572],[-122.78547,48.62161],[-122.73088,48.63613],[-122.7556,48.71208],[-122.95747,48.71593],[-122.97086,48.69577],[-122.9997,48.6978],[-123.00348,48.73427],[-123.0433,48.7431],[-123.07626,48.70528],[-123.08485,48.66335],[-123.12845,48.6638],[-123.22698,48.70302],[-123.24655,48.68353],[-123.17445,48.64702],[-123.21514,48.60107],[-123.21393,48.57336],[-123.1808,48.56575],[-123.16621,48.52006],[-123.10235,48.47684],[-123.02167,48.44667]],[[-122.98339,48.78214],[-122.93498,48.76653],[-122.91181,48.73858],[-122.80229,48.73982],[-122.81946,48.75499],[-122.9343,48.79572],[-122.98374,48.79436],[-122.98339,48.78214]]],terms_url:"https://www.arcgis.com/home/item.html?id=7bf69831861d438d8365cf9f46662523",terms_text:"Pictometry Inc, San Juan County GIS",description:"Public domain aerial imagery taken in May/June 2013 from San Juan County, WA. Resolution is 9 inch."},{id:"sjcgis.org-Aerials_2016_WM",name:"2016 aerial imagery for San Juan County WA",type:"tms",template:"https://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2016_WM/MapServer/tile/{zoom}/{y}/{x}",endDate:"2016-07-01T00:00:00.000Z",startDate:"2016-05-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-123.02167,48.44667],[-122.94666,48.44781],[-122.90151,48.41307],[-122.80263,48.40771],[-122.79199,48.4428],[-122.80881,48.47866],[-122.73912,48.49572],[-122.78547,48.62161],[-122.73088,48.63613],[-122.7556,48.71208],[-122.95747,48.71593],[-122.97086,48.69577],[-122.9997,48.6978],[-123.00348,48.73427],[-123.0433,48.7431],[-123.07626,48.70528],[-123.08485,48.66335],[-123.12845,48.6638],[-123.22698,48.70302],[-123.24655,48.68353],[-123.17445,48.64702],[-123.21514,48.60107],[-123.21393,48.57336],[-123.1808,48.56575],[-123.16621,48.52006],[-123.10235,48.47684],[-123.02167,48.44667]],[[-122.98339,48.78214],[-122.93498,48.76653],[-122.91181,48.73858],[-122.80229,48.73982],[-122.81946,48.75499],[-122.9343,48.79572],[-122.98374,48.79436],[-122.98339,48.78214]]],best:true,description:"Public domain aerial imagery taken in May, June, and July from San Juan County, WA. Resolution is 6 inch countywide."},{id:"OS7",name:"7th Series (OS7)",type:"tms",template:"https://ooc.openstreetmap.org/os7/{zoom}/{x}/{y}.jpg",zoomExtent:[6,14],polygon:[[[-3.04697,54.83947],[-3.05864,55.24157],[-4.04466,55.23296],[-4.07076,55.63654],[-4.61904,55.6253],[-4.64926,56.02834],[-4.48961,56.03217],[-4.52394,56.4367],[-3.86751,56.44581],[-3.84176,56.04944],[-3.44591,56.04982],[-3.43492,55.64429],[-2.79497,55.65049],[-2.80802,56.05749],[-3.20661,56.05327],[-3.21417,56.45682],[-3.73808,56.45075],[-3.74185,56.86175],[-5.07669,56.83171],[-5.03652,56.42949],[-5.16012,56.42493],[-5.12991,56.01798],[-5.92607,55.99456],[-5.85518,55.23335],[-5.2281,55.25136],[-5.21024,55.02765],[-4.65956,55.04181],[-4.64548,54.81633],[-3.04697,54.83947]],[[-1.74835,57.76428],[-1.74065,57.36],[-2.58022,57.35537],[-2.57437,57.04526],[-2.08408,57.04799],[-2.07651,56.64276],[-2.7345,56.63906],[-2.73781,56.81718],[-3.23885,56.81437],[-3.24896,57.35168],[-3.75629,57.34889],[-3.76219,57.65868],[-4.76587,57.64473],[-4.81008,58.26984],[-5.2511,58.26547],[-5.27376,58.66767],[-3.55818,58.69887],[-3.56607,58.9316],[-3.37656,58.93444],[-3.38584,59.20171],[-3.18713,59.20215],[-3.18747,59.24176],[-3.06757,59.24203],[-3.07855,59.42135],[-2.37131,59.42763],[-2.36856,59.0222],[-2.67893,59.02078],[-2.67343,58.83935],[-2.86569,58.83651],[-2.8602,58.53531],[-3.03461,58.53316],[-3.0195,58.13159],[-3.6156,58.11982],[-3.61276,57.97754],[-3.71092,57.97562],[-3.69932,57.75364],[-1.74835,57.76428]],[[-7.07492,56.76319],[-7.73471,56.73566],[-7.7911,57.13994],[-7.70662,57.14343],[-7.76299,57.54311],[-7.60218,57.54968],[-7.62134,57.68452],[-7.72499,57.6803],[-7.73017,57.71673],[-7.60264,57.72191],[-7.59964,57.70083],[-7.48634,57.70544],[-7.49528,57.76813],[-7.37493,57.77301],[-7.39337,57.90201],[-7.23591,57.90838],[-7.24323,57.95948],[-7.13916,57.96369],[-7.14508,58.00495],[-7.23742,58.00122],[-7.23297,57.97018],[-7.31133,57.96702],[-7.31538,57.99525],[-7.24904,57.99792],[-7.28082,58.21856],[-7.07355,58.22687],[-7.0827,58.29018],[-6.80743,58.30119],[-6.82768,58.44074],[-6.50305,58.45366],[-6.51532,58.53792],[-6.16474,58.55184],[-6.10631,58.14894],[-6.33469,58.13976],[-6.27759,57.74145],[-6.96138,57.71366],[-6.93332,57.51615],[-7.10017,57.50933],[-7.05218,57.169],[-7.13111,57.16575],[-7.07492,56.76319]],[[0.41076,50.82087],[0.98102,50.80612],[0.99437,51.01173],[1.45062,50.99998],[1.47712,51.40552],[0.89619,51.42035],[0.88243,51.21039],[0.505,51.22007],[0.52273,51.49042],[-0.63397,51.51063],[-0.63671,51.44563],[-1.09951,51.45248],[-1.11485,51.04814],[-0.52987,51.0394],[-0.52751,51.10203],[0.42806,51.08778],[0.41076,50.82087]],[[-5.39457,51.9619],[-4.79581,51.98051],[-4.78873,51.89403],[-4.20265,51.91228],[-4.22941,52.23828],[-3.6552,52.25602],[-3.62228,51.85483],[-4.21342,51.8364],[-4.18551,51.49342],[-4.77661,51.47485],[-4.78476,51.57525],[-5.08799,51.56574],[-5.09422,51.64242],[-5.3678,51.63385],[-5.39457,51.9619]],[[-1.2389,54.03537],[-0.62779,54.02811],[-0.62004,54.25257],[-0.57268,54.25201],[-0.55865,54.65542],[-1.17998,54.66269],[-1.18782,54.43788],[-1.23221,54.4384],[-1.2389,54.03537]],[[-2.67227,50.97677],[-2.09961,50.98023],[-2.10572,51.37949],[-1.58877,51.38259],[-1.59499,51.78589],[-2.17563,51.78891],[-2.17154,51.38392],[-2.67846,51.38088],[-2.67227,50.97677]],[[-2.60155,53.27155],[-3.22973,53.2685],[-3.23522,53.67231],[-2.60704,53.67533],[-2.60155,53.27155]],[[-0.03942,51.7728],[-0.61563,51.77577],[-0.60465,52.58414],[-0.02843,52.58122],[-0.03942,51.7728]],[[-2.91529,54.03523],[-3.53229,54.02866],[-3.54484,54.43397],[-2.92785,54.44047],[-2.91529,54.03523]],[[-6.30583,57.19689],[-6.3539,57.60015],[-5.69111,57.62295],[-5.64305,57.21995],[-6.30583,57.19689]],[[1.17115,52.57236],[1.19865,52.97594],[1.79788,52.96106],[1.77037,52.55734],[1.17115,52.57236]],[[-2.40225,55.56317],[-2.40088,55.9657],[-1.76084,55.96501],[-1.76222,55.56248],[-2.40225,55.56317]],[[-6.32574,56.38537],[-7.0196,56.35747],[-7.07316,56.76384],[-6.3793,56.79145],[-6.32574,56.38537]],[[-2.42258,54.4431],[-2.42574,54.84188],[-1.79931,54.84354],[-1.79614,54.44477],[-2.42258,54.4431]],[[-3.02701,51.37935],[-3.60589,51.37017],[-3.62237,51.77304],[-3.04349,51.78215],[-3.02701,51.37935]],[[-3.05379,52.18979],[-3.06615,52.59374],[-2.48364,52.60034],[-2.47128,52.19646],[-3.05379,52.18979]],[[-5.67673,51.70425],[-5.67886,51.73101],[-5.4636,51.7376],[-5.46146,51.71084],[-5.67673,51.70425]],[[-5.84427,59.10882],[-5.8469,59.13578],[-5.79558,59.1371],[-5.79294,59.11014],[-5.84427,59.10882]],[[-8.64844,57.77861],[-8.66597,57.87717],[-8.46649,57.88721],[-8.44897,57.78867],[-8.64844,57.77861]],[[-4.52711,59.01532],[-4.52859,59.03319],[-4.47623,59.03434],[-4.47475,59.01646],[-4.52711,59.01532]],[[-7.68062,58.25838],[-7.68655,58.2938],[-7.53445,58.30084],[-7.52852,58.26542],[-7.68062,58.25838]],[[-6.19102,59.08009],[-6.19546,59.11586],[-6.12542,59.11815],[-6.12099,59.08238],[-6.19102,59.08009]],[[-4.42669,59.07112],[-4.42805,59.0887],[-4.37621,59.08976],[-4.37485,59.07218],[-4.42669,59.07112]]]},{id:"ACT2017",name:"ACTmapi Imagery 2017",type:"wms",template:"https://data.actmapi.act.gov.au/arcgis/services/actmapi/imagery2017mga/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-05-01T00:00:00.000Z",startDate:"2017-05-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[149.085,-35.1171],[149.1509,-35.1157],[149.1509,-35.1335],[149.1736,-35.1335],[149.1739,-35.1512],[149.1957,-35.1512],[149.1962,-35.1689],[149.2177,-35.1683],[149.2192,-35.2048],[149.241,-35.2043],[149.2419,-35.2223],[149.2632,-35.2222],[149.2644,-35.2575],[149.3085,-35.2571],[149.309,-35.2751],[149.3531,-35.2742],[149.3536,-35.2921],[149.3974,-35.2917],[149.3988,-35.3452],[149.3777,-35.3457],[149.3772,-35.3641],[149.3341,-35.3648],[149.3385,-35.5451],[149.1624,-35.5487],[149.1727,-35.9271],[149.0175,-35.9294],[149.0172,-35.9113],[148.9506,-35.9125],[148.9499,-35.8946],[148.9277,-35.8949],[148.9272,-35.8768],[148.9053,-35.8768],[148.9042,-35.8586],[148.8826,-35.859],[148.8805,-35.7695],[148.8361,-35.7698],[148.8359,-35.7521],[148.8138,-35.7524],[148.8131,-35.7343],[148.7909,-35.7347],[148.7911,-35.7167],[148.7688,-35.7167],[148.7617,-35.3924],[148.7839,-35.3921],[148.7822,-35.3022],[148.8041,-35.302],[148.8033,-35.2836],[148.8474,-35.2832],[148.8469,-35.2652],[148.8689,-35.2643],[148.8687,-35.2466],[148.9128,-35.246],[148.9123,-35.2282],[148.9341,-35.228],[148.9329,-35.1919],[148.999,-35.1904],[148.9986,-35.1724],[149.0206,-35.172],[149.0204,-35.154],[149.0637,-35.1532],[149.0635,-35.1355],[149.0857,-35.1348],[149.085,-35.1171]]],terms_url:"https://actmapi-actgov.opendata.arcgis.com/datasets/884456bde6fd46d68e0c05479f55d548",terms_text:"© Jacobs Group (Australia) Pty Ltd and Australian Capital Territory"},{id:"ACT2018",name:"ACTmapi Imagery 2018",type:"wms",template:"https://data.actmapi.act.gov.au/arcgis/services/actmapi/imagery2018mga/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2018-03-19T00:00:00.000Z",startDate:"2018-03-19T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[149.2695,-35.4381],[149.2669,-35.348],[149.3329,-35.3468],[149.3334,-35.3648],[149.3774,-35.364],[149.3769,-35.3459],[149.3989,-35.3455],[149.3984,-35.3275],[149.4094,-35.3273],[149.4088,-35.3092],[149.3978,-35.3095],[149.3973,-35.2914],[149.3533,-35.2923],[149.3528,-35.2743],[149.3089,-35.2751],[149.3084,-35.2571],[149.2644,-35.2579],[149.2634,-35.2219],[149.2415,-35.2223],[149.241,-35.2043],[149.219,-35.2047],[149.218,-35.1687],[149.1961,-35.1691],[149.1956,-35.151],[149.1737,-35.1514],[149.1732,-35.1334],[149.1512,-35.1338],[149.1508,-35.1158],[149.085,-35.1169],[149.0854,-35.135],[149.0635,-35.1353],[149.0639,-35.1534],[149.0201,-35.1541],[149.0205,-35.1721],[148.9985,-35.1725],[148.999,-35.1905],[148.9331,-35.1916],[148.934,-35.2276],[148.912,-35.228],[148.9124,-35.246],[148.8685,-35.2467],[148.8689,-35.2647],[148.8469,-35.265],[148.8473,-35.2831],[148.8034,-35.2837],[148.8038,-35.3018],[148.7818,-35.3021],[148.7838,-35.3922],[148.8058,-35.3919],[148.8086,-35.5181],[148.7976,-35.5182],[148.7994,-35.5993],[148.8766,-35.5982],[148.8747,-35.517],[148.8527,-35.5174],[148.8508,-35.4363],[148.8398,-35.4364],[148.8388,-35.3914],[149.0039,-35.3888],[149.0048,-35.4248],[149.0268,-35.4244],[149.0277,-35.4605],[149.0497,-35.4601],[149.0511,-35.5142],[149.1613,-35.5122],[149.1594,-35.4402],[149.2695,-35.4381]]],terms_text:"© Jacobs Group (Australia) Pty Ltd and Australian Capital Territory",best:true},{id:"AGIV10cm",name:"AGIV Flanders 2013-2015 aerial imagery 10cm",type:"wms",template:"https://geoservices.informatievlaanderen.be/raadpleegdiensten/OGW/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OGWRGB13_15VL&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[5.98494,50.70723],[5.98494,50.7672],[5.91079,50.82275],[5.75561,50.83533],[5.75423,50.86264],[5.8332,50.93323],[5.85517,51.02661],[5.90941,51.07754],[5.91216,51.18225],[5.87851,51.20807],[5.77414,51.23689],[5.68419,51.24075],[5.62308,51.26998],[5.62308,51.29789],[5.54,51.34724],[5.4473,51.34853],[5.39855,51.32107],[5.31203,51.32322],[5.26671,51.36182],[5.19942,51.37254],[5.18294,51.39611],[5.15891,51.4924],[5.08338,51.53086],[5.03257,51.53983],[4.95566,51.50522],[4.90142,51.50565],[4.83825,51.54367],[4.77096,51.55862],[4.7119,51.54709],[4.64049,51.49667],[4.6144,51.4971],[4.56565,51.53171],[4.48256,51.53043],[4.42626,51.52189],[4.3006,51.46974],[4.29511,51.42566],[4.18113,51.42437],[4.13718,51.39525],[4.13856,51.35067],[4.05204,51.30047],[3.93325,51.27298],[3.86527,51.27084],[3.86321,51.29016],[3.76296,51.32407],[3.59336,51.35925],[3.47732,51.33137],[3.42582,51.39739],[3.23562,51.35153],[3.226,51.36568],[3.17794,51.36182],[3.16009,51.33223],[3.06258,51.30219],[2.75084,51.1702],[2.47001,51.07452],[2.49267,50.99378],[2.53112,50.95573],[2.50915,50.91159],[2.53043,50.82145],[2.5991,50.76416],[2.66501,50.76459],[2.77007,50.66677],[2.8971,50.65894],[2.99186,50.72549],[3.11339,50.72636],[3.23699,50.70592],[3.36265,50.6585],[3.47114,50.70201],[3.63936,50.66721],[3.69842,50.68156],[3.72794,50.71245],[3.81858,50.68418],[3.87488,50.64152],[4.09255,50.64283],[4.15023,50.66329],[4.20653,50.64413],[4.31365,50.64283],[4.45235,50.68766],[4.53475,50.67808],[4.61303,50.69549],[4.67689,50.69592],[4.72701,50.73201],[4.78057,50.73201],[4.79979,50.71288],[4.86228,50.71288],[4.88563,50.69549],[4.96116,50.69549],[5.03119,50.65763],[5.10741,50.65023],[5.2008,50.64892],[5.23581,50.66546],[5.32508,50.6659],[5.36696,50.682],[5.42121,50.66416],[5.52215,50.6746],[5.6224,50.72418],[5.67527,50.69853],[5.73981,50.69723],[5.77277,50.67199],[5.8126,50.66024],[5.90804,50.65981],[5.98494,50.70723]]],terms_text:"Orthophoto Flanders © AGIV",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIVFlandersGRB",name:"AGIV Flanders GRB",type:"tms",template:"https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=grb_bsk&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,21],polygon:[[[4.40434,50.78177],[4.45538,50.79328],[4.40268,50.8961],[4.331,50.90094],[4.27142,50.82002],[4.30648,50.81244],[4.36348,50.77251],[4.40434,50.78177],[4.43104,50.73831],[4.31859,50.72022],[4.29031,50.69402],[4.14853,50.72834],[3.95877,50.68947],[3.9097,50.69245],[3.89113,50.74333],[3.77568,50.74789],[3.75857,50.78045],[3.67752,50.77062],[3.64047,50.72242],[3.54139,50.73377],[3.54062,50.76307],[3.46005,50.76556],[3.3522,50.70614],[3.30562,50.75466],[3.17839,50.75609],[3.15329,50.78564],[3.02008,50.77312],[2.99943,50.81035],[2.91648,50.75356],[2.85476,50.75745],[2.86521,50.70565],[2.78473,50.7369],[2.713,50.81534],[2.63518,50.8129],[2.59909,50.85306],[2.59031,50.91893],[2.63262,50.94575],[2.57372,51.00842],[2.54165,51.09345],[3.15582,51.32714],[3.18307,51.37128],[3.23443,51.34669],[3.36356,51.37228],[3.38101,51.27446],[3.44201,51.24313],[3.52759,51.24604],[3.51511,51.28753],[3.58984,51.30577],[3.7783,51.26235],[3.79088,51.21429],[3.92412,51.21938],[4.16613,51.2929],[4.26163,51.37647],[4.42065,51.36473],[4.39108,51.45149],[4.54747,51.48571],[4.53541,51.42303],[4.64953,51.42758],[4.76359,51.5088],[4.84188,51.48074],[4.8383,51.42174],[4.89366,51.41698],[4.92785,51.39544],[5.02894,51.48789],[5.08018,51.46948],[5.10202,51.42892],[5.07117,51.3935],[5.13109,51.35137],[5.13448,51.31547],[5.20031,51.32172],[5.24189,51.30534],[5.23036,51.26436],[5.34828,51.27492],[5.41741,51.26229],[5.4863,51.30197],[5.5556,51.26986],[5.56045,51.22233],[5.76027,51.18505],[5.85578,51.14463],[5.75909,51.03588],[5.72665,50.91307],[5.64522,50.8372],[5.68732,50.804],[5.47863,50.72352],[5.41196,50.72368],[5.38908,50.74775],[5.30912,50.71802],[5.16984,50.72257],[5.16508,50.6957],[5.05642,50.71567],[5.00339,50.76594],[4.92545,50.74275],[4.90869,50.76968],[4.83106,50.77028],[4.76014,50.80544],[4.64309,50.79755],[4.65486,50.7552],[4.62021,50.74348],[4.59727,50.76359],[4.52399,50.72724],[4.49455,50.75679],[4.43104,50.73831],[4.40434,50.78177]],[[5.67393,50.75373],[5.88438,50.70114],[5.94172,50.76524],[5.76662,50.78761],[5.67393,50.75373]],[[4.91171,51.43492],[4.93711,51.42614],[4.95891,51.45471],[4.92801,51.46049],[4.91171,51.43492]]],terms_text:"GRB Flanders © AGIV",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIV",name:"AGIV Flanders most recent aerial imagery",type:"tms",template:"https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=omwrgbmrvl&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,21],polygon:[[[4.7737,50.79368],[4.8379,50.75916],[4.92511,50.73483],[4.98862,50.76264],[5.036,50.73527],[5.0645,50.69875],[5.1644,50.69005],[5.19393,50.71179],[5.3086,50.71245],[5.36422,50.74396],[5.43391,50.70766],[5.54378,50.74396],[5.61141,50.73527],[5.71166,50.73505],[5.77105,50.74092],[5.81946,50.70484],[5.89568,50.70614],[5.9204,50.72831],[5.91971,50.74504],[5.89843,50.77675],[5.81569,50.76351],[5.77517,50.79216],[5.69552,50.79737],[5.69072,50.82319],[5.66325,50.82904],[5.65467,50.86481],[5.72368,50.9012],[5.77174,50.95443],[5.75114,50.97368],[5.78273,51.00048],[5.78032,51.0523],[5.80848,51.05338],[5.80951,51.07668],[5.84315,51.09372],[5.84418,51.1101],[5.82599,51.11851],[5.86959,51.14953],[5.8277,51.17365],[5.792,51.16891],[5.7738,51.19344],[5.666,51.1928],[5.64059,51.21065],[5.5709,51.22829],[5.56231,51.27535],[5.49811,51.30605],[5.47099,51.30219],[5.45794,51.2893],[5.43048,51.28823],[5.41434,51.27363],[5.36593,51.282],[5.33641,51.28265],[5.32577,51.26718],[5.24337,51.27406],[5.24989,51.31335],[5.20972,51.32794],[5.14174,51.31914],[5.14209,51.35367],[5.08647,51.39482],[5.11565,51.43615],[5.08853,51.47508],[5.05214,51.47636],[5.04561,51.4939],[5.02364,51.4939],[5.01609,51.48663],[4.82966,51.48663],[4.83001,51.50009],[4.76855,51.51099],[4.74727,51.50394],[4.658,51.4492],[4.65663,51.43144],[4.53956,51.43379],[4.55466,51.48171],[4.5296,51.48748],[4.46368,51.48235],[4.37167,51.45562],[4.37751,51.40553],[4.4139,51.37511],[4.39776,51.36118],[4.34798,51.36675],[4.34627,51.38497],[4.20344,51.38111],[4.2213,51.3511],[4.15641,51.29832],[4.05101,51.25193],[4.00638,51.25279],[3.95144,51.22205],[3.88484,51.22936],[3.81926,51.21797],[3.80038,51.22872],[3.80107,51.26074],[3.74442,51.28007],[3.63593,51.29746],[3.58615,51.31378],[3.5065,51.28308],[3.51371,51.25021],[3.43921,51.25064],[3.39766,51.27513],[3.37329,51.31678],[3.39114,51.34274],[3.3623,51.37961],[3.24283,51.35474],[3.20266,51.37039],[3.15631,51.35196],[3.14223,51.33051],[2.53318,51.09092],[2.56476,50.9968],[2.61832,50.9527],[2.57781,50.91852],[2.5936,50.88431],[2.58948,50.85051],[2.6245,50.80757],[2.71033,50.8054],[2.78449,50.71853],[2.87375,50.69983],[2.86483,50.74765],[2.92525,50.75156],[2.97263,50.77024],[2.97332,50.79889],[3.00078,50.79759],[3.01383,50.76676],[3.09863,50.76611],[3.13537,50.78196],[3.16832,50.75004],[3.30428,50.74613],[3.31561,50.71484],[3.3678,50.70179],[3.44848,50.75091],[3.53293,50.75156],[3.53328,50.72549],[3.63902,50.7131],[3.69086,50.7672],[3.75163,50.76177],[3.7712,50.73874],[3.87729,50.73983],[3.87969,50.70418],[3.9202,50.68352],[3.99951,50.682],[4.06749,50.68961],[4.16018,50.72049],[4.17632,50.70331],[4.24739,50.68222],[4.31708,50.69418],[4.31846,50.70962],[4.38403,50.71027],[4.38437,50.72353],[4.47226,50.74743],[4.52617,50.71853],[4.55226,50.73766],[4.64908,50.73722],[4.6532,50.78717],[4.72426,50.78218],[4.73731,50.79585],[4.7737,50.79368]]],terms_text:"Orthophoto Flanders most recent © AGIV",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGRI-black_and_white-2.5m",name:"AGRI black-and-white 2.5m",type:"tms",template:"https://{switch:a,b,c}.agri.openstreetmap.org/layer/au_ga_agri/{zoom}/{x}/{y}.png",endDate:"2011-01-01T00:00:00.000Z",startDate:"2006-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[112.28778,-28.78459],[112.71488,-31.13894],[114.11263,-34.17829],[113.60788,-37.39012],[117.17992,-37.45179],[119.31538,-37.42096],[121.72262,-36.70839],[123.81925,-35.76893],[125.9547,-34.3066],[127.97368,-33.7274],[130.07031,-33.24166],[130.10913,-33.8887],[131.00214,-34.04971],[131.0798,-34.72257],[132.28342,-35.39],[134.18591,-35.61126],[133.8753,-37.1119],[134.8459,-37.6365],[139.7769,-37.82075],[139.93223,-39.4283],[141.6017,-39.8767],[142.3783,-39.36829],[142.3783,-40.64702],[142.49478,-42.07487],[144.009,-44.06013],[147.23161,-44.03222],[149.05645,-42.53431],[149.52237,-40.99959],[149.9494,-40.85292],[150.8036,-38.09627],[151.81313,-38.12682],[156.20052,-22.66771],[156.20052,-20.10109],[156.62761,-17.41763],[155.26869,-17.19521],[154.14272,-19.51662],[153.5215,-18.34139],[153.05558,-16.5636],[152.78379,-15.25677],[152.27905,-13.4135],[151.3472,-12.39177],[149.48354,-12.05024],[146.9598,-9.99241],[135.9719,-9.99241],[130.3032,-10.33636],[128.09016,-12.16414],[125.91588,-12.31591],[124.3239,-11.86033],[122.03323,-11.97429],[118.26706,-16.9353],[115.93747,-19.11357],[114.0738,-21.11863],[113.49141,-22.59603],[112.28778,-28.78459]]],terms_url:"https://data.gov.au/dataset/agri-the-australian-geographic-reference-image",terms_text:"AGRI, Geoscience Australia"},{id:"alagoas_litoral",name:"Alagoas Litoral 2006",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Ortofotos%202006&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-35.52384,-9.48089],[-35.5236,-9.44515],[-35.51572,-9.44518],[-35.51584,-9.44229],[-35.50542,-9.44238],[-35.50518,-9.43064],[-35.49334,-9.43073],[-35.49304,-9.3982],[-35.4893,-9.39817],[-35.48921,-9.38628],[-35.4854,-9.38634],[-35.48525,-9.37809],[-35.48127,-9.37812],[-35.48114,-9.36987],[-35.47698,-9.36996],[-35.47686,-9.36385],[-35.47459,-9.36388],[-35.47447,-9.36153],[-35.47212,-9.36141],[-35.47206,-9.35917],[-35.46976,-9.3592],[-35.46967,-9.35682],[-35.46653,-9.35676],[-35.46641,-9.35289],[-35.46387,-9.35277],[-35.46387,-9.35119],[-35.44135,-9.35131],[-35.44125,-9.34541],[-35.43177,-9.34538],[-35.43171,-9.33602],[-35.39463,-9.33632],[-35.39442,-9.30125],[-35.38165,-9.30143],[-35.38147,-9.28638],[-35.37799,-9.28626],[-35.37796,-9.2811],[-35.36942,-9.28122],[-35.36921,-9.27261],[-35.35966,-9.27276],[-35.35969,-9.26465],[-35.35051,-9.26474],[-35.35036,-9.25562],[-35.34115,-9.25565],[-35.34118,-9.24501],[-35.31775,-9.24519],[-35.3176,-9.22567],[-35.30292,-9.22579],[-35.30283,-9.2113],[-35.30794,-9.21136],[-35.30785,-9.19979],[-35.29103,-9.19988],[-35.29091,-9.1966],[-35.29018,-9.19669],[-35.28997,-9.16516],[-35.27759,-9.16522],[-35.2775,-9.16417],[-35.27541,-9.1642],[-35.27535,-9.16152],[-35.27375,-9.16149],[-35.27366,-9.15839],[-35.27182,-9.15842],[-35.27185,-9.15729],[-35.27149,-9.15729],[-35.27143,-9.15469],[-35.26965,-9.15463],[-35.26959,-9.15362],[-35.26919,-9.15362],[-35.26907,-9.13159],[-35.26403,-9.13165],[-35.264,-9.12318],[-35.26056,-9.12321],[-35.26053,-9.11781],[-35.256,-9.11784],[-35.25573,-9.08946],[-35.25114,-9.08955],[-35.25108,-9.08651],[-35.25026,-9.08648],[-35.25029,-9.08475],[-35.24449,-9.08478],[-35.24449,-9.07989],[-35.24093,-9.07997],[-35.24081,-9.07312],[-35.23734,-9.07312],[-35.23719,-9.06322],[-35.23655,-9.06322],[-35.23652,-9.04655],[-35.23323,-9.04652],[-35.23332,-9.04345],[-35.2306,-9.04348],[-35.2306,-9.04014],[-35.22897,-9.04008],[-35.229,-9.03835],[-35.22505,-9.03826],[-35.22502,-9.03167],[-35.2223,-9.03161],[-35.22233,-9.02012],[-35.21834,-9.02009],[-35.21831,-9.01341],[-35.21671,-9.01341],[-35.21668,-9.00998],[-35.21176,-9.00998],[-35.21173,-9.00647],[-35.20971,-9.00653],[-35.20974,-9.00438],[-35.20765,-9.00432],[-35.20768,-9.00226],[-35.20566,-9.00226],[-35.20563,-8.99987],[-35.20391,-8.99987],[-35.20394,-8.99785],[-35.20213,-8.99791],[-35.20213,-8.99579],[-35.19844,-8.99582],[-35.19844,-8.99361],[-35.19434,-8.99361],[-35.19428,-8.99122],[-35.19065,-8.99131],[-35.19062,-8.98833],[-35.18766,-8.98842],[-35.18763,-8.98544],[-35.18473,-8.98541],[-35.18467,-8.98255],[-35.18238,-8.98252],[-35.18235,-8.98052],[-35.17951,-8.98061],[-35.17948,-8.97742],[-35.17809,-8.97745],[-35.17803,-8.97306],[-35.17558,-8.97303],[-35.17549,-8.96912],[-35.17293,-8.96909],[-35.17284,-8.96292],[-35.17063,-8.96289],[-35.17048,-8.95579],[-35.16852,-8.95564],[-35.16852,-8.94806],[-35.16794,-8.948],[-35.16791,-8.93995],[-35.16245,-8.93995],[-35.16242,-8.92978],[-35.1587,-8.92981],[-35.15873,-8.92662],[-35.15547,-8.92668],[-35.1555,-8.92378],[-35.15348,-8.92381],[-35.15339,-8.92065],[-35.15131,-8.92062],[-35.15122,-8.91194],[-35.15263,-8.91194],[-35.15263,-8.90821],[-35.15439,-8.90824],[-35.1543,-8.90215],[-35.15593,-8.90212],[-35.15593,-8.90051],[-35.15768,-8.90048],[-35.15774,-8.89905],[-35.15958,-8.89908],[-35.15955,-8.89747],[-35.16139,-8.8975],[-35.16133,-8.89625],[-35.16363,-8.89625],[-35.1636,-8.89526],[-35.16553,-8.89526],[-35.1655,-8.89315],[-35.16794,-8.89315],[-35.16791,-8.89147],[-35.17024,-8.89153],[-35.17027,-8.8904],[-35.17302,-8.89043],[-35.17302,-8.88876],[-35.17791,-8.88876],[-35.17794,-8.88795],[-35.17894,-8.88792],[-35.17894,-8.88891],[-35.17966,-8.88894],[-35.17978,-8.88858],[-35.18099,-8.88861],[-35.18099,-8.88816],[-35.18519,-8.88816],[-35.18519,-8.88897],[-35.18591,-8.889],[-35.18591,-8.88971],[-35.18932,-8.88971],[-35.18947,-8.8893],[-35.19014,-8.88927],[-35.19017,-8.88831],[-35.19071,-8.88831],[-35.19077,-8.88789],[-35.19153,-8.88792],[-35.19156,-8.88619],[-35.19754,-8.88607],[-35.19757,-8.8873],[-35.19968,-8.8873],[-35.19974,-8.88777],[-35.2008,-8.88777],[-35.2008,-8.88822],[-35.2033,-8.88822],[-35.20337,-8.8887],[-35.20563,-8.88861],[-35.20557,-8.88983],[-35.20741,-8.8898],[-35.20744,-8.89022],[-35.21125,-8.89025],[-35.21128,-8.88769],[-35.21245,-8.88777],[-35.21248,-8.88861],[-35.21623,-8.88858],[-35.21623,-8.88748],[-35.21871,-8.88745],[-35.21871,-8.88897],[-35.22136,-8.88897],[-35.22263,-8.88792],[-35.22402,-8.88748],[-35.22453,-8.88763],[-35.22644,-8.88718],[-35.22707,-8.88598],[-35.23311,-8.88446],[-35.23933,-8.88339],[-35.24129,-8.88416],[-35.25011,-8.88515],[-35.25624,-8.88506],[-35.26168,-8.88294],[-35.26161,-8.88094],[-35.26406,-8.88109],[-35.26877,-8.8793],[-35.27421,-8.87748],[-35.2781,-8.87518],[-35.28499,-8.87507],[-35.28502,-8.87581],[-35.2881,-8.87578],[-35.29405,-8.87545],[-35.30782,-8.87208],[-35.31757,-8.86961],[-35.32784,-8.86716],[-35.33206,-8.86614],[-35.34103,-8.86376],[-35.3471,-8.86244],[-35.3522,-8.86113],[-35.35257,-8.86391],[-35.34903,-8.86611],[-35.34496,-8.87205],[-35.34327,-8.87489],[-35.34318,-8.87569],[-35.34381,-8.87668],[-35.34481,-8.8768],[-35.34888,-8.87721],[-35.35042,-8.87781],[-35.35254,-8.87891],[-35.35399,-8.88011],[-35.35577,-8.88252],[-35.35755,-8.88396],[-35.36036,-8.88512],[-35.36114,-8.88509],[-35.3612,-8.88587],[-35.36175,-8.8859],[-35.36178,-8.88777],[-35.36253,-8.88783],[-35.36247,-8.891],[-35.36311,-8.89112],[-35.36311,-8.89482],[-35.3644,-8.89488],[-35.36507,-8.8967],[-35.36637,-8.90022],[-35.36754,-8.90427],[-35.36794,-8.90782],[-35.36863,-8.90917],[-35.37207,-8.91155],[-35.3741,-8.91349],[-35.37277,-8.916],[-35.37262,-8.91817],[-35.37084,-8.92229],[-35.37062,-8.92486],[-35.37235,-8.93038],[-35.37153,-8.93193],[-35.37153,-8.93363],[-35.37171,-8.93387],[-35.37171,-8.94362],[-35.36818,-8.94377],[-35.36815,-8.94505],[-35.36927,-8.94511],[-35.36921,-8.94863],[-35.37078,-8.94872],[-35.37081,-8.95182],[-35.37219,-8.95176],[-35.37222,-8.95528],[-35.37319,-8.95531],[-35.37313,-8.95737],[-35.3744,-8.95737],[-35.37446,-8.96012],[-35.37567,-8.96018],[-35.3757,-8.96205],[-35.37688,-8.96208],[-35.37694,-8.96444],[-35.37781,-8.96444],[-35.37775,-8.96617],[-35.38074,-8.96617],[-35.38074,-8.96331],[-35.38288,-8.96328],[-35.38291,-8.95982],[-35.38542,-8.95985],[-35.38542,-8.95722],[-35.38723,-8.95722],[-35.3872,-8.95406],[-35.38947,-8.95409],[-35.38947,-8.95084],[-35.39158,-8.95087],[-35.39158,-8.94792],[-35.39587,-8.94792],[-35.39581,-8.94651],[-35.3972,-8.94654],[-35.39711,-8.94472],[-35.39838,-8.94469],[-35.39838,-8.93915],[-35.40107,-8.93915],[-35.40106,-8.93895],[-35.40167,-8.93894],[-35.40173,-8.93688],[-35.40236,-8.93688],[-35.40236,-8.93628],[-35.40324,-8.9364],[-35.4033,-8.93583],[-35.40426,-8.9358],[-35.4042,-8.93363],[-35.40574,-8.9336],[-35.40577,-8.93124],[-35.4081,-8.93133],[-35.40804,-8.92927],[-35.40937,-8.9293],[-35.40928,-8.92739],[-35.41085,-8.92742],[-35.41085,-8.92542],[-35.41239,-8.92545],[-35.41236,-8.9239],[-35.41335,-8.92387],[-35.41329,-8.92193],[-35.41523,-8.92196],[-35.41523,-8.91999],[-35.41655,-8.92002],[-35.41655,-8.91755],[-35.4196,-8.91755],[-35.41966,-8.91964],[-35.42184,-8.91964],[-35.42187,-8.92265],[-35.42389,-8.92268],[-35.42392,-8.92513],[-35.42537,-8.92513],[-35.42537,-8.92766],[-35.42724,-8.92766],[-35.42727,-8.92987],[-35.42815,-8.92984],[-35.42818,-8.9316],[-35.42987,-8.93154],[-35.4299,-8.93407],[-35.43141,-8.93407],[-35.43141,-8.9356],[-35.43226,-8.93557],[-35.43229,-8.93586],[-35.4334,-8.93583],[-35.4334,-8.94001],[-35.43434,-8.94004],[-35.43434,-8.94097],[-35.43531,-8.94097],[-35.43534,-8.94261],[-35.43567,-8.94264],[-35.4357,-8.94329],[-35.43627,-8.94332],[-35.43624,-8.94422],[-35.4373,-8.94422],[-35.43727,-8.9452],[-35.43823,-8.9452],[-35.43827,-8.94684],[-35.43902,-8.94687],[-35.43902,-8.94798],[-35.44026,-8.94798],[-35.44032,-8.94953],[-35.44159,-8.94956],[-35.44165,-8.95152],[-35.44273,-8.95152],[-35.44273,-8.95334],[-35.44436,-8.95334],[-35.44436,-8.95498],[-35.44569,-8.95501],[-35.44563,-8.95674],[-35.4472,-8.9568],[-35.44717,-8.95865],[-35.44895,-8.95871],[-35.44892,-8.96],[-35.45101,-8.95994],[-35.45098,-8.96101],[-35.45469,-8.96095],[-35.45466,-8.96235],[-35.46049,-8.96235],[-35.46055,-8.96557],[-35.46653,-8.96548],[-35.46659,-8.96885],[-35.46771,-8.96883],[-35.46774,-8.97053],[-35.4739,-8.97053],[-35.47399,-8.9753],[-35.47791,-8.97521],[-35.47797,-8.97816],[-35.4841,-8.97813],[-35.48416,-8.98201],[-35.49084,-8.98195],[-35.49084,-8.98562],[-35.49721,-8.98562],[-35.49721,-8.99069],[-35.50225,-8.99057],[-35.50234,-8.99567],[-35.50648,-8.99567],[-35.50651,-8.99856],[-35.51204,-8.9985],[-35.51207,-9.00163],[-35.51663,-9.00166],[-35.51666,-9.00617],[-35.52119,-9.00614],[-35.52122,-9.00739],[-35.53127,-9.00733],[-35.53127,-9.01064],[-35.54818,-9.01049],[-35.54818,-9.01359],[-35.56968,-9.01344],[-35.56974,-9.01738],[-35.58575,-9.01732],[-35.58578,-9.01995],[-35.60957,-9.01983],[-35.60954,-9.02302],[-35.62911,-9.02287],[-35.62905,-9.02508],[-35.65221,-9.0249],[-35.65224,-9.02758],[-35.67552,-9.0274],[-35.67555,-9.03056],[-35.68295,-9.03056],[-35.68298,-9.03435],[-35.69128,-9.03432],[-35.69128,-9.03766],[-35.6995,-9.0376],[-35.6995,-9.04034],[-35.70668,-9.04031],[-35.70671,-9.04518],[-35.71115,-9.04518],[-35.71133,-9.06691],[-35.70871,-9.06691],[-35.70877,-9.07869],[-35.70656,-9.07872],[-35.70656,-9.08653],[-35.7043,-9.08653],[-35.70433,-9.09104],[-35.69992,-9.09107],[-35.69989,-9.0956],[-35.69536,-9.09557],[-35.69542,-9.10001],[-35.69092,-9.10013],[-35.69101,-9.10207],[-35.63367,-9.10246],[-35.6337,-9.10541],[-35.62585,-9.10553],[-35.62591,-9.10964],[-35.62231,-9.10964],[-35.62234,-9.11203],[-35.6199,-9.112],[-35.6199,-9.11501],[-35.61473,-9.11507],[-35.61473,-9.11707],[-35.61177,-9.11701],[-35.61181,-9.1182],[-35.6096,-9.11826],[-35.60963,-9.12571],[-35.59976,-9.12583],[-35.59979,-9.12923],[-35.59634,-9.12926],[-35.5964,-9.13502],[-35.59197,-9.13507],[-35.59209,-9.149],[-35.59018,-9.14897],[-35.59015,-9.15108],[-35.6016,-9.15105],[-35.60154,-9.14912],[-35.60552,-9.14912],[-35.60549,-9.14557],[-35.61184,-9.14554],[-35.61184,-9.14235],[-35.6176,-9.14238],[-35.61757,-9.13853],[-35.624,-9.13853],[-35.62397,-9.13466],[-35.63177,-9.13466],[-35.63164,-9.13063],[-35.63922,-9.1306],[-35.63919,-9.12878],[-35.66386,-9.12869],[-35.6638,-9.1261],[-35.71278,-9.12577],[-35.71275,-9.12407],[-35.72426,-9.12401],[-35.71964,-9.15323],[-35.72112,-9.1532],[-35.72124,-9.17258],[-35.72066,-9.17255],[-35.72082,-9.18558],[-35.71212,-9.18566],[-35.7133,-9.34416],[-35.69041,-9.34433],[-35.69065,-9.37189],[-35.68899,-9.37189],[-35.68902,-9.37598],[-35.68757,-9.37598],[-35.68766,-9.38232],[-35.68497,-9.38235],[-35.68503,-9.39093],[-35.68168,-9.39099],[-35.68177,-9.39936],[-35.67715,-9.39933],[-35.67724,-9.4089],[-35.67292,-9.40893],[-35.67301,-9.41754],[-35.66972,-9.4176],[-35.66978,-9.42498],[-35.66722,-9.42498],[-35.66728,-9.4327],[-35.66075,-9.43288],[-35.66075,-9.43705],[-35.6513,-9.43708],[-35.65142,-9.44211],[-35.64514,-9.44217],[-35.64523,-9.44652],[-35.63645,-9.44661],[-35.63645,-9.44992],[-35.62711,-9.45],[-35.62727,-9.46505],[-35.62086,-9.46511],[-35.62092,-9.4722],[-35.60939,-9.47222],[-35.60939,-9.47529],[-35.59674,-9.47535],[-35.59674,-9.47351],[-35.57844,-9.47371],[-35.57847,-9.47595],[-35.57267,-9.47604],[-35.5727,-9.48042],[-35.56823,-9.48048],[-35.56826,-9.48881],[-35.54169,-9.48893],[-35.54163,-9.48071],[-35.52384,-9.48089]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"arapiraca_al",name:"Arapiraca AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Arapiraca&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.60875,-9.83072],[-36.60784,-9.74047],[-36.61718,-9.74051],[-36.61631,-9.65075],[-36.70737,-9.64977],[-36.70832,-9.74043],[-36.69898,-9.74047],[-36.69997,-9.82968],[-36.60875,-9.83072]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"CRAIG-Auvergne-2013",name:"Auvergne 2013 25cm CRAIG",type:"tms",template:"https://tiles.craig.fr/osm/wmts/1.0.0/ortho_2013/webmercator/{zoom}/{x}/{y}.jpeg",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[2.94012,44.63388],[2.99719,44.63393],[2.99717,44.64734],[3.01597,44.64735],[3.01593,44.67412],[3.03495,44.67413],[3.0349,44.70152],[3.05363,44.70154],[3.05357,44.7419],[3.07233,44.74191],[3.07222,44.80917],[3.09216,44.80919],[3.09214,44.82213],[3.13014,44.82216],[3.13005,44.87707],[3.14856,44.87709],[3.14858,44.8637],[3.16823,44.86371],[3.16825,44.85003],[3.2064,44.85006],[3.20638,44.86284],[3.24395,44.86287],[3.24393,44.87679],[3.26315,44.87681],[3.26308,44.91752],[3.32004,44.91757],[3.32002,44.93033],[3.33908,44.93035],[3.33906,44.9442],[3.377,44.94423],[3.37702,44.93029],[3.39603,44.9303],[3.39612,44.87627],[3.41483,44.87629],[3.41489,44.83553],[3.43334,44.83554],[3.43338,44.80828],[3.45255,44.80829],[3.45258,44.79463],[3.50893,44.79468],[3.5089,44.80815],[3.60426,44.80823],[3.60422,44.83482],[3.62361,44.83484],[3.62357,44.86166],[3.64248,44.86167],[3.64255,44.8211],[3.66101,44.82112],[3.66103,44.80777],[3.6993,44.8078],[3.69928,44.82099],[3.73611,44.82102],[3.73618,44.77971],[3.77511,44.77974],[3.77515,44.75223],[3.81184,44.75226],[3.81186,44.7392],[3.83118,44.73922],[3.83121,44.72468],[3.88782,44.72472],[3.8878,44.73818],[3.92563,44.73821],[3.9256,44.75167],[3.94541,44.75168],[3.94537,44.77847],[3.96437,44.77848],[3.96435,44.79193],[4.00332,44.79196],[4.0033,44.80526],[4.02169,44.80527],[4.02167,44.81857],[4.05965,44.8186],[4.05961,44.84492],[4.07981,44.84494],[4.07979,44.85735],[4.17388,44.85743],[4.17386,44.87055],[4.19326,44.87056],[4.19323,44.88427],[4.21404,44.88429],[4.214,44.91002],[4.23241,44.91004],[4.23237,44.93731],[4.27155,44.93734],[4.27153,44.9503],[4.32887,44.95034],[4.32878,45.00367],[4.34893,45.00368],[4.3489,45.01707],[4.40608,45.01711],[4.40599,45.071],[4.38847,45.07099],[4.38845,45.0846],[4.40794,45.08461],[4.40792,45.09663],[4.48436,45.09669],[4.48429,45.13705],[4.46636,45.13703],[4.46634,45.1502],[4.48645,45.15022],[4.4864,45.17724],[4.50655,45.17726],[4.50644,45.24501],[4.48813,45.24499],[4.48811,45.25921],[4.46986,45.25919],[4.46984,45.27298],[4.45088,45.27297],[4.45086,45.28642],[4.39368,45.28637],[4.39363,45.31352],[4.37509,45.3135],[4.37507,45.32741],[4.39507,45.32742],[4.39503,45.35458],[4.37679,45.35457],[4.37676,45.36855],[4.35766,45.36853],[4.35763,45.38234],[4.28146,45.38227],[4.28143,45.39688],[4.24446,45.39685],[4.24443,45.41079],[4.14812,45.41071],[4.14814,45.39807],[4.12919,45.39805],[4.12921,45.38409],[4.09021,45.38406],[4.09024,45.37121],[4.01355,45.37115],[4.01353,45.3861],[3.91709,45.38602],[3.91707,45.39974],[3.93757,45.39975],[3.93755,45.41311],[3.97528,45.41315],[3.97526,45.42621],[3.99537,45.42622],[3.9957,45.52096],[3.97778,45.52094],[3.97769,45.57439],[3.95818,45.57437],[3.95815,45.58837],[3.9396,45.58835],[3.93958,45.60262],[3.92023,45.60261],[3.9202,45.61646],[3.88189,45.61643],[3.88185,45.64328],[3.84413,45.64325],[3.84411,45.65709],[3.82617,45.65707],[3.82612,45.68389],[3.80722,45.68387],[3.80713,45.73758],[3.78821,45.73756],[3.78819,45.7518],[3.76885,45.75178],[3.7688,45.77897],[3.75072,45.77895],[3.75058,45.86066],[3.76967,45.86067],[3.76958,45.91433],[3.75166,45.91432],[3.75164,45.92809],[3.7329,45.92807],[3.73285,45.95472],[3.81018,45.95478],[3.81016,45.96823],[3.8496,45.96826],[3.84951,46.02162],[3.83188,46.0216],[3.83179,46.07591],[3.8505,46.07592],[3.85046,46.10295],[3.83247,46.10294],[3.83234,46.18456],[3.81422,46.18455],[3.81415,46.22442],[3.83369,46.22444],[3.83366,46.2381],[3.85289,46.23812],[3.85287,46.25147],[3.89314,46.25151],[3.89312,46.26447],[3.91306,46.26448],[3.91303,46.27793],[3.95189,46.27796],[3.95187,46.29082],[3.97152,46.29084],[3.9715,46.30369],[4.0105,46.30373],[4.01048,46.31776],[4.02983,46.31778],[4.02978,46.34428],[4.0116,46.34427],[4.01146,46.42534],[4.03153,46.42536],[4.03146,46.4658],[4.01324,46.46578],[4.01322,46.47938],[3.99437,46.47936],[3.99435,46.49361],[3.9746,46.4936],[3.97457,46.50753],[3.87754,46.50745],[3.8775,46.53478],[3.85836,46.53476],[3.85833,46.54832],[3.81869,46.54828],[3.81871,46.53553],[3.79924,46.53552],[3.79922,46.54907],[3.76104,46.54904],[3.76092,46.61681],[3.74233,46.61679],[3.74228,46.64396],[3.72286,46.64395],[3.72281,46.67104],[3.70387,46.67102],[3.70385,46.68467],[3.68411,46.68466],[3.68406,46.712],[3.66484,46.71198],[3.66479,46.73904],[3.64576,46.73902],[3.64572,46.76634],[3.62575,46.76632],[3.62573,46.77971],[3.56723,46.77966],[3.56725,46.76631],[3.54715,46.76629],[3.54719,46.73928],[3.52716,46.73927],[3.52723,46.6989],[3.48774,46.69887],[3.48776,46.68594],[3.46796,46.68593],[3.46794,46.69941],[3.46792,46.71279],[3.44865,46.71278],[3.44863,46.72679],[3.35043,46.72671],[3.35048,46.6999],[3.33039,46.69988],[3.33034,46.7272],[3.23272,46.72712],[3.23274,46.71351],[3.2129,46.7135],[3.21293,46.70013],[3.17354,46.7001],[3.1735,46.72751],[3.15412,46.72749],[3.1541,46.74073],[3.11478,46.7407],[3.11475,46.75428],[3.07534,46.75424],[3.0753,46.78135],[3.05597,46.78134],[3.05592,46.80831],[2.99704,46.80826],[2.99702,46.82196],[2.93794,46.82191],[2.93797,46.80826],[2.89866,46.80823],[2.89869,46.79424],[2.87899,46.79422],[2.87901,46.78104],[2.85942,46.78103],[2.85944,46.76771],[2.84004,46.76769],[2.84007,46.75447],[2.7414,46.75439],[2.74138,46.76682],[2.70234,46.76679],[2.70236,46.75389],[2.68266,46.75387],[2.68268,46.74048],[2.66349,46.74046],[2.66351,46.7259],[2.64342,46.72588],[2.64344,46.71309],[2.62414,46.71308],[2.62417,46.69981],[2.60397,46.69979],[2.60399,46.68584],[2.56512,46.68581],[2.56515,46.67261],[2.54593,46.6726],[2.546,46.63215],[2.56592,46.63217],[2.56595,46.61811],[2.54564,46.61809],[2.54569,46.59072],[2.56642,46.59074],[2.56644,46.57754],[2.5855,46.57756],[2.58552,46.56472],[2.56613,46.5647],[2.56616,46.55062],[2.46828,46.55055],[2.4683,46.53582],[2.33212,46.53571],[2.33217,46.50886],[2.31265,46.50884],[2.31267,46.49534],[2.29288,46.49533],[2.2929,46.48182],[2.27487,46.4818],[2.27492,46.45442],[2.25539,46.4544],[2.25553,46.37349],[2.27595,46.37351],[2.27604,46.32087],[2.31456,46.32091],[2.31458,46.30704],[2.35371,46.30707],[2.35373,46.29297],[2.39384,46.293],[2.39389,46.26729],[2.45157,46.26733],[2.4516,46.25349],[2.47094,46.25351],[2.47098,46.22656],[2.49151,46.22657],[2.49155,46.19933],[2.51088,46.19934],[2.51093,46.17278],[2.53117,46.1728],[2.53138,46.05135],[2.55163,46.05137],[2.55166,46.03777],[2.57056,46.03778],[2.57068,45.96994],[2.55144,45.96993],[2.55146,45.95662],[2.53226,45.9566],[2.53228,45.94301],[2.51307,45.94299],[2.51313,45.90203],[2.47494,45.902],[2.47496,45.88882],[2.43619,45.88879],[2.43622,45.87533],[2.41721,45.87531],[2.41725,45.84794],[2.37847,45.84791],[2.3785,45.83397],[2.35952,45.83396],[2.35956,45.80708],[2.37873,45.8071],[2.37875,45.79358],[2.3987,45.79359],[2.39872,45.78035],[2.41825,45.78036],[2.41832,45.74],[2.45722,45.74003],[2.45724,45.7267],[2.47589,45.72671],[2.47591,45.71324],[2.49533,45.71325],[2.49542,45.65913],[2.45769,45.6591],[2.45776,45.61834],[2.43912,45.61833],[2.43919,45.57766],[2.4585,45.57768],[2.45855,45.55053],[2.47809,45.55055],[2.47811,45.53725],[2.49755,45.53726],[2.49759,45.51068],[2.47855,45.51066],[2.47864,45.45613],[2.45978,45.45612],[2.45987,45.40176],[2.42249,45.40173],[2.42247,45.41528],[2.40232,45.41527],[2.40229,45.42882],[2.3256,45.42876],[2.32567,45.38796],[2.34562,45.38798],[2.34566,45.36111],[2.32626,45.36109],[2.32628,45.34721],[2.30738,45.3472],[2.3074,45.3336],[2.28811,45.33358],[2.28813,45.32082],[2.26963,45.3208],[2.26966,45.30621],[2.25066,45.3062],[2.25068,45.29251],[2.23169,45.2925],[2.23171,45.27924],[2.213,45.27922],[2.21305,45.25204],[2.19374,45.25202],[2.19376,45.23811],[2.17561,45.2381],[2.17574,45.15768],[2.15735,45.15767],[2.15744,45.10295],[2.12024,45.10292],[2.12026,45.08955],[2.10067,45.08953],[2.10069,45.07544],[2.08246,45.07543],[2.08255,45.0216],[2.10255,45.02161],[2.1026,44.99445],[2.04574,44.99441],[2.04585,44.92753],[2.06578,44.92755],[2.06589,44.85969],[2.0857,44.8597],[2.08572,44.84581],[2.10556,44.84583],[2.1056,44.81933],[2.12474,44.81934],[2.12477,44.80551],[2.14351,44.80553],[2.14355,44.7786],[2.12561,44.77858],[2.1257,44.72427],[2.10665,44.72426],[2.10671,44.68423],[2.12634,44.68424],[2.12636,44.67074],[2.14598,44.67075],[2.14607,44.61644],[2.18396,44.61648],[2.18398,44.60378],[2.24042,44.60383],[2.24037,44.63095],[2.25948,44.63097],[2.25946,44.64493],[2.31668,44.64498],[2.3167,44.63088],[2.33615,44.6309],[2.33617,44.61758],[2.37242,44.61761],[2.3724,44.63158],[2.41105,44.63161],[2.41107,44.61907],[2.44922,44.61911],[2.4492,44.63232],[2.50486,44.63237],[2.50481,44.65976],[2.52461,44.65977],[2.52457,44.68717],[2.54225,44.68719],[2.54223,44.70122],[2.58071,44.70125],[2.5806,44.76834],[2.61769,44.76837],[2.61762,44.80884],[2.63676,44.80885],[2.63669,44.84929],[2.67331,44.84933],[2.67329,44.86252],[2.69338,44.86253],[2.69333,44.88943],[2.73052,44.88946],[2.73048,44.91645],[2.74992,44.91646],[2.75005,44.83647],[2.80733,44.83652],[2.80731,44.8491],[2.82638,44.84912],[2.8264,44.83628],[2.8457,44.8363],[2.84577,44.79571],[2.86422,44.79573],[2.86426,44.76865],[2.88399,44.76866],[2.88403,44.74197],[2.90203,44.74198],[2.90214,44.67432],[2.92198,44.67434],[2.92202,44.6473],[2.9401,44.64731],[2.94012,44.63388]]],terms_url:"http://ids.craig.fr/geocat/srv/fre/catalog.search?node=srv#/metadata/8cabc987-829c-4c9f-943b-6a0e255cd73",terms_text:"Orthophotographie CRAIG/Sintegra/IGN 2013"},{id:"CRAIG-Auvergne-2016",name:"Auvergne 2016 25cm CRAIG",type:"tms",template:"https://tiles.craig.fr/ortho/wmts/1.0.0/ortho_2016/webmercator/{zoom}/{x}/{y}.jpeg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[2.49389,46.66829],[2.71362,46.84141],[3.64746,46.80758],[4.04846,46.48327],[4.03747,46.24825],[4.46044,46.25965],[4.4934,46.14559],[4.38354,46.09229],[4.45495,45.69084],[4.76257,45.57176],[4.81201,45.34443],[4.22424,44.84419],[3.86169,44.696],[3.37829,44.80523],[3.33435,44.89091],[3.18054,44.82471],[3.03222,44.60612],[2.92785,44.60221],[2.71911,44.85198],[2.51037,44.60221],[2.12585,44.58265],[2.005,44.97257],[2.30712,45.46784],[2.43347,45.44087],[2.41149,45.72919],[2.34558,45.82402],[2.54882,45.97979],[2.46093,46.22166],[2.21374,46.33935],[2.27828,46.53903],[2.54882,46.56642],[2.49389,46.66829]]],terms_url:"http://ids.craig.fr/geocat/srv/fre/catalog.search?node=srv#/metadata/e37c057b-5884-429b-8bec-5db0baef0ee",terms_text:"CRAIG - IGN -TopoGEODIS - Feder Auvergne-Rhône-Alpes 2016"},{id:"BANO",name:"BANO",type:"tms",template:"https://{switch:a,b,c}.layers.openstreetmap.fr/bano/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"https://wiki.openstreetmap.org/wiki/FR:WikiProject_France/WikiProject_Base_Adresses_Nationale_Ouverte_(BANO)#Licence_du_r.C3.A9sultat",terms_text:"Tiles © cquest@Openstreetmap France, data © OpenStreetMap contributors, ODBL",description:"French address registry or Base Adresses Nationale Ouverte",overlay:true},{id:"lu.geoportail.opendata.basemap",name:"Basemap geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/basemap/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png",endDate:"2010-07-20T00:00:00.000Z",startDate:"2013-07-19T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/carte-de-base-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"basemap.at",name:"basemap.at",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/geolandbasemap/normal/google3857/{zoom}/{y}/{x}.png",zoomExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at",terms_text:"basemap.at",description:"Basemap of Austria, based on government data.",icon:"https://www.basemap.at/images/logo_basemap.jpg"},{id:"basemap.at-overlay",name:"basemap.at Beschriftungen (annotations)",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmapoverlay/normal/google3857/{zoom}/{y}/{x}.png",zoomExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at/",terms_text:"basemap.at",description:"Annotation overlay provided by basemap.at.",icon:"https://www.basemap.at/images/logo_basemap.jpg",overlay:true},{id:"basemap.at-orthofoto",name:"basemap.at Orthofoto",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmaporthofoto30cm/normal/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at",terms_text:"basemap.at",best:true,description:"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.",icon:"https://www.basemap.at/images/logo_basemap.jpg"},{id:"bavaria-80cm",name:"Bavaria (80 cm)",type:"wms",template:"https://geoservices.bayern.de/wms/v1/ogc_dop80_oa.cgi?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=by_dop80c&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[7,18],polygon:[[[10.12359,50.56846],[10.14286,50.55078],[10.20281,50.55742],[10.25205,50.51796],[10.32698,50.49345],[10.41048,50.41848],[10.60317,50.33109],[10.62244,50.2271],[10.72521,50.21066],[10.72949,50.24765],[10.85153,50.24354],[10.71879,50.32015],[10.71236,50.36524],[10.85581,50.39664],[10.93717,50.39664],[10.99069,50.36661],[11.12772,50.36661],[11.1791,50.31332],[11.16197,50.29417],[11.24119,50.2928],[11.24975,50.37344],[11.24119,50.47982],[11.35895,50.5234],[11.43816,50.50979],[11.44244,50.48936],[11.42532,50.4771],[11.42532,50.44166],[11.48955,50.42257],[11.49169,50.39801],[11.51952,50.39801],[11.52594,50.37617],[11.59874,50.40347],[11.63727,50.38845],[11.79357,50.4212],[11.83639,50.39255],[11.92203,50.42802],[11.98626,50.38709],[11.98412,50.35705],[12.04835,50.33109],[12.09331,50.32972],[12.1297,50.29828],[12.14041,50.27228],[12.10615,50.25586],[12.11258,50.23532],[12.14897,50.23669],[12.19822,50.20107],[12.22391,50.16406],[12.20464,50.14348],[12.20678,50.10779],[12.24318,50.09955],[12.27743,50.07208],[12.49367,49.98543],[12.49796,49.94136],[12.55576,49.92206],[12.54934,49.86827],[12.48083,49.78817],[12.41018,49.75775],[12.46156,49.70655],[12.5472,49.68023],[12.58788,49.55261],[12.65425,49.53455],[12.66281,49.43302],[12.75274,49.41073],[12.7977,49.34661],[12.90475,49.35638],[12.99681,49.33685],[13.05462,49.27543],[13.13169,49.21952],[13.19164,49.14395],[13.2366,49.12153],[13.29655,49.12293],[13.37148,49.08088],[13.4143,49.02897],[13.4143,48.97981],[13.57916,48.96997],[13.63483,48.94326],[13.67765,48.88698],[13.73759,48.89261],[13.7847,48.83346],[13.84036,48.77423],[13.81681,48.70646],[13.84464,48.70081],[13.8425,48.60038],[13.76543,48.5423],[13.75258,48.50401],[13.67122,48.50543],[13.64339,48.54371],[13.45712,48.5508],[13.45712,48.41598],[13.40574,48.36053],[13.2837,48.27511],[13.09315,48.26941],[12.95827,48.19097],[12.87691,48.18526],[12.772,48.09382],[12.86407,48.01368],[12.89832,47.95492],[12.94543,47.95636],[12.99681,47.88461],[13.01394,47.83434],[12.93472,47.7322],[13.0589,47.72499],[13.11885,47.63851],[13.06532,47.56922],[13.05676,47.47379],[13.00323,47.45208],[12.76772,47.55044],[12.76986,47.63274],[12.73989,47.67312],[12.6671,47.67024],[12.57503,47.6212],[12.48083,47.61975],[12.41446,47.67024],[12.24318,47.67745],[12.2132,47.69186],[12.19179,47.68177],[12.2132,47.66591],[12.21106,47.60388],[12.17467,47.59521],[12.13827,47.60388],[11.89205,47.60388],[11.85137,47.57933],[11.63942,47.58222],[11.59445,47.54899],[11.59017,47.51285],[11.51738,47.49839],[11.4403,47.50417],[11.39534,47.47524],[11.42746,47.44484],[11.3461,47.44339],[11.27973,47.39559],[11.21336,47.38834],[11.24761,47.43181],[11.10203,47.39269],[10.965,47.38979],[10.97785,47.43615],[10.9179,47.47524],[10.8708,47.47524],[10.85581,47.49405],[10.90077,47.5143],[10.87294,47.53598],[10.81085,47.51285],[10.64385,47.54899],[10.59461,47.55477],[10.57962,47.52876],[10.46187,47.54032],[10.46615,47.48392],[10.48756,47.47813],[10.48756,47.41298],[10.45973,47.40283],[10.45973,47.37529],[10.41048,47.37384],[10.40834,47.34339],[10.32056,47.28678],[10.28202,47.27806],[10.28416,47.26208],[10.14714,47.26208],[10.1921,47.30275],[10.19424,47.37384],[10.16641,47.37384],[10.16641,47.34629],[10.10004,47.34339],[10.0615,47.36369],[10.06792,47.41877],[10.09361,47.42601],[10.09576,47.44194],[9.978,47.48537],[9.95659,47.52731],[9.8945,47.52876],[9.85596,47.50851],[9.81743,47.54465],[9.82171,47.57644],[9.77461,47.58222],[9.73821,47.52586],[9.67398,47.53454],[9.58406,47.56488],[9.63972,47.60532],[9.7168,47.60388],[9.85596,47.676],[9.978,47.65582],[10.02938,47.68177],[10.10004,47.66735],[10.13215,47.676],[10.14286,47.70195],[10.0615,47.7725],[10.11288,47.8099],[10.08291,47.85302],[10.1086,47.90902],[10.07649,47.96496],[10.13001,48.02084],[10.13429,48.10669],[10.10004,48.12813],[10.05508,48.26228],[9.96944,48.36765],[10.03153,48.42593],[10.02938,48.46144],[10.12359,48.47705],[10.15356,48.4515],[10.23492,48.51252],[10.31628,48.51678],[10.29915,48.61878],[10.24563,48.6683],[10.27346,48.70646],[10.3698,48.68385],[10.43189,48.69939],[10.45116,48.72765],[10.40192,48.746],[10.44046,48.84896],[10.43403,48.95873],[10.33769,49.02055],[10.24991,49.03599],[10.24991,49.07387],[10.20066,49.10331],[10.25205,49.13274],[10.12359,49.19714],[10.11931,49.26285],[10.15142,49.28939],[10.10432,49.34522],[10.14072,49.39401],[10.1086,49.44555],[10.11074,49.50537],[10.0722,49.53316],[10.01654,49.47616],[9.92662,49.47894],[9.92448,49.55678],[9.89878,49.58177],[9.85596,49.53872],[9.80672,49.55678],[9.86667,49.60675],[9.85382,49.6442],[9.81743,49.66083],[9.83455,49.68993],[9.79602,49.72039],[9.75748,49.70793],[9.74035,49.68577],[9.70609,49.71624],[9.67826,49.71624],[9.68254,49.68854],[9.62045,49.69131],[9.64615,49.78955],[9.55836,49.77434],[9.57121,49.73561],[9.50698,49.75222],[9.49199,49.77987],[9.46844,49.76051],[9.42562,49.77849],[9.40421,49.76466],[9.33356,49.7702],[9.32928,49.73423],[9.4085,49.72593],[9.42776,49.69824],[9.41492,49.6442],[9.38066,49.63865],[9.35925,49.64974],[9.33998,49.63727],[9.31215,49.64836],[9.27789,49.62617],[9.28432,49.60814],[9.2415,49.57483],[9.09805,49.57205],[9.06594,49.60814],[9.10019,49.65113],[9.09163,49.6927],[9.13017,49.71208],[9.13873,49.74253],[9.10876,49.75637],[9.13659,49.79093],[9.10019,49.78955],[9.07236,49.82824],[9.03596,49.83514],[9.01669,50.02671],[8.96317,50.03084],[8.95674,50.05971],[9.00171,50.0707],[9.02097,50.11054],[9.1216,50.12289],[9.15586,50.11328],[9.19654,50.11878],[9.18583,50.13525],[9.23507,50.1476],[9.37638,50.12701],[9.4085,50.0817],[9.52197,50.09543],[9.50484,50.14211],[9.53267,50.16406],[9.48985,50.16954],[9.49413,50.24354],[9.61403,50.22163],[9.66541,50.23532],[9.63544,50.24901],[9.66756,50.27228],[9.74249,50.30922],[9.72964,50.35841],[9.77032,50.42939],[9.86881,50.40074],[9.91805,50.40893],[10.03581,50.47982],[10.03795,50.51115],[10.12359,50.56846]]],terms_url:"https://www.ldbv.bayern.de/",terms_text:"Bayerische Vermessungsverwaltung",best:true},{id:"bavaria-DOP80",name:"Bavaria DOP 80cm",type:"tms",template:"https://mapproxy.osm.ch/tiles/BAYERNDOP80/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[7,18],polygon:[[[10.12359,50.56846],[10.14286,50.55078],[10.20281,50.55742],[10.25205,50.51796],[10.32698,50.49345],[10.41048,50.41848],[10.60317,50.33109],[10.62244,50.2271],[10.72521,50.21066],[10.72949,50.24765],[10.85153,50.24354],[10.71879,50.32015],[10.71236,50.36524],[10.85581,50.39664],[10.93717,50.39664],[10.99069,50.36661],[11.12772,50.36661],[11.1791,50.31332],[11.16197,50.29417],[11.24119,50.2928],[11.24975,50.37344],[11.24119,50.47982],[11.35895,50.5234],[11.43816,50.50979],[11.44244,50.48936],[11.42532,50.4771],[11.42532,50.44166],[11.48955,50.42257],[11.49169,50.39801],[11.51952,50.39801],[11.52594,50.37617],[11.59874,50.40347],[11.63727,50.38845],[11.79357,50.4212],[11.83639,50.39255],[11.92203,50.42802],[11.98626,50.38709],[11.98412,50.35705],[12.04835,50.33109],[12.09331,50.32972],[12.1297,50.29828],[12.14041,50.27228],[12.10615,50.25586],[12.11258,50.23532],[12.14897,50.23669],[12.19822,50.20107],[12.22391,50.16406],[12.20464,50.14348],[12.20678,50.10779],[12.24318,50.09955],[12.27743,50.07208],[12.49367,49.98543],[12.49796,49.94136],[12.55576,49.92206],[12.54934,49.86827],[12.48083,49.78817],[12.41018,49.75775],[12.46156,49.70655],[12.5472,49.68023],[12.58788,49.55261],[12.65425,49.53455],[12.66281,49.43302],[12.75274,49.41073],[12.7977,49.34661],[12.90475,49.35638],[12.99681,49.33685],[13.05462,49.27543],[13.13169,49.21952],[13.19164,49.14395],[13.2366,49.12153],[13.29655,49.12293],[13.37148,49.08088],[13.4143,49.02897],[13.4143,48.97981],[13.57916,48.96997],[13.63483,48.94326],[13.67765,48.88698],[13.73759,48.89261],[13.7847,48.83346],[13.84036,48.77423],[13.81681,48.70646],[13.84464,48.70081],[13.8425,48.60038],[13.76543,48.5423],[13.75258,48.50401],[13.67122,48.50543],[13.64339,48.54371],[13.45712,48.5508],[13.45712,48.41598],[13.40574,48.36053],[13.2837,48.27511],[13.09315,48.26941],[12.95827,48.19097],[12.87691,48.18526],[12.772,48.09382],[12.86407,48.01368],[12.89832,47.95492],[12.94543,47.95636],[12.99681,47.88461],[13.01394,47.83434],[12.93472,47.7322],[13.0589,47.72499],[13.11885,47.63851],[13.06532,47.56922],[13.05676,47.47379],[13.00323,47.45208],[12.76772,47.55044],[12.76986,47.63274],[12.73989,47.67312],[12.6671,47.67024],[12.57503,47.6212],[12.48083,47.61975],[12.41446,47.67024],[12.24318,47.67745],[12.2132,47.69186],[12.19179,47.68177],[12.2132,47.66591],[12.21106,47.60388],[12.17467,47.59521],[12.13827,47.60388],[11.89205,47.60388],[11.85137,47.57933],[11.63942,47.58222],[11.59445,47.54899],[11.59017,47.51285],[11.51738,47.49839],[11.4403,47.50417],[11.39534,47.47524],[11.42746,47.44484],[11.3461,47.44339],[11.27973,47.39559],[11.21336,47.38834],[11.24761,47.43181],[11.10203,47.39269],[10.965,47.38979],[10.97785,47.43615],[10.9179,47.47524],[10.8708,47.47524],[10.85581,47.49405],[10.90077,47.5143],[10.87294,47.53598],[10.81085,47.51285],[10.64385,47.54899],[10.59461,47.55477],[10.57962,47.52876],[10.46187,47.54032],[10.46615,47.48392],[10.48756,47.47813],[10.48756,47.41298],[10.45973,47.40283],[10.45973,47.37529],[10.41048,47.37384],[10.40834,47.34339],[10.32056,47.28678],[10.28202,47.27806],[10.28416,47.26208],[10.14714,47.26208],[10.1921,47.30275],[10.19424,47.37384],[10.16641,47.37384],[10.16641,47.34629],[10.10004,47.34339],[10.0615,47.36369],[10.06792,47.41877],[10.09361,47.42601],[10.09576,47.44194],[9.978,47.48537],[9.95659,47.52731],[9.8945,47.52876],[9.85596,47.50851],[9.81743,47.54465],[9.82171,47.57644],[9.77461,47.58222],[9.73821,47.52586],[9.67398,47.53454],[9.58406,47.56488],[9.63972,47.60532],[9.7168,47.60388],[9.85596,47.676],[9.978,47.65582],[10.02938,47.68177],[10.10004,47.66735],[10.13215,47.676],[10.14286,47.70195],[10.0615,47.7725],[10.11288,47.8099],[10.08291,47.85302],[10.1086,47.90902],[10.07649,47.96496],[10.13001,48.02084],[10.13429,48.10669],[10.10004,48.12813],[10.05508,48.26228],[9.96944,48.36765],[10.03153,48.42593],[10.02938,48.46144],[10.12359,48.47705],[10.15356,48.4515],[10.23492,48.51252],[10.31628,48.51678],[10.29915,48.61878],[10.24563,48.6683],[10.27346,48.70646],[10.3698,48.68385],[10.43189,48.69939],[10.45116,48.72765],[10.40192,48.746],[10.44046,48.84896],[10.43403,48.95873],[10.33769,49.02055],[10.24991,49.03599],[10.24991,49.07387],[10.20066,49.10331],[10.25205,49.13274],[10.12359,49.19714],[10.11931,49.26285],[10.15142,49.28939],[10.10432,49.34522],[10.14072,49.39401],[10.1086,49.44555],[10.11074,49.50537],[10.0722,49.53316],[10.01654,49.47616],[9.92662,49.47894],[9.92448,49.55678],[9.89878,49.58177],[9.85596,49.53872],[9.80672,49.55678],[9.86667,49.60675],[9.85382,49.6442],[9.81743,49.66083],[9.83455,49.68993],[9.79602,49.72039],[9.75748,49.70793],[9.74035,49.68577],[9.70609,49.71624],[9.67826,49.71624],[9.68254,49.68854],[9.62045,49.69131],[9.64615,49.78955],[9.55836,49.77434],[9.57121,49.73561],[9.50698,49.75222],[9.49199,49.77987],[9.46844,49.76051],[9.42562,49.77849],[9.40421,49.76466],[9.33356,49.7702],[9.32928,49.73423],[9.4085,49.72593],[9.42776,49.69824],[9.41492,49.6442],[9.38066,49.63865],[9.35925,49.64974],[9.33998,49.63727],[9.31215,49.64836],[9.27789,49.62617],[9.28432,49.60814],[9.2415,49.57483],[9.09805,49.57205],[9.06594,49.60814],[9.10019,49.65113],[9.09163,49.6927],[9.13017,49.71208],[9.13873,49.74253],[9.10876,49.75637],[9.13659,49.79093],[9.10019,49.78955],[9.07236,49.82824],[9.03596,49.83514],[9.01669,50.02671],[8.96317,50.03084],[8.95674,50.05971],[9.00171,50.0707],[9.02097,50.11054],[9.1216,50.12289],[9.15586,50.11328],[9.19654,50.11878],[9.18583,50.13525],[9.23507,50.1476],[9.37638,50.12701],[9.4085,50.0817],[9.52197,50.09543],[9.50484,50.14211],[9.53267,50.16406],[9.48985,50.16954],[9.49413,50.24354],[9.61403,50.22163],[9.66541,50.23532],[9.63544,50.24901],[9.66756,50.27228],[9.74249,50.30922],[9.72964,50.35841],[9.77032,50.42939],[9.86881,50.40074],[9.91805,50.40893],[10.03581,50.47982],[10.03795,50.51115],[10.12359,50.56846]]],terms_url:"https://www.ldbv.bayern.de/",terms_text:"Bayerische Vermessungsverwaltung",best:true},{id:"route500hydro",name:"BD Carthage",type:"tms",template:"https://{switch:a,b,c}.tile.openstreetmap.fr/route500hydro/{zoom}/{x}/{y}.png",zoomExtent:[6,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"http://www.sandre.eaufrance.fr/actualite/la-bd-carthage-en-licence-ouverte-open-licence",terms_text:"Tiles © cquest@Openstreetmap France, data © Onema - IGN, LO/OL",description:"Réseau hydrographique: cours et plans d'eau et POI",overlay:true},{id:"fr.ign.bdortho",name:"BDOrtho IGN",type:"tms",template:"https://proxy-ign.openstreetmap.fr/94GjiyqD/bdortho/{zoom}/{x}/{y}.jpg",zoomExtent:[2,21],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]],[[-61.27501,14.90218],[-60.72368,14.90101],[-60.72489,14.36686],[-61.27622,14.36803],[-61.27501,14.90218]],[[-61.92802,16.58618],[-61.92686,15.7394],[-60.88128,15.74072],[-60.88243,16.5875],[-61.92802,16.58618]],[[-53.89344,6.004],[-52.46522,5.4465],[-51.52039,4.51072],[-51.53687,4.11633],[-52.2345,3.10213],[-52.641,2.25162],[-52.92664,2.07597],[-53.72864,2.21869],[-54.20106,2.03205],[-54.8053,2.27358],[-54.31092,2.80589],[-54.31641,3.20085],[-54.12415,3.46408],[-54.12964,3.59567],[-54.42078,4.00127],[-54.58008,4.95962],[-53.89344,6.004]],[[55.08816,-20.77935],[55.95959,-20.77281],[55.96576,-21.49],[55.09434,-21.49651],[55.08816,-20.77935]],[[44.92054,-12.57363],[45.34826,-12.57029],[45.35274,-13.1163],[44.92502,-13.11963],[44.92054,-12.57363]],[[-178.57728,-14.70582],[-178.42568,-14.00334],[-176.34156,-12.83858],[-175.71534,-12.9189],[-175.91858,-13.58726],[-177.84638,-14.64983],[-178.57728,-14.70582]]],terms_url:"https://openstreetmap.fr/bdortho",terms_text:"BDOrtho IGN",best:true,icon:"http://www.ign.fr/institut/sites/all/themes/ign_institut/logo.png"},{id:"Benin_cotonou_pleiade_2016",name:"Benin: Cotonou Pleiade 2016",type:"tms",template:"https://geoxxx.agrocampus-ouest.fr/owsifl/gwc/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Benin:cotonou_pleiade_2016&STYLE=&FORMAT=image/jpeg&tileMatrixSet=EPSG:3857&tileMatrix=EPSG:3857:{zoom}&tileRow={y}&tileCol={x}",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[2.31954,6.55745],[2.33645,6.56024],[2.36377,6.56211],[2.36738,6.56068],[2.37777,6.5494],[2.37779,6.53485],[2.36994,6.49332],[2.37038,6.45527],[2.36958,6.45269],[2.36188,6.44177],[2.35392,6.40545],[2.36749,6.4015],[2.39526,6.40072],[2.40128,6.40374],[2.40588,6.40341],[2.42046,6.39383],[2.42485,6.39794],[2.42949,6.39887],[2.43625,6.39628],[2.43958,6.40042],[2.44439,6.40189],[2.45376,6.39899],[2.47145,6.39632],[2.48162,6.39106],[2.49453,6.3874],[2.50893,6.38888],[2.50719,6.39229],[2.5012,6.39162],[2.4963,6.39521],[2.4951,6.40123],[2.49543,6.40401],[2.4983,6.41022],[2.50191,6.41282],[2.51087,6.41321],[2.52219,6.40849],[2.53352,6.40517],[2.5381,6.40961],[2.54111,6.4109],[2.54651,6.41099],[2.54654,6.40651],[2.57639,6.40724],[2.57642,6.41177],[2.58576,6.41196],[2.58868,6.41095],[2.60877,6.39414],[2.6257,6.39488],[2.64555,6.39729],[2.65039,6.39339],[2.65367,6.36823],[2.64312,6.36659],[2.61251,6.36289],[2.56868,6.3607],[2.54683,6.36055],[2.54687,6.35546],[2.50207,6.35461],[2.47064,6.35596],[2.46777,6.35203],[2.46423,6.3502],[2.45254,6.35006],[2.45113,6.34813],[2.44737,6.34629],[2.43757,6.34654],[2.43298,6.33841],[2.43016,6.33707],[2.42245,6.33707],[2.39236,6.34115],[2.39315,6.34115],[2.36528,6.34445],[2.35386,6.3453],[2.34377,6.34458],[2.34094,6.34534],[2.31086,6.36567],[2.28435,6.37465],[2.28147,6.37762],[2.27599,6.39517],[2.27612,6.3982],[2.31529,6.49261],[2.3158,6.55307],[2.31954,6.55745]],[[1.69563,6.25076],[1.7001,6.24712],[1.70418,6.24697],[1.75875,6.25836],[1.77079,6.25995],[1.81712,6.27161],[1.84457,6.27657],[1.85768,6.27945],[1.88843,6.28326],[1.90482,6.28595],[1.90618,6.29435],[1.90083,6.29721],[1.89881,6.29954],[1.89404,6.30085],[1.89048,6.2997],[1.88748,6.29636],[1.88344,6.29622],[1.8697,6.29227],[1.8564,6.29198],[1.85207,6.28675],[1.84991,6.28906],[1.84691,6.29203],[1.84353,6.29333],[1.84041,6.29315],[1.83627,6.29129],[1.8341,6.28733],[1.83417,6.2852],[1.8323,6.28456],[1.82786,6.28644],[1.82182,6.29084],[1.81563,6.28998],[1.81211,6.29143],[1.80758,6.29571],[1.80472,6.29693],[1.80074,6.2971],[1.79776,6.29612],[1.79625,6.29492],[1.7949,6.28965],[1.79641,6.28608],[1.80098,6.28338],[1.79567,6.28013],[1.79156,6.28174],[1.78499,6.28122],[1.78092,6.27753],[1.77588,6.2755],[1.76745,6.27696],[1.75653,6.27496],[1.74833,6.27239],[1.74762,6.27726],[1.74572,6.27938],[1.73948,6.27985],[1.7368,6.27761],[1.73572,6.27892],[1.72902,6.27911],[1.72435,6.27422],[1.72449,6.26786],[1.72556,6.26683],[1.69934,6.26159],[1.69573,6.25726],[1.69563,6.25076]]],best:true},{id:"Berlin-2011",name:"Berlin aerial photography 2011",type:"wms",template:"https://fbinter.stadt-berlin.de/fb/wms/senstadt/k_luftbild2011_20?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[13.48699,52.68076],[13.52584,52.65196],[13.5299,52.64437],[13.54209,52.60921],[13.58109,52.58134],[13.59674,52.55936],[13.63477,52.55121],[13.66547,52.52854],[13.67199,52.50379],[13.65806,52.50372],[13.65796,52.49324],[13.7547,52.4565],[13.76644,52.43884],[13.76627,52.42973],[13.74494,52.39909],[13.65235,52.33133],[13.6417,52.33103],[13.62609,52.35491],[13.59432,52.37455],[13.53198,52.38376],[13.51948,52.39236],[13.48536,52.39227],[13.43552,52.38016],[13.42885,52.37401],[13.38689,52.37388],[13.38642,52.38667],[13.36857,52.38728],[13.37045,52.39349],[13.33968,52.40887],[13.31243,52.39775],[13.30557,52.40452],[13.23622,52.40342],[13.18886,52.40417],[13.17719,52.39067],[13.14859,52.38971],[13.14868,52.38421],[13.11889,52.38385],[13.11935,52.40025],[13.10487,52.40723],[13.07371,52.40668],[13.07367,52.41403],[13.10516,52.47897],[13.11685,52.47881],[13.112,52.55915],[13.11865,52.59156],[13.15251,52.60489],[13.16282,52.60462],[13.21264,52.6321],[13.22139,52.63215],[13.27292,52.66444],[13.31376,52.66442],[13.32714,52.64692],[13.36783,52.6468],[13.39158,52.65382],[13.42728,52.6549],[13.47594,52.68122],[13.48699,52.68076]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2011"},{id:"Berlin-2014",name:"Berlin aerial photography 2014",type:"tms",template:"https://tiles.codefor.de/berlin-2014/{zoom}/{x}/{y}.png",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[13.19746,52.64206],[13.25639,52.64285],[13.2558,52.66101],[13.31391,52.66185],[13.31476,52.64353],[13.37431,52.64462],[13.37386,52.66269],[13.4026,52.663],[13.40332,52.64501],[13.4334,52.64555],[13.43227,52.68001],[13.49082,52.68111],[13.49147,52.66428],[13.52092,52.66457],[13.5216,52.6465],[13.55096,52.6469],[13.55147,52.62938],[13.52219,52.62898],[13.52335,52.59248],[13.58263,52.59329],[13.58307,52.57535],[13.61246,52.57582],[13.61324,52.55784],[13.64268,52.55813],[13.64296,52.5401],[13.67253,52.54048],[13.67375,52.50475],[13.64413,52.5045],[13.64476,52.48608],[13.7037,52.48683],[13.70415,52.46901],[13.73362,52.4692],[13.73399,52.45121],[13.76358,52.45156],[13.76447,52.40209],[13.73546,52.39753],[13.73611,52.37963],[13.70678,52.37935],[13.70731,52.36136],[13.67785,52.36104],[13.67898,52.33017],[13.62102,52.32946],[13.61999,52.36033],[13.59046,52.36007],[13.5901,52.37806],[13.53116,52.37735],[13.53064,52.39525],[13.47168,52.39459],[13.47149,52.4125],[13.44101,52.41219],[13.44257,52.37604],[13.35487,52.37498],[13.35427,52.39306],[13.23667,52.39114],[13.23609,52.40922],[13.17635,52.40836],[13.17752,52.39029],[13.14791,52.38987],[13.14876,52.37459],[13.11971,52.37422],[13.11941,52.38955],[13.08981,52.38899],[13.08938,52.40707],[13.0618,52.40662],[13.06075,52.42408],[13.08842,52.42449],[13.086,52.47853],[13.11546,52.47896],[13.11462,52.49695],[13.1441,52.49729],[13.14332,52.5157],[13.1137,52.51528],[13.11077,52.6047],[13.19862,52.6062],[13.19746,52.64206]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2014"},{id:"Berlin-2015",name:"Berlin aerial photography 2015",type:"tms",template:"https://tiles.codefor.de/berlin-2015/{zoom}/{x}/{y}.png",endDate:"2015-08-03T00:00:00.000Z",startDate:"2015-08-02T00:00:00.000Z",polygon:[[[13.11068,52.59538],[13.13975,52.60527],[13.18355,52.61488],[13.21262,52.63315],[13.24167,52.64282],[13.256,52.65201],[13.27004,52.67021],[13.31368,52.67072],[13.32914,52.66204],[13.32948,52.6529],[13.43284,52.65414],[13.44733,52.6816],[13.50561,52.68244],[13.50654,52.65531],[13.53605,52.65572],[13.5376,52.61991],[13.52229,52.61977],[13.52304,52.60165],[13.59776,52.58469],[13.59865,52.55769],[13.62817,52.55805],[13.64303,52.5492],[13.65813,52.54042],[13.67312,52.53144],[13.67356,52.51358],[13.65913,52.51344],[13.65998,52.48643],[13.68931,52.48687],[13.73386,52.46933],[13.73405,52.46034],[13.76362,52.46068],[13.76431,52.42464],[13.74941,52.42474],[13.75045,52.39778],[13.73585,52.39762],[13.70661,52.37944],[13.707,52.3614],[13.67782,52.36125],[13.66405,52.33395],[13.62073,52.33337],[13.62031,52.36042],[13.58986,52.3781],[13.53149,52.37748],[13.53133,52.38641],[13.44223,52.38484],[13.42813,52.3667],[13.38464,52.3662],[13.35432,52.39301],[13.29537,52.39209],[13.29531,52.40103],[13.19171,52.39957],[13.19222,52.39056],[13.14774,52.38996],[13.14839,52.38095],[13.11964,52.38041],[13.0744,52.40683],[13.07392,52.42426],[13.10275,52.43374],[13.10123,52.47874],[13.11558,52.47897],[13.11068,52.59538]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2015"},{id:"Berlin-2016",name:"Berlin aerial photography 2016",type:"tms",template:"https://tiles.codefor.de/berlin-2016/{zoom}/{x}/{y}.png",endDate:"2016-04-03T00:00:00.000Z",startDate:"2016-04-02T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2016"},{id:"Berlin-2016-infrared",name:"Berlin aerial photography 2016 (infrared)",type:"tms",template:"https://tiles.codefor.de/berlin-2016i/{zoom}/{x}/{y}.png",endDate:"2016-04-03T00:00:00.000Z",startDate:"2016-04-02T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale Color-Infrarot-Orthophotos 2016"},{id:"Berlin-2017",name:"Berlin aerial photography 2017",type:"tms",template:"https://tiles.codefor.de/berlin-2017/{zoom}/{x}/{y}.png",endDate:"2017-03-28T00:00:00.000Z",startDate:"2017-03-27T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2017"},{id:"Berlin-2018",name:"Berlin aerial photography 2018",type:"tms",template:"https://tiles.codefor.de/berlin-2018/{zoom}/{x}/{y}.png",endDate:"2018-04-07T00:00:00.000Z",startDate:"2018-03-19T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2018",best:true},{id:"Bing",name:"Bing aerial imagery",type:"bing",template:"https://www.bing.com/maps",zoomExtent:[0,22],"default":true,description:"Satellite and aerial imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/Bing.png"},{id:"Bologna-Orthophoto-2017",name:"Bologna ortofoto 2017",type:"tms",template:"https://sitmappe.comune.bologna.it/tms/tileserver/Ortofoto2017/{zoom}/{x}/{y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[11.22962,44.53077],[11.23184,44.52461],[11.24123,44.52167],[11.23251,44.50893],[11.23572,44.50323],[11.25009,44.50116],[11.24765,44.49644],[11.25708,44.49765],[11.25653,44.49294],[11.29461,44.48981],[11.29676,44.4857],[11.28807,44.47586],[11.29226,44.4609],[11.28447,44.45459],[11.28228,44.42572],[11.29347,44.4276],[11.29254,44.43377],[11.31339,44.42103],[11.32504,44.42274],[11.33695,44.42772],[11.33765,44.43167],[11.3315,44.43273],[11.33453,44.43867],[11.34466,44.43594],[11.34498,44.44093],[11.36235,44.45099],[11.37312,44.44935],[11.37498,44.45897],[11.39499,44.46368],[11.4011,44.46122],[11.39464,44.46803],[11.41577,44.48376],[11.42559,44.4845],[11.42717,44.48921],[11.41727,44.4906],[11.43363,44.51312],[11.42692,44.51532],[11.43034,44.5196],[11.42466,44.51959],[11.41987,44.52934],[11.4143,44.52564],[11.40739,44.52851],[11.41487,44.53999],[11.38871,44.54145],[11.39082,44.54553],[11.36474,44.55253],[11.36414,44.55609],[11.3573,44.5519],[11.34375,44.55333],[11.33589,44.54299],[11.33145,44.54734],[11.31349,44.54722],[11.30929,44.5295],[11.29104,44.53581],[11.28179,44.54851],[11.26911,44.53248],[11.25118,44.55578],[11.24499,44.55569],[11.22962,44.53077]]],terms_url:"http://dati.comune.bologna.it/node/3449",terms_text:"© Comune di Bologna cc-by 4.0 ODbL compliant",best:true},{id:"Bonvillars-2013",name:"Bonvillars Orthophoto 2013",type:"tms",template:"http://osmdata.asitvd.ch/tiles/bonvillars2013/{zoom}/{x}/{y}.png",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.66713,46.83358],[6.66313,46.83833],[6.67213,46.84191],[6.6749,46.84226],[6.67843,46.83807],[6.66713,46.83358]]],terms_url:"http://osmdata.asitvd.ch/",terms_text:"Bonvillars - Orthophoto technique 2013"},{id:"Bordeaux_2012",name:"Bordeaux - 2012",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/bordeaux_2012/{zoom}/{x}/{y}",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-0.59923,45.04193],[-0.54231,45.02757],[-0.50979,45.00601],[-0.47727,45.00206],[-0.47066,44.97367],[-0.45542,44.95102],[-0.46456,44.91792],[-0.4732,44.91936],[-0.48794,44.90928],[-0.4981,44.89057],[-0.48946,44.87797],[-0.4666,44.87076],[-0.47625,44.84735],[-0.49505,44.83978],[-0.49099,44.83186],[-0.46965,44.82537],[-0.49709,44.80446],[-0.52453,44.80013],[-0.5103,44.76767],[-0.53469,44.76515],[-0.56213,44.75107],[-0.5601,44.74169],[-0.5728,44.74133],[-0.59465,44.7601],[-0.63429,44.73989],[-0.65004,44.77705],[-0.67901,44.77489],[-0.68816,44.77922],[-0.71509,44.76839],[-0.75168,44.7471],[-0.76336,44.75577],[-0.73846,44.77561],[-0.74202,44.78571],[-0.72779,44.81239],[-0.73999,44.82861],[-0.76438,44.82933],[-0.803,44.82176],[-0.8401,44.82753],[-0.83908,44.84014],[-0.87567,44.85023],[-0.88532,44.85852],[-0.88685,44.88769],[-0.86601,44.88697],[-0.84569,44.89669],[-0.83349,44.92764],[-0.81825,44.92764],[-0.80198,44.92224],[-0.79843,44.9485],[-0.78725,44.94814],[-0.75574,44.97007],[-0.72169,44.95785],[-0.69578,44.93087],[-0.68866,44.93447],[-0.67139,44.93267],[-0.66935,44.94095],[-0.62514,44.95066],[-0.63226,44.95893],[-0.63124,44.9672],[-0.60024,44.96756],[-0.55146,44.97834],[-0.54079,44.97726],[-0.55451,44.99739],[-0.59364,45.01751],[-0.60787,45.03403],[-0.59923,45.04193]]],terms_text:"Communauté urbaine de Bordeaux - 2012"},{id:"Bordeaux_2016",name:"Bordeaux 2016",type:"tms",template:"http://tms.bordeaux.inria.fr/bdx2016/{zoom}/{x}/{y}.jpg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[-0.59923,45.04193],[-0.54231,45.02757],[-0.50979,45.00601],[-0.47727,45.00206],[-0.47066,44.97367],[-0.45542,44.95102],[-0.46456,44.91792],[-0.4732,44.91936],[-0.48794,44.90928],[-0.4981,44.89057],[-0.48946,44.87797],[-0.4666,44.87076],[-0.47625,44.84735],[-0.49505,44.83978],[-0.49099,44.83186],[-0.46965,44.82537],[-0.49709,44.80446],[-0.52453,44.80013],[-0.5103,44.76767],[-0.53469,44.76515],[-0.56213,44.75107],[-0.5601,44.74169],[-0.5728,44.74133],[-0.59465,44.7601],[-0.63429,44.73989],[-0.65004,44.77705],[-0.67901,44.77489],[-0.68816,44.77922],[-0.71509,44.76839],[-0.75168,44.7471],[-0.76336,44.75577],[-0.73846,44.77561],[-0.74202,44.78571],[-0.72779,44.81239],[-0.73999,44.82861],[-0.76438,44.82933],[-0.803,44.82176],[-0.8401,44.82753],[-0.83908,44.84014],[-0.87567,44.85023],[-0.88532,44.85852],[-0.88685,44.88769],[-0.86601,44.88697],[-0.84569,44.89669],[-0.83349,44.92764],[-0.81825,44.92764],[-0.80198,44.92224],[-0.79843,44.9485],[-0.78725,44.94814],[-0.75574,44.97007],[-0.72169,44.95785],[-0.69578,44.93087],[-0.68866,44.93447],[-0.67139,44.93267],[-0.66935,44.94095],[-0.62514,44.95066],[-0.63226,44.95893],[-0.63124,44.9672],[-0.60024,44.96756],[-0.55146,44.97834],[-0.54079,44.97726],[-0.55451,44.99739],[-0.59364,45.01751],[-0.60787,45.03403],[-0.59923,45.04193]]],terms_text:"Bordeaux Métropole - 2016"},{id:"branquinha_al",name:"Branquinha AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?service=WMS&version=1.1.0&request=GetMap&layers=Branquinha&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-35.96968,-9.2928],[-35.97063,-9.20261],[-35.97727,-9.20264],[-35.98365,-9.2027],[-35.98765,-9.20266],[-35.99159,-9.20274],[-36.00498,-9.20284],[-36.01473,-9.20293],[-36.01651,-9.20296],[-36.01871,-9.20293],[-36.02487,-9.20286],[-36.02892,-9.20297],[-36.03308,-9.20289],[-36.03769,-9.20294],[-36.04581,-9.203],[-36.05161,-9.20305],[-36.05457,-9.20301],[-36.06022,-9.20304],[-36.06191,-9.20304],[-36.0618,-9.21319],[-36.06167,-9.21806],[-36.06156,-9.21915],[-36.06163,-9.22156],[-36.06144,-9.22277],[-36.06139,-9.22716],[-36.06134,-9.23227],[-36.0614,-9.23391],[-36.06145,-9.23494],[-36.06131,-9.23646],[-36.06133,-9.23773],[-36.06142,-9.23905],[-36.06145,-9.24133],[-36.06136,-9.2423],[-36.06141,-9.24358],[-36.06139,-9.2453],[-36.06126,-9.24726],[-36.06123,-9.24949],[-36.06127,-9.25107],[-36.06121,-9.25517],[-36.06119,-9.25795],[-36.06107,-9.25945],[-36.06109,-9.26183],[-36.06106,-9.26493],[-36.06086,-9.27146],[-36.06083,-9.2751],[-36.06074,-9.28274],[-36.0608,-9.29234],[-36.06074,-9.29363],[-36.05477,-9.29357],[-36.04621,-9.29349],[-36.03941,-9.29348],[-36.03501,-9.29339],[-36.02979,-9.29341],[-36.02167,-9.29332],[-36.01278,-9.29328],[-36.00468,-9.29321],[-35.99678,-9.29314],[-35.98969,-9.29312],[-35.98483,-9.29305],[-35.98305,-9.29289],[-35.98173,-9.29294],[-35.97884,-9.29282],[-35.96968,-9.2928]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"British_Columbia_Mosaic",name:"British Columbia Mosaic",type:"tms",template:"http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/bc_mosaic/{zoom}/{x}/{y}.png",endDate:"2013-06-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",zoomExtent:[9,20],polygon:[[[-123.3176,49.32726],[-123.44053,49.32682],[-123.44072,49.33844],[-123.43984,49.34304],[-123.44013,49.34354],[-123.44011,49.34399],[-123.44063,49.34445],[-123.44047,49.34558],[-123.43978,49.34606],[-123.43897,49.34613],[-123.43729,49.35672],[-123.43748,49.37108],[-123.43353,49.37094],[-123.43304,49.37373],[-123.43327,49.37512],[-123.43228,49.3761],[-123.43175,49.37917],[-123.43143,49.37959],[-123.43078,49.38239],[-123.43134,49.38274],[-123.43121,49.38385],[-123.43004,49.38459],[-123.41899,49.38471],[-123.41922,49.41352],[-123.39725,49.41357],[-123.39728,49.42435],[-123.40069,49.42433],[-123.40077,49.57035],[-123.40008,49.57035],[-123.40108,49.59338],[-123.37604,49.59328],[-123.37698,49.67561],[-123.35073,49.67564],[-123.3508,49.70868],[-123.33289,49.70872],[-123.33279,49.72563],[-123.30071,49.72556],[-123.30092,49.73754],[-123.2886,49.73764],[-123.28878,49.82492],[-123.2998,49.82492],[-123.30117,49.84978],[-123.32182,49.85067],[-123.32733,49.85777],[-123.32767,49.97589],[-123.30083,49.97522],[-123.30072,50.0997],[-123.25017,50.10074],[-123.25091,50.27549],[-123.02243,50.27556],[-123.02249,50.32549],[-123.00093,50.32547],[-123.00078,50.34239],[-122.9775,50.34234],[-122.97748,50.35043],[-122.95081,50.3505],[-122.95079,50.3712],[-122.93252,50.37115],[-122.9321,50.39979],[-122.88742,50.39997],[-122.88734,50.42561],[-122.66202,50.4257],[-122.66231,50.39945],[-122.59903,50.39924],[-122.59883,50.37552],[-122.57248,50.37537],[-122.57356,50.24939],[-122.59904,50.24946],[-122.59915,50.22657],[-122.6185,50.22664],[-122.61857,50.22441],[-122.64906,50.22451],[-122.64922,50.19935],[-122.73086,50.19938],[-122.73116,50.12443],[-122.74904,50.12451],[-122.74905,50.0903],[-122.76878,50.09034],[-122.76898,49.94945],[-122.99905,49.94947],[-122.99912,49.87546],[-122.97759,49.87546],[-122.97781,49.69951],[-122.99924,49.69948],[-122.99925,49.65165],[-123.02215,49.65165],[-123.02212,49.59951],[-123.04919,49.59946],[-123.04919,49.59405],[-123.06646,49.59404],[-123.06636,49.54519],[-123.06999,49.54512],[-123.0699,49.54132],[-123.07068,49.53928],[-123.07089,49.53799],[-123.07115,49.53688],[-123.07111,49.53581],[-123.07138,49.53282],[-123.07165,49.53211],[-123.07171,49.53139],[-123.07203,49.53042],[-123.07396,49.53035],[-123.0748,49.5295],[-123.07482,49.52881],[-123.07434,49.52806],[-123.07353,49.52746],[-123.07337,49.52704],[-123.07329,49.52559],[-123.07371,49.52496],[-123.07362,49.52449],[-123.09926,49.52449],[-123.09916,49.47545],[-123.07105,49.47553],[-123.07109,49.4663],[-123.07392,49.46631],[-123.07422,49.4505],[-123.07463,49.45009],[-123.07465,49.44933],[-123.0746,49.44902],[-123.07446,49.44869],[-123.07433,49.44799],[-123.07424,49.44777],[-123.07431,49.44475],[-123.07471,49.44476],[-123.07464,49.43773],[-122.99965,49.43774],[-122.99965,49.43692],[-122.86062,49.44153],[-122.81026,49.4424],[-122.8099,49.37667],[-122.40361,49.37666],[-122.40363,49.37719],[-122.26474,49.3773],[-122.26354,49.23601],[-122.21557,49.23614],[-122.0581,49.23588],[-121.95383,49.29665],[-121.94009,49.30454],[-121.92358,49.31423],[-121.89909,49.32254],[-121.88834,49.32598],[-121.8553,49.33636],[-121.8327,49.34415],[-121.76713,49.36544],[-121.67367,49.36546],[-121.64042,49.37438],[-121.5962,49.38605],[-121.58612,49.38792],[-121.52137,49.39946],[-121.51174,49.40384],[-121.46793,49.4229],[-121.44168,49.43456],[-121.42243,49.43458],[-121.34629,49.39323],[-121.34801,49.34124],[-121.5135,49.32058],[-121.60317,49.27717],[-121.65841,49.18561],[-121.67995,49.16541],[-121.78158,49.07026],[-121.80762,49.06225],[-121.9394,49.06362],[-121.97255,49.04242],[-121.99214,49.03329],[-122.00353,49.02734],[-122.01786,49.02411],[-122.11086,48.99928],[-122.14931,48.99953],[-122.14927,48.99915],[-122.19914,48.9996],[-122.19918,48.9992],[-122.23436,48.99948],[-122.23436,49.00017],[-122.39947,49.00124],[-122.45213,49.00163],[-122.45213,49.00088],[-122.45841,49.00093],[-122.45848,48.99931],[-122.49925,48.9995],[-122.49925,48.99929],[-122.54926,48.99951],[-122.54926,48.99932],[-122.65808,48.99942],[-122.65811,48.9954],[-122.70676,48.99553],[-122.75198,48.99564],[-122.79221,48.99572],[-122.79219,48.99943],[-123.03504,48.99957],[-123.03504,49.0001],[-123.03971,49.00005],[-123.03974,49.00018],[-123.04855,49.00013],[-123.04853,49.00047],[-123.05571,49.00045],[-123.05563,49.00023],[-123.06414,49.00013],[-123.06416,48.99994],[-123.0749,48.99969],[-123.07507,49.00062],[-123.08996,49.00037],[-123.10923,48.99994],[-123.12712,49.0003],[-123.136,48.99987],[-123.13627,49.00058],[-123.15385,48.99981],[-123.15405,49.00068],[-123.171,49.00013],[-123.20009,48.99968],[-123.20034,49.04978],[-123.21088,49.04972],[-123.21122,49.05199],[-123.20705,49.05209],[-123.20789,49.06079],[-123.21917,49.0601],[-123.21896,49.06127],[-123.22518,49.06127],[-123.22539,49.06224],[-123.22971,49.06203],[-123.22981,49.06859],[-123.23319,49.06873],[-123.2335,49.07059],[-123.24931,49.07025],[-123.24973,49.08026],[-123.27514,49.0804],[-123.27514,49.08709],[-123.29948,49.0873],[-123.29944,49.08025],[-123.32545,49.08039],[-123.32544,49.11547],[-123.2751,49.15033],[-123.27518,49.18733],[-123.27881,49.18711],[-123.27889,49.19107],[-123.30048,49.19107],[-123.30042,49.26229],[-123.31262,49.26224],[-123.3126,49.27149],[-123.31543,49.27147],[-123.31566,49.28189],[-123.31747,49.28188],[-123.3175,49.29185],[-123.31904,49.29185],[-123.31907,49.2986],[-123.32023,49.29857],[-123.32028,49.30197],[-123.32227,49.30196],[-123.32239,49.31183],[-123.3254,49.31181],[-123.32539,49.32017],[-123.31927,49.3202],[-123.31922,49.32467],[-123.31794,49.32466],[-123.31799,49.32541],[-123.3176,49.32726]]],terms_url:"http://imagery.paulnorman.ca/tiles/about.html",terms_text:"Copyright Province of British Columbia, City of Surrey"},{id:"Budapest_XI_2015",name:"Budapest district XI orthophoto 2015",type:"wms",template:"http://terinfo.ujbuda.hu/mapproxy/service?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orto2015_20160304&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[19.04767,47.48789],[19.05157,47.4899],[19.06434,47.4792],[19.0665,47.47632],[19.06766,47.47343],[19.06837,47.47077],[19.06846,47.46876],[19.06722,47.46501],[19.05683,47.45259],[19.0549,47.44906],[19.05176,47.43499],[19.04863,47.429],[19.04384,47.42968],[19.04023,47.42932],[19.03509,47.43818],[19.03221,47.43779],[19.0252,47.442],[19.0207,47.44576],[19.01915,47.44658],[19.01545,47.44759],[19.01347,47.44361],[19.01266,47.44271],[19.01178,47.44247],[19.0119,47.44188],[19.0098,47.43944],[19.0057,47.43111],[19.00046,47.43097],[18.99534,47.42821],[18.97545,47.42818],[18.97343,47.42904],[18.97361,47.42998],[18.97548,47.43067],[18.97719,47.43402],[18.97823,47.43817],[18.97733,47.44657],[18.97004,47.44988],[18.96861,47.45142],[18.97568,47.45506],[18.97586,47.45556],[18.97625,47.45584],[18.97658,47.45594],[18.97763,47.45597],[18.98017,47.45605],[18.98162,47.46067],[18.97793,47.46857],[18.96867,47.47643],[18.97745,47.48194],[18.98035,47.48169],[18.98565,47.4782],[18.98907,47.47838],[18.99117,47.47898],[18.99177,47.48102],[18.99288,47.48182],[18.99836,47.48238],[18.99902,47.483],[19.004,47.48189],[19.00416,47.48399],[19.01027,47.48535],[19.01237,47.48404],[19.0138,47.48351],[19.01674,47.48465],[19.0163,47.48539],[19.01689,47.48595],[19.01808,47.48605],[19.02108,47.48492],[19.02124,47.48612],[19.02301,47.48741],[19.02637,47.48885],[19.02995,47.48904],[19.03135,47.48855],[19.03189,47.48759],[19.03286,47.48712],[19.03364,47.48702],[19.03514,47.48725],[19.03585,47.48729],[19.03616,47.48751],[19.03665,47.48767],[19.03748,47.48774],[19.03847,47.48737],[19.03918,47.48679],[19.04105,47.48649],[19.04181,47.48737],[19.04387,47.4881],[19.04542,47.48817],[19.04695,47.4881],[19.04767,47.48789]]],terms_url:"http://terinfo.ujbuda.hu",terms_text:"Budapest XI. kerület önkormányzata",description:"5 cm resolution bald image"},{id:"Budapest_XI_2017",name:"Budapest district XI orthophoto 2017",type:"wms",template:"http://terinfo.ujbuda.hu/mapproxy/service?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orto_2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-03-01T00:00:00.000Z",startDate:"2017-03-01T00:00:00.000Z",polygon:[[[19.04767,47.48789],[19.05157,47.4899],[19.06434,47.4792],[19.0665,47.47632],[19.06766,47.47343],[19.06837,47.47077],[19.06846,47.46876],[19.06722,47.46501],[19.05683,47.45259],[19.0549,47.44906],[19.05176,47.43499],[19.04863,47.429],[19.04384,47.42968],[19.04023,47.42932],[19.03509,47.43818],[19.03221,47.43779],[19.0252,47.442],[19.0207,47.44576],[19.01915,47.44658],[19.01545,47.44759],[19.01347,47.44361],[19.01266,47.44271],[19.01178,47.44247],[19.0119,47.44188],[19.0098,47.43944],[19.0057,47.43111],[19.00046,47.43097],[18.99534,47.42821],[18.97545,47.42818],[18.97343,47.42904],[18.97361,47.42998],[18.97548,47.43067],[18.97719,47.43402],[18.97823,47.43817],[18.97733,47.44657],[18.97004,47.44988],[18.96861,47.45142],[18.97568,47.45506],[18.97586,47.45556],[18.97625,47.45584],[18.97658,47.45594],[18.97763,47.45597],[18.98017,47.45605],[18.98162,47.46067],[18.97793,47.46857],[18.96867,47.47643],[18.97745,47.48194],[18.98035,47.48169],[18.98565,47.4782],[18.98907,47.47838],[18.99117,47.47898],[18.99177,47.48102],[18.99288,47.48182],[18.99836,47.48238],[18.99902,47.483],[19.004,47.48189],[19.00416,47.48399],[19.01027,47.48535],[19.01237,47.48404],[19.0138,47.48351],[19.01674,47.48465],[19.0163,47.48539],[19.01689,47.48595],[19.01808,47.48605],[19.02108,47.48492],[19.02124,47.48612],[19.02301,47.48741],[19.02637,47.48885],[19.02995,47.48904],[19.03135,47.48855],[19.03189,47.48759],[19.03286,47.48712],[19.03364,47.48702],[19.03514,47.48725],[19.03585,47.48729],[19.03616,47.48751],[19.03665,47.48767],[19.03748,47.48774],[19.03847,47.48737],[19.03918,47.48679],[19.04105,47.48649],[19.04181,47.48737],[19.04387,47.4881],[19.04542,47.48817],[19.04695,47.4881],[19.04767,47.48789]]],terms_url:"http://terinfo.ujbuda.hu",terms_text:"Budapest XI. kerület önkormányzata",best:true,description:"5 cm resolution bald image"},{id:"Cadastre",name:"Cadastre",type:"tms",template:"http://tms.cadastre.openstreetmap.fr/*/tout/{zoom}/{x}/{y}.png",zoomExtent:[12,22],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_Cadastre_Fran%C3%A7ais/Conditions_d%27utilisation",terms_text:"cadastre-dgi-fr source : Direction Générale des Impôts - Cadastre. Mise à jour : 2018",description:"French land registry",icon:"https://svn.openstreetmap.org/applications/editors/josm/plugins/cadastre-fr/images/cadastre_small.png"},{id:"lu.geoportail.opendata.cadastre",name:"Cadastre geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/cadastre/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/plan-cadastral-numerise-pcn-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"cajueiro_al",name:"Cajueiro AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Cajueiro&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.10753,-9.43884],[-36.10752,-9.43421],[-36.10767,-9.42959],[-36.10779,-9.42361],[-36.10769,-9.41927],[-36.10781,-9.41391],[-36.10803,-9.41094],[-36.1081,-9.40965],[-36.10811,-9.40747],[-36.10816,-9.40693],[-36.10819,-9.40418],[-36.10811,-9.40176],[-36.10817,-9.40002],[-36.10827,-9.39952],[-36.10827,-9.39646],[-36.10833,-9.39475],[-36.10832,-9.39273],[-36.10836,-9.3904],[-36.10841,-9.38447],[-36.10847,-9.38165],[-36.10846,-9.37767],[-36.10835,-9.37573],[-36.10845,-9.37432],[-36.10849,-9.37234],[-36.10845,-9.3697],[-36.10867,-9.36278],[-36.10863,-9.36102],[-36.10873,-9.35928],[-36.10874,-9.35736],[-36.10855,-9.35479],[-36.1087,-9.3523],[-36.10871,-9.34996],[-36.10873,-9.34893],[-36.11269,-9.34908],[-36.11726,-9.34912],[-36.12138,-9.34905],[-36.12806,-9.3491],[-36.13217,-9.34906],[-36.13694,-9.34915],[-36.14025,-9.34914],[-36.14134,-9.34932],[-36.14458,-9.34916],[-36.14684,-9.34914],[-36.14842,-9.34905],[-36.15276,-9.34907],[-36.154,-9.34922],[-36.15627,-9.34923],[-36.16026,-9.34921],[-36.16086,-9.34929],[-36.166,-9.34933],[-36.16938,-9.34942],[-36.17176,-9.34936],[-36.17628,-9.34945],[-36.18028,-9.34937],[-36.18227,-9.34946],[-36.18826,-9.34938],[-36.19039,-9.34945],[-36.19354,-9.34946],[-36.19552,-9.34941],[-36.19918,-9.34951],[-36.19926,-9.35146],[-36.19913,-9.35234],[-36.19912,-9.35353],[-36.19919,-9.35646],[-36.19922,-9.35771],[-36.1993,-9.35832],[-36.19933,-9.36112],[-36.19922,-9.36177],[-36.19918,-9.36258],[-36.19931,-9.364],[-36.19926,-9.36499],[-36.19922,-9.36563],[-36.19928,-9.3666],[-36.19917,-9.36796],[-36.19917,-9.36868],[-36.19922,-9.36911],[-36.19912,-9.37017],[-36.19887,-9.37149],[-36.19886,-9.37264],[-36.19902,-9.37322],[-36.19915,-9.37504],[-36.19911,-9.37688],[-36.19896,-9.37747],[-36.19899,-9.37915],[-36.19917,-9.38053],[-36.19919,-9.38124],[-36.19926,-9.38175],[-36.19928,-9.38302],[-36.19913,-9.38374],[-36.19908,-9.38592],[-36.19879,-9.38787],[-36.19881,-9.38935],[-36.19902,-9.39092],[-36.19904,-9.392],[-36.19899,-9.39348],[-36.1988,-9.39451],[-36.19867,-9.39705],[-36.19845,-9.39949],[-36.19864,-9.40313],[-36.19866,-9.40476],[-36.19865,-9.40836],[-36.19875,-9.40902],[-36.19857,-9.41058],[-36.19859,-9.41273],[-36.19874,-9.41446],[-36.19868,-9.41711],[-36.1986,-9.41902],[-36.19846,-9.41965],[-36.1985,-9.42235],[-36.19871,-9.42429],[-36.19858,-9.42697],[-36.1984,-9.42895],[-36.19857,-9.43412],[-36.19871,-9.4347],[-36.19865,-9.43595],[-36.19857,-9.43626],[-36.19859,-9.43667],[-36.19876,-9.43749],[-36.19889,-9.43905],[-36.19882,-9.43995],[-36.1785,-9.43977],[-36.17718,-9.43968],[-36.17265,-9.43967],[-36.17099,-9.43971],[-36.16396,-9.43963],[-36.15386,-9.4395],[-36.13983,-9.4393],[-36.12875,-9.43913],[-36.11497,-9.43892],[-36.10753,-9.43884]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"osm-cambodia_laos_thailand_vietnam-bilingual",name:"Cambodia, Laos, Thailand, Vietnam, Malaysia, Myanmar bilingual",type:"tms",template:"https://{switch:a,b,c,d}.tile.osm-tools.org/osm/{zoom}/{x}/{y}.png",zoomExtent:[0,20],polygon:[[[92.10238,20.81356],[93.56905,24.09755],[94.1733,23.92695],[95.19503,26.70727],[96.75509,27.52867],[97.58456,28.5806],[98.73812,27.51405],[98.74362,25.87992],[97.67794,24.75774],[97.96359,24.04238],[98.82052,24.16272],[99.52364,22.95934],[100.36959,21.50514],[101.79232,22.48305],[105.36288,23.33311],[106.81857,22.84801],[108.19735,21.36197],[107.43895,18.85398],[117.14537,7.46562],[119.6173,5.28754],[118.12315,4.05023],[117.25523,4.36249],[115.86546,4.34606],[115.50841,3.02498],[114.5526,1.5101],[113.54186,1.25748],[112.96507,1.5705],[112.24547,1.5101],[111.67418,1.01583],[110.4547,0.90049],[109.49889,1.9219],[103.22569,1.12568],[100.46263,3.23889],[97.6721,8.05888],[93.89281,15.93987],[92.10238,20.81356]]],terms_url:"http://www.osm-tools.org",terms_text:"© osm-tools.org & OpenStreetMap contributors, CC-BY-SA"},{id:"campo_alegre_al",name:"Campo Alegre AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Campo%20Alegre&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.30643,-9.82332],[-36.30603,-9.78597],[-36.30602,-9.78263],[-36.30609,-9.78168],[-36.30604,-9.78081],[-36.3059,-9.77531],[-36.30586,-9.76496],[-36.30545,-9.73336],[-36.39634,-9.73248],[-36.39627,-9.73744],[-36.39636,-9.74336],[-36.39644,-9.75535],[-36.3966,-9.75856],[-36.39665,-9.75979],[-36.39655,-9.76244],[-36.39661,-9.76489],[-36.39658,-9.76648],[-36.39661,-9.76684],[-36.39659,-9.7696],[-36.3967,-9.77896],[-36.39675,-9.78464],[-36.39684,-9.79067],[-36.39693,-9.79681],[-36.39703,-9.80298],[-36.39719,-9.82033],[-36.39722,-9.82234],[-36.39392,-9.82233],[-36.35375,-9.82279],[-36.34822,-9.82286],[-36.31697,-9.82317],[-36.31191,-9.82324],[-36.30879,-9.82327],[-36.30643,-9.82332]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"canaan_drone_red_cross_201712",name:"Canaan - American Red Cross, Dec-2017",type:"tms",template:"https://tiles.openaerialmap.org/5ac65a9f91b5310010e0d489/0/5ac65a9f91b5310010e0d48a/{zoom}/{x}/{y}.png",endDate:"2017-12-20T00:00:00.000Z",startDate:"2017-12-11T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[-72.26734,18.63561],[-72.2636,18.6373],[-72.26116,18.64141],[-72.25983,18.64588],[-72.25811,18.64742],[-72.24502,18.64795],[-72.23433,18.64807],[-72.22734,18.6482],[-72.21953,18.65438],[-72.2161,18.65446],[-72.21584,18.66222],[-72.21725,18.66739],[-72.21889,18.67019],[-72.22309,18.66958],[-72.22343,18.67312],[-72.22502,18.6732],[-72.22545,18.67609],[-72.23288,18.67597],[-72.23339,18.67877],[-72.23674,18.67857],[-72.23854,18.67975],[-72.24,18.68129],[-72.24463,18.68207],[-72.24682,18.6817],[-72.24605,18.67698],[-72.25094,18.67698],[-72.25511,18.67902],[-72.25961,18.67898],[-72.26081,18.67743],[-72.27038,18.67711],[-72.27901,18.67682],[-72.28373,18.67893],[-72.28613,18.68154],[-72.29665,18.68178],[-72.30184,18.68568],[-72.3012,18.68824],[-72.30802,18.69324],[-72.30948,18.69308],[-72.31699,18.69682],[-72.32806,18.70528],[-72.3384,18.69902],[-72.34012,18.69666],[-72.33961,18.69426],[-72.33377,18.68357],[-72.33135,18.68192],[-72.32551,18.68093],[-72.32027,18.67741],[-72.31626,18.67477],[-72.31167,18.672],[-72.308,18.66995],[-72.30534,18.66926],[-72.30068,18.66499],[-72.29796,18.66479],[-72.29609,18.66129],[-72.29315,18.65999],[-72.29519,18.65497],[-72.28414,18.64962],[-72.27804,18.64523],[-72.27487,18.64212],[-72.27352,18.64057],[-72.2706,18.63901],[-72.26734,18.63561]]],terms_url:"http://americanredcross.github.io/",terms_text:"American Red Cross",description:"Drone imagery collected December 2017 for Canaan, Haiti by American Red Cross in coordination with the Haitian Red Cross."},{id:"Geneve-SITG-2011",name:"Canton de Génève 5cm (SITG 2011)",type:"wms",template:"https://ge.ch/ags2/services/Orthophotos_2011/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[6.18221,46.22618],[6.18348,46.22772],[6.18929,46.23329],[6.19196,46.23858],[6.19253,46.24239],[6.19061,46.24397],[6.19046,46.24654],[6.19256,46.25045],[6.19186,46.25262],[6.19325,46.256],[6.19287,46.25776],[6.19543,46.26181],[6.1979,46.26454],[6.20045,46.26569],[6.20917,46.26634],[6.21716,46.27388],[6.22046,46.27895],[6.2275,46.28649],[6.23433,46.28955],[6.23643,46.2932],[6.24074,46.29774],[6.23958,46.30396],[6.2413,46.30529],[6.2432,46.30453],[6.24513,46.30492],[6.24627,46.30372],[6.24983,46.3027],[6.25032,46.3014],[6.24938,46.30018],[6.25146,46.29647],[6.25063,46.29451],[6.25223,46.29382],[6.25429,46.2907],[6.25231,46.28735],[6.25032,46.2868],[6.24974,46.28574],[6.24636,46.28433],[6.24323,46.28428],[6.23985,46.28098],[6.23934,46.27627],[6.24372,46.27356],[6.25113,46.26258],[6.26244,46.2553],[6.26301,46.25457],[6.262,46.25215],[6.26736,46.24887],[6.27732,46.25211],[6.27725,46.25298],[6.2832,46.25503],[6.28231,46.25568],[6.28278,46.25677],[6.28868,46.26046],[6.29154,46.2644],[6.29457,46.26556],[6.29729,46.26489],[6.29783,46.2631],[6.29541,46.25827],[6.29663,46.2566],[6.3024,46.2558],[6.30678,46.25753],[6.311,46.25666],[6.30768,46.25184],[6.31046,46.25057],[6.31011,46.24749],[6.31156,46.24386],[6.29606,46.22501],[6.29012,46.22241],[6.27773,46.21493],[6.26707,46.21276],[6.25668,46.20926],[6.25089,46.20574],[6.25076,46.20456],[6.2495,46.20404],[6.24643,46.20454],[6.24251,46.20364],[6.23594,46.20541],[6.23347,46.20509],[6.22889,46.20172],[6.22323,46.20005],[6.22355,46.19881],[6.22257,46.19791],[6.21935,46.19765],[6.21688,46.19448],[6.21259,46.19189],[6.20727,46.19137],[6.20588,46.18908],[6.2034,46.18806],[6.20282,46.18642],[6.20035,46.18504],[6.19905,46.18296],[6.19615,46.18288],[6.1885,46.17967],[6.18751,46.17539],[6.18982,46.16584],[6.1748,46.15694],[6.1688,46.15624],[6.15829,46.15195],[6.15434,46.15141],[6.14952,46.14933],[6.14805,46.14748],[6.14832,46.14619],[6.14561,46.14417],[6.14244,46.14493],[6.13768,46.14217],[6.13692,46.14071],[6.13074,46.13946],[6.12598,46.13966],[6.12014,46.14181],[6.1077,46.14203],[6.10537,46.14313],[6.09746,46.14325],[6.09151,46.15095],[6.07476,46.14795],[6.07188,46.14908],[6.05295,46.15046],[6.04973,46.1468],[6.04862,46.14153],[6.04571,46.13916],[6.04287,46.14006],[6.04013,46.13894],[6.03783,46.13716],[6.03647,46.13381],[6.03531,46.13344],[6.03,46.13816],[6.02079,46.14024],[6.01693,46.14191],[6.01282,46.14119],[6.00814,46.14171],[6.00364,46.14088],[5.99338,46.1432],[5.98728,46.14171],[5.98464,46.14232],[5.98309,46.13712],[5.97603,46.1319],[5.97314,46.13081],[5.97037,46.13108],[5.96536,46.12882],[5.96163,46.12976],[5.9573,46.12767],[5.95575,46.12836],[5.95484,46.13214],[5.9589,46.13553],[5.96446,46.13738],[5.96517,46.13845],[5.9631,46.14241],[5.96383,46.14656],[5.97157,46.1558],[5.97884,46.16721],[5.98022,46.17354],[5.98322,46.17507],[5.98537,46.17478],[5.98754,46.17306],[5.99029,46.17955],[5.9936,46.18203],[5.98976,46.18692],[5.98287,46.18822],[5.98068,46.1904],[5.96282,46.1963],[5.96225,46.19719],[5.96465,46.20022],[5.97164,46.20302],[5.96985,46.20383],[5.96794,46.20675],[5.97227,46.21418],[5.97364,46.21563],[5.97897,46.21821],[6.00857,46.24444],[6.01422,46.24855],[6.06593,46.28345],[6.11511,46.31511],[6.12573,46.31843],[6.12972,46.31568],[6.12978,46.31407],[6.13604,46.30896],[6.14179,46.30555],[6.15393,46.30014],[6.17157,46.29507],[6.17125,46.29223],[6.17277,46.28629],[6.17018,46.28533],[6.16834,46.28109],[6.17201,46.27554],[6.1722,46.27301],[6.1691,46.26785],[6.16746,46.26217],[6.16531,46.26195],[6.16455,46.26274],[6.15943,46.25898],[6.15532,46.25216],[6.15387,46.25212],[6.15273,46.25037],[6.15311,46.2477],[6.15494,46.24591],[6.1521,46.23878],[6.15217,46.23273],[6.15034,46.22659],[6.15454,46.22191],[6.15483,46.22044],[6.15296,46.21738],[6.154,46.21355],[6.1571,46.21097],[6.16263,46.21043],[6.16387,46.2097],[6.16911,46.21191],[6.16867,46.21318],[6.17073,46.21478],[6.17471,46.21603],[6.18221,46.22618]],[[6.18834,46.34901],[6.18696,46.34862],[6.18195,46.35015],[6.17961,46.352],[6.17142,46.35444],[6.17022,46.35911],[6.17415,46.36036],[6.17272,46.36189],[6.17348,46.36288],[6.17999,46.36547],[6.1877,46.36132],[6.19447,46.36175],[6.19905,46.36086],[6.20113,46.35634],[6.20258,46.35567],[6.20791,46.35583],[6.21374,46.35379],[6.21247,46.35085],[6.20846,46.34665],[6.2086,46.33991],[6.20659,46.33792],[6.20493,46.33861],[6.20348,46.33793],[6.19181,46.34333],[6.19318,46.34787],[6.19076,46.3477],[6.18834,46.34901]],[[6.18182,46.34281],[6.18016,46.34318],[6.1752,46.34532],[6.17341,46.34398],[6.17324,46.34054],[6.1714,46.33952],[6.16588,46.34254],[6.16564,46.34339],[6.17091,46.35054],[6.17341,46.35029],[6.17458,46.35192],[6.17587,46.35205],[6.18579,46.34593],[6.18182,46.34281]]],terms_url:"http://ge.ch/sitg/donnees/conditions-d-utilisation/open-data",terms_text:"Orthophotos du SITG 2011"},{id:"CTFRIBOURG2016",name:"Canton Fribourg 2016",type:"tms",template:"https://mapproxy.osm.ch/tiles/fribourg_2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[1,21],polygon:[[[6.79478,46.57542],[6.79949,46.57407],[6.80256,46.57491],[6.80336,46.57687],[6.80427,46.57664],[6.80489,46.57792],[6.80794,46.57761],[6.8094,46.57885],[6.81084,46.57896],[6.81322,46.57823],[6.81153,46.58099],[6.8142,46.58396],[6.81411,46.58567],[6.8206,46.58368],[6.82371,46.57747],[6.82693,46.57796],[6.82927,46.57637],[6.83485,46.57533],[6.83744,46.57677],[6.83691,46.57748],[6.83982,46.57896],[6.84239,46.58244],[6.84532,46.58276],[6.84644,46.58394],[6.84857,46.58331],[6.85087,46.58113],[6.85262,46.58197],[6.85996,46.57987],[6.86554,46.57725],[6.86507,46.57623],[6.8679,46.57515],[6.87446,46.56497],[6.8845,46.56195],[6.88686,46.56341],[6.89214,46.5679],[6.89918,46.56671],[6.89885,46.56499],[6.89393,46.55991],[6.88822,46.55815],[6.86839,46.54164],[6.86498,46.53896],[6.86015,46.53597],[6.85563,46.54086],[6.85501,46.54144],[6.85087,46.54111],[6.8407,46.53819],[6.83032,46.53744],[6.82783,46.54298],[6.82553,46.54357],[6.81278,46.52707],[6.81088,46.52513],[6.81534,46.52139],[6.8181,46.5165],[6.82263,46.51411],[6.82429,46.51207],[6.83034,46.51246],[6.83239,46.50544],[6.83503,46.50231],[6.84126,46.49706],[6.84294,46.49632],[6.84554,46.49667],[6.84775,46.49369],[6.84891,46.49337],[6.85729,46.49305],[6.86276,46.49384],[6.86634,46.50079],[6.87244,46.50431],[6.88168,46.51257],[6.8967,46.52044],[6.89773,46.52005],[6.89711,46.51766],[6.89767,46.51483],[6.89522,46.51079],[6.89572,46.50773],[6.89974,46.51039],[6.90142,46.51233],[6.92517,46.50769],[6.92759,46.50467],[6.93363,46.50167],[6.93674,46.50096],[6.95614,46.49949],[6.97239,46.48879],[6.97581,46.4784],[6.97783,46.47289],[6.97815,46.46833],[6.97906,46.46107],[6.98016,46.45896],[6.99212,46.44891],[6.98361,46.43873],[6.98394,46.43799],[6.98746,46.43794],[7.01786,46.44707],[7.02103,46.45729],[7.06583,46.48904],[7.0724,46.4864],[7.10037,46.48699],[7.12279,46.49869],[7.1264,46.50317],[7.13096,46.50466],[7.13624,46.50861],[7.13704,46.51308],[7.14005,46.51688],[7.14044,46.51988],[7.14318,46.52183],[7.1437,46.52475],[7.1453,46.52701],[7.14835,46.52846],[7.15834,46.52681],[7.16346,46.52855],[7.16709,46.53101],[7.18234,46.53837],[7.19218,46.54656],[7.20081,46.54169],[7.20108,46.543],[7.20765,46.53291],[7.21417,46.53762],[7.21811,46.54211],[7.22171,46.54481],[7.22311,46.5476],[7.22543,46.54923],[7.2322,46.55123],[7.23614,46.554],[7.24047,46.55424],[7.24705,46.55623],[7.25574,46.56029],[7.26385,46.56752],[7.2681,46.57369],[7.28136,46.58411],[7.2992,46.5791],[7.30805,46.58132],[7.31254,46.58917],[7.3207,46.59183],[7.31479,46.60042],[7.3162,46.60937],[7.31826,46.61615],[7.3178,46.61856],[7.31213,46.6217],[7.31327,46.63662],[7.32284,46.63731],[7.32684,46.63873],[7.32975,46.64171],[7.32787,46.64616],[7.321,46.65465],[7.32345,46.65526],[7.32914,46.65459],[7.33116,46.65522],[7.33403,46.65471],[7.34549,46.6553],[7.34756,46.65307],[7.35063,46.65164],[7.35079,46.64799],[7.35456,46.64669],[7.3558,46.64533],[7.35528,46.64193],[7.35714,46.63927],[7.35877,46.64418],[7.36209,46.64683],[7.36229,46.64791],[7.36608,46.64898],[7.37747,46.65636],[7.36933,46.65564],[7.36953,46.65748],[7.37103,46.65907],[7.37083,46.66085],[7.37187,46.66283],[7.37122,46.66375],[7.37252,46.66757],[7.37108,46.66942],[7.37649,46.67503],[7.37293,46.68012],[7.37777,46.68357],[7.37587,46.68645],[7.376,46.6878],[7.38027,46.69018],[7.37693,46.69272],[7.3686,46.69265],[7.3649,46.69505],[7.36261,46.69928],[7.3598,46.69802],[7.34598,46.69895],[7.34604,46.7019],[7.34939,46.70555],[7.35037,46.70874],[7.35021,46.71119],[7.34903,46.71249],[7.34065,46.71464],[7.33277,46.71491],[7.32868,46.71641],[7.31011,46.71815],[7.30785,46.71717],[7.30002,46.72247],[7.29683,46.72737],[7.29685,46.73565],[7.29834,46.74013],[7.30304,46.74517],[7.30454,46.74816],[7.30486,46.75026],[7.30335,46.7514],[7.30309,46.75261],[7.30359,46.75919],[7.29987,46.76375],[7.29881,46.76513],[7.29307,46.77136],[7.29532,46.77537],[7.29639,46.77729],[7.30081,46.77905],[7.30053,46.78064],[7.30113,46.78134],[7.30447,46.78321],[7.30447,46.78415],[7.30207,46.78638],[7.30351,46.78887],[7.30201,46.79079],[7.30159,46.79283],[7.30732,46.79872],[7.31044,46.80823],[7.31537,46.81246],[7.32028,46.8149],[7.32047,46.81564],[7.32072,46.82011],[7.31981,46.82515],[7.32891,46.829],[7.3302,46.82968],[7.33123,46.83177],[7.33103,46.8328],[7.32926,46.83563],[7.32333,46.84041],[7.30755,46.84704],[7.30775,46.84808],[7.30613,46.84999],[7.31207,46.85557],[7.31351,46.85936],[7.31739,46.8606],[7.32087,46.86154],[7.32576,46.85681],[7.323,46.85476],[7.32603,46.85163],[7.33181,46.8512],[7.33536,46.85043],[7.33678,46.84979],[7.33821,46.84946],[7.34726,46.85375],[7.34934,46.85331],[7.35167,46.85502],[7.35444,46.85875],[7.35772,46.86065],[7.35925,46.86311],[7.35794,46.86513],[7.35838,46.8688],[7.35738,46.8701],[7.35386,46.87129],[7.35253,46.87555],[7.35339,46.88676],[7.34843,46.88934],[7.32573,46.89373],[7.30935,46.89152],[7.29618,46.89377],[7.28938,46.89377],[7.28639,46.89269],[7.28245,46.8898],[7.2802,46.8896],[7.27259,46.89249],[7.26634,46.89361],[7.25931,46.89797],[7.24433,46.90037],[7.24314,46.89792],[7.23633,46.89809],[7.23203,46.90029],[7.2309,46.9024],[7.23032,46.90394],[7.22351,46.90276],[7.21755,46.89735],[7.21244,46.90173],[7.2088,46.9026],[7.20781,46.90913],[7.20578,46.91477],[7.20692,46.92481],[7.2111,46.92527],[7.21854,46.92434],[7.2342,46.92939],[7.23411,46.93669],[7.23477,46.93827],[7.2302,46.93995],[7.2282,46.93881],[7.22555,46.93633],[7.2174,46.93307],[7.2093,46.93334],[7.20823,46.93323],[7.2058,46.94023],[7.2055,46.94112],[7.20951,46.94188],[7.21027,46.94302],[7.21044,46.94569],[7.21011,46.94781],[7.20885,46.95435],[7.21102,46.95652],[7.20838,46.95768],[7.20742,46.95967],[7.19764,46.96065],[7.19459,46.96135],[7.19463,46.9629],[7.19552,46.96416],[7.19633,46.96365],[7.19794,46.96445],[7.1993,46.9638],[7.20646,46.96413],[7.20745,46.96751],[7.21422,46.96692],[7.21467,46.97133],[7.21739,46.97147],[7.21686,46.97271],[7.22247,46.97454],[7.22163,46.97556],[7.22821,46.97836],[7.23569,46.98456],[7.23486,46.98675],[7.22594,46.9924],[7.22625,46.99868],[7.22575,46.99915],[7.21779,47.00641],[7.21299,47.0068],[7.09058,46.978],[7.03295,46.98265],[6.73785,46.81195],[6.73908,46.71021],[6.81908,46.65533],[6.82741,46.65982],[6.82089,46.65179],[6.81729,46.64923],[6.81851,46.6478],[6.81458,46.64747],[6.81344,46.64953],[6.81194,46.6492],[6.81081,46.65038],[6.80674,46.65059],[6.80203,46.64889],[6.79891,46.64914],[6.79879,46.64781],[6.80367,46.64567],[6.80325,46.6448],[6.8038,46.64451],[6.80321,46.64376],[6.80171,46.64421],[6.79895,46.63959],[6.79692,46.63314],[6.79838,46.63016],[6.80043,46.62991],[6.80065,46.62843],[6.80172,46.62854],[6.80228,46.62775],[6.80197,46.62507],[6.80355,46.62124],[6.80244,46.61877],[6.80296,46.61615],[6.80185,46.61555],[6.80389,46.60903],[6.80239,46.60142],[6.79833,46.59986],[6.8002,46.59362],[6.80124,46.5925],[6.79848,46.58616],[6.79948,46.58559],[6.79894,46.58205],[6.79611,46.57932],[6.79626,46.57728],[6.79478,46.57542]]],terms_text:"Canton Fribourg 2016 'orthophoto technique'"},{id:"Canvec",name:"Canvec - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/canvec_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=canvec&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"Canvec_French",name:"Canvec - French",type:"wms",template:"https://maps.geogratis.gc.ca/wms/canvec_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=canvec&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"capela_al",name:"Capela AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Capela&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.03321,-9.45741],[-36.03322,-9.45581],[-36.03336,-9.45483],[-36.0334,-9.45291],[-36.03327,-9.45141],[-36.03336,-9.44287],[-36.0335,-9.43821],[-36.03353,-9.42881],[-36.03363,-9.42027],[-36.03389,-9.41091],[-36.03389,-9.40032],[-36.03401,-9.3888],[-36.03413,-9.38528],[-36.03428,-9.38265],[-36.03417,-9.37849],[-36.03444,-9.36688],[-36.05246,-9.3671],[-36.05791,-9.36711],[-36.0716,-9.36727],[-36.08622,-9.36731],[-36.103,-9.3675],[-36.11652,-9.36755],[-36.12515,-9.36768],[-36.12522,-9.37473],[-36.12521,-9.37721],[-36.12511,-9.38038],[-36.12514,-9.38529],[-36.12505,-9.39026],[-36.12504,-9.39477],[-36.12506,-9.40172],[-36.12499,-9.40382],[-36.1248,-9.40679],[-36.12463,-9.41123],[-36.12474,-9.4136],[-36.12456,-9.4163],[-36.12459,-9.42461],[-36.12466,-9.42691],[-36.12465,-9.42925],[-36.12457,-9.4297],[-36.12464,-9.43538],[-36.12438,-9.44109],[-36.12446,-9.44387],[-36.12452,-9.44579],[-36.12438,-9.44736],[-36.12448,-9.44856],[-36.12448,-9.45095],[-36.12436,-9.45392],[-36.12434,-9.45791],[-36.11758,-9.45783],[-36.1089,-9.45778],[-36.10419,-9.4578],[-36.10116,-9.45773],[-36.0953,-9.45773],[-36.08461,-9.45767],[-36.07361,-9.45757],[-36.05726,-9.45741],[-36.04816,-9.45747],[-36.04177,-9.45739],[-36.03767,-9.45739],[-36.03321,-9.45741]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"COS2010_v1.0",name:"Carta de Uso do Solo 2010 (WMS)",type:"wms",template:"http://mapas.dgterritorio.pt/wms-inspire/cos2010v1?language=por&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=COS2010_v1.0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2010-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[14,18],polygon:[[[-7.31278,36.98391],[-7.44461,37.5718],[-7.1933,37.97019],[-6.97357,38.00807],[-6.90628,38.24142],[-7.06627,38.20743],[-7.27158,38.45628],[-7.20429,38.72356],[-7.0134,38.85468],[-6.91315,39.03839],[-6.97357,39.13113],[-7.17957,39.23651],[-7.28668,39.48497],[-7.44873,39.61838],[-7.34162,39.60886],[-6.99692,39.64906],[-6.81839,40.0192],[-7.01065,40.19986],[-6.85272,40.24285],[-6.76209,40.35073],[-6.77994,40.8886],[-6.88637,41.01151],[-6.79642,41.01721],[-6.63849,41.21689],[-6.4531,41.24116],[-6.29311,41.38763],[-6.15715,41.5908],[-6.31165,41.68932],[-6.51215,41.71188],[-6.49841,41.88081],[-6.56296,41.97991],[-6.80191,42.00951],[-7.20497,42.00135],[-7.22763,41.8849],[-7.36908,41.87058],[-7.72751,41.92885],[-7.92526,41.94009],[-8.07907,41.84706],[-8.1601,41.91812],[-8.01796,42.05031],[-8.19924,42.18681],[-8.39356,42.1023],[-8.66066,42.07886],[-8.88382,41.88081],[-9.17084,41.86956],[-9.04175,41.43655],[-9.01978,40.65981],[-9.15711,40.26695],[-9.81903,39.52099],[-9.74213,38.6512],[-9.12964,37.88136],[-9.27246,36.99378],[-9.09394,36.68604],[-7.80579,36.74989],[-7.31278,36.98391]]],terms_url:"http://www.dgterritorio.pt/dados_abertos/cos/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"Cartoriviera-2012",name:"Cartoriviera - Orthophoto 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/cartoriviera2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[7.02235,46.42856],[7.0224,46.42045],[7.02176,46.41955],[7.02225,46.41954],[7.02161,46.41749],[7.02242,46.4174],[7.02242,46.41681],[7.02113,46.41443],[7.02164,46.41259],[7.0216,46.41188],[7.01918,46.41055],[7.01896,46.41004],[7.01757,46.40826],[7.01426,46.40696],[7.00948,46.40695],[7.00952,46.40451],[7.00368,46.40153],[6.97052,46.40139],[6.97056,46.39354],[6.96507,46.38333],[6.89379,46.383],[6.89327,46.39209],[6.8968,46.4],[6.89678,46.40097],[6.89395,46.401],[6.89768,46.40888],[6.89246,46.41386],[6.89237,46.41807],[6.8949,46.4193],[6.89285,46.41948],[6.89395,46.42312],[6.89225,46.42339],[6.89219,46.42802],[6.88743,46.428],[6.87652,46.43163],[6.86624,46.43633],[6.84003,46.44591],[6.83504,46.44934],[6.827,46.45204],[6.82695,46.45379],[6.81953,46.45655],[6.80361,46.45993],[6.78775,46.46253],[6.78697,46.5246],[6.82604,46.5248],[6.82609,46.52662],[6.83907,46.5267],[6.83888,46.55006],[6.90658,46.55042],[6.912,46.54301],[6.91083,46.53983],[6.90979,46.53512],[6.90931,46.53517],[6.90867,46.53373],[6.91195,46.53297],[6.91335,46.53604],[6.9268,46.53364],[6.92723,46.5349],[6.93714,46.53311],[6.93691,46.5327],[6.94028,46.53196],[6.94164,46.53477],[6.94309,46.53455],[6.94345,46.53528],[6.95641,46.53003],[6.95632,46.52733],[6.95111,46.52725],[6.95301,46.52611],[6.94341,46.52605],[6.94343,46.52546],[7.01629,46.52568],[7.02158,46.52211],[7.02196,46.47355],[7.07099,46.47368],[7.07402,46.4719],[7.07383,46.4326],[7.05947,46.43233],[7.05278,46.42879],[7.02235,46.42856]]],terms_url:"https://map.cartoriviera.ch/?baselayer_ref=orthos_2012_mobile&baselayer_opacity=100",terms_text:"Cartoriviera"},{id:"Catastro-Spain",name:"Catastro Spain",type:"wms",template:"http://ovc.catastro.meh.es/Cartografia/WMS/ServidorWMS.aspx?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=Catastro&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-17.88463,28.44606],[-17.89395,28.52255],[-18.02125,28.74819],[-18.02241,28.80384],[-17.9424,28.87261],[-17.89118,28.87371],[-17.89033,28.85151],[-17.76759,28.85378],[-17.76698,28.83122],[-17.74127,28.832],[-17.73949,28.76422],[-17.71398,28.76497],[-17.71293,28.73037],[-17.75744,28.69318],[-17.75708,28.67413],[-17.74579,28.67435],[-17.74573,28.61656],[-17.75197,28.58337],[-17.76225,28.5592],[-17.78331,28.54167],[-17.78316,28.49366],[-17.80861,28.4925],[-17.80601,28.4469],[-17.88463,28.44606]],[[-18.1661,27.78516],[-18.16349,27.69492],[-18.08898,27.69634],[-18.08734,27.67387],[-18.03641,27.67537],[-18.03501,27.63026],[-17.959,27.6324],[-17.86033,27.7926],[-17.86303,27.83688],[-17.8884,27.83649],[-17.88913,27.85905],[-17.99065,27.85675],[-18.03868,27.76558],[-18.11464,27.76379],[-18.11546,27.78636],[-18.1661,27.78516]],[[-17.36038,28.06398],[-17.36297,28.17572],[-17.33756,28.17637],[-17.33846,28.2213],[-17.18579,28.22388],[-17.08208,28.13518],[-17.08084,28.068],[-17.13154,28.06681],[-17.15633,28.02146],[-17.23211,28.02037],[-17.23199,27.99804],[-17.25768,27.99784],[-17.25785,28.01997],[-17.30867,28.01923],[-17.36038,28.06398]],[[-16.92782,28.32758],[-16.92866,28.37219],[-16.87767,28.37293],[-16.87807,28.39542],[-16.52143,28.42261],[-16.44571,28.49113],[-16.44625,28.53597],[-16.42059,28.53627],[-16.42092,28.55884],[-16.34433,28.55976],[-16.3446,28.58221],[-16.19125,28.58372],[-16.19162,28.60684],[-16.12793,28.60782],[-16.1278,28.59218],[-16.09951,28.5925],[-16.09934,28.51638],[-16.16481,28.51612],[-16.16475,28.49386],[-16.23858,28.44847],[-16.26535,28.44761],[-16.26586,28.403],[-16.31675,28.40176],[-16.31631,28.38019],[-16.34208,28.37951],[-16.34083,28.2893],[-16.41584,28.19761],[-16.4151,28.13113],[-16.51533,28.01648],[-16.61684,28.01532],[-16.61681,27.99305],[-16.71842,27.99192],[-16.7191,28.03714],[-16.7447,28.03679],[-16.74534,28.08181],[-16.7707,28.08161],[-16.8224,28.1259],[-16.82317,28.17087],[-16.8487,28.17075],[-16.85028,28.26079],[-16.87565,28.26055],[-16.87608,28.28322],[-16.90151,28.28277],[-16.90239,28.32793],[-16.92782,28.32758]],[[-15.85374,27.90089],[-15.8542,27.99018],[-15.82895,27.99066],[-15.82911,28.03558],[-15.7783,28.03632],[-15.75328,28.08143],[-15.72788,28.08157],[-15.72826,28.17186],[-15.49897,28.1728],[-15.49874,28.15041],[-15.44978,28.15075],[-15.45016,28.19614],[-15.39728,28.19614],[-15.39644,28.03836],[-15.37103,28.03802],[-15.37065,28.01532],[-15.34578,28.01532],[-15.34548,27.92544],[-15.3708,27.92524],[-15.37057,27.83521],[-15.39598,27.83474],[-15.421,27.78797],[-15.47181,27.78939],[-15.47188,27.76665],[-15.52277,27.76678],[-15.54771,27.72161],[-15.62361,27.72134],[-15.62415,27.74199],[-15.70075,27.74335],[-15.80167,27.81105],[-15.85374,27.90089]],[[-14.52156,28.04678],[-14.52244,28.11841],[-14.41575,28.11561],[-14.21688,28.22788],[-14.21537,28.33903],[-14.16417,28.45283],[-14.11151,28.4748],[-14.03358,28.72267],[-13.95652,28.74494],[-13.95617,28.76659],[-13.82902,28.76643],[-13.82896,28.78798],[-13.80007,28.78793],[-13.8013,28.71899],[-13.82757,28.71935],[-13.82786,28.6518],[-13.80258,28.6519],[-13.80339,28.53842],[-13.82885,28.53847],[-13.83151,28.39702],[-13.91582,28.22414],[-13.98564,28.22357],[-14.03696,28.17958],[-14.13871,28.17999],[-14.13866,28.15791],[-14.21537,28.15781],[-14.21472,28.11189],[-14.29132,28.04524],[-14.33197,28.03687],[-14.44578,28.04698],[-14.44666,28.0658],[-14.49628,28.06826],[-14.49593,28.04585],[-14.52156,28.04678]],[[-13.80066,28.84566],[-13.80093,28.82311],[-13.77569,28.82305],[-13.69729,28.88982],[-13.69729,28.91277],[-13.60725,28.9118],[-13.43886,29.00024],[-13.43746,29.13513],[-13.4117,29.13499],[-13.41056,29.22298],[-13.45928,29.25559],[-13.45974,29.2942],[-13.50913,29.29456],[-13.51006,29.31635],[-13.56354,29.31729],[-13.56406,29.27138],[-13.53892,29.2712],[-13.53897,29.25004],[-13.56613,29.25013],[-13.5666,29.203],[-13.51565,29.20223],[-13.51565,29.18206],[-13.5398,29.18278],[-13.54089,29.13753],[-13.65782,29.13685],[-13.71322,29.09351],[-13.76634,29.09345],[-13.85025,29.01659],[-13.85182,28.98343],[-13.85244,28.91486],[-13.90131,28.89245],[-13.9024,28.84698],[-13.80066,28.84566]],[[1.64799,38.99907],[1.73217,38.99936],[1.73147,39.04417],[1.64895,39.04319],[1.64816,39.12764],[1.39486,39.12657],[1.39544,39.08642],[1.22811,39.08526],[1.22911,39.0029],[1.14487,39.0018],[1.14528,38.832],[1.31136,38.83316],[1.31219,38.79065],[1.39469,38.79162],[1.39519,38.75296],[1.31128,38.75193],[1.31259,38.62388],[1.6489,38.62511],[1.64807,38.71115],[1.58456,38.71012],[1.58116,38.70054],[1.54915,38.70028],[1.51972,38.70921],[1.50355,38.72532],[1.48133,38.91551],[1.55189,38.92544],[1.56673,38.95666],[1.64874,38.95833],[1.64799,38.99907]],[[2.54507,39.41667],[2.43933,39.41611],[2.43871,39.48469],[2.43902,39.49934],[2.31223,39.49934],[2.31192,39.54179],[2.22907,39.541],[2.22835,39.62606],[2.34601,39.62709],[2.92704,39.96016],[3.14566,39.96005],[3.14608,40.00198],[3.23139,40.00198],[3.23129,39.83292],[3.14823,39.83316],[3.14844,39.79357],[3.48148,39.79318],[3.48035,39.5959],[3.31506,39.47846],[3.31462,39.37855],[3.08302,39.24994],[2.97986,39.25015],[2.97904,39.3335],[2.72874,39.33342],[2.72885,39.45814],[2.64569,39.45774],[2.64538,39.49966],[2.54528,39.49942],[2.54507,39.41667]],[[3.81204,40.04344],[3.72908,40.0438],[3.72862,39.95842],[3.81266,39.9576],[3.81228,39.91644],[3.9609,39.91598],[4.19381,39.79131],[4.31503,39.79058],[4.31599,39.83293],[4.39874,39.83204],[4.39737,39.91858],[4.3158,39.91933],[4.31619,40.0434],[4.2319,40.04436],[4.23248,40.08478],[4.14915,40.08611],[4.14906,40.12552],[4.0628,40.12722],[4.06242,40.08499],[3.81287,40.08529],[3.81204,40.04344]],[[-8.89106,41.82289],[-9.1092,42.57511],[-9.03655,42.73066],[-9.08834,42.72696],[-9.14661,42.77503],[-9.21855,42.90163],[-9.2761,42.86051],[-9.30991,42.93113],[-9.27898,42.9822],[-9.30991,43.06004],[-9.25236,43.10417],[-9.2315,43.17032],[-9.14733,43.21018],[-9.06748,43.19916],[-9.03367,43.24267],[-8.99842,43.24477],[-8.99986,43.29558],[-8.93727,43.30553],[-8.92936,43.32699],[-8.8639,43.32908],[-8.87613,43.37407],[-8.82217,43.37354],[-8.78548,43.31914],[-8.70635,43.305],[-8.60996,43.3296],[-8.55097,43.32332],[-8.52435,43.3364],[-8.52507,43.36465],[-8.45745,43.39184],[-8.36105,43.41118],[-8.36033,43.46342],[-8.33444,43.57974],[-8.27761,43.57088],[-8.06467,43.72392],[-7.99921,43.7234],[-7.9172,43.78264],[-7.85605,43.79146],[-7.83591,43.73743],[-7.66284,43.80982],[-7.31889,43.67827],[-7.19975,43.58308],[-6.24882,43.6075],[-6.12293,43.57901],[-5.85204,43.6799],[-5.60363,43.57087],[-5.28553,43.56191],[-5.17875,43.49916],[-4.90899,43.48367],[-4.61562,43.4192],[-4.18399,43.42492],[-3.80295,43.51954],[-3.74,43.48693],[-3.56128,43.54236],[-3.1083,43.38163],[-2.93857,43.46246],[-2.74524,43.47551],[-2.30462,43.31706],[-1.9854,43.3563],[-1.85528,43.39725],[-1.7698,43.39644],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[3.23049,42.37644],[3.31415,42.37604],[3.31412,42.33399],[3.39785,42.33404],[3.39739,42.29009],[3.31389,42.29084],[3.31397,42.20702],[3.14759,42.2073],[3.14759,42.12606],[3.23055,42.126],[3.24668,41.95294],[3.19452,41.85589],[3.06054,41.76474],[2.78358,41.63718],[2.26293,41.42716],[2.16492,41.29893],[1.86008,41.22322],[1.3763,41.11627],[1.17937,41.04646],[1.08585,41.04849],[0.75854,40.81956],[0.9114,40.73376],[0.87813,40.67514],[0.66502,40.53587],[0.55801,40.55022],[0.43392,40.37576],[0.26756,40.19192],[0.16415,40.06472],[0.07513,40.01447],[0.01039,39.89522],[-0.09392,39.81169],[-0.18474,39.63117],[-0.29085,39.50363],[-0.28636,39.33343],[-0.18564,39.17746],[-0.21352,39.15585],[-0.11101,38.97222],[0.00949,38.88268],[0.12189,38.87218],[0.23429,38.79864],[0.25587,38.72642],[0.09581,38.61338],[-0.0022,38.60706],[-0.05705,38.52691],[-0.27197,38.47624],[-0.37987,38.39312],[-0.38347,38.33813],[-0.45091,38.33108],[-0.50487,38.28309],[-0.48238,38.19481],[-0.42933,38.16583],[-0.45451,38.14886],[-0.584,38.17219],[-0.61367,38.11986],[-0.63705,37.96122],[-0.68111,37.94562],[-0.73237,37.88107],[-0.72158,37.78306],[-0.68831,37.734],[-0.66415,37.62315],[-0.71939,37.58784],[-0.91963,37.53758],[-1.11071,37.51641],[-1.33832,37.52867],[-1.44089,37.39037],[-1.6767,37.27652],[-1.85408,36.91229],[-2.06835,36.69291],[-2.21588,36.66192],[-2.37219,36.78018],[-2.68129,36.65911],[-2.92015,36.66756],[-3.09402,36.71263],[-3.46108,36.65488],[-3.72804,36.69291],[-4.37435,36.66333],[-4.65712,36.44042],[-4.9188,36.45313],[-5.16995,36.35135],[-5.28411,36.19702],[-5.26809,36.12418],[-5.35248,36.12247],[-5.35161,36.04014],[-5.43658,36.03889],[-5.43532,36.00344],[-5.68886,36.00365],[-5.68996,36.04053],[-5.85506,36.03856],[-5.85668,36.12421],[-5.93848,36.12215],[-5.94003,36.16556],[-5.99834,36.1645],[-6.03573,36.1781],[-6.07752,36.22241],[-6.15061,36.28646],[-6.23154,36.37701],[-6.33585,36.53106],[-6.32146,36.58163],[-6.40419,36.6235],[-6.47433,36.74897],[-6.41588,36.79939],[-6.49052,36.91738],[-6.62989,37.0194],[-6.87448,37.10838],[-7.04264,37.18507],[-7.26474,37.18435],[-7.37535,37.15354],[-7.40832,37.16822],[-7.42029,37.21183],[-7.42492,37.23505],[-7.43805,37.2452],[-7.44597,37.33261],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]]},{id:"Chorzow-buildings",name:"Chorzów: Buildings",type:"wms",template:"http://e-odgik.chorzow.eu/services/wms/wms_funkcje_bud/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=3,2,1,8,7,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.94562,50.31836],[18.94349,50.32385],[18.95466,50.32599],[18.96426,50.33307],[18.96521,50.33777],[18.98692,50.33621],[18.98468,50.32501],[18.99777,50.32204],[18.99686,50.31716],[18.98774,50.31736],[18.98695,50.30989],[18.99736,50.30031],[18.99744,50.29722],[19.00546,50.29548],[19.0073,50.28342],[19.00574,50.27871],[18.99236,50.27091],[18.96792,50.28661],[18.96215,50.27972],[18.96169,50.27337],[18.95824,50.27291],[18.95492,50.26193],[18.96014,50.24927],[18.95672,50.2452],[18.95555,50.23891],[18.94132,50.243],[18.93475,50.25314],[18.93324,50.26032],[18.93262,50.26588],[18.9296,50.26774],[18.92976,50.27131],[18.92669,50.27289],[18.92632,50.27623],[18.93071,50.27619],[18.93437,50.28729],[18.92383,50.29533],[18.92635,50.29986],[18.91905,50.30212],[18.91955,50.30576],[18.92463,50.31192],[18.9262,50.31883],[18.94562,50.31836]]],terms_text:"Urząd Miasta Chorzowa"},{id:"South_Africa-CapeTown-Aerial-2013",name:"City of Cape Town 2013 Aerial",type:"tms",template:"https://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2013/{zoom}/{x}/{y}.jpg",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[1,21],polygon:[[[18.44866,-33.89362],[18.44859,-33.90264],[18.4702,-33.90277],[18.48139,-33.84724],[18.44925,-33.80107],[18.42815,-33.73564],[18.43914,-33.71772],[18.40719,-33.65899],[18.33224,-33.57752],[18.33245,-33.55045],[18.354,-33.55059],[18.35425,-33.5236],[18.36524,-33.52366],[18.36503,-33.5148],[18.37601,-33.51477],[18.37605,-33.5058],[18.42966,-33.50594],[18.4297,-33.48785],[18.44049,-33.48789],[18.4406,-33.46988],[18.49437,-33.4701],[18.49433,-33.47916],[18.51583,-33.47917],[18.51574,-33.48819],[18.52647,-33.4883],[18.52632,-33.52435],[18.54793,-33.52443],[18.54795,-33.51539],[18.56937,-33.5155],[18.56937,-33.52448],[18.58012,-33.52453],[18.58007,-33.5426],[18.59078,-33.5426],[18.59074,-33.56064],[18.57995,-33.56053],[18.57988,-33.56962],[18.5907,-33.56962],[18.59065,-33.57868],[18.62301,-33.57873],[18.62292,-33.58773],[18.66597,-33.58789],[18.66593,-33.61493],[18.67672,-33.61497],[18.67658,-33.65103],[18.6873,-33.65102],[18.68734,-33.66004],[18.69807,-33.66009],[18.69807,-33.66907],[18.75204,-33.66925],[18.75208,-33.64219],[18.77364,-33.64225],[18.77371,-33.63319],[18.82746,-33.6333],[18.82752,-33.6603],[18.81667,-33.66029],[18.8166,-33.67832],[18.80581,-33.67831],[18.80581,-33.70539],[18.8274,-33.70544],[18.82733,-33.72347],[18.83812,-33.72343],[18.83804,-33.74139],[18.81652,-33.74137],[18.81637,-33.79551],[18.80559,-33.79551],[18.80551,-33.81357],[18.79476,-33.81355],[18.79472,-33.83154],[18.77311,-33.83152],[18.77313,-33.84052],[18.76236,-33.84052],[18.76227,-33.90359],[18.75146,-33.90352],[18.75108,-33.98478],[18.76191,-33.9848],[18.76178,-34.02988],[18.7726,-34.0299],[18.77258,-34.03891],[18.79403,-34.03894],[18.79388,-34.0407],[18.79845,-34.04119],[18.80324,-34.04118],[18.80341,-34.03892],[18.81594,-34.03897],[18.81634,-34.02993],[18.83798,-34.03165],[18.838,-34.03],[18.84842,-34.03001],[18.84847,-34.02185],[18.85993,-34.02347],[18.85986,-34.02101],[18.86827,-34.02208],[18.86819,-34.02117],[18.88546,-34.02343],[18.88518,-34.02132],[18.90252,-34.02103],[18.90258,-34.012],[18.91342,-34.012],[18.91348,-33.99396],[18.94588,-33.99403],[18.94586,-34.0031],[18.96743,-34.003],[18.96747,-34.01208],[18.97822,-34.01208],[18.97833,-34.02114],[18.98914,-34.02114],[18.98916,-34.03913],[19.00002,-34.03913],[19.00002,-34.05718],[19.01084,-34.05725],[19.01079,-34.08414],[19,-34.08413],[19.00002,-34.0932],[18.98915,-34.09317],[18.98918,-34.1022],[18.97832,-34.10218],[18.97832,-34.11123],[18.9675,-34.11121],[18.96749,-34.12925],[18.9566,-34.12924],[18.95656,-34.13824],[18.96742,-34.13831],[18.96742,-34.14732],[18.98918,-34.1473],[18.98918,-34.1653],[18.97827,-34.16529],[18.97832,-34.17429],[18.96742,-34.17427],[18.96746,-34.1833],[18.95656,-34.18332],[18.95656,-34.19236],[18.94574,-34.19232],[18.9457,-34.20132],[18.93487,-34.20137],[18.93489,-34.21933],[18.90236,-34.21935],[18.90176,-34.23626],[18.88784,-34.23735],[18.88942,-34.25541],[18.88059,-34.25534],[18.87927,-34.26443],[18.86969,-34.26441],[18.86971,-34.27344],[18.83714,-34.27342],[18.83712,-34.26438],[18.84802,-34.2644],[18.84803,-34.23739],[18.81549,-34.21028],[18.81565,-34.17413],[18.85488,-34.15627],[18.76176,-34.08405],[18.65337,-34.07748],[18.47974,-34.11012],[18.44637,-34.13423],[18.44445,-34.16409],[18.436,-34.16405],[18.43597,-34.18202],[18.44681,-34.18211],[18.44673,-34.19111],[18.46593,-34.19121],[18.48662,-34.24539],[18.47889,-34.25437],[18.486,-34.25437],[18.46771,-34.29941],[18.48922,-34.34458],[18.50011,-34.34458],[18.49992,-34.36262],[18.46743,-34.36251],[18.46737,-34.35349],[18.3916,-34.31707],[18.39177,-34.29002],[18.37016,-34.28087],[18.37068,-34.21789],[18.34923,-34.18162],[18.32747,-34.18149],[18.32767,-34.16346],[18.31187,-34.15438],[18.3114,-34.14353],[18.32367,-34.13469],[18.34993,-34.10421],[18.33932,-34.08828],[18.36125,-34.05972],[18.35505,-34.05538],[18.34275,-34.06433],[18.32,-34.06443],[18.29607,-34.04513],[18.30682,-34.02526],[18.32877,-34.0192],[18.32892,-34.00125],[18.33974,-34.00127],[18.3398,-33.98663],[18.36287,-33.97351],[18.36381,-33.92925],[18.37262,-33.92927],[18.37284,-33.91776],[18.39773,-33.89335],[18.44866,-33.89362]]],terms_url:"https://www.capetown.gov.za",terms_text:"City of Cape Town Aerial - OPENSTREETMAP USE ONLY",description:"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 12cm ground sample distance"},{id:"South_Africa-CapeTown-Aerial",name:"City of Cape Town 2015 Aerial",type:"tms",template:"https://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2015/{zoom}/{x}/{y}.jpg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[1,21],polygon:[[[18.44866,-33.89362],[18.44859,-33.90264],[18.4702,-33.90277],[18.48139,-33.84724],[18.44925,-33.80107],[18.42815,-33.73564],[18.43914,-33.71772],[18.40719,-33.65899],[18.33224,-33.57752],[18.33245,-33.55045],[18.354,-33.55059],[18.35425,-33.5236],[18.36524,-33.52366],[18.36503,-33.5148],[18.37601,-33.51477],[18.37605,-33.5058],[18.42966,-33.50594],[18.4297,-33.48785],[18.44049,-33.48789],[18.4406,-33.46988],[18.49437,-33.4701],[18.49433,-33.47916],[18.51583,-33.47917],[18.51574,-33.48819],[18.52647,-33.4883],[18.52632,-33.52435],[18.54793,-33.52443],[18.54795,-33.51539],[18.56937,-33.5155],[18.56937,-33.52448],[18.58012,-33.52453],[18.58007,-33.5426],[18.59078,-33.5426],[18.59074,-33.56064],[18.57995,-33.56053],[18.57988,-33.56962],[18.5907,-33.56962],[18.59065,-33.57868],[18.62301,-33.57873],[18.62292,-33.58773],[18.66597,-33.58789],[18.66593,-33.61493],[18.67672,-33.61497],[18.67658,-33.65103],[18.6873,-33.65102],[18.68734,-33.66004],[18.69807,-33.66009],[18.69807,-33.66907],[18.75204,-33.66925],[18.75208,-33.64219],[18.77364,-33.64225],[18.77371,-33.63319],[18.82746,-33.6333],[18.82752,-33.6603],[18.81667,-33.66029],[18.8166,-33.67832],[18.80581,-33.67831],[18.80581,-33.70539],[18.8274,-33.70544],[18.82733,-33.72347],[18.83812,-33.72343],[18.83804,-33.74139],[18.81652,-33.74137],[18.81637,-33.79551],[18.80559,-33.79551],[18.80551,-33.81357],[18.79476,-33.81355],[18.79472,-33.83154],[18.77311,-33.83152],[18.77313,-33.84052],[18.76236,-33.84052],[18.76227,-33.90359],[18.75146,-33.90352],[18.75108,-33.98478],[18.76191,-33.9848],[18.76178,-34.02988],[18.7726,-34.0299],[18.77258,-34.03891],[18.79403,-34.03894],[18.79388,-34.0407],[18.79845,-34.04119],[18.80324,-34.04118],[18.80341,-34.03892],[18.81594,-34.03897],[18.81634,-34.02993],[18.83798,-34.03165],[18.838,-34.03],[18.84842,-34.03001],[18.84847,-34.02185],[18.85993,-34.02347],[18.85986,-34.02101],[18.86827,-34.02208],[18.86819,-34.02117],[18.88546,-34.02343],[18.88518,-34.02132],[18.90252,-34.02103],[18.90258,-34.012],[18.91342,-34.012],[18.91348,-33.99396],[18.94588,-33.99403],[18.94586,-34.0031],[18.96743,-34.003],[18.96747,-34.01208],[18.97822,-34.01208],[18.97833,-34.02114],[18.98914,-34.02114],[18.98916,-34.03913],[19.00002,-34.03913],[19.00002,-34.05718],[19.01084,-34.05725],[19.01079,-34.08414],[19,-34.08413],[19.00002,-34.0932],[18.98915,-34.09317],[18.98918,-34.1022],[18.97832,-34.10218],[18.97832,-34.11123],[18.9675,-34.11121],[18.96749,-34.12925],[18.9566,-34.12924],[18.95656,-34.13824],[18.96742,-34.13831],[18.96742,-34.14732],[18.98918,-34.1473],[18.98918,-34.1653],[18.97827,-34.16529],[18.97832,-34.17429],[18.96742,-34.17427],[18.96746,-34.1833],[18.95656,-34.18332],[18.95656,-34.19236],[18.94574,-34.19232],[18.9457,-34.20132],[18.93487,-34.20137],[18.93489,-34.21933],[18.90236,-34.21935],[18.90176,-34.23626],[18.88784,-34.23735],[18.88942,-34.25541],[18.88059,-34.25534],[18.87927,-34.26443],[18.86969,-34.26441],[18.86971,-34.27344],[18.83714,-34.27342],[18.83712,-34.26438],[18.84802,-34.2644],[18.84803,-34.23739],[18.81549,-34.21028],[18.81565,-34.17413],[18.85488,-34.15627],[18.76176,-34.08405],[18.65337,-34.07748],[18.47974,-34.11012],[18.44637,-34.13423],[18.44445,-34.16409],[18.436,-34.16405],[18.43597,-34.18202],[18.44681,-34.18211],[18.44673,-34.19111],[18.46593,-34.19121],[18.48662,-34.24539],[18.47889,-34.25437],[18.486,-34.25437],[18.46771,-34.29941],[18.48922,-34.34458],[18.50011,-34.34458],[18.49992,-34.36262],[18.46743,-34.36251],[18.46737,-34.35349],[18.3916,-34.31707],[18.39177,-34.29002],[18.37016,-34.28087],[18.37068,-34.21789],[18.34923,-34.18162],[18.32747,-34.18149],[18.32767,-34.16346],[18.31187,-34.15438],[18.3114,-34.14353],[18.32367,-34.13469],[18.34993,-34.10421],[18.33932,-34.08828],[18.36125,-34.05972],[18.35505,-34.05538],[18.34275,-34.06433],[18.32,-34.06443],[18.29607,-34.04513],[18.30682,-34.02526],[18.32877,-34.0192],[18.32892,-34.00125],[18.33974,-34.00127],[18.3398,-33.98663],[18.36287,-33.97351],[18.36381,-33.92925],[18.37262,-33.92927],[18.37284,-33.91776],[18.39773,-33.89335],[18.44866,-33.89362]]],terms_url:"https://www.capetown.gov.za",terms_text:"City of Cape Town Aerial - OPENSTREETMAP USE ONLY",best:true,description:"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 8cm ground sample distance"},{id:"City_of_Melbourne_May_2018",name:"City of Melbourne",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/openstreetmapau.gdbhzo3g/{zoom}/{x}/{y}.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcGF1IiwiYSI6ImNqbWl3bXZ6aDA0MTkzd21xdnV1d2k0azEifQ.HYkMOqH_E2fYd1b0oXRe6w",endDate:"2018-05-01T00:00:00.000Z",startDate:"2018-05-01T00:00:00.000Z",zoomExtent:[10,22],polygon:[[[144.9146,-37.79929],[144.9139,-37.79888],[144.91276,-37.79858],[144.91138,-37.79876],[144.90975,-37.79976],[144.90604,-37.80641],[144.90428,-37.81261],[144.9042,-37.81421],[144.90561,-37.82089],[144.90426,-37.82245],[144.89902,-37.82728],[144.89686,-37.83007],[144.89598,-37.83355],[144.89602,-37.83873],[144.89703,-37.84192],[144.90113,-37.84692],[144.9052,-37.85019],[144.90684,-37.85056],[144.90802,-37.8502],[144.9084,-37.84948],[144.90701,-37.84771],[144.90763,-37.84693],[144.90448,-37.84165],[144.90529,-37.84139],[144.90806,-37.8458],[144.91181,-37.8502],[144.91274,-37.85039],[144.91548,-37.84892],[144.91553,-37.84814],[144.91396,-37.84594],[144.91619,-37.84451],[144.91396,-37.84131],[144.91634,-37.83985],[144.91651,-37.83841],[144.91508,-37.83441],[144.91829,-37.83307],[144.91947,-37.83258],[144.92102,-37.83087],[144.92186,-37.83002],[144.92297,-37.8295],[144.92937,-37.82816],[144.93529,-37.82702],[144.94112,-37.82692],[144.94181,-37.82679],[144.94585,-37.8275],[144.94707,-37.82794],[144.94784,-37.82779],[144.95786,-37.82953],[144.95921,-37.82941],[144.9613,-37.82902],[144.96254,-37.82972],[144.96477,-37.83184],[144.96565,-37.83229],[144.96621,-37.83231],[144.97033,-37.83121],[144.97052,-37.83228],[144.97106,-37.83307],[144.97346,-37.83507],[144.97428,-37.83595],[144.97943,-37.85002],[144.97968,-37.85081],[144.98061,-37.85117],[144.98425,-37.85151],[144.98483,-37.85139],[144.98537,-37.85085],[144.98923,-37.83109],[144.98891,-37.83038],[144.99226,-37.81041],[144.99243,-37.80983],[144.99187,-37.80895],[144.97449,-37.80714],[144.97683,-37.79327],[144.97674,-37.7928],[144.97642,-37.79232],[144.97589,-37.79219],[144.96977,-37.79146],[144.97076,-37.78566],[144.97041,-37.785],[144.9699,-37.78477],[144.96488,-37.7842],[144.96511,-37.78252],[144.96507,-37.78198],[144.96421,-37.78142],[144.96398,-37.78082],[144.96389,-37.77964],[144.96355,-37.7785],[144.96267,-37.77779],[144.96136,-37.77724],[144.93919,-37.77456],[144.93836,-37.77458],[144.93801,-37.77485],[144.93728,-37.77601],[144.93658,-37.77692],[144.93613,-37.77728],[144.93598,-37.77791],[144.93778,-37.78142],[144.93827,-37.78421],[144.93911,-37.78654],[144.93885,-37.78672],[144.93881,-37.7873],[144.93773,-37.78801],[144.93216,-37.7874],[144.93123,-37.78783],[144.93076,-37.78786],[144.93003,-37.78735],[144.92181,-37.78642],[144.91488,-37.77938],[144.91428,-37.77865],[144.9137,-37.77853],[144.91293,-37.77855],[144.90819,-37.78135],[144.90722,-37.78206],[144.90572,-37.7845],[144.90529,-37.78637],[144.90428,-37.78657],[144.90375,-37.78718],[144.90319,-37.78827],[144.90201,-37.78883],[144.90143,-37.78964],[144.90188,-37.79103],[144.90257,-37.79198],[144.90415,-37.79288],[144.90645,-37.79383],[144.90814,-37.79456],[144.91046,-37.79519],[144.9127,-37.79605],[144.91429,-37.79695],[144.91525,-37.79783],[144.91539,-37.79815],[144.91531,-37.79848],[144.91518,-37.79872],[144.9148,-37.79914],[144.9146,-37.79929]]],terms_url:"https://data.melbourne.vic.gov.au/Property-Planning/2018-Aerial-Imagery-True-Ortho-/qa5h-sfgh",terms_text:"City of Melbourne",best:true,icon:"https://www.melbourne.vic.gov.au/_catalogs/masterpage/android-icon.png"},{id:"Zuerich-aerial_2011",name:"City of Zürich Orthophoto 2011",type:"wms",template:"https://www.gis.stadt-zuerich.ch/maps/services/wms/WMS-ZH-STZH-OGD/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Luftbild_2011&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[8.44624,47.44143],[8.63178,47.43968],[8.62895,47.31377],[8.44381,47.31555],[8.44624,47.44143]]],terms_text:"Stadt Zürich Open Government Data"},{id:"Zuerich-overview",name:"City of Zürich Overview map (Steets, buildings, house numbers)",type:"wms",template:"https://www.gis.stadt-zuerich.ch/maps/services/wms/WMS-ZH-STZH-OGD/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Uebersichtsplan&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,21],polygon:[[[8.45788,47.44582],[8.57392,47.44477],[8.57362,47.43124],[8.60266,47.43096],[8.6023,47.41746],[8.6318,47.41716],[8.6295,47.33628],[8.57162,47.33678],[8.57152,47.32292],[8.54236,47.3236],[8.54212,47.31013],[8.48418,47.31062],[8.48478,47.33762],[8.45582,47.33787],[8.45609,47.35135],[8.42713,47.35161],[8.42864,47.43259],[8.45745,47.43231],[8.45788,47.44582]]],terms_text:"Stadt Zürich Open Government Data"},{id:"Czech_CUZK-KM",name:"Czech CUZK:KM",type:"wms",template:"https://wms.cuzk.cz/wms.asp?service=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&LAYERS=parcelni_cisla_i,obrazy_parcel_i,RST_KMD_I,hranice_parcel_i,DEF_BUDOVY,RST_KN_I,dalsi_p_mapy_i,prehledka_kat_prac,prehledka_kat_uz,prehledka_kraju-linie&FORMAT=image/png&transparent=TRUE&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],overlay:true},{id:"Czech_CUZK-KM-tms",name:"Czech CUZK:KM tiles proxy",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_cuzk.php/{zoom}/{x}/{y}.png",zoomExtent:[13,18],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],overlay:true},{id:"Czech_pLPIS",name:"Czech pLPIS",type:"wms",template:"https://eagri.cz/public/app/wms/plpis.fcgi?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LPIS_FB4,LPIS_FB4_KOD&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true",projection:"EPSG:4326",polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]]},{id:"Czech_RUIAN-budovy",name:"Czech RUIAN budovy",type:"tms",template:"https://tile.poloha.net/budovy/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],terms_url:"https://poloha.net/",terms_text:"Czech RUIAN"},{id:"Czech_RUIAN-parcely",name:"Czech RUIAN parcely",type:"tms",template:"https://tile.poloha.net/parcely/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],terms_url:"https://poloha.net/",terms_text:"Czech RUIAN"},{id:"Czestochowa-buildings",name:"Częstochowa: Buildings",type:"wms",template:"http://geoportal.czestochowa.um.gov.pl/isdp/scripts/isdp.dll/wms?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ieg_budynek&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[19.08183,50.8554],[19.0888,50.86563],[19.11082,50.86616],[19.10961,50.86092],[19.11709,50.85933],[19.11531,50.86283],[19.11997,50.86327],[19.1227,50.85452],[19.12938,50.85519],[19.12566,50.86165],[19.13364,50.86147],[19.14318,50.86815],[19.1498,50.87916],[19.16507,50.8794],[19.16816,50.88501],[19.17265,50.88477],[19.18346,50.87706],[19.18084,50.86562],[19.18711,50.84712],[19.19973,50.84395],[19.19637,50.83678],[19.19358,50.83357],[19.19454,50.83145],[19.20696,50.82985],[19.20838,50.82484],[19.21831,50.82571],[19.22564,50.82475],[19.23075,50.82509],[19.2308,50.82666],[19.23351,50.82683],[19.23303,50.82335],[19.21868,50.80115],[19.21753,50.79272],[19.22592,50.78822],[19.20889,50.77561],[19.19891,50.76355],[19.19521,50.75182],[19.19074,50.75211],[19.18245,50.7545],[19.16504,50.7535],[19.16417,50.75586],[19.14559,50.75805],[19.14282,50.75543],[19.13021,50.75786],[19.127,50.75314],[19.1216,50.75363],[19.12066,50.74981],[19.10348,50.75228],[19.09598,50.75201],[19.0956,50.74912],[19.09351,50.7488],[19.09285,50.75027],[19.08442,50.74986],[19.08473,50.74349],[19.08382,50.73741],[19.07878,50.73668],[19.07503,50.73465],[19.07284,50.73708],[19.07153,50.74042],[19.0685,50.74339],[19.06632,50.74233],[19.06392,50.74554],[19.06595,50.7466],[19.06548,50.7496],[19.06202,50.75041],[19.06018,50.74455],[19.04257,50.74466],[19.0333,50.74827],[19.01869,50.76252],[19.01554,50.77044],[19.01101,50.7718],[19.01353,50.77766],[19.01159,50.78077],[19.01081,50.78759],[19.01362,50.79262],[19.01972,50.79555],[19.01896,50.80703],[19.03439,50.80116],[19.03453,50.804],[19.02593,50.80731],[19.02308,50.81499],[19.03154,50.81614],[19.02909,50.82435],[19.03787,50.82584],[19.03921,50.84083],[19.04676,50.84934],[19.05993,50.8532],[19.06209,50.8596],[19.06492,50.86134],[19.08183,50.8554]]],terms_text:"Urząd Miasta Częstochowy"},{id:"Duna_2013",name:"Danube flood orthophoto 2013",type:"tms",template:"http://e.tile.openstreetmap.hu/dunai-arviz-2013/{zoom}/{x}/{y}.jpg",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[10,20],polygon:[[[19.07732,47.69597],[19.07799,47.69598],[19.09462,47.69446],[19.08056,47.59587],[19.07434,47.58909],[19.07952,47.58883],[19.07717,47.57241],[19.05779,47.57209],[19.07732,47.69597]]],terms_url:"http://fototerkep.hu",terms_text:"Fotótérkép.hu",description:"Riverbank of Danube at Budapest, Szentendre and Szigetmonostor"},{id:"Delaware2012Orthophotography",name:"Delaware 2012 Orthophotography",type:"wms",template:"https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2012/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[-75.01771,38.45189],[-75.74174,38.44996],[-75.807,39.73907],[-75.75559,39.80106],[-75.64692,39.85638],[-75.47115,39.84646],[-75.37726,39.81478],[-75.48746,39.67181],[-75.50901,39.43446],[-75.39327,39.27784],[-75.30707,39.01667],[-75.19317,38.82219],[-75.05341,38.80876],[-75.01771,38.45189]]],terms_url:"https://firstmap.delaware.gov/arcgis/rest/services/DE_Imagery/DE_Imagery_2012/ImageServer",terms_text:"Digital Aerial Solutions, LLC",description:"This data set consists of 0.3-meter pixel resolution (approximately 1-foot), 4-band true color and near infrared (R, G, B, IR) orthoimages covering New Castle, Kent and Sussex Counties in Delaware."},{id:"Delaware2017Orthophotography",name:"Delaware 2017 Orthophotography",type:"wms",template:"https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2017/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",polygon:[[[-75.01771,38.45189],[-75.74174,38.44996],[-75.807,39.73907],[-75.75559,39.80106],[-75.64692,39.85638],[-75.47115,39.84646],[-75.37726,39.81478],[-75.48746,39.67181],[-75.50901,39.43446],[-75.39327,39.27784],[-75.30707,39.01667],[-75.19317,38.82219],[-75.05341,38.80876],[-75.01771,38.45189]]],terms_url:"https://firstmap.delaware.gov/arcgis/rest/services/DE_Imagery/DE_Imagery_2017/ImageServer",terms_text:"Digital Aerial Solutions, LLC",description:"This data set consists of 0.3-meter pixel resolution (approximately 1-foot), 4-band true color and near infrared (R, G, B, IR) orthoimages covering New Castle, Kent and Sussex Counties in Delaware."},{id:"delmiro_gouveia",name:"Delmiro Gouveia AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Delmiro%20Gouveia&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.94962,-9.42957],[-37.94834,-9.33972],[-38.03903,-9.33834],[-38.04034,-9.42846],[-37.94962,-9.42957]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"der-es",name:"DER-ES",type:"wms",template:"http://portal.der.es.gov.br/geoserver/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=deres-ext:TRECHOINFO&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-40.94577,-21.31404],[-40.6231,-20.86278],[-40.38882,-20.65177],[-40.22209,-20.29831],[-39.80383,-19.66412],[-39.69603,-19.42573],[-39.67304,-19.30437],[-39.70538,-18.61384],[-39.65292,-18.33096],[-40.22281,-17.97587],[-40.34282,-17.9198],[-40.45278,-17.91502],[-40.46499,-17.92049],[-40.48368,-17.90408],[-40.50164,-17.90681],[-40.51602,-17.88903],[-40.53326,-17.88903],[-40.54548,-17.90134],[-40.58932,-17.91502],[-40.58932,-17.93211],[-40.61519,-17.93416],[-40.62956,-17.9868],[-40.64609,-17.9868],[-40.65903,-18.00731],[-40.68777,-18.00594],[-40.70574,-18.01756],[-40.71365,-18.00184],[-40.72155,-17.99774],[-40.75102,-18.00252],[-40.76754,-17.99842],[-40.76754,-17.98133],[-40.80923,-17.94852],[-40.82432,-17.96014],[-40.83151,-17.94989],[-40.86528,-17.9827],[-40.88397,-17.96766],[-40.90912,-17.98475],[-40.77761,-18.10775],[-40.77832,-18.15146],[-40.79054,-18.15351],[-40.8351,-18.14531],[-40.89547,-18.10365],[-40.93283,-18.12755],[-40.95583,-18.1255],[-40.95296,-18.14463],[-40.96014,-18.15009],[-40.96374,-18.14326],[-40.97955,-18.13643],[-40.99248,-18.15009],[-40.99105,-18.16307],[-41.00901,-18.16307],[-41.05788,-18.1658],[-41.05788,-18.17536],[-41.09597,-18.19243],[-41.09597,-18.2054],[-41.1089,-18.21291],[-41.09812,-18.22997],[-41.10531,-18.2327],[-41.09884,-18.25591],[-41.12903,-18.27502],[-41.16137,-18.30572],[-41.15059,-18.37394],[-41.16424,-18.37939],[-41.16424,-18.4019],[-41.15059,-18.40735],[-41.15849,-18.41144],[-41.17358,-18.41144],[-41.18868,-18.44485],[-41.02123,-18.46667],[-41.04638,-18.60362],[-41.03776,-18.61452],[-41.05788,-18.62678],[-41.0471,-18.64857],[-41.03488,-18.65402],[-40.99895,-18.67716],[-40.94505,-18.69418],[-40.94433,-18.76973],[-40.92134,-18.81055],[-40.93715,-18.82347],[-40.94721,-18.82143],[-40.97092,-18.83572],[-41.08375,-18.83232],[-41.10675,-18.83572],[-41.11753,-18.80783],[-41.13118,-18.79286],[-41.23611,-18.7949],[-41.2512,-18.81667],[-41.2476,-18.85544],[-41.2203,-18.87992],[-41.20808,-18.87992],[-41.20664,-18.86632],[-41.16424,-18.867],[-41.15634,-18.88876],[-41.12903,-18.9044],[-41.12112,-18.92412],[-41.0392,-18.98665],[-41.07585,-19.00567],[-41.06507,-19.06342],[-40.96877,-19.12726],[-40.96158,-19.15102],[-40.92996,-19.206],[-40.94649,-19.22296],[-40.94793,-19.24264],[-40.92565,-19.26299],[-40.94936,-19.2786],[-40.92277,-19.31048],[-40.94361,-19.35252],[-40.93427,-19.381],[-40.95727,-19.39184],[-40.9738,-19.42641],[-40.95439,-19.46165],[-40.97883,-19.50298],[-41.01332,-19.50298],[-41.04638,-19.48333],[-41.05429,-19.48401],[-41.04135,-19.56664],[-41.09238,-19.58966],[-41.14627,-19.656],[-41.16496,-19.65871],[-41.17933,-19.6939],[-41.19658,-19.74599],[-41.16999,-19.80618],[-41.18939,-19.82375],[-41.18868,-19.88526],[-41.21239,-19.89743],[-41.22964,-19.90216],[-41.24689,-19.93324],[-41.25479,-19.92919],[-41.26988,-19.93797],[-41.30653,-19.93392],[-41.31516,-19.96972],[-41.3245,-19.97647],[-41.313,-20.01226],[-41.33672,-20.05548],[-41.34822,-20.08653],[-41.3554,-20.12094],[-41.37768,-20.15805],[-41.38702,-20.18638],[-41.41074,-20.19448],[-41.4208,-20.20257],[-41.7636,-20.2046],[-41.78516,-20.28483],[-41.85055,-20.3246],[-41.86349,-20.37513],[-41.85127,-20.38187],[-41.84337,-20.40949],[-41.80887,-20.42498],[-41.80672,-20.47211],[-41.83115,-20.47885],[-41.81103,-20.54212],[-41.83115,-20.55086],[-41.86205,-20.61814],[-41.82109,-20.64437],[-41.85343,-20.68068],[-41.87139,-20.72102],[-41.8678,-20.73849],[-41.88002,-20.73984],[-41.88289,-20.76739],[-41.85415,-20.77478],[-41.83331,-20.7983],[-41.80887,-20.80905],[-41.78444,-20.80569],[-41.75138,-20.82382],[-41.74707,-20.87487],[-41.72335,-20.87554],[-41.74132,-20.92723],[-41.72335,-20.97757],[-41.74347,-21.09763],[-41.7291,-21.12579],[-41.594,-21.16332],[-41.57244,-21.18678],[-41.49051,-21.18879],[-41.48332,-21.20085],[-41.43948,-21.22095],[-41.41289,-21.20956],[-41.34965,-21.21291],[-41.27994,-21.2464],[-41.24473,-21.23234],[-41.17718,-21.25511],[-41.09238,-21.2243],[-41.04854,-21.25913],[-41.01548,-21.25578],[-41.00254,-21.28726],[-40.94577,-21.31404]]],terms_url:"https://der.es.gov.br",terms_text:"Departamento de Estradas de Rodagem do Estado do Espírito Santo",overlay:true},{id:"db-inspire-2013-11",name:"Deutsche Bahn VzG lines January 2017",type:"wms",template:"https://wms.michreichert.de/vzg-strecken-2017?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=vzg_strecken,station_codes,level_crossings&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-11-01T00:00:00.000Z",startDate:"2013-11-01T00:00:00.000Z",polygon:[[[8.19422,48.97504],[7.97355,49.02623],[7.94677,49.06313],[7.44328,49.18928],[7.05679,49.11163],[6.94302,49.21345],[6.81633,49.16389],[6.68209,49.24061],[6.3501,49.46202],[6.35353,49.57302],[6.42632,49.67177],[6.50254,49.71885],[6.45241,50.61258],[6.03871,50.71215],[6.00369,50.753],[6.05742,50.8559],[6.0787,50.90247],[6.0727,51.06792],[6.17123,51.33853],[6.22548,51.36554],[6.15715,51.5509],[6.12763,51.91069],[6.79985,51.86661],[7.02851,52.31255],[6.72947,52.64179],[7.07486,52.75269],[7.20532,53.18442],[7.04464,53.33106],[6.5173,53.65785],[8.23529,54.99001],[11.92257,54.52963],[14.1679,54.59631],[14.46591,53.24712],[14.14318,52.83946],[14.64375,52.58613],[14.57646,52.32756],[14.74537,52.06577],[14.66847,51.7353],[14.7234,51.53927],[15.03926,51.28745],[14.98845,51.09207],[14.88922,50.93856],[14.81593,50.87729],[14.63671,50.89116],[14.59311,50.91887],[14.57217,51.01076],[14.26283,51.06473],[14.28086,50.98024],[14.22816,50.85796],[13.69532,50.72883],[13.03442,50.50085],[12.49077,50.34582],[12.32632,50.29277],[12.35379,50.21462],[12.32701,50.16363],[12.1677,50.34889],[12.07707,50.2524],[12.18195,50.21136],[12.26014,50.09069],[12.53892,49.4164],[12.88808,49.3385],[13.21287,49.12439],[13.73952,48.83688],[13.45371,48.56222],[13.40555,48.37812],[13.03648,48.25986],[12.71376,48.10856],[12.93108,47.9376],[13.00455,47.84506],[12.90671,47.73249],[13.05228,47.59329],[12.15792,47.7087],[12.20393,47.61667],[12.17783,47.59815],[11.61753,47.60093],[11.26666,47.39124],[10.9247,47.46811],[10.91578,47.55623],[10.59031,47.5567],[10.29848,47.39937],[9.78144,47.61274],[9.74024,47.52842],[9.00278,47.69137],[8.68933,47.72371],[8.63809,47.70261],[8.63079,47.69359],[8.62127,47.69177],[8.62414,47.68221],[8.61243,47.68115],[8.35382,47.61367],[8.27485,47.619],[8.23709,47.61023],[8.22808,47.60583],[8.20284,47.61555],[8.10834,47.58251],[8.08568,47.5583],[8.06714,47.56444],[8.04981,47.55645],[8.02749,47.55112],[7.98097,47.55494],[7.91917,47.54787],[7.88862,47.58888],[7.81257,47.57122],[7.79455,47.55558],[7.71404,47.54063],[7.66043,47.54485],[7.65219,47.54702],[7.63439,47.56173],[7.61499,47.55669],[7.5834,47.57048],[7.58559,47.5845],[7.59366,47.60048],[7.58761,47.608],[7.51491,47.6652],[7.5434,47.81539],[7.57671,48.02454],[7.56812,48.06012],[7.80639,48.52438],[7.79987,48.58029],[7.80665,48.60106],[8.11014,48.84977],[8.19422,48.97504]]],terms_url:"https://data.deutschebahn.com/dataset/data-streckennetz",terms_text:"Data CC-BY 4.0 Deutsche Bahn AG",overlay:true},{id:"db-inspire-2015-11",name:"Deutsche Bahn VzG lines Nov 2015",type:"wms",template:"https://wms.michreichert.de/vzg-strecken-2015?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=vzg_strecken,station_codes,level_crossings&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-11-01T00:00:00.000Z",startDate:"2015-11-01T00:00:00.000Z",polygon:[[[8.19422,48.97504],[7.97355,49.02623],[7.94677,49.06313],[7.44328,49.18928],[7.05679,49.11163],[6.94302,49.21345],[6.81633,49.16389],[6.68209,49.24061],[6.3501,49.46202],[6.35353,49.57302],[6.42632,49.67177],[6.50254,49.71885],[6.45241,50.61258],[6.03871,50.71215],[6.00369,50.753],[6.05742,50.8559],[6.0787,50.90247],[6.0727,51.06792],[6.17123,51.33853],[6.22548,51.36554],[6.15715,51.5509],[6.12763,51.91069],[6.79985,51.86661],[7.02851,52.31255],[6.72947,52.64179],[7.07486,52.75269],[7.20532,53.18442],[7.04464,53.33106],[6.5173,53.65785],[8.23529,54.99001],[11.92257,54.52963],[14.1679,54.59631],[14.46591,53.24712],[14.14318,52.83946],[14.64375,52.58613],[14.57646,52.32756],[14.74537,52.06577],[14.66847,51.7353],[14.7234,51.53927],[15.03926,51.28745],[14.98845,51.09207],[14.88922,50.93856],[14.81593,50.87729],[14.63671,50.89116],[14.59311,50.91887],[14.57217,51.01076],[14.26283,51.06473],[14.28086,50.98024],[14.22816,50.85796],[13.69532,50.72883],[13.03442,50.50085],[12.49077,50.34582],[12.32632,50.29277],[12.35379,50.21462],[12.32701,50.16363],[12.1677,50.34889],[12.07707,50.2524],[12.18195,50.21136],[12.26014,50.09069],[12.53892,49.4164],[12.88808,49.3385],[13.21287,49.12439],[13.73952,48.83688],[13.45371,48.56222],[13.40555,48.37812],[13.03648,48.25986],[12.71376,48.10856],[12.93108,47.9376],[13.00455,47.84506],[12.90671,47.73249],[13.05228,47.59329],[12.15792,47.7087],[12.20393,47.61667],[12.17783,47.59815],[11.61753,47.60093],[11.26666,47.39124],[10.9247,47.46811],[10.91578,47.55623],[10.59031,47.5567],[10.29848,47.39937],[9.78144,47.61274],[9.74024,47.52842],[9.00278,47.69137],[8.68933,47.72371],[8.63809,47.70261],[8.63079,47.69359],[8.62127,47.69177],[8.62414,47.68221],[8.61243,47.68115],[8.35382,47.61367],[8.27485,47.619],[8.23709,47.61023],[8.22808,47.60583],[8.20284,47.61555],[8.10834,47.58251],[8.08568,47.5583],[8.06714,47.56444],[8.04981,47.55645],[8.02749,47.55112],[7.98097,47.55494],[7.91917,47.54787],[7.88862,47.58888],[7.81257,47.57122],[7.79455,47.55558],[7.71404,47.54063],[7.66043,47.54485],[7.65219,47.54702],[7.63439,47.56173],[7.61499,47.55669],[7.5834,47.57048],[7.58559,47.5845],[7.59366,47.60048],[7.58761,47.608],[7.51491,47.6652],[7.5434,47.81539],[7.57671,48.02454],[7.56812,48.06012],[7.80639,48.52438],[7.79987,48.58029],[7.80665,48.60106],[8.11014,48.84977],[8.19422,48.97504]]],terms_url:"https://data.deutschebahn.com/dataset/data-streckennetz",terms_text:"Data CC-BY 4.0 Deutsche Bahn AG",overlay:true},{id:"DigitalGlobe-Premium",name:"DigitalGlobe Premium Imagery",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.316c9a2e/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqZGFrZ2c2dzFlMWgyd2x0ZHdmMDB6NzYifQ.9Pl3XOO82ArX94fHV289Pg",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback","default":true,description:"DigitalGlobe-Premium is a mosaic composed of DigitalGlobe basemap with select regions filled with +Vivid or custom area of interest imagery, 50cm resolution or better, and refreshed more frequently with ongoing updates.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png"},{id:"DigitalGlobe-Premium-vintage",name:"DigitalGlobe Premium Imagery Vintage",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.2850d66c/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBkcmZjNzJ5ZnozNHF6NnVkOGd6ODYifQ.grAnqgpCjOaeq-ozqt4QNw",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback",description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png",overlay:true},{id:"DigitalGlobe-Standard",name:"DigitalGlobe Standard Imagery",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.0a8e44ba/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqZGFrZ3pjczNpaHYycXFyMGo0djY3N2IifQ.90uebT4-ow1uqZKTUrf6RQ",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback","default":true,description:"DigitalGlobe-Standard is a curated set of imagery covering 86% of the earth’s landmass, with 30-60cm resolution where available, backfilled by Landsat. Average age is 2.31 years, with some areas updated 2x per year.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png"},{id:"DigitalGlobe-Standard-vintage",name:"DigitalGlobe Standard Imagery Vintage",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.1412531a/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBlYWJ1ZDAza2YyeG14NWVodTA4OWUifQ.wVc8ZOuPuYVw39lhS2j3_g",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback",description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png",overlay:true},{id:"drone-imagery-2014",name:"Drone Imagery 2014 (Haiti)",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/haiti_2014/{zoom}/{x}/{y}",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[-72.3286,18.69461],[-72.33034,18.69412],[-72.33117,18.69284],[-72.33413,18.68542],[-72.33452,18.68414],[-72.33443,18.68355],[-72.33375,18.68235],[-72.32147,18.67721],[-72.32027,18.67698],[-72.31909,18.67713],[-72.3183,18.67804],[-72.31508,18.68457],[-72.31394,18.689],[-72.31553,18.68993],[-72.3286,18.69461]],[[-72.34695,18.61833],[-72.34553,18.62166],[-72.34355,18.62447],[-72.34245,18.62553],[-72.34076,18.62658],[-72.33786,18.62639],[-72.33649,18.62597],[-72.33589,18.62504],[-72.33482,18.62559],[-72.33472,18.6255],[-72.33459,18.62513],[-72.33343,18.62438],[-72.33174,18.62469],[-72.3313,18.62457],[-72.33126,18.62321],[-72.33088,18.62276],[-72.33066,18.62277],[-72.32985,18.62345],[-72.32862,18.62186],[-72.32829,18.6218],[-72.32817,18.62193],[-72.32809,18.6218],[-72.32734,18.62261],[-72.32541,18.62101],[-72.32422,18.62122],[-72.32396,18.61869],[-72.32354,18.61815],[-72.32325,18.61818],[-72.32351,18.61877],[-72.32058,18.62031],[-72.32043,18.61993],[-72.31978,18.62066],[-72.31807,18.61907],[-72.31742,18.61958],[-72.31523,18.61782],[-72.31463,18.61844],[-72.31324,18.6165],[-72.31275,18.61677],[-72.31232,18.6172],[-72.31198,18.61704],[-72.31042,18.61764],[-72.31062,18.61564],[-72.30996,18.61526],[-72.30936,18.61623],[-72.30786,18.61542],[-72.30669,18.61623],[-72.30604,18.61704],[-72.30419,18.61545],[-72.30288,18.61688],[-72.30191,18.61637],[-72.30131,18.61552],[-72.30118,18.6158],[-72.30087,18.61546],[-72.30076,18.61567],[-72.30062,18.6156],[-72.30012,18.61609],[-72.29198,18.61365],[-72.29194,18.61347],[-72.29143,18.61342],[-72.29094,18.61323],[-72.29105,18.61199],[-72.29057,18.61152],[-72.28772,18.61145],[-72.28801,18.6096],[-72.2865,18.60968],[-72.28635,18.60799],[-72.28448,18.60844],[-72.28436,18.60789],[-72.283,18.60808],[-72.283,18.60658],[-72.2828,18.60676],[-72.2816,18.60537],[-72.28106,18.60533],[-72.27973,18.60682],[-72.27805,18.60525],[-72.27793,18.6053],[-72.2778,18.60524],[-72.2772,18.60638],[-72.27589,18.60564],[-72.27544,18.60629],[-72.27385,18.60508],[-72.27341,18.60508],[-72.27241,18.60593],[-72.27099,18.60442],[-72.27047,18.60429],[-72.27038,18.60446],[-72.27024,18.60427],[-72.27011,18.60433],[-72.26862,18.60368],[-72.26778,18.6037],[-72.26751,18.60429],[-72.2655,18.60318],[-72.26539,18.60336],[-72.26515,18.60309],[-72.26471,18.603],[-72.26436,18.60331],[-72.26312,18.60193],[-72.26258,18.60188],[-72.262,18.60251],[-72.26139,18.60184],[-72.26106,18.60182],[-72.26106,18.60148],[-72.26014,18.6005],[-72.25994,18.60049],[-72.25803,18.60079],[-72.2576,18.60054],[-72.25691,18.60094],[-72.25413,18.59992],[-72.25093,18.59739],[-72.25062,18.59676],[-72.25033,18.59701],[-72.24451,18.59231],[-72.24215,18.58872],[-72.24167,18.58756],[-72.24077,18.58654],[-72.24147,18.58592],[-72.2413,18.58543],[-72.2395,18.58424],[-72.24007,18.58358],[-72.2382,18.58197],[-72.23868,18.58157],[-72.2385,18.58119],[-72.23703,18.58054],[-72.23612,18.57894],[-72.23646,18.57825],[-72.23636,18.5777],[-72.23467,18.57684],[-72.2353,18.57562],[-72.235,18.57499],[-72.23335,18.57423],[-72.23399,18.57293],[-72.23182,18.57169],[-72.23188,18.57137],[-72.23175,18.57127],[-72.23198,18.5708],[-72.23072,18.5694],[-72.23097,18.56874],[-72.23082,18.56844],[-72.23046,18.56855],[-72.23009,18.56754],[-72.22942,18.56715],[-72.22972,18.56651],[-72.22961,18.566],[-72.22908,18.56612],[-72.22848,18.56396],[-72.22818,18.56395],[-72.22733,18.56421],[-72.2265,18.56179],[-72.22623,18.56191],[-72.22436,18.55908],[-72.22471,18.55882],[-72.22357,18.55689],[-72.22379,18.55675],[-72.22325,18.55579],[-72.22387,18.55544],[-72.22382,18.55528],[-72.22458,18.55483],[-72.22453,18.55439],[-72.22625,18.55408],[-72.22705,18.55349],[-72.22692,18.55333],[-72.2271,18.55324],[-72.22687,18.55273],[-72.22592,18.55308],[-72.22465,18.55027],[-72.22483,18.5501],[-72.22457,18.54956],[-72.22327,18.55014],[-72.22261,18.54869],[-72.2208,18.54918],[-72.22051,18.54852],[-72.22034,18.54865],[-72.2201,18.54845],[-72.21952,18.54876],[-72.21862,18.54755],[-72.2174,18.5478],[-72.21714,18.54733],[-72.21694,18.54734],[-72.21583,18.54517],[-72.21505,18.54533],[-72.21477,18.54494],[-72.21442,18.54218],[-72.21421,18.54233],[-72.21293,18.5401],[-72.21199,18.5404],[-72.21188,18.54025],[-72.21145,18.53781],[-72.21085,18.53797],[-72.21028,18.53545],[-72.20993,18.53465],[-72.20942,18.53478],[-72.20942,18.53456],[-72.20851,18.53472],[-72.2057,18.53039],[-72.20444,18.52693],[-72.20438,18.52643],[-72.20418,18.52637],[-72.20399,18.52572],[-72.20263,18.5222],[-72.20182,18.5197],[-72.20148,18.51742],[-72.20301,18.51606],[-72.20503,18.51506],[-72.20767,18.51432],[-72.20936,18.5142],[-72.2095,18.51448],[-72.21082,18.51416],[-72.21095,18.51444],[-72.21189,18.51412],[-72.21266,18.51403],[-72.21277,18.51417],[-72.21462,18.51393],[-72.21697,18.51569],[-72.21731,18.51648],[-72.21787,18.51642],[-72.21818,18.51975],[-72.21798,18.51984],[-72.21909,18.52189],[-72.22031,18.52152],[-72.22096,18.52382],[-72.22209,18.52355],[-72.22251,18.52685],[-72.22229,18.52693],[-72.22271,18.52726],[-72.22289,18.52707],[-72.2231,18.52722],[-72.22404,18.52681],[-72.22551,18.52936],[-72.22596,18.5297],[-72.22642,18.52964],[-72.2265,18.53018],[-72.2275,18.53118],[-72.22673,18.53171],[-72.22885,18.53383],[-72.22811,18.53435],[-72.22981,18.53623],[-72.22912,18.5367],[-72.22935,18.53731],[-72.23059,18.53875],[-72.23222,18.54189],[-72.23215,18.5421],[-72.23258,18.54324],[-72.23311,18.54304],[-72.2342,18.54558],[-72.23436,18.5455],[-72.23554,18.54776],[-72.23571,18.54779],[-72.23601,18.54899],[-72.23839,18.55165],[-72.23747,18.55231],[-72.23951,18.55397],[-72.23918,18.55413],[-72.2407,18.55661],[-72.24014,18.5568],[-72.24079,18.55824],[-72.24063,18.55835],[-72.24067,18.55845],[-72.24117,18.55815],[-72.24161,18.55898],[-72.24216,18.55882],[-72.24242,18.56062],[-72.24262,18.56101],[-72.24294,18.56089],[-72.24399,18.56371],[-72.24466,18.56356],[-72.24475,18.56413],[-72.24536,18.56445],[-72.2449,18.56525],[-72.24518,18.56549],[-72.245,18.56581],[-72.24499,18.56607],[-72.24543,18.56633],[-72.24559,18.56618],[-72.24588,18.56662],[-72.24687,18.56727],[-72.24662,18.56749],[-72.24781,18.56897],[-72.24728,18.56938],[-72.24859,18.57137],[-72.24894,18.57159],[-72.24865,18.57222],[-72.2488,18.57219],[-72.24885,18.5723],[-72.24945,18.57197],[-72.25068,18.57411],[-72.25147,18.5737],[-72.25251,18.57598],[-72.25339,18.57551],[-72.25491,18.57848],[-72.25462,18.57863],[-72.25467,18.57878],[-72.25505,18.57894],[-72.25495,18.57913],[-72.256,18.58074],[-72.2563,18.58054],[-72.25752,18.58237],[-72.25769,18.58227],[-72.2578,18.5824],[-72.25808,18.5823],[-72.25857,18.5821],[-72.25862,18.58222],[-72.25889,18.58219],[-72.25894,18.58302],[-72.25958,18.58445],[-72.25984,18.58472],[-72.26072,18.58443],[-72.26094,18.58565],[-72.2622,18.58722],[-72.26351,18.58643],[-72.2643,18.58738],[-72.26474,18.58708],[-72.26594,18.58862],[-72.26756,18.58877],[-72.26742,18.58917],[-72.27039,18.58893],[-72.27021,18.5903],[-72.2722,18.59048],[-72.27211,18.59145],[-72.27381,18.59188],[-72.27384,18.59168],[-72.27729,18.59169],[-72.28014,18.59129],[-72.28059,18.59048],[-72.28106,18.59071],[-72.28226,18.58989],[-72.28286,18.59047],[-72.28367,18.58966],[-72.28401,18.59014],[-72.28468,18.59029],[-72.2851,18.58997],[-72.2857,18.59062],[-72.28661,18.59068],[-72.28681,18.59014],[-72.28728,18.59032],[-72.28741,18.59013],[-72.28801,18.59052],[-72.28991,18.59071],[-72.29077,18.58997],[-72.29196,18.59186],[-72.2945,18.59148],[-72.29454,18.59361],[-72.29654,18.59322],[-72.29689,18.59586],[-72.2976,18.59675],[-72.29824,18.59722],[-72.29871,18.5962],[-72.30053,18.59733],[-72.30081,18.59675],[-72.30113,18.59691],[-72.30131,18.59676],[-72.30175,18.59721],[-72.30303,18.59774],[-72.3033,18.59729],[-72.30394,18.59761],[-72.30394,18.59736],[-72.30555,18.59794],[-72.30598,18.59756],[-72.30703,18.59838],[-72.30723,18.59799],[-72.30862,18.59833],[-72.30938,18.59752],[-72.31013,18.5981],[-72.31037,18.59739],[-72.3121,18.5983],[-72.3122,18.59807],[-72.31424,18.59902],[-72.31456,18.59873],[-72.31524,18.59922],[-72.31681,18.59952],[-72.31662,18.60004],[-72.31958,18.60072],[-72.31907,18.60202],[-72.32042,18.60247],[-72.32061,18.60242],[-72.32082,18.60267],[-72.3211,18.6027],[-72.32105,18.60298],[-72.32144,18.60347],[-72.32368,18.60322],[-72.32375,18.60432],[-72.32584,18.60436],[-72.32588,18.60522],[-72.32617,18.60585],[-72.32864,18.60525],[-72.32897,18.60527],[-72.32916,18.60727],[-72.33006,18.60812],[-72.3294,18.60867],[-72.33004,18.60959],[-72.33282,18.60949],[-72.33258,18.61058],[-72.33302,18.61005],[-72.3335,18.61054],[-72.33477,18.61035],[-72.33485,18.61167],[-72.33735,18.61174],[-72.33725,18.61237],[-72.33767,18.61298],[-72.34038,18.61306],[-72.34016,18.6138],[-72.34153,18.61384],[-72.34258,18.61457],[-72.3426,18.61512],[-72.34306,18.61499],[-72.34682,18.61792],[-72.34695,18.61833]],[[-72.72363,19.09461],[-72.72302,19.09518],[-72.72206,19.0965],[-72.72169,19.09612],[-72.72164,19.0962],[-72.72132,19.09609],[-72.72073,19.0967],[-72.7198,19.09587],[-72.71965,19.09591],[-72.7197,19.09601],[-72.71955,19.09602],[-72.71911,19.09623],[-72.71906,19.09627],[-72.71904,19.09625],[-72.71888,19.09631],[-72.71886,19.09626],[-72.71817,19.09643],[-72.71776,19.09679],[-72.71756,19.09657],[-72.71693,19.09705],[-72.71713,19.09735],[-72.71495,19.0988],[-72.71479,19.09852],[-72.71483,19.09849],[-72.7148,19.0984],[-72.71455,19.09859],[-72.71449,19.09851],[-72.71413,19.09877],[-72.71413,19.09893],[-72.71419,19.09891],[-72.71417,19.09978],[-72.71324,19.09971],[-72.71287,19.09974],[-72.71295,19.09967],[-72.71278,19.09968],[-72.71278,19.09977],[-72.71282,19.09976],[-72.71285,19.09988],[-72.71266,19.09989],[-72.71266,19.09987],[-72.71245,19.09987],[-72.71182,19.09991],[-72.71178,19.10012],[-72.71157,19.10009],[-72.71147,19.10102],[-72.71042,19.10086],[-72.71039,19.10119],[-72.7103,19.1012],[-72.71031,19.10151],[-72.7097,19.10156],[-72.7097,19.10162],[-72.70917,19.10169],[-72.70917,19.1021],[-72.70828,19.10211],[-72.70809,19.10289],[-72.70788,19.10284],[-72.70798,19.10367],[-72.70724,19.1038],[-72.70731,19.10501],[-72.70723,19.10501],[-72.70736,19.10565],[-72.70637,19.10584],[-72.7062,19.10714],[-72.70588,19.10706],[-72.70591,19.10747],[-72.7053,19.10757],[-72.7054,19.10813],[-72.70568,19.10809],[-72.70568,19.10928],[-72.70591,19.11013],[-72.70589,19.11022],[-72.70574,19.11025],[-72.70574,19.11116],[-72.70538,19.11114],[-72.70557,19.11247],[-72.70499,19.11256],[-72.70537,19.11361],[-72.7047,19.11388],[-72.70496,19.11563],[-72.70418,19.11564],[-72.70442,19.11762],[-72.70371,19.11764],[-72.70371,19.1178],[-72.70352,19.11779],[-72.70339,19.12227],[-72.70264,19.12205],[-72.70253,19.12301],[-72.70289,19.12592],[-72.70308,19.12595],[-72.70316,19.12864],[-72.70234,19.12997],[-72.70206,19.1301],[-72.69987,19.1305],[-72.69325,19.13064],[-72.687,19.13075],[-72.68456,19.13073],[-72.68338,19.13056],[-72.6828,19.1297],[-72.68203,19.1283],[-72.68201,19.12715],[-72.68158,19.12714],[-72.68187,19.12508],[-72.68185,19.12507],[-72.68215,19.12414],[-72.68253,19.12295],[-72.68265,19.12243],[-72.68263,19.12185],[-72.68302,19.12185],[-72.68301,19.12132],[-72.68286,19.12133],[-72.68293,19.11947],[-72.68251,19.11946],[-72.68256,19.11803],[-72.68265,19.11751],[-72.68265,19.11703],[-72.68318,19.11704],[-72.68319,19.11685],[-72.68371,19.11687],[-72.68384,19.11684],[-72.684,19.11685],[-72.68398,19.11689],[-72.68426,19.11688],[-72.68426,19.11679],[-72.68481,19.11674],[-72.68546,19.11667],[-72.68557,19.11664],[-72.68551,19.11664],[-72.6856,19.11662],[-72.68595,19.11658],[-72.68596,19.11654],[-72.68608,19.11654],[-72.68661,19.11663],[-72.68662,19.11656],[-72.68713,19.11665],[-72.68721,19.11666],[-72.68721,19.11663],[-72.6878,19.11666],[-72.68779,19.11659],[-72.68833,19.11663],[-72.68832,19.11658],[-72.68928,19.11657],[-72.6897,19.11656],[-72.68998,19.11644],[-72.6902,19.11644],[-72.69019,19.11615],[-72.69027,19.11563],[-72.69029,19.11541],[-72.69017,19.11543],[-72.69018,19.11493],[-72.69018,19.11458],[-72.69019,19.11445],[-72.69022,19.11433],[-72.6902,19.11406],[-72.68972,19.11398],[-72.68968,19.11397],[-72.68973,19.11415],[-72.68974,19.1142],[-72.68937,19.11417],[-72.68872,19.11412],[-72.688,19.11412],[-72.68758,19.11409],[-72.68759,19.11401],[-72.68736,19.11403],[-72.68711,19.11406],[-72.68682,19.11406],[-72.68677,19.11405],[-72.68591,19.11422],[-72.68554,19.11421],[-72.68557,19.11369],[-72.68554,19.11308],[-72.68533,19.11314],[-72.6852,19.11316],[-72.68519,19.1132],[-72.68504,19.11325],[-72.68495,19.1127],[-72.68474,19.11278],[-72.68468,19.11277],[-72.68446,19.11281],[-72.68416,19.1128],[-72.6836,19.11254],[-72.68353,19.11102],[-72.68363,19.11007],[-72.68338,19.11003],[-72.68344,19.10974],[-72.68295,19.1096],[-72.68305,19.10892],[-72.68111,19.10826],[-72.68112,19.1081],[-72.67965,19.10781],[-72.67968,19.10765],[-72.67923,19.10749],[-72.67916,19.10802],[-72.67838,19.10755],[-72.67779,19.10753],[-72.67775,19.10769],[-72.67623,19.10765],[-72.67606,19.10762],[-72.67621,19.10797],[-72.67549,19.10804],[-72.67548,19.1079],[-72.67431,19.10804],[-72.67432,19.10795],[-72.67398,19.10794],[-72.67382,19.10798],[-72.6739,19.10864],[-72.67319,19.10856],[-72.67307,19.10852],[-72.67284,19.10855],[-72.67276,19.10855],[-72.67286,19.10907],[-72.67284,19.10915],[-72.67251,19.10903],[-72.67236,19.10906],[-72.6723,19.10905],[-72.67224,19.10913],[-72.67179,19.10912],[-72.67051,19.10679],[-72.6704,19.10401],[-72.67048,19.10396],[-72.67032,19.10223],[-72.67034,19.1016],[-72.67062,19.09856],[-72.67121,19.09697],[-72.67278,19.09595],[-72.67277,19.09629],[-72.67364,19.09636],[-72.6736,19.09662],[-72.67484,19.09623],[-72.67489,19.09666],[-72.67566,19.09655],[-72.67566,19.09648],[-72.67655,19.09642],[-72.67772,19.09626],[-72.67786,19.09675],[-72.67784,19.09689],[-72.67826,19.09677],[-72.67837,19.09698],[-72.67858,19.09698],[-72.67853,19.09665],[-72.67878,19.09666],[-72.67861,19.09635],[-72.67927,19.09633],[-72.67973,19.0962],[-72.68015,19.09604],[-72.68058,19.09598],[-72.68029,19.09501],[-72.68072,19.095],[-72.68066,19.09474],[-72.68048,19.09418],[-72.68037,19.09335],[-72.68064,19.09335],[-72.68064,19.09266],[-72.67973,19.09263],[-72.67972,19.09269],[-72.67943,19.09266],[-72.67966,19.09132],[-72.67977,19.09107],[-72.68249,19.0892],[-72.68272,19.08907],[-72.68506,19.0888],[-72.68508,19.08888],[-72.68616,19.08873],[-72.6862,19.08887],[-72.68718,19.08866],[-72.68717,19.0886],[-72.68849,19.08844],[-72.68852,19.08847],[-72.69006,19.0884],[-72.69018,19.08871],[-72.69227,19.08828],[-72.69229,19.08887],[-72.69218,19.08924],[-72.69222,19.08928],[-72.69277,19.08923],[-72.69279,19.08933],[-72.69335,19.08934],[-72.69289,19.0888],[-72.69274,19.0883],[-72.69496,19.08857],[-72.69571,19.08831],[-72.69579,19.08892],[-72.69625,19.08904],[-72.69649,19.08889],[-72.69849,19.08845],[-72.69849,19.08866],[-72.6988,19.08858],[-72.69885,19.08895],[-72.69884,19.08903],[-72.69926,19.08895],[-72.70023,19.08884],[-72.70023,19.08893],[-72.70088,19.08892],[-72.7014,19.08887],[-72.70128,19.08828],[-72.70257,19.08859],[-72.70282,19.08874],[-72.70309,19.08883],[-72.70293,19.08855],[-72.70341,19.08862],[-72.70557,19.08863],[-72.70552,19.08906],[-72.70665,19.08889],[-72.70666,19.08938],[-72.70902,19.08917],[-72.70898,19.0891],[-72.71116,19.08894],[-72.71121,19.0892],[-72.71281,19.08912],[-72.71286,19.0898],[-72.71502,19.08882],[-72.71569,19.08838],[-72.71573,19.08847],[-72.7161,19.08824],[-72.71598,19.08795],[-72.71653,19.0877],[-72.71653,19.08761],[-72.71579,19.08781],[-72.71676,19.08727],[-72.71671,19.08717],[-72.71815,19.08638],[-72.71795,19.08602],[-72.71954,19.08518],[-72.71954,19.08511],[-72.72217,19.08467],[-72.72327,19.08506],[-72.72622,19.08712],[-72.72763,19.0891],[-72.72752,19.08973],[-72.72548,19.09295],[-72.72482,19.09403],[-72.72399,19.09495],[-72.72363,19.09461]],[[-72.06537,19.65239],[-72.06565,19.6518],[-72.06603,19.65128],[-72.06697,19.65109],[-72.0676,19.6511],[-72.07102,19.65223],[-72.0719,19.65254],[-72.07189,19.65255],[-72.07264,19.6528],[-72.07262,19.65284],[-72.07268,19.65286],[-72.07269,19.65283],[-72.0733,19.65305],[-72.07393,19.65327],[-72.07416,19.65347],[-72.07418,19.65351],[-72.07435,19.65395],[-72.07432,19.65425],[-72.07419,19.65495],[-72.07399,19.65583],[-72.07384,19.65648],[-72.07307,19.65805],[-72.07274,19.65866],[-72.0727,19.65869],[-72.07228,19.65915],[-72.07221,19.65917],[-72.07196,19.65916],[-72.0714,19.65909],[-72.07012,19.65866],[-72.07017,19.65856],[-72.06983,19.65852],[-72.06984,19.65848],[-72.06939,19.65841],[-72.06944,19.65823],[-72.06941,19.65823],[-72.06937,19.65836],[-72.06842,19.65807],[-72.06707,19.65759],[-72.06451,19.65663],[-72.06434,19.65632],[-72.06421,19.65547],[-72.06422,19.65541],[-72.06472,19.65379],[-72.06487,19.65351],[-72.06537,19.65239]],[[-72.23222,18.69173],[-72.23182,18.69172],[-72.23115,18.69168],[-72.23128,18.69161],[-72.23072,18.69152],[-72.23068,18.69147],[-72.23135,18.69159],[-72.23157,18.69149],[-72.23162,18.69137],[-72.23165,18.69134],[-72.23165,18.69164],[-72.23222,18.69173]],[[-72.2406,18.69192],[-72.23953,18.6921],[-72.23891,18.69207],[-72.23878,18.69207],[-72.23856,18.692],[-72.23818,18.69192],[-72.23186,18.69054],[-72.22977,18.69113],[-72.21709,18.68967],[-72.21618,18.68724],[-72.21599,18.68673],[-72.21602,18.68659],[-72.2159,18.68601],[-72.21581,18.68593],[-72.21561,18.68483],[-72.21569,18.6847],[-72.21578,18.68435],[-72.21595,18.68347],[-72.21629,18.68289],[-72.2164,18.68221],[-72.21633,18.68211],[-72.21641,18.68208],[-72.21642,18.68189],[-72.21694,18.6813],[-72.21685,18.68096],[-72.21693,18.68099],[-72.21722,18.68091],[-72.21734,18.6808],[-72.21731,18.67964],[-72.21749,18.67958],[-72.21749,18.67946],[-72.21747,18.67908],[-72.21743,18.67853],[-72.21739,18.6785],[-72.21718,18.6786],[-72.2171,18.67856],[-72.21708,18.67838],[-72.21724,18.67767],[-72.21724,18.67745],[-72.21721,18.67744],[-72.21681,18.67754],[-72.21671,18.67688],[-72.21662,18.67612],[-72.21642,18.67621],[-72.21601,18.67548],[-72.21596,18.67551],[-72.21589,18.67549],[-72.21552,18.6756],[-72.2154,18.67561],[-72.21529,18.6757],[-72.21521,18.67571],[-72.21491,18.67472],[-72.21464,18.67387],[-72.21456,18.6737],[-72.21447,18.67348],[-72.21413,18.67301],[-72.21427,18.67293],[-72.21413,18.67271],[-72.21383,18.67278],[-72.21339,18.67181],[-72.21178,18.67209],[-72.21169,18.67172],[-72.21135,18.67183],[-72.21116,18.67196],[-72.21077,18.67121],[-72.21058,18.67129],[-72.20984,18.66963],[-72.20972,18.6697],[-72.20966,18.66968],[-72.20918,18.66838],[-72.20895,18.66773],[-72.2093,18.66606],[-72.20937,18.66571],[-72.20974,18.66536],[-72.21031,18.66477],[-72.21021,18.66416],[-72.21042,18.66401],[-72.2111,18.66329],[-72.21167,18.66268],[-72.21179,18.66236],[-72.21206,18.66242],[-72.21193,18.66185],[-72.21188,18.66155],[-72.21199,18.66147],[-72.21239,18.66137],[-72.21331,18.66103],[-72.21393,18.66039],[-72.21376,18.65992],[-72.21355,18.65956],[-72.21376,18.65943],[-72.21349,18.65869],[-72.21296,18.65736],[-72.21357,18.6572],[-72.21312,18.65639],[-72.21281,18.65534],[-72.21317,18.6551],[-72.21308,18.65459],[-72.21347,18.65438],[-72.21374,18.65436],[-72.21382,18.65416],[-72.2135,18.65353],[-72.21304,18.65171],[-72.21345,18.65143],[-72.21341,18.65133],[-72.21364,18.65105],[-72.21418,18.65077],[-72.21378,18.65016],[-72.21364,18.64989],[-72.21372,18.64975],[-72.21429,18.64943],[-72.21379,18.64934],[-72.21362,18.64922],[-72.21382,18.64869],[-72.21354,18.64765],[-72.21331,18.64717],[-72.21366,18.64552],[-72.21389,18.64539],[-72.21377,18.6451],[-72.214,18.64399],[-72.21412,18.64378],[-72.21437,18.64347],[-72.2158,18.64222],[-72.21601,18.64217],[-72.21761,18.64218],[-72.21778,18.64272],[-72.21798,18.64256],[-72.21816,18.64236],[-72.21821,18.6422],[-72.22119,18.64222],[-72.22125,18.6423],[-72.22135,18.64224],[-72.2215,18.64223],[-72.22293,18.64229],[-72.22299,18.64235],[-72.22311,18.64227],[-72.22717,18.64249],[-72.22828,18.64281],[-72.22811,18.6432],[-72.22848,18.64325],[-72.22919,18.64258],[-72.2304,18.64263],[-72.23711,18.64295],[-72.23719,18.64317],[-72.23807,18.64322],[-72.23828,18.64298],[-72.23988,18.64306],[-72.24332,18.6434],[-72.24367,18.64387],[-72.24518,18.64437],[-72.2456,18.64364],[-72.24562,18.64372],[-72.24574,18.64363],[-72.24723,18.64378],[-72.24853,18.64441],[-72.24918,18.64397],[-72.25155,18.64418],[-72.25382,18.64516],[-72.2546,18.64564],[-72.25517,18.64642],[-72.2554,18.64807],[-72.25531,18.64812],[-72.2552,18.64828],[-72.2555,18.64881],[-72.25586,18.64847],[-72.25603,18.64856],[-72.25625,18.64848],[-72.25685,18.64755],[-72.25965,18.64494],[-72.26253,18.64336],[-72.26304,18.64362],[-72.26388,18.64308],[-72.26486,18.64445],[-72.26525,18.64373],[-72.26533,18.64378],[-72.26576,18.64259],[-72.26652,18.64289],[-72.26641,18.64135],[-72.26714,18.64137],[-72.26737,18.6407],[-72.26824,18.64023],[-72.26853,18.6403],[-72.26901,18.63988],[-72.26908,18.63978],[-72.26948,18.63958],[-72.27214,18.63895],[-72.27383,18.63988],[-72.27375,18.64004],[-72.27476,18.64088],[-72.27501,18.64054],[-72.27622,18.64161],[-72.27639,18.64131],[-72.27652,18.64138],[-72.27845,18.643],[-72.27896,18.64273],[-72.2823,18.64457],[-72.28387,18.64607],[-72.28384,18.64611],[-72.28412,18.64641],[-72.28401,18.64647],[-72.28455,18.6471],[-72.28538,18.64803],[-72.28569,18.64785],[-72.28642,18.64857],[-72.28724,18.64936],[-72.28775,18.65003],[-72.28724,18.65028],[-72.28768,18.65089],[-72.28708,18.65122],[-72.28656,18.65188],[-72.28736,18.6532],[-72.2872,18.65332],[-72.2873,18.65355],[-72.28905,18.65383],[-72.28882,18.65459],[-72.28889,18.6546],[-72.28878,18.65512],[-72.29013,18.65481],[-72.29084,18.65766],[-72.2902,18.65767],[-72.29076,18.66015],[-72.28998,18.66022],[-72.29045,18.66151],[-72.29022,18.66161],[-72.29033,18.66256],[-72.29138,18.66227],[-72.29155,18.66276],[-72.29368,18.66243],[-72.29377,18.663],[-72.29441,18.66289],[-72.29444,18.66273],[-72.29656,18.66246],[-72.29662,18.66262],[-72.29708,18.66261],[-72.29692,18.66184],[-72.30025,18.66195],[-72.30141,18.66311],[-72.30141,18.66397],[-72.30192,18.66392],[-72.30197,18.66454],[-72.30311,18.66471],[-72.30471,18.66632],[-72.30471,18.66668],[-72.30505,18.66666],[-72.30529,18.66692],[-72.30519,18.66768],[-72.30607,18.66759],[-72.30749,18.66901],[-72.30782,18.67109],[-72.30784,18.67216],[-72.30757,18.67405],[-72.30716,18.67526],[-72.30674,18.67537],[-72.30687,18.67599],[-72.30657,18.67612],[-72.30611,18.67602],[-72.30585,18.67705],[-72.30607,18.67726],[-72.3061,18.67744],[-72.30635,18.678],[-72.30609,18.67871],[-72.30587,18.67881],[-72.3059,18.67951],[-72.30556,18.68062],[-72.30395,18.68368],[-72.30377,18.68373],[-72.30139,18.68415],[-72.29912,18.68452],[-72.29899,18.68432],[-72.29826,18.6844],[-72.29828,18.6845],[-72.29502,18.68412],[-72.29419,18.68422],[-72.29408,18.68376],[-72.29202,18.68398],[-72.29191,18.68364],[-72.29101,18.68377],[-72.29095,18.68347],[-72.29037,18.68378],[-72.29035,18.68363],[-72.28936,18.68384],[-72.28913,18.68345],[-72.28766,18.6835],[-72.2877,18.68329],[-72.28538,18.68344],[-72.2849,18.68243],[-72.28449,18.68243],[-72.28376,18.68198],[-72.28268,18.68186],[-72.2822,18.68284],[-72.28268,18.68296],[-72.28164,18.68413],[-72.28111,18.68523],[-72.28129,18.68628],[-72.28089,18.68726],[-72.28036,18.68726],[-72.28036,18.68762],[-72.2715,18.688],[-72.2715,18.68774],[-72.27171,18.6875],[-72.27193,18.68611],[-72.2713,18.68611],[-72.27115,18.68635],[-72.27115,18.68735],[-72.26903,18.68805],[-72.26661,18.68821],[-72.26315,18.68817],[-72.25798,18.6868],[-72.25503,18.68501],[-72.25415,18.68242],[-72.25408,18.68278],[-72.25266,18.68732],[-72.25106,18.68819],[-72.24828,18.68927],[-72.24695,18.68917],[-72.24718,18.68966],[-72.24628,18.68966],[-72.24632,18.68997],[-72.24527,18.69032],[-72.24487,18.69045],[-72.24361,18.69036],[-72.24351,18.69029],[-72.24321,18.6903],[-72.24318,18.69051],[-72.24324,18.69061],[-72.24325,18.691],[-72.24303,18.69122],[-72.24166,18.69171],[-72.24149,18.69178],[-72.2406,18.69192]],[[-72.27545,18.56614],[-72.27419,18.56701],[-72.27356,18.56701],[-72.27297,18.56706],[-72.27227,18.56707],[-72.27191,18.56707],[-72.27178,18.56718],[-72.2709,18.56724],[-72.27064,18.56724],[-72.26998,18.56708],[-72.26875,18.56671],[-72.2684,18.56661],[-72.26809,18.56639],[-72.26781,18.56611],[-72.26744,18.5652],[-72.26739,18.56308],[-72.26738,18.5626],[-72.26742,18.56195],[-72.26799,18.56064],[-72.26822,18.56014],[-72.26856,18.55975],[-72.26871,18.55962],[-72.2702,18.55963],[-72.27181,18.55967],[-72.27491,18.55982],[-72.27579,18.55986],[-72.27588,18.55999],[-72.2758,18.56491],[-72.27578,18.56541],[-72.27575,18.56556],[-72.27552,18.56608],[-72.27545,18.56614]],[[-72.33318,18.56014],[-72.33166,18.55959],[-72.33021,18.55904],[-72.32919,18.55866],[-72.3292,18.55861],[-72.32887,18.55838],[-72.32868,18.55826],[-72.3282,18.55827],[-72.32815,18.55828],[-72.3261,18.55752],[-72.32604,18.5575],[-72.32604,18.55745],[-72.32589,18.55732],[-72.32551,18.5573],[-72.32437,18.55688],[-72.32411,18.55678],[-72.32379,18.55662],[-72.32348,18.55633],[-72.32315,18.55628],[-72.32174,18.55556],[-72.32143,18.55541],[-72.3205,18.55488],[-72.32019,18.5547],[-72.32007,18.55453],[-72.31984,18.55412],[-72.31984,18.55385],[-72.31998,18.55322],[-72.32046,18.55124],[-72.32056,18.55083],[-72.32066,18.55047],[-72.32068,18.55039],[-72.32111,18.54857],[-72.32127,18.54791],[-72.32147,18.54719],[-72.32153,18.54699],[-72.322,18.5458],[-72.32203,18.54575],[-72.32354,18.54486],[-72.3236,18.54483],[-72.3236,18.54481],[-72.32486,18.54407],[-72.32534,18.54378],[-72.32533,18.5439],[-72.32534,18.54392],[-72.32555,18.54416],[-72.32588,18.54452],[-72.3259,18.54453],[-72.32621,18.54452],[-72.3266,18.54452],[-72.32666,18.54398],[-72.32669,18.54367],[-72.32666,18.54361],[-72.32666,18.54356],[-72.32669,18.54356],[-72.32677,18.5436],[-72.32704,18.54363],[-72.32714,18.5432],[-72.32713,18.54314],[-72.32704,18.54317],[-72.32697,18.54316],[-72.32698,18.54296],[-72.32697,18.54293],[-72.32697,18.54281],[-72.32728,18.54263],[-72.32814,18.5424],[-72.32864,18.54226],[-72.3297,18.54228],[-72.32979,18.54228],[-72.33174,18.54279],[-72.33242,18.54298],[-72.33329,18.54319],[-72.33328,18.54321],[-72.33529,18.54372],[-72.33589,18.54387],[-72.33689,18.54504],[-72.33734,18.54555],[-72.33761,18.546],[-72.33783,18.54639],[-72.33788,18.54658],[-72.33791,18.54693],[-72.33792,18.54705],[-72.33763,18.54705],[-72.33749,18.54705],[-72.33751,18.54753],[-72.33751,18.54764],[-72.33747,18.54764],[-72.33748,18.54773],[-72.33742,18.54773],[-72.33739,18.54776],[-72.33735,18.54773],[-72.33734,18.54774],[-72.33726,18.54774],[-72.33725,18.54782],[-72.33725,18.54804],[-72.33728,18.548],[-72.3373,18.54798],[-72.3373,18.54796],[-72.33737,18.54788],[-72.33739,18.54789],[-72.33741,18.5478],[-72.33744,18.5478],[-72.33755,18.5477],[-72.33752,18.54764],[-72.33773,18.54741],[-72.33775,18.54741],[-72.33775,18.54737],[-72.33789,18.54721],[-72.3389,18.54828],[-72.33902,18.54842],[-72.34008,18.55026],[-72.34014,18.55034],[-72.34028,18.55068],[-72.34041,18.55099],[-72.34029,18.55156],[-72.34021,18.55185],[-72.33985,18.55283],[-72.33973,18.55315],[-72.33927,18.55425],[-72.33914,18.55457],[-72.33915,18.55458],[-72.3391,18.5547],[-72.33896,18.55506],[-72.33847,18.55626],[-72.33842,18.55625],[-72.33844,18.55631],[-72.33832,18.55661],[-72.33822,18.55686],[-72.33821,18.55687],[-72.33816,18.55699],[-72.33815,18.55698],[-72.33807,18.557],[-72.33803,18.557],[-72.33806,18.55726],[-72.338,18.55742],[-72.33716,18.5593],[-72.33709,18.55945],[-72.33843,18.55931],[-72.33929,18.55922],[-72.33982,18.55941],[-72.33983,18.55943],[-72.34028,18.55975],[-72.34092,18.5598],[-72.34096,18.5598],[-72.34413,18.5609],[-72.3446,18.56107],[-72.34472,18.56111],[-72.34472,18.56109],[-72.34829,18.5623],[-72.34912,18.5626],[-72.35035,18.56335],[-72.35302,18.56496],[-72.35333,18.56616],[-72.35351,18.56901],[-72.35337,18.56949],[-72.35156,18.57185],[-72.35042,18.57341],[-72.35036,18.57338],[-72.34849,18.57592],[-72.34815,18.57636],[-72.34756,18.57636],[-72.34753,18.57634],[-72.34746,18.57647],[-72.34745,18.57639],[-72.34705,18.57703],[-72.34659,18.57672],[-72.34649,18.57683],[-72.34544,18.57618],[-72.34365,18.57629],[-72.34361,18.57636],[-72.34354,18.57631],[-72.34258,18.5764],[-72.34252,18.57699],[-72.3428,18.57707],[-72.343,18.57715],[-72.3429,18.57737],[-72.34338,18.5774],[-72.34321,18.57803],[-72.34324,18.57803],[-72.3432,18.57816],[-72.3444,18.57852],[-72.34395,18.57972],[-72.34414,18.57976],[-72.34377,18.58067],[-72.34424,18.58074],[-72.34398,18.58155],[-72.34388,18.58181],[-72.34392,18.5818],[-72.34371,18.5823],[-72.34375,18.58229],[-72.34371,18.58237],[-72.34283,18.58355],[-72.3424,18.58413],[-72.34238,18.58411],[-72.34234,18.58411],[-72.34209,18.58403],[-72.34207,18.58434],[-72.342,18.58433],[-72.34192,18.58474],[-72.34192,18.58477],[-72.34118,18.58575],[-72.3408,18.58627],[-72.34024,18.58655],[-72.33983,18.58675],[-72.33542,18.58843],[-72.33539,18.58845],[-72.33539,18.58843],[-72.33517,18.58851],[-72.3346,18.58806],[-72.33372,18.58896],[-72.33361,18.58917],[-72.33295,18.58941],[-72.33253,18.58912],[-72.33252,18.58916],[-72.33168,18.58889],[-72.33157,18.5891],[-72.33152,18.58918],[-72.33153,18.58917],[-72.33152,18.5892],[-72.33158,18.58929],[-72.33161,18.58934],[-72.33136,18.58951],[-72.33134,18.58953],[-72.33135,18.58954],[-72.3313,18.58963],[-72.33132,18.58976],[-72.33112,18.58977],[-72.33118,18.58983],[-72.33097,18.59017],[-72.33011,18.5905],[-72.32965,18.59068],[-72.32418,18.59182],[-72.3238,18.59189],[-72.32228,18.59068],[-72.32079,18.58947],[-72.32076,18.58801],[-72.32078,18.588],[-72.32078,18.58706],[-72.32073,18.58691],[-72.32073,18.58626],[-72.32092,18.58625],[-72.32081,18.58589],[-72.32074,18.58593],[-72.3207,18.58531],[-72.32114,18.58437],[-72.32185,18.58274],[-72.32202,18.58277],[-72.3222,18.58276],[-72.32211,18.58251],[-72.32196,18.58249],[-72.32242,18.5815],[-72.32245,18.5815],[-72.32295,18.58034],[-72.32368,18.579],[-72.32465,18.57947],[-72.32575,18.57852],[-72.32661,18.5778],[-72.32721,18.57838],[-72.32824,18.57817],[-72.32848,18.57756],[-72.32855,18.5776],[-72.32938,18.57666],[-72.32907,18.57629],[-72.32936,18.57607],[-72.32877,18.57563],[-72.32975,18.57451],[-72.32968,18.57443],[-72.32989,18.57408],[-72.32994,18.57359],[-72.3296,18.57363],[-72.32997,18.57247],[-72.33009,18.57153],[-72.33017,18.57152],[-72.33047,18.57045],[-72.3314,18.57052],[-72.33167,18.56999],[-72.33027,18.56999],[-72.33025,18.57003],[-72.33006,18.57004],[-72.3297,18.57],[-72.32981,18.56877],[-72.32877,18.56765],[-72.32858,18.56749],[-72.32877,18.56711],[-72.32912,18.5668],[-72.32897,18.56664],[-72.32938,18.56572],[-72.32946,18.56554],[-72.33052,18.56424],[-72.33056,18.56424],[-72.33056,18.5642],[-72.33105,18.56367],[-72.33112,18.56374],[-72.33111,18.56376],[-72.33117,18.56377],[-72.33131,18.56391],[-72.33153,18.5641],[-72.33154,18.56385],[-72.33161,18.56365],[-72.33168,18.56329],[-72.33169,18.56322],[-72.33171,18.56319],[-72.33181,18.5628],[-72.33187,18.5626],[-72.33299,18.56123],[-72.33318,18.561],[-72.33365,18.56064],[-72.33393,18.56042],[-72.33367,18.56033],[-72.33367,18.56027],[-72.33332,18.56011],[-72.33318,18.56014]],[[-72.31173,18.56168],[-72.31195,18.56259],[-72.31221,18.56365],[-72.31259,18.56628],[-72.31254,18.5663],[-72.31264,18.56654],[-72.31266,18.56682],[-72.3127,18.56687],[-72.31276,18.56734],[-72.31256,18.56746],[-72.31232,18.56754],[-72.31229,18.56757],[-72.31199,18.5677],[-72.31216,18.56801],[-72.31227,18.56815],[-72.31231,18.56828],[-72.31239,18.56841],[-72.31291,18.56909],[-72.31281,18.56916],[-72.31306,18.56945],[-72.31309,18.56956],[-72.31323,18.57061],[-72.31325,18.57137],[-72.31325,18.57213],[-72.31234,18.57268],[-72.31117,18.57341],[-72.30971,18.5739],[-72.30911,18.5739],[-72.30894,18.57369],[-72.3086,18.57389],[-72.30712,18.57389],[-72.307,18.57357],[-72.30666,18.57388],[-72.30605,18.57389],[-72.30581,18.57367],[-72.30555,18.57388],[-72.3007,18.57387],[-72.30059,18.57369],[-72.30044,18.57386],[-72.29691,18.57388],[-72.29518,18.57386],[-72.295,18.57371],[-72.29473,18.57341],[-72.29387,18.5722],[-72.29341,18.57156],[-72.29338,18.57142],[-72.2933,18.57075],[-72.29338,18.57008],[-72.29349,18.56992],[-72.29361,18.56978],[-72.29361,18.56985],[-72.29378,18.56959],[-72.29364,18.56957],[-72.29345,18.56951],[-72.29358,18.56919],[-72.29389,18.56859],[-72.29373,18.56847],[-72.29359,18.56827],[-72.29359,18.5681],[-72.29379,18.5679],[-72.29403,18.56774],[-72.29387,18.56762],[-72.29368,18.56743],[-72.29396,18.56457],[-72.29411,18.56426],[-72.29401,18.56418],[-72.29402,18.5638],[-72.29412,18.56283],[-72.29451,18.56209],[-72.29462,18.56196],[-72.29767,18.5617],[-72.29849,18.56192],[-72.29864,18.56184],[-72.29857,18.56174],[-72.2988,18.56157],[-72.30144,18.56133],[-72.30181,18.56176],[-72.30228,18.56125],[-72.30275,18.56122],[-72.30427,18.56126],[-72.30505,18.56147],[-72.30522,18.5613],[-72.30609,18.56132],[-72.30821,18.56138],[-72.31173,18.56168]]]},{id:"DroneImageryCanaanHaitiNovember2015",name:"Drone Imagery Canaan(Haiti) November 2015",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/haiti_canaan_nov2015/{zoom}/{x}/{y}",endDate:"2015-11-01T00:00:00.000Z",startDate:"2015-11-01T00:00:00.000Z",polygon:[[[-72.23109,18.67676],[-72.23101,18.67675],[-72.23108,18.67675],[-72.23104,18.67669],[-72.23105,18.67665],[-72.23151,18.67663],[-72.23153,18.67665],[-72.23146,18.67676],[-72.23285,18.67669],[-72.23506,18.67641],[-72.23507,18.67638],[-72.23507,18.67635],[-72.23505,18.67635],[-72.23511,18.6762],[-72.23509,18.67614],[-72.23523,18.67613],[-72.23522,18.67611],[-72.23523,18.67606],[-72.2352,18.67598],[-72.23515,18.6758],[-72.23629,18.67565],[-72.23625,18.67553],[-72.23624,18.67551],[-72.23648,18.67548],[-72.23648,18.67565],[-72.23648,18.67581],[-72.23689,18.67575],[-72.2372,18.67571],[-72.23747,18.67567],[-72.23772,18.67563],[-72.23805,18.6756],[-72.23854,18.67555],[-72.23888,18.67552],[-72.239,18.67551],[-72.23897,18.67565],[-72.23897,18.67571],[-72.23901,18.67576],[-72.239,18.67576],[-72.23902,18.67584],[-72.23905,18.67589],[-72.23929,18.67587],[-72.23981,18.67581],[-72.24059,18.67571],[-72.24142,18.67561],[-72.24177,18.67556],[-72.24179,18.67553],[-72.2421,18.67551],[-72.24272,18.67545],[-72.24276,18.67536],[-72.24278,18.67537],[-72.24279,18.67537],[-72.24299,18.67536],[-72.24334,18.67535],[-72.24339,18.67535],[-72.2434,18.67534],[-72.24372,18.67532],[-72.24424,18.67525],[-72.24443,18.67509],[-72.2474,18.67253],[-72.24731,18.67233],[-72.24681,18.67157],[-72.2469,18.67061],[-72.24652,18.67055],[-72.24661,18.66991],[-72.24669,18.66991],[-72.24688,18.66884],[-72.24707,18.66789],[-72.24709,18.66749],[-72.24728,18.66743],[-72.24716,18.66691],[-72.24717,18.66642],[-72.24703,18.66644],[-72.24701,18.66616],[-72.24971,18.66598],[-72.24947,18.66475],[-72.24989,18.66489],[-72.24989,18.66507],[-72.25113,18.66515],[-72.25102,18.66548],[-72.25111,18.66548],[-72.25111,18.66559],[-72.25219,18.66551],[-72.25387,18.66554],[-72.25387,18.66563],[-72.25551,18.66559],[-72.25638,18.66484],[-72.25719,18.66359],[-72.25763,18.66208],[-72.25768,18.65694],[-72.25779,18.64996],[-72.25713,18.64563],[-72.25696,18.64517],[-72.25564,18.64352],[-72.2493,18.64358],[-72.2482,18.64361],[-72.24637,18.64397],[-72.24629,18.64462],[-72.24454,18.64436],[-72.24442,18.64527],[-72.24311,18.6455],[-72.24326,18.64639],[-72.24286,18.64794],[-72.24272,18.64801],[-72.24282,18.6482],[-72.24257,18.64894],[-72.24109,18.64902],[-72.24109,18.64918],[-72.2405,18.64906],[-72.24036,18.6495],[-72.2403,18.64863],[-72.23753,18.64915],[-72.23664,18.64899],[-72.23666,18.64883],[-72.23582,18.64888],[-72.23488,18.64878],[-72.23487,18.64893],[-72.2338,18.649],[-72.23384,18.64932],[-72.23262,18.64927],[-72.2325,18.64824],[-72.23028,18.64837],[-72.23028,18.64821],[-72.22743,18.64815],[-72.2263,18.64775],[-72.22608,18.64845],[-72.22583,18.64841],[-72.22576,18.64828],[-72.22417,18.64849],[-72.22417,18.64805],[-72.22166,18.64804],[-72.21921,18.6485],[-72.21767,18.64995],[-72.21719,18.6509],[-72.21637,18.65422],[-72.21633,18.65888],[-72.21633,18.66198],[-72.2171,18.66448],[-72.21737,18.66441],[-72.21814,18.66454],[-72.21864,18.66568],[-72.21837,18.66588],[-72.21881,18.66817],[-72.21881,18.66893],[-72.21846,18.66888],[-72.21884,18.67018],[-72.22015,18.67173],[-72.22175,18.67311],[-72.22175,18.67288],[-72.2225,18.67317],[-72.22257,18.67357],[-72.22241,18.67368],[-72.22489,18.67588],[-72.2287,18.67693],[-72.23073,18.6768],[-72.23111,18.67678],[-72.23109,18.67676]]]},{id:"drone-imagery-2016",name:"Drone Imagery Matthew(Haiti) October 2016",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/haiti_uav_201610/{zoom}/{x}/{y}",endDate:"2016-10-01T00:00:00.000Z",startDate:"2016-10-01T00:00:00.000Z",polygon:[[[-74.11291,18.64948],[-74.10903,18.64598],[-74.10873,18.64446],[-74.1095,18.64452],[-74.1095,18.64181],[-74.10968,18.64187],[-74.11053,18.64103],[-74.10988,18.64034],[-74.11005,18.64014],[-74.11005,18.64009],[-74.11011,18.64002],[-74.10949,18.63959],[-74.1095,18.63924],[-74.10904,18.63926],[-74.10894,18.63917],[-74.10905,18.63912],[-74.10898,18.63899],[-74.10782,18.63839],[-74.10823,18.63775],[-74.10812,18.63764],[-74.10786,18.63774],[-74.10768,18.63733],[-74.10748,18.63719],[-74.10722,18.63559],[-74.10901,18.63394],[-74.11678,18.62847],[-74.11952,18.62815],[-74.12251,18.63132],[-74.12731,18.63703],[-74.12684,18.6374],[-74.12731,18.63771],[-74.12768,18.63756],[-74.13403,18.64671],[-74.13401,18.64897],[-74.13087,18.65167],[-74.13076,18.65153],[-74.13053,18.65179],[-74.13054,18.65195],[-74.12878,18.65342],[-74.1274,18.65412],[-74.12514,18.65497],[-74.11997,18.65432],[-74.11938,18.65429],[-74.11291,18.64948]],[[-74.11305,18.4922],[-74.10884,18.49216],[-74.10118,18.49095],[-74.10105,18.49057],[-74.10131,18.4902],[-74.10101,18.48996],[-74.10142,18.48933],[-74.10099,18.48931],[-74.1009,18.48886],[-74.10166,18.48725],[-74.10108,18.48713],[-74.10133,18.48664],[-74.10058,18.48654],[-74.10048,18.48552],[-74.10062,18.4849],[-74.10037,18.48478],[-74.10012,18.4827],[-74.09994,18.48123],[-74.10033,18.48114],[-74.10242,18.48116],[-74.10492,18.48149],[-74.10771,18.48189],[-74.1099,18.48226],[-74.10987,18.48243],[-74.10992,18.48246],[-74.11018,18.48232],[-74.11196,18.48261],[-74.11247,18.48278],[-74.11316,18.48382],[-74.1134,18.48521],[-74.11349,18.48709],[-74.11338,18.48704],[-74.11336,18.48717],[-74.11349,18.48727],[-74.11355,18.48931],[-74.11349,18.48949],[-74.1135,18.48951],[-74.11349,18.48952],[-74.11347,18.48951],[-74.11334,18.48957],[-74.11336,18.48962],[-74.11341,18.48958],[-74.11344,18.48959],[-74.11349,18.48956],[-74.11352,18.48957],[-74.11355,18.48956],[-74.11357,18.48998],[-74.11359,18.49067],[-74.11354,18.49108],[-74.11322,18.492],[-74.11305,18.4922]],[[-74.10198,18.24954],[-74.09767,18.24744],[-74.09419,18.2474],[-74.09338,18.24885],[-74.09638,18.25292],[-74.09934,18.25335],[-74.10198,18.24954]],[[-74.02901,18.59744],[-74.02881,18.60255],[-74.00847,18.60182],[-74.00867,18.59671],[-74.02901,18.59744]],[[-73.91991,18.07466],[-73.91468,18.07482],[-73.91535,18.07742],[-73.91478,18.08009],[-73.91997,18.08014],[-73.91924,18.07802],[-73.91999,18.07637],[-73.91991,18.07466]],[[-74.22365,18.3081],[-74.22061,18.30272],[-74.21902,18.30278],[-74.21592,18.30364],[-74.21615,18.30804],[-74.22365,18.3081]],[[-74.00508,18.17646],[-74.00072,18.17657],[-74.00186,18.18175],[-74.00269,18.18344],[-74.00653,18.18336],[-74.00715,18.18218],[-74.00649,18.18056],[-74.0052,18.17922],[-74.00508,18.17646]],[[-74.0653,18.22881],[-74.06361,18.2268],[-74.06114,18.22672],[-74.05968,18.22853],[-74.06281,18.23083],[-74.06446,18.23034],[-74.0653,18.22881]],[[-74.11371,18.47184],[-74.11002,18.47177],[-74.10959,18.47536],[-74.11341,18.47497],[-74.11371,18.47184]],[[-73.95852,18.47452],[-73.95446,18.47465],[-73.95548,18.4794],[-73.95965,18.47878],[-73.95852,18.47452]],[[-74.16719,18.27229],[-74.16196,18.27232],[-74.16175,18.27303],[-74.16255,18.27452],[-74.16372,18.27542],[-74.16341,18.27749],[-74.16404,18.27854],[-74.16756,18.27868],[-74.16742,18.27592],[-74.16775,18.27416],[-74.16719,18.27229]],[[-74.11091,18.45286],[-74.10701,18.45258],[-74.10684,18.4586],[-74.11102,18.45781],[-74.11091,18.45286]],[[-73.76854,18.18022],[-73.75773,18.18006],[-73.73559,18.19311],[-73.73567,18.20143],[-73.74563,18.20191],[-73.74468,18.22311],[-73.77121,18.22417],[-73.77129,18.20844],[-73.76915,18.2064],[-73.76854,18.18022]],[[-74.13455,18.60914],[-74.1388,18.60929],[-74.13871,18.61165],[-74.13447,18.6115],[-74.13455,18.60914]],[[-74.04228,18.20945],[-74.042,18.20484],[-74.04155,18.20239],[-74.03959,18.20051],[-74.03836,18.20028],[-74.03764,18.20242],[-74.03792,18.20562],[-74.03918,18.20932],[-74.04228,18.20945]],[[-74.08668,18.61121],[-74.08669,18.61217],[-74.09146,18.61689],[-74.09211,18.61603],[-74.09313,18.61699],[-74.09603,18.62025],[-74.09627,18.6206],[-74.0967,18.62202],[-74.09337,18.62651],[-74.09237,18.62754],[-74.08862,18.62596],[-74.08863,18.62561],[-74.08778,18.62561],[-74.08661,18.6251],[-74.08662,18.62368],[-74.08514,18.62367],[-74.08462,18.62289],[-74.08463,18.62175],[-74.08339,18.62174],[-74.08261,18.62057],[-74.08262,18.61982],[-74.07659,18.6198],[-74.07658,18.61596],[-74.07255,18.61591],[-74.07259,18.61403],[-74.07062,18.61402],[-74.06858,18.6129],[-74.06855,18.61208],[-74.06614,18.61207],[-74.06414,18.61206],[-74.0625,18.61105],[-74.06254,18.61011],[-74.05927,18.61013],[-74.0545,18.60876],[-74.05451,18.60817],[-74.05168,18.60816],[-74.04932,18.60776],[-74.04647,18.60664],[-74.04646,18.6062],[-74.04243,18.6062],[-74.04133,18.60592],[-74.03625,18.60378],[-74.03597,18.60345],[-74.03642,18.60252],[-74.03719,18.6019],[-74.04003,18.60217],[-74.05608,18.60473],[-74.05851,18.6054],[-74.05861,18.60623],[-74.0611,18.60627],[-74.06481,18.60745],[-74.06518,18.60686],[-74.06679,18.60802],[-74.0696,18.60885],[-74.07142,18.60711],[-74.07239,18.60736],[-74.07515,18.61024],[-74.07701,18.61019],[-74.07798,18.61096],[-74.07901,18.61013],[-74.08109,18.61234],[-74.08234,18.60896],[-74.08383,18.60922],[-74.08513,18.60977],[-74.08668,18.61121]],[[-74.45922,18.4663],[-74.45589,18.46471],[-74.44779,18.47],[-74.44693,18.4713],[-74.44726,18.47934],[-74.44554,18.47915],[-74.44515,18.48326],[-74.43968,18.4839],[-74.439,18.48762],[-74.44299,18.49004],[-74.44906,18.49104],[-74.45382,18.49311],[-74.45571,18.49635],[-74.45786,18.49725],[-74.46052,18.49523],[-74.46241,18.49143],[-74.46198,18.48799],[-74.45537,18.48597],[-74.45526,18.47111],[-74.45944,18.46871],[-74.45922,18.4663]],[[-74.41888,18.57551],[-74.41499,18.57331],[-74.41045,18.57648],[-74.40824,18.58233],[-74.40954,18.58894],[-74.4112,18.59195],[-74.41081,18.59689],[-74.41663,18.60063],[-74.42178,18.59671],[-74.42146,18.59416],[-74.41745,18.59419],[-74.41753,18.59067],[-74.41538,18.59002],[-74.41533,18.58382],[-74.41652,18.58382],[-74.41756,18.5814],[-74.41756,18.57967],[-74.41924,18.57754],[-74.41888,18.57551]]]},{id:"Erlangen-2011",name:"Erlangen Luftbild (2011 5,0 cm)",type:"wms",template:"https://secure.erlangen.de/arcgiser/services/Luftbilder2011/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Erlangen_ratio10_5cm_gk4.jp2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[10.92791,49.53196],[10.97194,49.52969],[10.97821,49.53568],[10.99934,49.53589],[11.03214,49.53089],[11.04425,49.54317],[11.03842,49.55239],[11.03663,49.57167],[11.04029,49.58572],[11.07287,49.58587],[11.07243,49.63486],[11.0054,49.6344],[11.00397,49.62599],[10.9748,49.62541],[10.94293,49.64563],[10.92532,49.64876],[10.91002,49.63793],[10.92235,49.60463],[10.91949,49.57823],[10.91135,49.57095],[10.91256,49.5606],[10.92907,49.55674],[10.92791,49.53196]]],terms_text:"© Stadt Erlangen | © Aerowest GmbH"},{id:"Erlangen-2013",name:"Erlangen Luftbild (2013 6,25 cm)",type:"wms",template:"https://secure.erlangen.de/arcgiser/services/Luftbilder2013/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Erlangen_ratio5_6.25cm.jp2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[10.92791,49.53196],[10.9726,49.52939],[10.97909,49.53475],[10.99934,49.53589],[11.03214,49.53089],[11.04425,49.54317],[11.03842,49.55239],[11.03743,49.57873],[11.0568,49.592],[11.05748,49.61358],[11.04681,49.61447],[11.04788,49.6187],[11.00308,49.62367],[10.98107,49.62339],[10.98069,49.62617],[10.96737,49.62781],[10.96539,49.63415],[10.94293,49.64563],[10.92532,49.64876],[10.91002,49.63793],[10.92235,49.60463],[10.91949,49.57823],[10.91135,49.57095],[10.91256,49.5606],[10.92907,49.55674],[10.92791,49.53196]]],terms_text:"© Stadt Erlangen | © Aerowest GmbH"},{id:"Erlangen-2016",name:"Erlangen Luftbild (2016 5,0 cm)",type:"wms",template:"https://secure.erlangen.de/arcgiser/services/Luftbild2016/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-03-18T00:00:00.000Z",startDate:"2016-03-18T00:00:00.000Z",polygon:[[[10.97664,49.53765],[10.99101,49.53392],[10.99389,49.53835],[11.02784,49.53254],[11.0346,49.53462],[11.03407,49.53759],[11.04318,49.54321],[11.03557,49.55303],[11.0384,49.55842],[11.03508,49.56929],[11.03791,49.58659],[11.04797,49.5902],[11.04922,49.5937],[11.05749,49.59521],[11.05623,49.59905],[11.05127,49.6003],[11.05351,49.60904],[11.04309,49.61381],[11.04076,49.61823],[11.0285,49.61735],[11.01929,49.61896],[11.0152,49.61372],[11.00581,49.61448],[11.00639,49.61931],[11.00083,49.6221],[10.9856,49.61651],[10.97837,49.61753],[10.9737,49.62495],[10.96539,49.62557],[10.96063,49.62856],[10.96382,49.63176],[10.95474,49.6379],[10.94837,49.637],[10.94185,49.64377],[10.9273,49.64837],[10.92063,49.63963],[10.91136,49.63773],[10.92429,49.60505],[10.92205,49.58004],[10.91221,49.57008],[10.91441,49.5618],[10.92353,49.55842],[10.92712,49.55976],[10.93345,49.55892],[10.93071,49.54467],[10.93067,49.53225],[10.9406,49.53325],[10.95488,49.53021],[10.97199,49.53126],[10.97664,49.53765]]],terms_text:"© Stadt Erlangen | © Geocart GmbH",best:true},{id:"EsriWorldImagery",name:"Esri World Imagery",type:"tms",template:"https://{switch:services,server}.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/Esri",terms_text:"Terms & Feedback","default":true,description:"Esri world imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/EsriImageryClarity.png"},{id:"EsriWorldImageryClarity",name:"Esri World Imagery (Clarity) Beta",type:"tms",template:"https://clarity.maptiles.arcgis.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/Esri",terms_text:"Terms & Feedback","default":true,description:"Esri archive imagery that may be clearer and more accurate than the default layer.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/EsriImageryClarity.png"},{id:"maaamet.ee-pohi_vr2",name:"Estonia Basemap (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=pohi_vr2&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti põhikaart"},{id:"Maaamet-Estonia_Cadastre",name:"Estonia Cadastre (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=of10000,TOPOYKSUS_6569,TOPOYKSUS_6573&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti katastrikaart ortofoto alusel"},{id:"maaamet.ee-cir_ngr",name:"Estonia Forestry (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=cir_ngr&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti metsanduslik ortofoto"},{id:"maaamet.ee-reljeef",name:"Estonia Hillshading (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=reljeef&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti reljeefikaart"},{id:"maaamet.ee-orto",name:"Estonia Ortho (Maaamet)",type:"tms",template:"https://tiles.maaamet.ee/tm/tms/1.0.0/foto@GMC/{zoom}/{x}/{-y}.png",zoomExtent:[6,18],polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti ortofoto"},{id:"estrela_de_alagoas",name:"Estrela de Alagoas",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Estrela%20de%20Alagoas&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.71382,-9.43476],[-36.71477,-9.34443],[-36.80586,-9.34498],[-36.80525,-9.43542],[-36.71382,-9.43476]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"eufar-balaton",name:"EUFAR Balaton orthophotos",type:"tms",template:"http://e.tile.openstreetmap.hu/balaton/0/{zoom}/{x}/{y}.jpg",endDate:"2010-08-31T00:00:00.000Z",startDate:"2010-08-01T00:00:00.000Z",zoomExtent:[12,19],polygon:[[[18.17918,46.98502],[18.17773,47.01816],[18.08176,47.05643],[18.10281,47.06311],[18.08152,47.09344],[18.06436,47.09049],[18.03537,47.07983],[18.03344,47.08262],[17.9582,47.05567],[17.99436,47.00449],[17.86441,46.95517],[17.80274,47.0103],[17.67184,46.97207],[17.23875,46.77079],[17.22244,46.6796],[17.47175,46.70306],[18.16735,46.94133],[18.17918,46.98502]]],terms_url:"http://www.bli.okologia.mta.hu/",terms_text:"EUFAR Balaton ortofotó 2010",best:true,description:"1940 geo-tagged photography from Balaton Limnological Institute."},{id:"Fiez-2013",name:"Fiez Orthophoto 2013",type:"tms",template:"http://osmdata.asitvd.ch/tiles/fiez2013/{zoom}/{x}/{y}.png",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.62313,46.82339],[6.62899,46.82484],[6.62882,46.82674],[6.62531,46.83274],[6.62382,46.83317],[6.61839,46.83194],[6.62313,46.82339]]],terms_url:"http://osmdata.asitvd.ch/",terms_text:"Fiez - Orthophoto technique 2013"},{id:"fiskeridir-akvakultur",name:"Fiskeridirektoratet Aquaculture overlay",type:"wms",template:"https://ogc.fiskeridir.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_262&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.fiskeridir.no/Kart",terms_text:"© Fiskeridirektoratet",description:"Aquaculture/marine farms (licensed sites, may not yet have any installations)",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Emblem_of_the_Norwegian_Directorate_of_Fisheries.svg/175px-Emblem_of_the_Norwegian_Directorate_of_Fisheries.svg.png",overlay:true},{id:"FOMI_2000",name:"FÖMI orthophoto 2000",type:"tms",template:"http://e.tile.openstreetmap.hu/ortofoto2000/{zoom}/{x}/{y}.jpg",endDate:"2000-01-01T00:00:00.000Z",startDate:"2000-01-01T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[16.11391,46.8691],[16.17897,46.90662],[16.20004,46.94151],[16.22175,46.93554],[16.24628,46.94639],[16.25532,46.96421],[16.27647,46.96261],[16.29058,47.01398],[16.30162,46.99923],[16.34146,46.99652],[16.35052,47.01063],[16.3734,46.99859],[16.41277,47.00475],[16.43327,46.99274],[16.44781,47.00389],[16.48,46.99412],[16.5122,47.00117],[16.46356,47.03227],[16.44786,47.02275],[16.43912,47.02966],[16.44567,47.03887],[16.52032,47.0561],[16.47321,47.07362],[16.46372,47.09392],[16.5008,47.11006],[16.50004,47.12329],[16.52953,47.12874],[16.51716,47.14969],[16.45495,47.14259],[16.46487,47.16833],[16.45556,47.18756],[16.43056,47.1847],[16.4195,47.19491],[16.41892,47.21071],[16.43713,47.2097],[16.44263,47.23371],[16.43131,47.25276],[16.46715,47.25317],[16.48923,47.27989],[16.46463,47.33385],[16.4337,47.35281],[16.45851,47.36705],[16.44546,47.40702],[16.48317,47.40936],[16.49638,47.38927],[16.51709,47.41002],[16.57491,47.40542],[16.58073,47.41917],[16.66185,47.4556],[16.67064,47.47422],[16.65234,47.50034],[16.68956,47.51016],[16.71478,47.5402],[16.66354,47.56773],[16.6732,47.60495],[16.65953,47.6061],[16.65276,47.62285],[16.63142,47.62832],[16.57391,47.61967],[16.51474,47.6462],[16.49675,47.63931],[16.42546,47.66217],[16.44374,47.67421],[16.44805,47.69647],[16.4747,47.68116],[16.48722,47.69798],[16.55217,47.72255],[16.53638,47.73678],[16.54798,47.75154],[16.60952,47.76037],[16.63441,47.75908],[16.65729,47.74149],[16.72094,47.73536],[16.75341,47.68282],[16.83016,47.68106],[16.83943,47.70451],[16.86689,47.72115],[16.87668,47.68765],[17.09374,47.70777],[17.07066,47.72854],[17.0516,47.79385],[17.07495,47.8085],[17.04714,47.82856],[17.05195,47.83777],[17.01055,47.85818],[17.01639,47.86733],[17.08575,47.87462],[17.11317,47.92716],[17.09171,47.93429],[17.11838,47.96011],[17.09466,47.97088],[17.20103,48.01999],[17.24177,48.02247],[17.25795,47.99865],[17.33465,47.99312],[17.40299,47.94785],[17.45392,47.88526],[17.52674,47.86551],[17.56758,47.81513],[17.6084,47.82189],[17.70858,47.75668],[17.77987,47.73949],[17.8661,47.74575],[17.90013,47.73926],[17.94687,47.74467],[17.97087,47.75784],[18.00441,47.74634],[18.03806,47.75768],[18.29588,47.73146],[18.45407,47.76512],[18.49316,47.75276],[18.55908,47.766],[18.64609,47.75909],[18.72607,47.78904],[18.74118,47.81382],[18.792,47.82309],[18.84854,47.81672],[18.85588,47.82608],[18.82801,47.83429],[18.81357,47.85555],[18.76353,47.8716],[18.75686,47.89684],[18.77675,47.95509],[18.75525,47.97635],[18.81574,47.99344],[18.82,48.03968],[18.83327,48.04824],[18.87494,48.04707],[18.88667,48.05868],[18.90898,48.05114],[18.9439,48.05886],[18.98161,48.0536],[19.01486,48.07818],[19.05852,48.05735],[19.08436,48.07278],[19.1074,48.0656],[19.13529,48.07415],[19.24137,48.05365],[19.25578,48.07156],[19.30311,48.08871],[19.3866,48.09191],[19.40002,48.0823],[19.45405,48.10144],[19.46735,48.08393],[19.49442,48.10991],[19.49238,48.13966],[19.51282,48.15466],[19.50452,48.17344],[19.52897,48.19036],[19.52604,48.20313],[19.5775,48.21601],[19.63083,48.25007],[19.64452,48.23917],[19.66986,48.23921],[19.69122,48.20389],[19.72113,48.20147],[19.74618,48.21651],[19.78716,48.19253],[19.79873,48.19482],[19.80528,48.18373],[19.78242,48.16504],[19.79481,48.15353],[19.82133,48.16908],[19.84528,48.16274],[19.85517,48.17843],[19.86013,48.16941],[19.89875,48.16631],[19.91454,48.14686],[19.8983,48.1249],[19.93738,48.13112],[19.97439,48.166],[19.98871,48.16217],[20.02904,48.17768],[20.04945,48.1672],[20.07299,48.17961],[20.07004,48.1917],[20.13409,48.22518],[20.13319,48.25398],[20.20616,48.25098],[20.20383,48.26191],[20.22847,48.26278],[20.23495,48.27993],[20.28686,48.26164],[20.32571,48.27279],[20.33746,48.30167],[20.36566,48.31661],[20.38408,48.35118],[20.40983,48.36586],[20.40253,48.38256],[20.42053,48.40386],[20.41623,48.41854],[20.50793,48.48936],[20.50651,48.53442],[20.53747,48.52788],[20.54649,48.54429],[20.58659,48.53576],[20.65387,48.56141],[20.83636,48.58284],[20.8378,48.57421],[20.85044,48.58163],[20.84533,48.5665],[20.86815,48.55182],[20.92232,48.55945],[20.93463,48.53834],[20.95588,48.53396],[20.9562,48.52167],[20.98158,48.51777],[21.01511,48.53231],[21.06632,48.52589],[21.11745,48.49105],[21.16087,48.5215],[21.17963,48.51823],[21.22106,48.5375],[21.30549,48.52225],[21.31338,48.55084],[21.32688,48.55413],[21.31938,48.5612],[21.41545,48.55895],[21.42266,48.57882],[21.44061,48.5851],[21.51409,48.55107],[21.54202,48.5084],[21.61393,48.50942],[21.62019,48.46983],[21.66355,48.41796],[21.66456,48.39216],[21.70174,48.3807],[21.71187,48.35762],[21.81741,48.33279],[21.8352,48.33464],[21.83721,48.36325],[21.8843,48.35605],[21.88484,48.36754],[21.89788,48.36256],[21.8998,48.37022],[21.92819,48.3616],[21.92681,48.3709],[21.9492,48.37873],[21.99446,48.37732],[22.02133,48.39275],[22.0546,48.37753],[22.07649,48.38724],[22.08674,48.37156],[22.13591,48.38052],[22.13106,48.39123],[22.15277,48.39624],[22.15619,48.40931],[22.21257,48.42565],[22.23714,48.41004],[22.26549,48.40987],[22.23988,48.38701],[22.26757,48.36116],[22.31781,48.35454],[22.31329,48.32507],[22.33729,48.30791],[22.33843,48.27921],[22.38475,48.23396],[22.40064,48.2492],[22.43284,48.25252],[22.45639,48.24231],[22.4899,48.25342],[22.49722,48.23955],[22.51615,48.23797],[22.53111,48.20943],[22.57114,48.19614],[22.56164,48.18161],[22.59824,48.14476],[22.59028,48.10734],[22.67545,48.092],[22.73472,48.11985],[22.75762,48.12006],[22.77039,48.10902],[22.77232,48.12187],[22.80277,48.12211],[22.80253,48.10708],[22.82543,48.11751],[22.83644,48.08025],[22.86113,48.07503],[22.8678,48.05243],[22.88204,48.05481],[22.86597,48.01132],[22.83556,47.9906],[22.84076,47.98136],[22.87257,47.97527],[22.86973,47.96596],[22.89157,47.96724],[22.89744,47.95406],[22.84733,47.90776],[22.79281,47.89086],[22.75869,47.89414],[22.77775,47.84225],[22.71363,47.83609],[22.68019,47.78775],[22.61112,47.77175],[22.549,47.77222],[22.48121,47.81089],[22.45131,47.80339],[22.43133,47.73981],[22.35662,47.74862],[22.31777,47.76609],[22.31762,47.74337],[22.28514,47.72928],[22.26432,47.73107],[22.259,47.69791],[22.23068,47.6932],[22.17965,47.59161],[22.12892,47.5979],[22.09428,47.55836],[22.07826,47.56213],[22.05345,47.54748],[22.07122,47.53807],[22.06179,47.5288],[22.04513,47.53989],[22.03672,47.53267],[22.00719,47.48362],[22.03279,47.45084],[22.02388,47.39086],[22.01198,47.3758],[21.96274,47.38105],[21.93825,47.37253],[21.87779,47.28578],[21.88728,47.27305],[21.85349,47.23976],[21.85807,47.18736],[21.81248,47.16675],[21.79241,47.10598],[21.72683,47.09839],[21.6976,47.05792],[21.65042,47.04083],[21.68887,47.002],[21.66787,46.97123],[21.68149,46.96521],[21.6382,46.93305],[21.59845,46.92747],[21.61429,46.88673],[21.60167,46.86682],[21.52033,46.83737],[21.51861,46.80007],[21.48318,46.76502],[21.52634,46.73932],[21.52937,46.72097],[21.49233,46.68597],[21.47284,46.69591],[21.4299,46.69394],[21.43096,46.67814],[21.45467,46.66086],[21.41624,46.64262],[21.4098,46.62181],[21.3657,46.63795],[21.33005,46.63182],[21.31397,46.61767],[21.30124,46.59087],[21.32079,46.58286],[21.2743,46.54074],[21.26003,46.50216],[21.27442,46.47673],[21.29645,46.4763],[21.31743,46.45073],[21.28952,46.41548],[21.29633,46.40696],[21.22501,46.41369],[21.20642,46.40338],[21.19926,46.3479],[21.17623,46.33577],[21.1805,46.30445],[21.11554,46.30185],[21.10305,46.26246],[21.07088,46.2539],[21.06608,46.24294],[21.03662,46.24804],[21.02467,46.26653],[20.96082,46.2623],[20.94658,46.2793],[20.92507,46.27662],[20.92181,46.26181],[20.87327,46.28776],[20.77565,46.27596],[20.74905,46.25085],[20.76186,46.20456],[20.7274,46.20775],[20.73411,46.19394],[20.71405,46.16605],[20.68436,46.14478],[20.65492,46.14977],[20.63945,46.12676],[20.54505,46.17909],[20.50148,46.19033],[20.49494,46.17099],[20.45923,46.14288],[20.39751,46.15747],[20.36853,46.15286],[20.35571,46.16963],[20.29681,46.15215],[20.2549,46.11585],[20.24848,46.1301],[20.23301,46.12417],[20.18174,46.16011],[20.1365,46.14495],[20.10097,46.17728],[20.06362,46.14373],[20.03461,46.14589],[20.01581,46.17684],[19.93541,46.17642],[19.85335,46.15],[19.81797,46.12817],[19.75854,46.14798],[19.69821,46.18793],[19.68277,46.18004],[19.66151,46.19044],[19.63174,46.1693],[19.56765,46.17911],[19.5604,46.16658],[19.50266,46.14245],[19.52712,46.12103],[19.4645,46.09538],[19.46658,46.08204],[19.416,46.04605],[19.3804,46.03587],[19.36409,46.0523],[19.2819,46.0148],[19.29653,45.98812],[19.28565,45.9969],[19.14799,45.99634],[19.13384,46.0371],[19.10487,46.04017],[19.06604,46.0002],[19.07968,45.96364],[19.00598,45.95907],[19.00927,45.92366],[18.90613,45.93538],[18.87946,45.91668],[18.86471,45.92085],[18.86856,45.91134],[18.82768,45.90517],[18.822,45.91459],[18.80751,45.90361],[18.80925,45.87962],[18.79562,45.87845],[18.70489,45.91819],[18.67002,45.91084],[18.65966,45.91689],[18.66513,45.89928],[18.64128,45.88904],[18.65502,45.87424],[18.62777,45.87338],[18.61484,45.85314],[18.62367,45.83985],[18.57324,45.81376],[18.57498,45.80043],[18.55972,45.8038],[18.52235,45.78269],[18.49067,45.79472],[18.48219,45.7655],[18.45628,45.76952],[18.44508,45.76052],[18.44685,45.73713],[18.40763,45.73971],[18.39189,45.7617],[18.36423,45.77294],[18.33942,45.74716],[18.29682,45.76122],[18.24405,45.76123],[18.23073,45.77903],[18.19087,45.78788],[18.16819,45.77627],[18.12465,45.78963],[18.10681,45.77083],[18.08189,45.76452],[17.99588,45.79573],[17.93021,45.78633],[17.90668,45.79257],[17.86531,45.76701],[17.82627,45.81],[17.80898,45.8041],[17.78091,45.81749],[17.76034,45.81192],[17.74086,45.8296],[17.66329,45.83818],[17.62762,45.89794],[17.57007,45.93582],[17.43783,45.95038],[17.4259,45.92727],[17.41081,45.93997],[17.39215,45.93021],[17.38287,45.94757],[17.34762,45.94234],[17.34388,45.96053],[17.35377,45.9525],[17.39054,45.95819],[17.38742,45.96618],[17.35835,45.96427],[17.37549,45.96869],[17.37519,45.98811],[17.36357,45.99154],[17.35672,45.97358],[17.33396,45.99608],[17.33198,45.97289],[17.313,45.96653],[17.32365,45.98878],[17.29877,45.98387],[17.3042,46.00211],[17.25797,46.01103],[17.29632,46.02852],[17.25415,46.03001],[17.27096,46.05671],[17.23248,46.0592],[17.25251,46.06647],[17.23131,46.07903],[17.20199,46.07655],[17.23313,46.09896],[17.2104,46.10017],[17.21297,46.11386],[17.17593,46.10846],[17.17434,46.12876],[17.18652,46.13323],[17.1811,46.15055],[17.15623,46.15858],[17.15929,46.16968],[17.1261,46.16845],[17.12274,46.17898],[17.07525,46.18895],[17.06616,46.2023],[16.97354,46.2252],[16.97395,46.24311],[16.95041,46.24153],[16.88624,46.28146],[16.87137,46.32528],[16.88021,46.3357],[16.86154,46.34524],[16.86562,46.35565],[16.8522,46.35172],[16.84986,46.36262],[16.83529,46.36382],[16.83765,46.3748],[16.82617,46.3671],[16.79334,46.38739],[16.75921,46.37766],[16.72987,46.40149],[16.71821,46.38987],[16.67729,46.44945],[16.66318,46.4487],[16.66637,46.4583],[16.61879,46.46199],[16.60447,46.47608],[16.5236,46.50538],[16.53258,46.5314],[16.51767,46.53635],[16.50841,46.56527],[16.483,46.56604],[16.4834,46.5786],[16.44557,46.61095],[16.42486,46.61316],[16.38594,46.64425],[16.39154,46.66373],[16.41985,46.65848],[16.42863,46.69397],[16.36892,46.70401],[16.37983,46.71539],[16.37109,46.72229],[16.35706,46.71424],[16.3186,46.75414],[16.33054,46.77521],[16.31216,46.778],[16.31277,46.79731],[16.34064,46.80519],[16.35084,46.83006],[16.34033,46.84688],[16.3015,46.85951],[16.29139,46.87283],[16.23323,46.87667],[16.15609,46.85371],[16.12657,46.85691],[16.11391,46.8691]]],terms_url:"https://www.fomi.hu",terms_text:"Földmérési és Távérzékelési Intézet"},{id:"FOMI_2005",name:"FÖMI orthophoto 2005",type:"tms",template:"http://e.tile.openstreetmap.hu/ortofoto2005/{zoom}/{x}/{y}.jpg",endDate:"2005-01-01T00:00:00.000Z",startDate:"2005-01-01T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[16.11391,46.8691],[16.17897,46.90662],[16.20004,46.94151],[16.22175,46.93554],[16.24628,46.94639],[16.25532,46.96421],[16.27647,46.96261],[16.29058,47.01398],[16.30162,46.99923],[16.34146,46.99652],[16.35052,47.01063],[16.3734,46.99859],[16.41277,47.00475],[16.43327,46.99274],[16.44781,47.00389],[16.48,46.99412],[16.5122,47.00117],[16.46356,47.03227],[16.44786,47.02275],[16.43912,47.02966],[16.44567,47.03887],[16.52032,47.0561],[16.47321,47.07362],[16.46372,47.09392],[16.5008,47.11006],[16.50004,47.12329],[16.52953,47.12874],[16.51716,47.14969],[16.45495,47.14259],[16.46487,47.16833],[16.45556,47.18756],[16.43056,47.1847],[16.4195,47.19491],[16.41892,47.21071],[16.43713,47.2097],[16.44263,47.23371],[16.43131,47.25276],[16.46715,47.25317],[16.48923,47.27989],[16.46463,47.33385],[16.4337,47.35281],[16.45851,47.36705],[16.44546,47.40702],[16.48317,47.40936],[16.49638,47.38927],[16.51709,47.41002],[16.57491,47.40542],[16.58073,47.41917],[16.66185,47.4556],[16.67064,47.47422],[16.65234,47.50034],[16.68956,47.51016],[16.71478,47.5402],[16.66354,47.56773],[16.6732,47.60495],[16.65953,47.6061],[16.65276,47.62285],[16.63142,47.62832],[16.57391,47.61967],[16.51474,47.6462],[16.49675,47.63931],[16.42546,47.66217],[16.44374,47.67421],[16.44805,47.69647],[16.4747,47.68116],[16.48722,47.69798],[16.55217,47.72255],[16.53638,47.73678],[16.54798,47.75154],[16.60952,47.76037],[16.63441,47.75908],[16.65729,47.74149],[16.72094,47.73536],[16.75341,47.68282],[16.83016,47.68106],[16.83943,47.70451],[16.86689,47.72115],[16.87668,47.68765],[17.09374,47.70777],[17.07066,47.72854],[17.0516,47.79385],[17.07495,47.8085],[17.04714,47.82856],[17.05195,47.83777],[17.01055,47.85818],[17.01639,47.86733],[17.08575,47.87462],[17.11317,47.92716],[17.09171,47.93429],[17.11838,47.96011],[17.09466,47.97088],[17.20103,48.01999],[17.24177,48.02247],[17.25795,47.99865],[17.33465,47.99312],[17.40299,47.94785],[17.45392,47.88526],[17.52674,47.86551],[17.56758,47.81513],[17.6084,47.82189],[17.70858,47.75668],[17.77987,47.73949],[17.8661,47.74575],[17.90013,47.73926],[17.94687,47.74467],[17.97087,47.75784],[18.00441,47.74634],[18.03806,47.75768],[18.29588,47.73146],[18.45407,47.76512],[18.49316,47.75276],[18.55908,47.766],[18.64609,47.75909],[18.72607,47.78904],[18.74118,47.81382],[18.792,47.82309],[18.84854,47.81672],[18.85588,47.82608],[18.82801,47.83429],[18.81357,47.85555],[18.76353,47.8716],[18.75686,47.89684],[18.77675,47.95509],[18.75525,47.97635],[18.81574,47.99344],[18.82,48.03968],[18.83327,48.04824],[18.87494,48.04707],[18.88667,48.05868],[18.90898,48.05114],[18.9439,48.05886],[18.98161,48.0536],[19.01486,48.07818],[19.05852,48.05735],[19.08436,48.07278],[19.1074,48.0656],[19.13529,48.07415],[19.24137,48.05365],[19.25578,48.07156],[19.30311,48.08871],[19.3866,48.09191],[19.40002,48.0823],[19.45405,48.10144],[19.46735,48.08393],[19.49442,48.10991],[19.49238,48.13966],[19.51282,48.15466],[19.50452,48.17344],[19.52897,48.19036],[19.52604,48.20313],[19.5775,48.21601],[19.63083,48.25007],[19.64452,48.23917],[19.66986,48.23921],[19.69122,48.20389],[19.72113,48.20147],[19.74618,48.21651],[19.78716,48.19253],[19.79873,48.19482],[19.80528,48.18373],[19.78242,48.16504],[19.79481,48.15353],[19.82133,48.16908],[19.84528,48.16274],[19.85517,48.17843],[19.86013,48.16941],[19.89875,48.16631],[19.91454,48.14686],[19.8983,48.1249],[19.93738,48.13112],[19.97439,48.166],[19.98871,48.16217],[20.02904,48.17768],[20.04945,48.1672],[20.07299,48.17961],[20.07004,48.1917],[20.13409,48.22518],[20.13319,48.25398],[20.20616,48.25098],[20.20383,48.26191],[20.22847,48.26278],[20.23495,48.27993],[20.28686,48.26164],[20.32571,48.27279],[20.33746,48.30167],[20.36566,48.31661],[20.38408,48.35118],[20.40983,48.36586],[20.40253,48.38256],[20.42053,48.40386],[20.41623,48.41854],[20.50793,48.48936],[20.50651,48.53442],[20.53747,48.52788],[20.54649,48.54429],[20.58659,48.53576],[20.65387,48.56141],[20.83636,48.58284],[20.8378,48.57421],[20.85044,48.58163],[20.84533,48.5665],[20.86815,48.55182],[20.92232,48.55945],[20.93463,48.53834],[20.95588,48.53396],[20.9562,48.52167],[20.98158,48.51777],[21.01511,48.53231],[21.06632,48.52589],[21.11745,48.49105],[21.16087,48.5215],[21.17963,48.51823],[21.22106,48.5375],[21.30549,48.52225],[21.31338,48.55084],[21.32688,48.55413],[21.31938,48.5612],[21.41545,48.55895],[21.42266,48.57882],[21.44061,48.5851],[21.51409,48.55107],[21.54202,48.5084],[21.61393,48.50942],[21.62019,48.46983],[21.66355,48.41796],[21.66456,48.39216],[21.70174,48.3807],[21.71187,48.35762],[21.81741,48.33279],[21.8352,48.33464],[21.83721,48.36325],[21.8843,48.35605],[21.88484,48.36754],[21.89788,48.36256],[21.8998,48.37022],[21.92819,48.3616],[21.92681,48.3709],[21.9492,48.37873],[21.99446,48.37732],[22.02133,48.39275],[22.0546,48.37753],[22.07649,48.38724],[22.08674,48.37156],[22.13591,48.38052],[22.13106,48.39123],[22.15277,48.39624],[22.15619,48.40931],[22.21257,48.42565],[22.23714,48.41004],[22.26549,48.40987],[22.23988,48.38701],[22.26757,48.36116],[22.31781,48.35454],[22.31329,48.32507],[22.33729,48.30791],[22.33843,48.27921],[22.38475,48.23396],[22.40064,48.2492],[22.43284,48.25252],[22.45639,48.24231],[22.4899,48.25342],[22.49722,48.23955],[22.51615,48.23797],[22.53111,48.20943],[22.57114,48.19614],[22.56164,48.18161],[22.59824,48.14476],[22.59028,48.10734],[22.67545,48.092],[22.73472,48.11985],[22.75762,48.12006],[22.77039,48.10902],[22.77232,48.12187],[22.80277,48.12211],[22.80253,48.10708],[22.82543,48.11751],[22.83644,48.08025],[22.86113,48.07503],[22.8678,48.05243],[22.88204,48.05481],[22.86597,48.01132],[22.83556,47.9906],[22.84076,47.98136],[22.87257,47.97527],[22.86973,47.96596],[22.89157,47.96724],[22.89744,47.95406],[22.84733,47.90776],[22.79281,47.89086],[22.75869,47.89414],[22.77775,47.84225],[22.71363,47.83609],[22.68019,47.78775],[22.61112,47.77175],[22.549,47.77222],[22.48121,47.81089],[22.45131,47.80339],[22.43133,47.73981],[22.35662,47.74862],[22.31777,47.76609],[22.31762,47.74337],[22.28514,47.72928],[22.26432,47.73107],[22.259,47.69791],[22.23068,47.6932],[22.17965,47.59161],[22.12892,47.5979],[22.09428,47.55836],[22.07826,47.56213],[22.05345,47.54748],[22.07122,47.53807],[22.06179,47.5288],[22.04513,47.53989],[22.03672,47.53267],[22.00719,47.48362],[22.03279,47.45084],[22.02388,47.39086],[22.01198,47.3758],[21.96274,47.38105],[21.93825,47.37253],[21.87779,47.28578],[21.88728,47.27305],[21.85349,47.23976],[21.85807,47.18736],[21.81248,47.16675],[21.79241,47.10598],[21.72683,47.09839],[21.6976,47.05792],[21.65042,47.04083],[21.68887,47.002],[21.66787,46.97123],[21.68149,46.96521],[21.6382,46.93305],[21.59845,46.92747],[21.61429,46.88673],[21.60167,46.86682],[21.52033,46.83737],[21.51861,46.80007],[21.48318,46.76502],[21.52634,46.73932],[21.52937,46.72097],[21.49233,46.68597],[21.47284,46.69591],[21.4299,46.69394],[21.43096,46.67814],[21.45467,46.66086],[21.41624,46.64262],[21.4098,46.62181],[21.3657,46.63795],[21.33005,46.63182],[21.31397,46.61767],[21.30124,46.59087],[21.32079,46.58286],[21.2743,46.54074],[21.26003,46.50216],[21.27442,46.47673],[21.29645,46.4763],[21.31743,46.45073],[21.28952,46.41548],[21.29633,46.40696],[21.22501,46.41369],[21.20642,46.40338],[21.19926,46.3479],[21.17623,46.33577],[21.1805,46.30445],[21.11554,46.30185],[21.10305,46.26246],[21.07088,46.2539],[21.06608,46.24294],[21.03662,46.24804],[21.02467,46.26653],[20.96082,46.2623],[20.94658,46.2793],[20.92507,46.27662],[20.92181,46.26181],[20.87327,46.28776],[20.77565,46.27596],[20.74905,46.25085],[20.76186,46.20456],[20.7274,46.20775],[20.73411,46.19394],[20.71405,46.16605],[20.68436,46.14478],[20.65492,46.14977],[20.63945,46.12676],[20.54505,46.17909],[20.50148,46.19033],[20.49494,46.17099],[20.45923,46.14288],[20.39751,46.15747],[20.36853,46.15286],[20.35571,46.16963],[20.29681,46.15215],[20.2549,46.11585],[20.24848,46.1301],[20.23301,46.12417],[20.18174,46.16011],[20.1365,46.14495],[20.10097,46.17728],[20.06362,46.14373],[20.03461,46.14589],[20.01581,46.17684],[19.93541,46.17642],[19.85335,46.15],[19.81797,46.12817],[19.75854,46.14798],[19.69821,46.18793],[19.68277,46.18004],[19.66151,46.19044],[19.63174,46.1693],[19.56765,46.17911],[19.5604,46.16658],[19.50266,46.14245],[19.52712,46.12103],[19.4645,46.09538],[19.46658,46.08204],[19.416,46.04605],[19.3804,46.03587],[19.36409,46.0523],[19.2819,46.0148],[19.29653,45.98812],[19.28565,45.9969],[19.14799,45.99634],[19.13384,46.0371],[19.10487,46.04017],[19.06604,46.0002],[19.07968,45.96364],[19.00598,45.95907],[19.00927,45.92366],[18.90613,45.93538],[18.87946,45.91668],[18.86471,45.92085],[18.86856,45.91134],[18.82768,45.90517],[18.822,45.91459],[18.80751,45.90361],[18.80925,45.87962],[18.79562,45.87845],[18.70489,45.91819],[18.67002,45.91084],[18.65966,45.91689],[18.66513,45.89928],[18.64128,45.88904],[18.65502,45.87424],[18.62777,45.87338],[18.61484,45.85314],[18.62367,45.83985],[18.57324,45.81376],[18.57498,45.80043],[18.55972,45.8038],[18.52235,45.78269],[18.49067,45.79472],[18.48219,45.7655],[18.45628,45.76952],[18.44508,45.76052],[18.44685,45.73713],[18.40763,45.73971],[18.39189,45.7617],[18.36423,45.77294],[18.33942,45.74716],[18.29682,45.76122],[18.24405,45.76123],[18.23073,45.77903],[18.19087,45.78788],[18.16819,45.77627],[18.12465,45.78963],[18.10681,45.77083],[18.08189,45.76452],[17.99588,45.79573],[17.93021,45.78633],[17.90668,45.79257],[17.86531,45.76701],[17.82627,45.81],[17.80898,45.8041],[17.78091,45.81749],[17.76034,45.81192],[17.74086,45.8296],[17.66329,45.83818],[17.62762,45.89794],[17.57007,45.93582],[17.43783,45.95038],[17.4259,45.92727],[17.41081,45.93997],[17.39215,45.93021],[17.38287,45.94757],[17.34762,45.94234],[17.34388,45.96053],[17.35377,45.9525],[17.39054,45.95819],[17.38742,45.96618],[17.35835,45.96427],[17.37549,45.96869],[17.37519,45.98811],[17.36357,45.99154],[17.35672,45.97358],[17.33396,45.99608],[17.33198,45.97289],[17.313,45.96653],[17.32365,45.98878],[17.29877,45.98387],[17.3042,46.00211],[17.25797,46.01103],[17.29632,46.02852],[17.25415,46.03001],[17.27096,46.05671],[17.23248,46.0592],[17.25251,46.06647],[17.23131,46.07903],[17.20199,46.07655],[17.23313,46.09896],[17.2104,46.10017],[17.21297,46.11386],[17.17593,46.10846],[17.17434,46.12876],[17.18652,46.13323],[17.1811,46.15055],[17.15623,46.15858],[17.15929,46.16968],[17.1261,46.16845],[17.12274,46.17898],[17.07525,46.18895],[17.06616,46.2023],[16.97354,46.2252],[16.97395,46.24311],[16.95041,46.24153],[16.88624,46.28146],[16.87137,46.32528],[16.88021,46.3357],[16.86154,46.34524],[16.86562,46.35565],[16.8522,46.35172],[16.84986,46.36262],[16.83529,46.36382],[16.83765,46.3748],[16.82617,46.3671],[16.79334,46.38739],[16.75921,46.37766],[16.72987,46.40149],[16.71821,46.38987],[16.67729,46.44945],[16.66318,46.4487],[16.66637,46.4583],[16.61879,46.46199],[16.60447,46.47608],[16.5236,46.50538],[16.53258,46.5314],[16.51767,46.53635],[16.50841,46.56527],[16.483,46.56604],[16.4834,46.5786],[16.44557,46.61095],[16.42486,46.61316],[16.38594,46.64425],[16.39154,46.66373],[16.41985,46.65848],[16.42863,46.69397],[16.36892,46.70401],[16.37983,46.71539],[16.37109,46.72229],[16.35706,46.71424],[16.3186,46.75414],[16.33054,46.77521],[16.31216,46.778],[16.31277,46.79731],[16.34064,46.80519],[16.35084,46.83006],[16.34033,46.84688],[16.3015,46.85951],[16.29139,46.87283],[16.23323,46.87667],[16.15609,46.85371],[16.12657,46.85691],[16.11391,46.8691]]],terms_url:"https://www.fomi.hu",terms_text:"Földmérési és Távérzékelési Intézet"},{id:"Freemap.sk-Car",name:"Freemap.sk Car",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/A/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Cyclo",name:"Freemap.sk Cyclo",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/C/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Hiking",name:"Freemap.sk Hiking",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/T/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Ski",name:"Freemap.sk Ski",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/K/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"fta-digiroad-functional",name:"FTA Road Network",type:"wms",template:"https://extranet.liikennevirasto.fi/inspirepalvelu/beta/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dr_tielinkki_toim_lk&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,20],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.liikennevirasto.fi/web/en/open-data/digiroad/",terms_text:"© Liikennevirasto",description:"Digiroad national road network from the Finnish Transport Agency, functional road classes.",icon:"https://www.liikennevirasto.fi/livi-theme/images/general/liikennevirasto_logo_2x.png",overlay:true},{id:"gaza_pleiades_20140706",name:"Gaza Strip - Pléiades - 2014/07/06",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/gaza_pleiades_20140706/{zoom}/{x}/{y}",endDate:"2014-07-06T00:00:00.000Z",startDate:"2014-07-06T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[34.49022,31.59487],[34.49339,31.59263],[34.5678,31.5401],[34.5653,31.53226],[34.55613,31.52552],[34.54729,31.5121],[34.53011,31.5066],[34.5255,31.50251],[34.51369,31.50067],[34.505,31.49543],[34.4887,31.48263],[34.48532,31.48028],[34.47962,31.47778],[34.47471,31.47207],[34.4674,31.46448],[34.46576,31.46275],[34.45308,31.45139],[34.44585,31.4441],[34.44216,31.44327],[34.43798,31.44112],[34.43226,31.43458],[34.43164,31.43265],[34.4268,31.42804],[34.42211,31.42437],[34.41326,31.41862],[34.41329,31.41758],[34.41174,31.41604],[34.40918,31.41542],[34.4067,31.41295],[34.40506,31.41295],[34.40197,31.4112],[34.40134,31.40986],[34.39492,31.40391],[34.39351,31.40113],[34.38824,31.39599],[34.38037,31.38951],[34.38074,31.38791],[34.37407,31.37915],[34.37338,31.37422],[34.37159,31.37209],[34.37214,31.37093],[34.37158,31.36972],[34.3704,31.36909],[34.36827,31.36992],[34.36685,31.36914],[34.36497,31.36137],[34.37438,31.30609],[34.36708,31.29074],[34.34339,31.27846],[34.33119,31.26149],[34.31931,31.25317],[34.29093,31.24009],[34.26762,31.21894],[34.25915,31.22131],[34.231,31.26295],[34.21113,31.32157],[34.2434,31.34554],[34.29954,31.39629],[34.34172,31.43251],[34.36439,31.45715],[34.41099,31.50162],[34.42619,31.52686],[34.44463,31.54193],[34.49022,31.59487]]],terms_url:"https://wiki.openstreetmap.org/wiki/2014_Gaza_Strip",terms_text:"Copyright CNES 2014, Distribution Airbus Defence and Space"},{id:"gaza_pleiades_20140706_nir",name:"Gaza Strip - Pléiades - 2014/07/06 (NIR)",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/gaza_pleiades_20140706_nir/{zoom}/{x}/{y}",endDate:"2014-07-06T00:00:00.000Z",startDate:"2014-07-06T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[34.49022,31.59487],[34.49339,31.59263],[34.5678,31.5401],[34.5653,31.53226],[34.55613,31.52552],[34.54729,31.5121],[34.53011,31.5066],[34.5255,31.50251],[34.51369,31.50067],[34.505,31.49543],[34.4887,31.48263],[34.48532,31.48028],[34.47962,31.47778],[34.47471,31.47207],[34.4674,31.46448],[34.46576,31.46275],[34.45308,31.45139],[34.44585,31.4441],[34.44216,31.44327],[34.43798,31.44112],[34.43226,31.43458],[34.43164,31.43265],[34.4268,31.42804],[34.42211,31.42437],[34.41326,31.41862],[34.41329,31.41758],[34.41174,31.41604],[34.40918,31.41542],[34.4067,31.41295],[34.40506,31.41295],[34.40197,31.4112],[34.40134,31.40986],[34.39492,31.40391],[34.39351,31.40113],[34.38824,31.39599],[34.38037,31.38951],[34.38074,31.38791],[34.37407,31.37915],[34.37338,31.37422],[34.37159,31.37209],[34.37214,31.37093],[34.37158,31.36972],[34.3704,31.36909],[34.36827,31.36992],[34.36685,31.36914],[34.36497,31.36137],[34.37438,31.30609],[34.36708,31.29074],[34.34339,31.27846],[34.33119,31.26149],[34.31931,31.25317],[34.29093,31.24009],[34.26762,31.21894],[34.25915,31.22131],[34.231,31.26295],[34.21113,31.32157],[34.2434,31.34554],[34.29954,31.39629],[34.34172,31.43251],[34.36439,31.45715],[34.41099,31.50162],[34.42619,31.52686],[34.44463,31.54193],[34.49022,31.59487]]],terms_url:"https://wiki.openstreetmap.org/wiki/2014_Gaza_Strip",terms_text:"Copyright CNES 2014, Distribution Airbus Defence and Space"},{id:"Geobase_Hydrography",name:"Geobase Hydrography - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/hydro_network_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nhn:nhn&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]],overlay:true},{id:"Geobase_Hydrography_French",name:"Geobase Hydrography - French",type:"wms",template:"https://maps.geogratis.gc.ca/wms/hydro_network_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nhn:nhn&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]],overlay:true},{id:"Geobase_Roads",name:"Geobase Roads - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/roads_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=roads&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[4,20],polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"Geobase_Roads_French",name:"Geobase Roads - French",type:"wms",template:"https://cartes.geogratis.gc.ca/wms/roads_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=routes&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[4,20],polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"geoimage.at",name:"Geoimage.at MaxRes",type:"wms",template:"https://gis.bmlfuw.gv.at/wmsgw/?key=4d80de696cd562a63ce463a58a61488d&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=Luftbild_MR,Luftbild_1m,Luftbild_8m,Satellitenbild_30m&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"http://geoimage.at",terms_text:"geoimage.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/GeoimageatMaxRes.png"},{id:"Geolittoral-Orthophotos2000",name:"Géolittoral - Orthophotos 2000",type:"wms",template:"http://geolittoral.din.developpement-durable.gouv.fr/wxs?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortholittorale&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2000-01-01T00:00:00.000Z",startDate:"2000-01-01T00:00:00.000Z",polygon:[[[-1.07962,46.10959],[-0.94115,46.01474],[-0.56306,45.15178],[-0.7266,45.08425],[-0.87904,45.34094],[-0.99794,45.33779],[-0.95558,44.69982],[-1.15862,44.19865],[-1.21512,44.20558],[-1.24654,44.1162],[-1.27903,44.03937],[-1.28825,44.02304],[-1.32117,43.94094],[-1.32151,43.92296],[-1.3092,43.92337],[-1.3085,43.91439],[-1.28366,43.91514],[-1.28302,43.90624],[-1.2761,43.90655],[-1.28211,43.89254],[-1.30102,43.85159],[-1.30384,43.8424],[-1.30923,43.83498],[-1.33474,43.76946],[-1.34407,43.74875],[-1.3456,43.74214],[-1.34673,43.73688],[-1.43284,43.53152],[-1.42806,43.46812],[-1.60627,43.40591],[-1.6061,43.36012],[-1.77441,43.30357],[-1.82995,43.38484],[-1.58551,43.46856],[-1.35706,44.03374],[-1.40217,44.06461],[-1.33584,44.22832],[-1.21836,44.23033],[-1.16795,44.41097],[-1.30744,44.41847],[-1.16979,45.59107],[-1.48685,46.06042],[-1.36364,46.09146],[-1.60176,46.17019],[-1.64442,46.22375],[-1.58595,46.30426],[-1.51008,46.33888],[-1.75643,46.42214],[-2.1872,46.81857],[-2.16423,46.85534],[-2.23654,46.9337],[-2.39769,46.96718],[-2.282,47.07631],[-2.12563,47.01875],[-2.09013,47.06562],[-2.18487,47.10698],[-2.2647,47.10763],[-2.24489,47.18562],[-2.56779,47.24467],[-2.66727,47.46686],[-2.74787,47.47122],[-2.75771,47.43461],[-2.89321,47.4629],[-2.90369,47.50905],[-3.03383,47.53833],[-3.07113,47.51185],[-3.01653,47.49873],[-3.12502,47.42693],[-3.18803,47.48441],[-3.22791,47.61132],[-3.2967,47.63161],[-3.2876,47.67154],[-3.34074,47.66893],[-3.38912,47.59473],[-3.55087,47.63827],[-3.53384,47.72488],[-3.76577,47.76476],[-3.77595,47.7371],[-3.91168,47.75915],[-3.8959,47.79911],[-3.97236,47.81526],[-3.99722,47.7975],[-3.97956,47.76268],[-3.8945,47.72193],[-3.9162,47.67831],[-4.10163,47.70921],[-4.08989,47.78944],[-4.03798,47.79909],[-4.04125,47.83109],[-4.08765,47.84221],[-4.14781,47.82525],[-4.14314,47.78847],[-4.35162,47.7415],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.63576,48.07798],[-4.60147,48.11469],[-4.385,48.10962],[-4.38955,48.14543],[-4.30925,48.15009],[-4.31268,48.17694],[-4.46369,48.18468],[-4.49748,48.1453],[-4.5921,48.14758],[-4.57537,48.22488],[-4.67101,48.2331],[-4.65434,48.31049],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.81465,48.39413],[-4.83515,48.54319],[-4.63387,48.66373],[-3.96692,48.77978],[-3.94939,48.74715],[-3.6502,48.75356],[-3.65853,48.82527],[-3.53931,48.85834],[-3.54444,48.90297],[-3.40954,48.91866],[-3.40755,48.87366],[-3.02769,48.9275],[-2.67861,48.58841],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.80392,48.66126],[-1.61161,48.68582],[-1.71645,49.24781],[-1.8026,49.32721],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.17134,49.55412],[-1.27353,49.55245],[-1.1328,49.3934],[-0.93059,49.40804],[-0.74827,49.35976],[-0.38935,49.34167],[-0.24704,49.29995],[-0.12454,49.29353],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.4521,51.12144],[2.59286,51.12124],[2.60683,51.05779],[1.7976,50.89906],[1.66458,50.82379],[1.70786,50.1282],[1.05936,49.85],[0.61607,49.79062],[0.24731,49.65027],[0.1709,49.53174],[0.57065,49.49622],[0.41115,49.3396],[0.19504,49.35736],[0.01718,49.25479],[-0.24453,49.26312],[-0.38408,49.30495],[-0.74091,49.32438],[-0.9954,49.37133],[-1.05453,49.25175],[-1.27704,49.29022],[-1.25966,49.43463],[-1.39141,49.53985],[-1.27535,49.62056],[-1.29775,49.65946],[-1.4905,49.57139],[-1.77517,49.63398],[-1.74601,49.48155],[-1.51294,49.24691],[-1.48261,48.72607],[-1.30574,48.72531],[-1.28323,48.59731],[-2.76114,48.43471],[-3.00174,48.67646],[-3.21062,48.72097],[-3.95404,48.56051],[-4.15643,48.60792],[-4.44475,48.55852],[-4.63683,48.48299],[-4.6319,48.44727],[-4.25022,48.43088],[-4.06141,48.21805],[-4.1757,48.05165],[-4.31904,48.0141],[-4.26781,47.89977],[-3.88484,47.98172],[-3.76375,47.86403],[-2.32727,47.52634],[-2.36911,47.3339],[-1.74067,47.33507],[-1.77062,47.20451],[-2.03678,47.21942],[-2.0968,47.15548],[-1.88786,47.01239],[-2.08797,46.83007],[-2.01214,46.83436],[-1.84079,46.69651],[-1.87318,46.65484],[-1.68859,46.50392],[-1.62117,46.51513],[-1.42428,46.41675],[-1.01761,46.35917],[-1.07962,46.10959]],[[-2.41232,46.69242],[-2.37197,46.67611],[-2.26749,46.68033],[-2.27007,46.70705],[-2.29827,46.73286],[-2.41655,46.73711],[-2.41232,46.69242]],[[-3.06018,47.40542],[-2.82587,47.29635],[-2.78787,47.33417],[-3.02436,47.44563],[-3.06018,47.40542]],[[-3.26482,47.4295],[-3.3343,47.35928],[-3.29614,47.34133],[-3.31489,47.30057],[-3.19941,47.24492],[-3.16567,47.27751],[-3.08686,47.23612],[-3.00637,47.30855],[-3.26482,47.4295]],[[-1.93966,48.86346],[-1.93993,48.91179],[-1.701,48.91105],[-1.69726,48.86173],[-1.93966,48.86346]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral",terms_text:"Ortho littorale 2000"},{id:"Geolittoral-Sentiers",name:"Géolittoral - Sentiers",type:"wms",template:"http://geolittoral.din.developpement-durable.gouv.fr/wxs?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=n_sentier_littoral_l&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-0.98385,46.18807],[-0.89497,46.15628],[-0.93455,46.10163],[-0.84388,46.06949],[-0.88241,46.01637],[-0.53787,45.89558],[-0.63498,45.76444],[-0.86666,45.8479],[-0.76264,45.6245],[-0.69695,45.62659],[-0.69397,45.60184],[-0.68755,45.60174],[-0.688,45.50986],[-0.63799,45.50892],[-0.63978,45.44747],[-0.61574,45.44695],[-0.61619,45.38586],[-0.58544,45.38596],[-0.58529,45.32334],[-0.55379,45.32344],[-0.55275,45.19661],[-0.49094,45.19577],[-0.49184,45.13315],[-0.45661,45.13325],[-0.45512,45.07161],[-0.41611,45.07089],[-0.41621,45.02696],[-0.2907,44.98278],[-0.22,45.06771],[-0.12252,45.02563],[-0.18925,44.94591],[-0.09266,44.91019],[-0.14521,44.8392],[-0.15491,44.84238],[-0.19387,44.78678],[-0.43541,44.87317],[-0.39048,44.68413],[-0.58798,44.66014],[-0.66628,44.99129],[-0.77838,44.99263],[-0.77764,45.05389],[-0.81584,45.05321],[-0.81838,45.11962],[-0.88393,45.12051],[-0.88171,45.18081],[-0.93438,45.18185],[-0.9328,45.24484],[-1.00163,45.24439],[-1.00247,45.30827],[-1.0524,45.31013],[-1.04828,45.36911],[-1.06412,45.36911],[-1.05039,45.18252],[-1.10761,44.80787],[-1.01514,44.80113],[-1.01946,44.76914],[-0.93365,44.76149],[-0.9404,44.7018],[-0.96035,44.56434],[-1.01408,44.56765],[-1.09916,44.1456],[-1.22689,44.14022],[-1.21853,44.03249],[-1.30762,44.029],[-1.39572,43.74301],[-1.31296,43.72951],[-1.37439,43.53109],[-1.34589,43.50606],[-1.59964,43.35423],[-1.76549,43.25548],[-1.79281,43.28038],[-1.80281,43.40425],[-1.72832,43.45033],[-1.58531,43.489],[-1.33584,44.22832],[-1.30744,44.41847],[-1.22511,45.44416],[-1.48685,46.06042],[-1.60176,46.17019],[-1.64442,46.22375],[-1.75643,46.42214],[-2.03483,46.61895],[-2.3466,46.62382],[-2.46561,46.71196],[-2.3233,46.83812],[-2.45286,46.93856],[-2.31733,47.16214],[-2.92848,47.28413],[-2.96742,47.22147],[-3.35602,47.32474],[-3.18803,47.48441],[-3.22791,47.61132],[-3.38912,47.59473],[-3.9162,47.67831],[-4.10163,47.70921],[-4.14314,47.78847],[-4.37619,47.71067],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.60147,48.11469],[-4.5921,48.14758],[-4.67101,48.2331],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.83515,48.54319],[-4.63117,48.66129],[-3.96692,48.77978],[-3.94939,48.74715],[-3.67013,48.89508],[-3.54444,48.90297],[-3.40954,48.91866],[-3.33344,48.90458],[-3.02769,48.9275],[-2.80207,48.79793],[-2.69353,48.76722],[-2.45786,48.70896],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.7243,48.75828],[-1.70557,48.84512],[-1.90304,48.86288],[-1.91027,48.92348],[-1.68714,48.93249],[-1.74277,49.24473],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.18545,49.54836],[-0.96463,49.42509],[-0.74429,49.36802],[-0.39014,49.3622],[-0.24976,49.3158],[-0.13342,49.31293],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.59712,51.17355],[2.66071,51.0196],[2.07124,50.92022],[2.05937,50.94709],[1.7976,50.89906],[1.68089,50.8717],[1.65569,50.59729],[1.75357,50.5932],[1.72295,50.24702],[1.82156,50.24262],[1.80149,50.05116],[1.54565,50.06311],[1.54155,50.01267],[1.42462,50.01747],[1.42667,50.05276],[1.03838,49.84609],[0.9827,49.88916],[0.57961,49.82133],[0.42063,49.76297],[0.4281,49.75445],[0.20831,49.67269],[0.14765,49.57767],[0.13461,49.5809],[0.11117,49.54365],[0.56598,49.52045],[0.5632,49.49989],[0.63001,49.49666],[0.61478,49.37441],[0.54825,49.37851],[0.54254,49.33461],[0.45741,49.33938],[0.45843,49.34492],[0.32597,49.35456],[0.32846,49.38128],[0.28011,49.38433],[0.27689,49.36334],[0.21095,49.36658],[0.20817,49.35084],[0.14326,49.35532],[0.13769,49.3115],[0.07204,49.31532],[0.0675,49.28713],[0.00274,49.29076],[0.00508,49.25711],[-0.02027,49.26036],[-0.03492,49.1973],[-0.19448,49.21463],[-0.38966,49.12726],[-0.45369,49.18792],[-0.3561,49.23214],[-0.82088,49.28331],[-0.99778,49.30149],[-1.16728,49.24545],[-1.19515,49.28183],[-1.26768,49.24099],[-1.34114,49.2975],[-1.24768,49.35025],[-1.44583,49.60689],[-1.81105,49.61757],[-1.77479,49.44333],[-1.72775,49.46509],[-1.5339,49.29098],[-1.47909,49.29233],[-1.47608,49.24027],[-1.43557,49.20326],[-1.47225,49.1822],[-1.45091,48.75725],[-1.31155,48.76408],[-1.30533,48.70216],[-1.2584,48.70421],[-1.25229,48.64353],[-1.23519,48.64435],[-1.2269,48.56824],[-1.85218,48.53086],[-1.84908,48.4975],[-1.92326,48.49187],[-1.92813,48.44096],[-2.04272,48.43601],[-2.03889,48.48191],[-2.2895,48.46102],[-2.3021,48.52433],[-2.40863,48.51618],[-2.42035,48.56954],[-2.43084,48.57852],[-2.49083,48.54924],[-2.47353,48.53326],[-2.54978,48.49647],[-2.54005,48.48747],[-2.70681,48.40746],[-3.02979,48.69115],[-4.01034,48.53179],[-4.05342,48.64412],[-4.38281,48.57349],[-4.35482,48.5118],[-4.38853,48.50473],[-4.13495,48.44868],[-4.16411,48.38936],[-4.01832,48.35685],[-4.04733,48.29918],[-3.98814,48.2867],[-4.0214,48.21606],[-4.03634,48.21958],[-4.06623,48.16028],[-4.16675,48.18247],[-4.18331,48.14934],[-4.17232,48.1065],[-4.20111,48.10285],[-4.18643,48.04389],[-4.18806,48.04061],[-4.35686,48.02305],[-4.25657,47.93997],[-4.23363,47.93497],[-4.21371,47.97598],[-4.21854,47.97726],[-4.1806,48.05569],[-3.6172,47.93124],[-2.17991,47.58642],[-2.25449,47.44501],[-2.30182,47.4568],[-2.32043,47.42092],[-2.30372,47.41755],[-2.34753,47.33499],[-2.36219,47.33837],[-2.38079,47.3039],[-2.35852,47.29854],[-2.29962,47.29784],[-2.29742,47.3618],[-2.13199,47.35852],[-2.13478,47.39107],[-2.01565,47.39623],[-2.01404,47.38095],[-1.92862,47.38254],[-1.92891,47.37956],[-1.8322,47.38184],[-1.82986,47.34165],[-1.73608,47.34304],[-1.73418,47.305],[-1.64084,47.30639],[-1.64011,47.29427],[-1.58355,47.29566],[-1.58531,47.33708],[-1.4612,47.33966],[-1.46003,47.32924],[-1.37211,47.33221],[-1.36054,47.11239],[-1.48567,47.11149],[-1.48582,47.11877],[-1.66897,47.11688],[-1.66971,47.12864],[-1.72553,47.12764],[-1.72612,47.13761],[-1.93975,47.13263],[-1.94019,47.1422],[-1.9925,47.14309],[-1.81066,47.00588],[-1.94723,46.92078],[-1.92891,46.90677],[-1.99529,46.86461],[-1.73652,46.66839],[-1.77535,46.64386],[-1.82678,46.64174],[-1.82473,46.62071],[-1.18192,46.39987],[-0.91261,46.3048],[-0.95481,46.2489],[-0.94235,46.24424],[-0.98385,46.18807]],[[3.14769,42.40072],[3.14949,42.40015],[3.15305,42.40052],[3.15804,42.40243],[3.1877,42.42805],[3.14227,42.5248],[3.06837,42.54635],[3.04884,42.6942],[3.0799,43.03073],[3.22641,43.18727],[3.40916,43.26032],[3.52104,43.25877],[3.66429,43.37628],[3.73841,43.39054],[4.00979,43.53607],[4.17692,43.45636],[4.54355,43.43349],[4.54943,43.35401],[4.83506,43.30891],[4.97506,43.38309],[5.03219,43.31928],[5.25919,43.31928],[5.31082,43.20504],[5.35682,43.18645],[5.36882,43.16785],[5.40232,43.16211],[5.41382,43.17123],[5.40919,43.19921],[5.54232,43.18827],[5.60582,43.14797],[5.6197,43.1529],[5.63832,43.17159],[5.67157,43.1674],[5.69095,43.13411],[5.77607,43.10637],[5.7762,43.09432],[5.75407,43.08328],[5.75707,43.0725],[5.77032,43.06465],[5.85933,43.03469],[5.8877,43.06273],[5.9567,43.06109],[5.96383,43.09277],[6.00033,43.09186],[6.01745,43.06849],[6.10233,43.07415],[6.10483,43.0526],[6.0666,43.04318],[6.06722,43.03785],[6.1427,43.00923],[6.15676,42.98715],[6.19635,42.97331],[6.22221,42.9801],[6.26891,42.99651],[6.25515,43.03627],[6.2019,43.02713],[6.18378,43.09188],[6.30153,43.09909],[6.32478,43.07974],[6.37778,43.08011],[6.38866,43.13395],[6.51341,43.14608],[6.57704,43.17881],[6.62291,43.14563],[6.69779,43.19969],[6.68016,43.23357],[6.72116,43.26007],[6.72241,43.27472],[6.67054,43.29192],[6.68741,43.33113],[6.72416,43.34267],[6.75291,43.409],[6.79104,43.39674],[6.90629,43.41672],[6.96767,43.50273],[6.96617,43.52812],[7.00617,43.53845],[7.03554,43.4982],[7.06892,43.5001],[7.09079,43.51642],[7.06267,43.53672],[7.08254,43.5456],[7.1238,43.53074],[7.1558,43.5437],[7.1433,43.62284],[7.16867,43.64636],[7.2138,43.63469],[7.25417,43.68497],[7.3403,43.66744],[7.36442,43.6894],[7.35305,43.7082],[7.4163,43.71091],[7.45405,43.74506],[7.4943,43.74524],[7.57943,43.78424],[7.60552,43.78603],[7.60368,43.78898],[7.59588,43.79528],[7.59628,43.79549],[7.53853,43.84195],[7.45996,43.79988],[7.44781,43.80934],[7.32353,43.74806],[7.30822,43.76357],[6.64878,43.3885],[6.66865,43.37178],[6.51003,43.27803],[6.56584,43.22509],[6.12681,43.10527],[5.48229,43.24939],[5.47267,43.2309],[5.41567,43.24657],[5.45267,43.3451],[4.80191,43.48158],[4.76416,43.39244],[4.65716,43.42368],[4.67228,43.45608],[4.43203,43.52419],[4.41453,43.49255],[4.16102,43.56433],[4.14452,43.57067],[4.14165,43.57393],[4.18677,43.59946],[4.10565,43.68196],[3.79689,43.52165],[3.77851,43.51313],[3.76464,43.50597],[3.76201,43.50334],[3.74226,43.49328],[3.71601,43.52075],[3.26213,43.28143],[3.24638,43.29735],[3.18388,43.28052],[3.10675,43.24083],[3.15475,43.19419],[2.90625,43.19383],[2.90675,42.76189],[2.94613,42.76208],[2.9465,42.61516],[2.99238,42.61497],[2.99238,42.5125],[3.041,42.51259],[3.04121,42.50093],[3.09086,42.50082],[3.14769,42.40072]],[[6.35945,43.02321],[6.42477,43.02444],[6.45244,43.03504],[6.46985,43.05461],[6.51121,43.05765],[6.52156,43.04318],[6.48364,43.02444],[6.47179,43.00725],[6.41178,42.9918],[6.39852,42.98048],[6.35178,42.99905],[6.35945,43.02321]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral",terms_text:"Ortho littorale 2000"},{id:"GeolittoralV2-Orthophotos",name:"Géolittoral V2 - Orthophotos 2011-2014",type:"wms",template:"http://geolittoral.din.developpement-durable.gouv.fr/wxs?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortholittorale_v2_rvb&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[-0.98385,46.18807],[-0.89497,46.15628],[-0.93455,46.10163],[-0.84388,46.06949],[-0.88241,46.01637],[-0.53787,45.89558],[-0.63498,45.76444],[-0.86666,45.8479],[-0.76264,45.6245],[-0.69695,45.62659],[-0.69397,45.60184],[-0.68755,45.60174],[-0.688,45.50986],[-0.63799,45.50892],[-0.63978,45.44747],[-0.61574,45.44695],[-0.61619,45.38586],[-0.58544,45.38596],[-0.58529,45.32334],[-0.55379,45.32344],[-0.55275,45.19661],[-0.49094,45.19577],[-0.49184,45.13315],[-0.45661,45.13325],[-0.45512,45.07161],[-0.41611,45.07089],[-0.41621,45.02696],[-0.2907,44.98278],[-0.22,45.06771],[-0.12252,45.02563],[-0.18925,44.94591],[-0.09266,44.91019],[-0.14521,44.8392],[-0.15491,44.84238],[-0.19387,44.78678],[-0.43541,44.87317],[-0.39048,44.68413],[-0.58798,44.66014],[-0.66628,44.99129],[-0.77838,44.99263],[-0.77764,45.05389],[-0.81584,45.05321],[-0.81838,45.11962],[-0.88393,45.12051],[-0.88171,45.18081],[-0.93438,45.18185],[-0.9328,45.24484],[-1.00163,45.24439],[-1.00247,45.30827],[-1.0524,45.31013],[-1.04828,45.36911],[-1.06412,45.36911],[-1.05039,45.18252],[-1.10761,44.80787],[-1.01514,44.80113],[-1.01946,44.76914],[-0.93365,44.76149],[-0.9404,44.7018],[-0.96035,44.56434],[-1.01408,44.56765],[-1.09916,44.1456],[-1.22689,44.14022],[-1.21853,44.03249],[-1.30762,44.029],[-1.39572,43.74301],[-1.31296,43.72951],[-1.37439,43.53109],[-1.34589,43.50606],[-1.59964,43.35423],[-1.76549,43.25548],[-1.79281,43.28038],[-1.80281,43.40425],[-1.72832,43.45033],[-1.58531,43.489],[-1.33584,44.22832],[-1.30744,44.41847],[-1.22511,45.44416],[-1.48685,46.06042],[-1.60176,46.17019],[-1.64442,46.22375],[-1.75643,46.42214],[-2.03483,46.61895],[-2.3466,46.62382],[-2.46561,46.71196],[-2.3233,46.83812],[-2.45286,46.93856],[-2.31733,47.16214],[-2.92848,47.28413],[-2.96742,47.22147],[-3.35602,47.32474],[-3.18803,47.48441],[-3.22791,47.61132],[-3.38912,47.59473],[-3.9162,47.67831],[-4.10163,47.70921],[-4.14314,47.78847],[-4.37619,47.71067],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.60147,48.11469],[-4.5921,48.14758],[-4.67101,48.2331],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.83515,48.54319],[-4.63117,48.66129],[-3.96692,48.77978],[-3.94939,48.74715],[-3.67013,48.89508],[-3.54444,48.90297],[-3.40954,48.91866],[-3.33344,48.90458],[-3.02769,48.9275],[-2.80207,48.79793],[-2.69353,48.76722],[-2.45786,48.70896],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.7243,48.75828],[-1.70557,48.84512],[-1.90304,48.86288],[-1.91027,48.92348],[-1.68714,48.93249],[-1.74277,49.24473],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.18545,49.54836],[-0.96463,49.42509],[-0.74429,49.36802],[-0.39014,49.3622],[-0.24976,49.3158],[-0.13342,49.31293],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.59712,51.17355],[2.66071,51.0196],[2.07124,50.92022],[2.05937,50.94709],[1.7976,50.89906],[1.68089,50.8717],[1.65569,50.59729],[1.75357,50.5932],[1.72295,50.24702],[1.82156,50.24262],[1.80149,50.05116],[1.54565,50.06311],[1.54155,50.01267],[1.42462,50.01747],[1.42667,50.05276],[1.03838,49.84609],[0.9827,49.88916],[0.57961,49.82133],[0.42063,49.76297],[0.4281,49.75445],[0.20831,49.67269],[0.14765,49.57767],[0.13461,49.5809],[0.11117,49.54365],[0.56598,49.52045],[0.5632,49.49989],[0.63001,49.49666],[0.61478,49.37441],[0.54825,49.37851],[0.54254,49.33461],[0.45741,49.33938],[0.45843,49.34492],[0.32597,49.35456],[0.32846,49.38128],[0.28011,49.38433],[0.27689,49.36334],[0.21095,49.36658],[0.20817,49.35084],[0.14326,49.35532],[0.13769,49.3115],[0.07204,49.31532],[0.0675,49.28713],[0.00274,49.29076],[0.00508,49.25711],[-0.02027,49.26036],[-0.03492,49.1973],[-0.19448,49.21463],[-0.38966,49.12726],[-0.45369,49.18792],[-0.3561,49.23214],[-0.82088,49.28331],[-0.99778,49.30149],[-1.16728,49.24545],[-1.19515,49.28183],[-1.26768,49.24099],[-1.34114,49.2975],[-1.24768,49.35025],[-1.44583,49.60689],[-1.81105,49.61757],[-1.77479,49.44333],[-1.72775,49.46509],[-1.5339,49.29098],[-1.47909,49.29233],[-1.47608,49.24027],[-1.43557,49.20326],[-1.47225,49.1822],[-1.45091,48.75725],[-1.31155,48.76408],[-1.30533,48.70216],[-1.2584,48.70421],[-1.25229,48.64353],[-1.23519,48.64435],[-1.2269,48.56824],[-1.85218,48.53086],[-1.84908,48.4975],[-1.92326,48.49187],[-1.92813,48.44096],[-2.04272,48.43601],[-2.03889,48.48191],[-2.2895,48.46102],[-2.3021,48.52433],[-2.40863,48.51618],[-2.42035,48.56954],[-2.43084,48.57852],[-2.49083,48.54924],[-2.47353,48.53326],[-2.54978,48.49647],[-2.54005,48.48747],[-2.70681,48.40746],[-3.02979,48.69115],[-4.01034,48.53179],[-4.05342,48.64412],[-4.38281,48.57349],[-4.35482,48.5118],[-4.38853,48.50473],[-4.13495,48.44868],[-4.16411,48.38936],[-4.01832,48.35685],[-4.04733,48.29918],[-3.98814,48.2867],[-4.0214,48.21606],[-4.03634,48.21958],[-4.06623,48.16028],[-4.16675,48.18247],[-4.18331,48.14934],[-4.17232,48.1065],[-4.20111,48.10285],[-4.18643,48.04389],[-4.18806,48.04061],[-4.35686,48.02305],[-4.25657,47.93997],[-4.23363,47.93497],[-4.21371,47.97598],[-4.21854,47.97726],[-4.1806,48.05569],[-3.6172,47.93124],[-2.17991,47.58642],[-2.25449,47.44501],[-2.30182,47.4568],[-2.32043,47.42092],[-2.30372,47.41755],[-2.34753,47.33499],[-2.36219,47.33837],[-2.38079,47.3039],[-2.35852,47.29854],[-2.29962,47.29784],[-2.29742,47.3618],[-2.13199,47.35852],[-2.13478,47.39107],[-2.01565,47.39623],[-2.01404,47.38095],[-1.92862,47.38254],[-1.92891,47.37956],[-1.8322,47.38184],[-1.82986,47.34165],[-1.73608,47.34304],[-1.73418,47.305],[-1.64084,47.30639],[-1.64011,47.29427],[-1.58355,47.29566],[-1.58531,47.33708],[-1.4612,47.33966],[-1.46003,47.32924],[-1.37211,47.33221],[-1.36054,47.11239],[-1.48567,47.11149],[-1.48582,47.11877],[-1.66897,47.11688],[-1.66971,47.12864],[-1.72553,47.12764],[-1.72612,47.13761],[-1.93975,47.13263],[-1.94019,47.1422],[-1.9925,47.14309],[-1.81066,47.00588],[-1.94723,46.92078],[-1.92891,46.90677],[-1.99529,46.86461],[-1.73652,46.66839],[-1.77535,46.64386],[-1.82678,46.64174],[-1.82473,46.62071],[-1.18192,46.39987],[-0.91261,46.3048],[-0.95481,46.2489],[-0.94235,46.24424],[-0.98385,46.18807]],[[3.14769,42.40072],[3.14949,42.40015],[3.15305,42.40052],[3.15804,42.40243],[3.1877,42.42805],[3.14227,42.5248],[3.06837,42.54635],[3.04884,42.6942],[3.0799,43.03073],[3.22641,43.18727],[3.40916,43.26032],[3.52104,43.25877],[3.66429,43.37628],[3.73841,43.39054],[4.00979,43.53607],[4.17692,43.45636],[4.54355,43.43349],[4.54943,43.35401],[4.83506,43.30891],[4.97506,43.38309],[5.03219,43.31928],[5.25919,43.31928],[5.31082,43.20504],[5.35682,43.18645],[5.36882,43.16785],[5.40232,43.16211],[5.41382,43.17123],[5.40919,43.19921],[5.54232,43.18827],[5.60582,43.14797],[5.6197,43.1529],[5.63832,43.17159],[5.67157,43.1674],[5.69095,43.13411],[5.77607,43.10637],[5.7762,43.09432],[5.75407,43.08328],[5.75707,43.0725],[5.77032,43.06465],[5.85933,43.03469],[5.8877,43.06273],[5.9567,43.06109],[5.96383,43.09277],[6.00033,43.09186],[6.01745,43.06849],[6.10233,43.07415],[6.10483,43.0526],[6.0666,43.04318],[6.06722,43.03785],[6.1427,43.00923],[6.15676,42.98715],[6.19635,42.97331],[6.22221,42.9801],[6.26891,42.99651],[6.25515,43.03627],[6.2019,43.02713],[6.18378,43.09188],[6.30153,43.09909],[6.32478,43.07974],[6.37778,43.08011],[6.38866,43.13395],[6.51341,43.14608],[6.57704,43.17881],[6.62291,43.14563],[6.69779,43.19969],[6.68016,43.23357],[6.72116,43.26007],[6.72241,43.27472],[6.67054,43.29192],[6.68741,43.33113],[6.72416,43.34267],[6.75291,43.409],[6.79104,43.39674],[6.90629,43.41672],[6.96767,43.50273],[6.96617,43.52812],[7.00617,43.53845],[7.03554,43.4982],[7.06892,43.5001],[7.09079,43.51642],[7.06267,43.53672],[7.08254,43.5456],[7.1238,43.53074],[7.1558,43.5437],[7.1433,43.62284],[7.16867,43.64636],[7.2138,43.63469],[7.25417,43.68497],[7.3403,43.66744],[7.36442,43.6894],[7.35305,43.7082],[7.4163,43.71091],[7.45405,43.74506],[7.4943,43.74524],[7.57943,43.78424],[7.60552,43.78603],[7.60368,43.78898],[7.59588,43.79528],[7.59628,43.79549],[7.53853,43.84195],[7.45996,43.79988],[7.44781,43.80934],[7.32353,43.74806],[7.30822,43.76357],[6.64878,43.3885],[6.66865,43.37178],[6.51003,43.27803],[6.56584,43.22509],[6.12681,43.10527],[5.48229,43.24939],[5.47267,43.2309],[5.41567,43.24657],[5.45267,43.3451],[4.80191,43.48158],[4.76416,43.39244],[4.65716,43.42368],[4.67228,43.45608],[4.43203,43.52419],[4.41453,43.49255],[4.16102,43.56433],[4.14452,43.57067],[4.14165,43.57393],[4.18677,43.59946],[4.10565,43.68196],[3.79689,43.52165],[3.77851,43.51313],[3.76464,43.50597],[3.76201,43.50334],[3.74226,43.49328],[3.71601,43.52075],[3.26213,43.28143],[3.24638,43.29735],[3.18388,43.28052],[3.10675,43.24083],[3.15475,43.19419],[2.90625,43.19383],[2.90675,42.76189],[2.94613,42.76208],[2.9465,42.61516],[2.99238,42.61497],[2.99238,42.5125],[3.041,42.51259],[3.04121,42.50093],[3.09086,42.50082],[3.14769,42.40072]],[[6.35945,43.02321],[6.42477,43.02444],[6.45244,43.03504],[6.46985,43.05461],[6.51121,43.05765],[6.52156,43.04318],[6.48364,43.02444],[6.47179,43.00725],[6.41178,42.9918],[6.39852,42.98048],[6.35178,42.99905],[6.35945,43.02321]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral",terms_text:"Ortho Littorale V2 - MEDDE"},{id:"lu.geoportail.opendata.ortho_10cm_proto_lidar",name:"geoportail.lu LIDAR prototype Nordstad 2017",type:"tms",template:"https://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_10cm_proto_lidar/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2017-04-09T00:00:00.000Z",startDate:"2017-04-09T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[6.05001,49.82175],[6.04979,49.91166],[6.18901,49.91172],[6.18897,49.82181],[6.05001,49.82175]]],terms_url:"https://act.public.lu/fr/cartographie/lidar",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"Geoportal2-PL-aerial_image",name:"Geoportal 2: Orthophotomap (aerial image)",type:"wms",template:"http://mapy.geoportal.gov.pl/wss/service/img/guest/ORTO/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Raster&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}{header(User-Agent,Mozilla/5.0 (JOSM)}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"https://geoportal.gov.pl/web/guest/regulamin",terms_text:"Główny Urząd Geodezji i Kartografii",best:true,icon:"https://wiki.openstreetmap.org/w/images/2/25/Geoportal-josm.png"},{id:"Geoportal2-PL-prng",name:"Geoportal 2: PRNG (geo names)",type:"wms",template:"http://mapy.geoportal.gov.pl/wss/service/pub/guest/G2_PRNG_WMS/MapServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=PozostaleObiektyFizjograficzne,Hydrografia,PozostaleMiejscowosci,Wies,UksztaltowanieTerenu&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}{header(User-Agent,Mozilla/5.0 (JOSM)}",projection:"EPSG:4326",polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"http://www.codgik.gov.pl/index.php/darmowe-dane/prng.html",terms_text:"Centralny Ośrodek Dokumentacji Geodezyjnej i Kartograficznej",icon:"https://wiki.openstreetmap.org/w/images/2/25/Geoportal-josm.png",overlay:true},{id:"Geoportal-PL-aerial_image",name:"Geoportal.gov.pl (Orthophotomap)",type:"tms",template:"https://wms.misek.pl/geoportal.orto/tms/{zoom}/{x}/{y}",zoomExtent:[6,24],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_text:"Copyright © Główny Urząd Geodezji i Kartografii.",best:true,icon:"https://i.imgur.com/aFlvMpM.png"},{id:"girau_do_pnciano",name:"Girau do Ponciano",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Girau%20do%20Ponciano&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.78013,-9.92939],[-36.78087,-9.83892],[-36.87233,-9.83917],[-36.87173,-9.90542],[-36.87037,-9.92989],[-36.86156,-9.92994],[-36.85566,-9.92981],[-36.85146,-9.92973],[-36.84575,-9.92977],[-36.83213,-9.92967],[-36.81456,-9.9296],[-36.78013,-9.92939]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Gliwice-buildings",name:"Gliwice: Buildings",type:"wms",template:"http://185.60.246.14:9090/isdp/gs/ows?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=default:EGIB_budynek,default:pkt_adr&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.57376,50.34828],[18.58723,50.35464],[18.58421,50.3601],[18.59264,50.37522],[18.65228,50.38297],[18.67384,50.37675],[18.67672,50.36174],[18.69218,50.34467],[18.70805,50.33799],[18.74154,50.3391],[18.75145,50.33046],[18.74679,50.31236],[18.75512,50.30193],[18.76358,50.29989],[18.76539,50.26873],[18.744,50.26541],[18.73482,50.25377],[18.72775,50.22843],[18.71439,50.22835],[18.71426,50.21978],[18.67522,50.21969],[18.67607,50.22562],[18.65098,50.23169],[18.6288,50.22539],[18.61744,50.24044],[18.62699,50.24369],[18.6315,50.25487],[18.61406,50.2576],[18.60319,50.25206],[18.56536,50.24763],[18.54841,50.2492],[18.55857,50.2826],[18.5459,50.29947],[18.52896,50.33687],[18.55118,50.35332],[18.57376,50.34828]]],terms_text:"Urząd Miasta Gliwice"},{id:"GRAFCAN-Canary_Islands",name:"GRAFCAN - Canary Islands",type:"wms",template:"https://idecan1.grafcan.es/ServicioWMS/OrtoUrb?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OU&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[-17.92917,28.89106],[-18.03334,28.79981],[-18.03743,28.73178],[-17.87811,28.43224],[-17.83113,28.41787],[-17.72696,28.56328],[-17.73105,28.67982],[-17.68407,28.73715],[-17.75352,28.86781],[-17.85768,28.86065],[-17.92917,28.89106]],[[-18.07818,27.77211],[-18.13707,27.78751],[-18.17054,27.76441],[-18.1779,27.70695],[-18.15782,27.68799],[-18.0581,27.6791],[-18.00656,27.62574],[-17.96105,27.62218],[-17.93896,27.70814],[-17.90751,27.7194],[-17.86199,27.80468],[-17.8727,27.84079],[-17.92558,27.86801],[-18.00522,27.83605],[-18.01392,27.8035],[-18.07818,27.77211]],[[-17.26878,28.23996],[-17.33403,28.21933],[-17.36331,28.1537],[-17.36666,28.08803],[-17.33069,28.04742],[-17.27296,28.00681],[-17.20017,28.00533],[-17.14412,28.02896],[-17.07803,28.0836],[-17.08723,28.1537],[-17.1826,28.2149],[-17.26878,28.23996]],[[-16.9358,28.37623],[-16.945,28.33574],[-16.71995,27.98317],[-16.62541,27.98317],[-16.52753,28.01641],[-16.39953,28.14632],[-16.33594,28.30922],[-16.33009,28.36445],[-16.10253,28.52408],[-16.09834,28.5814],[-16.14268,28.62547],[-16.33929,28.59609],[-16.43801,28.53143],[-16.53924,28.44025],[-16.83959,28.41229],[-16.9358,28.37623]],[[-15.68833,28.20585],[-15.47395,28.16437],[-15.42427,28.21046],[-15.36283,28.17244],[-15.38375,28.05598],[-15.33146,27.98444],[-15.3576,27.8042],[-15.5916,27.69777],[-15.7001,27.73365],[-15.79944,27.80305],[-15.87134,27.92439],[-15.84781,28.03637],[-15.74716,28.08943],[-15.73147,28.18396],[-15.68833,28.20585]],[[-14.50882,28.13448],[-14.41078,28.13448],[-14.24868,28.24278],[-14.23822,28.34637],[-14.03953,28.73911],[-13.89442,28.78265],[-13.78592,28.77692],[-13.82122,28.38433],[-13.91534,28.19095],[-14.18593,28.13563],[-14.30881,28.00529],[-14.54019,28.05144],[-14.50882,28.13448]],[[-13.5525,29.37727],[-13.50868,29.36824],[-13.47955,29.38728],[-13.47543,29.40963],[-13.5003,29.42807],[-13.5505,29.40712],[-13.5525,29.37727]],[[-13.3976,29.16102],[-13.42814,29.12157],[-13.44174,28.99084],[-13.53899,28.91947],[-13.70841,28.88468],[-13.77116,28.80865],[-13.90083,28.83522],[-13.90711,28.88926],[-13.85796,28.93686],[-13.85691,29.03657],[-13.67599,29.14988],[-13.56723,29.15719],[-13.55428,29.35073],[-13.39988,29.21806],[-13.3976,29.16102]],[[-13.33792,29.28667],[-13.35035,29.27436],[-13.3386,29.26533],[-13.32617,29.27765],[-13.33792,29.28667]]],terms_text:"GRAFCAN OrtoExpress Urbana 2009"},{id:"GRAFCAN_Express-Canary_Islands",name:"GRAFCAN Express - Canary Islands",type:"wms",template:"https://idecan1.grafcan.es/ServicioWMS/OrtoExpress?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=ortoexpress&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[-17.92917,28.89106],[-18.03334,28.79981],[-18.03743,28.73178],[-17.87811,28.43224],[-17.83113,28.41787],[-17.72696,28.56328],[-17.73105,28.67982],[-17.68407,28.73715],[-17.75352,28.86781],[-17.85768,28.86065],[-17.92917,28.89106]],[[-18.07818,27.77211],[-18.13707,27.78751],[-18.17054,27.76441],[-18.1779,27.70695],[-18.15782,27.68799],[-18.0581,27.6791],[-18.00656,27.62574],[-17.96105,27.62218],[-17.93896,27.70814],[-17.90751,27.7194],[-17.86199,27.80468],[-17.8727,27.84079],[-17.92558,27.86801],[-18.00522,27.83605],[-18.01392,27.8035],[-18.07818,27.77211]],[[-17.26878,28.23996],[-17.33403,28.21933],[-17.36331,28.1537],[-17.36666,28.08803],[-17.33069,28.04742],[-17.27296,28.00681],[-17.20017,28.00533],[-17.14412,28.02896],[-17.07803,28.0836],[-17.08723,28.1537],[-17.1826,28.2149],[-17.26878,28.23996]],[[-16.9358,28.37623],[-16.945,28.33574],[-16.71995,27.98317],[-16.62541,27.98317],[-16.52753,28.01641],[-16.39953,28.14632],[-16.33594,28.30922],[-16.33009,28.36445],[-16.10253,28.52408],[-16.09834,28.5814],[-16.14268,28.62547],[-16.33929,28.59609],[-16.43801,28.53143],[-16.53924,28.44025],[-16.83959,28.41229],[-16.9358,28.37623]],[[-15.68833,28.20585],[-15.47395,28.16437],[-15.42427,28.21046],[-15.36283,28.17244],[-15.38375,28.05598],[-15.33146,27.98444],[-15.3576,27.8042],[-15.5916,27.69777],[-15.7001,27.73365],[-15.79944,27.80305],[-15.87134,27.92439],[-15.84781,28.03637],[-15.74716,28.08943],[-15.73147,28.18396],[-15.68833,28.20585]],[[-14.50882,28.13448],[-14.41078,28.13448],[-14.24868,28.24278],[-14.23822,28.34637],[-14.03953,28.73911],[-13.89442,28.78265],[-13.78592,28.77692],[-13.82122,28.38433],[-13.91534,28.19095],[-14.18593,28.13563],[-14.30881,28.00529],[-14.54019,28.05144],[-14.50882,28.13448]],[[-13.5525,29.37727],[-13.50868,29.36824],[-13.47955,29.38728],[-13.47543,29.40963],[-13.5003,29.42807],[-13.5505,29.40712],[-13.5525,29.37727]],[[-13.3976,29.16102],[-13.42814,29.12157],[-13.44174,28.99084],[-13.53899,28.91947],[-13.70841,28.88468],[-13.77116,28.80865],[-13.90083,28.83522],[-13.90711,28.88926],[-13.85796,28.93686],[-13.85691,29.03657],[-13.67599,29.14988],[-13.56723,29.15719],[-13.55428,29.35073],[-13.39988,29.21806],[-13.3976,29.16102]],[[-13.33792,29.28667],[-13.35035,29.27436],[-13.3386,29.26533],[-13.32617,29.27765],[-13.33792,29.28667]]],terms_text:"GRAFCAN OrtoExpress"},{id:"GrandNancy_Orthophotographie_2012",name:"GrandNancy - Orthophoto - 2012",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/nancy_2012/{zoom}/{x}/{y}",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[6.06066,48.60554],[6.29717,48.59923],[6.30611,48.74077],[6.06896,48.7471],[6.06066,48.60554]]],terms_url:"https://wiki.openstreetmap.org/wiki/Nancy/Orthophotographie",terms_text:"GrandNancy Orthophotographie 2012"},{id:"GURS-buildings",name:"GURS: Building outlines",type:"tms",template:"http://wms.openstreetmap.de/tms/GURS-building-outlines/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"http://egp.gu.gov.si/",terms_text:"CC-BY ©2018 Geodetska uprava Republike Slovenije (gu.gov.si).",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/GURSRoadlines.png",overlay:true},{id:"GURS-roads",name:"GURS: Road lines",type:"tms",template:"http://wms.openstreetmap.de/tms/GURS-road-lines/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"http://egp.gu.gov.si/",terms_text:"CC-BY ©2018 Geodetska uprava Republike Slovenije (gu.gov.si).",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/GURSRoadlines.png",overlay:true},{id:"hamburg-20cm",name:"Hamburg (20 cm)",type:"wms",template:"https://geodienste.hamburg.de/HH_WMS_DOP20?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4826,53.9356],[8.48274,53.90924],[8.5275,53.90941],[8.52792,53.93577],[8.4826,53.9356]],[[9.77232,53.54352],[9.77434,53.55433],[9.76314,53.55521],[9.73047,53.55787],[9.73465,53.56536],[9.75793,53.61828],[9.77129,53.63131],[9.7707,53.61607],[9.79634,53.6103],[9.78993,53.60386],[9.81817,53.58591],[9.83773,53.59198],[9.84498,53.59498],[9.85416,53.59805],[9.86814,53.6093],[9.86931,53.61323],[9.88505,53.62199],[9.88697,53.6252],[9.89356,53.63026],[9.89637,53.63122],[9.89688,53.63492],[9.90678,53.65231],[9.93115,53.65262],[9.94552,53.65276],[9.95024,53.65085],[9.95155,53.65065],[9.97795,53.64887],[9.98492,53.6483],[9.98739,53.65072],[9.9996,53.68153],[10.02282,53.68157],[10.04338,53.68198],[10.05148,53.67759],[10.06925,53.67955],[10.0604,53.68833],[10.071,53.69585],[10.0707,53.70996],[10.08198,53.72044],[10.11908,53.71324],[10.16939,53.73896],[10.19369,53.731],[10.1779,53.70992],[10.15694,53.70451],[10.15829,53.68944],[10.14342,53.68057],[10.14176,53.67744],[10.14473,53.67613],[10.14643,53.67588],[10.14955,53.67545],[10.17153,53.66869],[10.19885,53.64675],[10.18973,53.63838],[10.22202,53.63349],[10.18887,53.61316],[10.19236,53.59474],[10.20117,53.58392],[10.15169,53.57619],[10.15067,53.56973],[10.148,53.5639],[10.15308,53.56242],[10.15942,53.56091],[10.15189,53.5417],[10.15465,53.53657],[10.16874,53.5374],[10.16327,53.52185],[10.16611,53.52013],[10.16919,53.51965],[10.18951,53.51148],[10.21043,53.51996],[10.21828,53.49923],[10.2367,53.49629],[10.25008,53.47898],[10.26592,53.47079],[10.29043,53.45512],[10.30962,53.44309],[10.31223,53.45229],[10.32514,53.44979],[10.30799,53.43332],[10.25598,53.41623],[10.25089,53.41024],[10.24578,53.40261],[10.24155,53.39797],[10.16555,53.39933],[10.14506,53.41614],[10.10949,53.42649],[10.1068,53.42658],[10.07581,53.45436],[10.05155,53.46394],[10.03517,53.4469],[10.01449,53.44203],[10.02294,53.43228],[9.99754,53.42546],[9.98243,53.41478],[9.97873,53.4142],[9.9581,53.42708],[9.92953,53.42007],[9.92552,53.41924],[9.90667,53.41596],[9.92305,53.43631],[9.91704,53.44664],[9.90436,53.45707],[9.89493,53.45583],[9.86885,53.44462],[9.86211,53.42942],[9.84872,53.44111],[9.80663,53.46648],[9.80021,53.47372],[9.8028,53.49383],[9.78203,53.49236],[9.76885,53.5053],[9.77107,53.52185],[9.78105,53.51838],[9.77352,53.52796],[9.77232,53.54352]]],terms_url:"https://www.hamburg.de/bsw/landesbetrieb-geoinformation-und-vermessung",terms_text:"Freie und Hansestadt Hamburg, Landesbetrieb Geoinformation und Vermessung"},{id:"Hamburg-DK5",name:"Hamburg (DK5)",type:"wms",template:"https://geodienste.hamburg.de/HH_WMS_DK5?FORMAT=image/png&TRANSPARENT=false&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4826,53.9356],[8.48274,53.90924],[8.5275,53.90941],[8.52792,53.93577],[8.4826,53.9356]],[[9.77232,53.54352],[9.77434,53.55433],[9.76314,53.55521],[9.73047,53.55787],[9.73465,53.56536],[9.75793,53.61828],[9.77129,53.63131],[9.7707,53.61607],[9.79634,53.6103],[9.78993,53.60386],[9.81817,53.58591],[9.83773,53.59198],[9.84498,53.59498],[9.85416,53.59805],[9.86814,53.6093],[9.86931,53.61323],[9.88505,53.62199],[9.88697,53.6252],[9.89356,53.63026],[9.89637,53.63122],[9.89688,53.63492],[9.90678,53.65231],[9.93115,53.65262],[9.94552,53.65276],[9.95024,53.65085],[9.95155,53.65065],[9.97795,53.64887],[9.98492,53.6483],[9.98739,53.65072],[9.9996,53.68153],[10.02282,53.68157],[10.04338,53.68198],[10.05148,53.67759],[10.06925,53.67955],[10.0604,53.68833],[10.071,53.69585],[10.0707,53.70996],[10.08198,53.72044],[10.11908,53.71324],[10.16939,53.73896],[10.19369,53.731],[10.1779,53.70992],[10.15694,53.70451],[10.15829,53.68944],[10.14342,53.68057],[10.14176,53.67744],[10.14473,53.67613],[10.14643,53.67588],[10.14955,53.67545],[10.17153,53.66869],[10.19885,53.64675],[10.18973,53.63838],[10.22202,53.63349],[10.18887,53.61316],[10.19236,53.59474],[10.20117,53.58392],[10.15169,53.57619],[10.15067,53.56973],[10.148,53.5639],[10.15308,53.56242],[10.15942,53.56091],[10.15189,53.5417],[10.15465,53.53657],[10.16874,53.5374],[10.16327,53.52185],[10.16611,53.52013],[10.16919,53.51965],[10.18951,53.51148],[10.21043,53.51996],[10.21828,53.49923],[10.2367,53.49629],[10.25008,53.47898],[10.26592,53.47079],[10.29043,53.45512],[10.30962,53.44309],[10.31223,53.45229],[10.32514,53.44979],[10.30799,53.43332],[10.25598,53.41623],[10.25089,53.41024],[10.24578,53.40261],[10.24155,53.39797],[10.16555,53.39933],[10.14506,53.41614],[10.10949,53.42649],[10.1068,53.42658],[10.07581,53.45436],[10.05155,53.46394],[10.03517,53.4469],[10.01449,53.44203],[10.02294,53.43228],[9.99754,53.42546],[9.98243,53.41478],[9.97873,53.4142],[9.9581,53.42708],[9.92953,53.42007],[9.92552,53.41924],[9.90667,53.41596],[9.92305,53.43631],[9.91704,53.44664],[9.90436,53.45707],[9.89493,53.45583],[9.86885,53.44462],[9.86211,53.42942],[9.84872,53.44111],[9.80663,53.46648],[9.80021,53.47372],[9.8028,53.49383],[9.78203,53.49236],[9.76885,53.5053],[9.77107,53.52185],[9.78105,53.51838],[9.77352,53.52796],[9.77232,53.54352]]],terms_url:"https://www.hamburg.de/bsw/landesbetrieb-geoinformation-und-vermessung",terms_text:"Freie und Hansestadt Hamburg, Landesbetrieb Geoinformation und Vermessung"},{id:"Hampshire-Aerial-FCIR",name:"Hampshire Aerial FCIR",type:"tms",template:"https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_fcir/{zoom}/{x}/{y}.png",endDate:"2014-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[8,20],polygon:[[[-1.31567,50.77809],[-1.49139,50.73027],[-1.57113,50.69041],[-1.68095,50.71748],[-1.69338,50.73484],[-1.69528,50.74065],[-1.68689,50.74999],[-1.71068,50.74812],[-1.7195,50.75261],[-1.746,50.74452],[-1.74845,50.75675],[-1.74287,50.76397],[-1.75101,50.77577],[-1.78525,50.76177],[-1.79911,50.77236],[-1.82256,50.77225],[-1.82678,50.78077],[-1.8225,50.79933],[-1.80732,50.80074],[-1.81566,50.80752],[-1.80889,50.81358],[-1.80579,50.83249],[-1.79816,50.83535],[-1.80649,50.84414],[-1.80988,50.86189],[-1.81378,50.85591],[-1.83052,50.85261],[-1.85271,50.85651],[-1.85655,50.86684],[-1.8492,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.82693,50.89939],[-1.82006,50.90492],[-1.82151,50.91691],[-1.81689,50.92412],[-1.84114,50.92886],[-1.87446,50.91441],[-1.91129,50.9439],[-1.92339,50.95917],[-1.95751,50.97575],[-1.9591,50.99152],[-1.94907,50.98649],[-1.92879,51.00055],[-1.88709,51.0026],[-1.87393,51.0097],[-1.8717,50.99083],[-1.85433,51.00786],[-1.83567,51.01238],[-1.81502,50.9899],[-1.80031,50.99457],[-1.75184,50.98133],[-1.71927,50.98047],[-1.69142,50.95943],[-1.66829,50.95041],[-1.6526,50.95029],[-1.63536,50.96269],[-1.62397,50.95903],[-1.6089,50.97686],[-1.62172,50.98099],[-1.63115,50.99984],[-1.60984,51.01225],[-1.60173,51.01042],[-1.60787,51.01582],[-1.6057,51.02271],[-1.63542,51.03176],[-1.63858,51.04126],[-1.63107,51.07819],[-1.64025,51.09201],[-1.6306,51.10359],[-1.63408,51.11099],[-1.63067,51.11652],[-1.64109,51.12237],[-1.66525,51.12546],[-1.65724,51.15539],[-1.67474,51.177],[-1.67213,51.18708],[-1.69679,51.20233],[-1.69247,51.21617],[-1.65288,51.22301],[-1.63564,51.22019],[-1.62395,51.24136],[-1.61402,51.24467],[-1.60741,51.25513],[-1.57717,51.25863],[-1.54443,51.24826],[-1.5384,51.25085],[-1.53436,51.25919],[-1.54345,51.25957],[-1.54007,51.27602],[-1.54596,51.28095],[-1.53591,51.28978],[-1.52595,51.28975],[-1.53093,51.29948],[-1.53008,51.3111],[-1.53628,51.31596],[-1.52986,51.34057],[-1.51552,51.34219],[-1.49498,51.33228],[-1.43599,51.33861],[-1.44759,51.3464],[-1.4463,51.35699],[-1.43056,51.35941],[-1.41608,51.37517],[-1.34899,51.37045],[-1.31472,51.37627],[-1.27555,51.3707],[-1.25116,51.37511],[-1.24118,51.36938],[-1.22209,51.37271],[-1.17602,51.36102],[-1.14321,51.36028],[-1.11875,51.36156],[-1.12096,51.36859],[-1.11678,51.3767],[-1.08363,51.38712],[-1.04754,51.36122],[-0.9904,51.36619],[-0.97264,51.36297],[-0.92376,51.36937],[-0.87681,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.81122,51.34418],[-0.78322,51.34084],[-0.76325,51.32721],[-0.76005,51.32013],[-0.74183,51.31112],[-0.72842,51.28238],[-0.72631,51.25653],[-0.73713,51.23126],[-0.74898,51.2277],[-0.77712,51.23901],[-0.80193,51.23628],[-0.80611,51.24056],[-0.82491,51.23137],[-0.82701,51.22315],[-0.84493,51.20998],[-0.82268,51.18268],[-0.83042,51.15022],[-0.81952,51.15047],[-0.80504,51.15847],[-0.79382,51.15491],[-0.78879,51.14141],[-0.77846,51.13664],[-0.77813,51.13063],[-0.76654,51.11946],[-0.74365,51.11491],[-0.74715,51.10131],[-0.75411,51.10116],[-0.75122,51.09547],[-0.75506,51.08987],[-0.75076,51.0852],[-0.7785,51.07715],[-0.78645,51.06467],[-0.79954,51.06078],[-0.82645,51.05881],[-0.83646,51.0664],[-0.84519,51.06052],[-0.8499,51.0436],[-0.89485,51.01978],[-0.89065,51.00194],[-0.90461,50.99327],[-0.91461,50.97806],[-0.91278,50.9708],[-0.93246,50.94278],[-0.92119,50.9232],[-0.93793,50.91615],[-0.95132,50.89178],[-0.92368,50.86513],[-0.92976,50.85365],[-0.92903,50.84245],[-0.94342,50.82191],[-0.9299,50.78445],[-0.93275,50.77435],[-0.95347,50.73682],[-1.31567,50.77809]]]},{id:"Hampshire-Aerial-RGB",name:"Hampshire Aerial RGB",type:"tms",template:"https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_rgb/{zoom}/{x}/{y}.png",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[8,20],polygon:[[[-1.31567,50.77809],[-1.49139,50.73027],[-1.57113,50.69041],[-1.68095,50.71748],[-1.69338,50.73484],[-1.69528,50.74065],[-1.68689,50.74999],[-1.71068,50.74812],[-1.7195,50.75261],[-1.746,50.74452],[-1.74845,50.75675],[-1.74287,50.76397],[-1.75101,50.77577],[-1.78525,50.76177],[-1.79911,50.77236],[-1.82256,50.77225],[-1.82678,50.78077],[-1.8225,50.79933],[-1.80732,50.80074],[-1.81566,50.80752],[-1.80889,50.81358],[-1.80579,50.83249],[-1.79816,50.83535],[-1.80649,50.84414],[-1.80988,50.86189],[-1.81378,50.85591],[-1.83052,50.85261],[-1.85271,50.85651],[-1.85655,50.86684],[-1.8492,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.82693,50.89939],[-1.82006,50.90492],[-1.82151,50.91691],[-1.81689,50.92412],[-1.84114,50.92886],[-1.87446,50.91441],[-1.91129,50.9439],[-1.92339,50.95917],[-1.95751,50.97575],[-1.9591,50.99152],[-1.94907,50.98649],[-1.92879,51.00055],[-1.88709,51.0026],[-1.87393,51.0097],[-1.8717,50.99083],[-1.85433,51.00786],[-1.83567,51.01238],[-1.81502,50.9899],[-1.80031,50.99457],[-1.75184,50.98133],[-1.71927,50.98047],[-1.69142,50.95943],[-1.66829,50.95041],[-1.6526,50.95029],[-1.63536,50.96269],[-1.62397,50.95903],[-1.6089,50.97686],[-1.62172,50.98099],[-1.63115,50.99984],[-1.60984,51.01225],[-1.60173,51.01042],[-1.60787,51.01582],[-1.6057,51.02271],[-1.63542,51.03176],[-1.63858,51.04126],[-1.63107,51.07819],[-1.64025,51.09201],[-1.6306,51.10359],[-1.63408,51.11099],[-1.63067,51.11652],[-1.64109,51.12237],[-1.66525,51.12546],[-1.65724,51.15539],[-1.67474,51.177],[-1.67213,51.18708],[-1.69679,51.20233],[-1.69247,51.21617],[-1.65288,51.22301],[-1.63564,51.22019],[-1.62395,51.24136],[-1.61402,51.24467],[-1.60741,51.25513],[-1.57717,51.25863],[-1.54443,51.24826],[-1.5384,51.25085],[-1.53436,51.25919],[-1.54345,51.25957],[-1.54007,51.27602],[-1.54596,51.28095],[-1.53591,51.28978],[-1.52595,51.28975],[-1.53093,51.29948],[-1.53008,51.3111],[-1.53628,51.31596],[-1.52986,51.34057],[-1.51552,51.34219],[-1.49498,51.33228],[-1.43599,51.33861],[-1.44759,51.3464],[-1.4463,51.35699],[-1.43056,51.35941],[-1.41608,51.37517],[-1.34899,51.37045],[-1.31472,51.37627],[-1.27555,51.3707],[-1.25116,51.37511],[-1.24118,51.36938],[-1.22209,51.37271],[-1.17602,51.36102],[-1.14321,51.36028],[-1.11875,51.36156],[-1.12096,51.36859],[-1.11678,51.3767],[-1.08363,51.38712],[-1.04754,51.36122],[-0.9904,51.36619],[-0.97264,51.36297],[-0.92376,51.36937],[-0.87681,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.81122,51.34418],[-0.78322,51.34084],[-0.76325,51.32721],[-0.76005,51.32013],[-0.74183,51.31112],[-0.72842,51.28238],[-0.72631,51.25653],[-0.73713,51.23126],[-0.74898,51.2277],[-0.77712,51.23901],[-0.80193,51.23628],[-0.80611,51.24056],[-0.82491,51.23137],[-0.82701,51.22315],[-0.84493,51.20998],[-0.82268,51.18268],[-0.83042,51.15022],[-0.81952,51.15047],[-0.80504,51.15847],[-0.79382,51.15491],[-0.78879,51.14141],[-0.77846,51.13664],[-0.77813,51.13063],[-0.76654,51.11946],[-0.74365,51.11491],[-0.74715,51.10131],[-0.75411,51.10116],[-0.75122,51.09547],[-0.75506,51.08987],[-0.75076,51.0852],[-0.7785,51.07715],[-0.78645,51.06467],[-0.79954,51.06078],[-0.82645,51.05881],[-0.83646,51.0664],[-0.84519,51.06052],[-0.8499,51.0436],[-0.89485,51.01978],[-0.89065,51.00194],[-0.90461,50.99327],[-0.91461,50.97806],[-0.91278,50.9708],[-0.93246,50.94278],[-0.92119,50.9232],[-0.93793,50.91615],[-0.95132,50.89178],[-0.92368,50.86513],[-0.92976,50.85365],[-0.92903,50.84245],[-0.94342,50.82191],[-0.9299,50.78445],[-0.93275,50.77435],[-0.95347,50.73682],[-1.31567,50.77809]]]},{id:"helsingborg-orto",name:"Helsingborg Orthophoto",type:"tms",template:"http://mapproxy.openstreetmap.se/tiles/1.0.0/hborg2016_EPSG3857/{zoom}/{x}/{y}.jpeg",zoomExtent:[5,20],polygon:[[[12.74345,55.94997],[12.93777,55.90804],[13.00369,55.96842],[12.79083,56.25022],[12.56698,56.1356],[12.74345,55.94997]]],terms_url:"https://helsingborg.opendatasoft.com/",terms_text:"© Helsingborg municipality",best:true,description:"Orthophotos from the municipality of Helsingborg 2016, public domain",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Helsingborg_vapen.svg/198px-Helsingborg_vapen.svg.png"},{id:"hri-orto",name:"Helsinki region orthophoto",type:"wms",template:"https://kartta.hsy.fi/geoserver/ows?SERVICE=WMS&FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=taustakartat_ja_aluejaot:Ortoilmakuva_2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[24.26948,59.8593],[24.26674,60.22549],[24.55307,60.36703],[24.50363,60.49038],[24.76387,60.60079],[25.00625,60.54175],[24.90051,60.38197],[24.9884,60.35073],[25.06943,60.44096],[25.17517,60.45248],[25.18066,60.34122],[25.27954,60.2943],[25.19577,60.08813],[24.26948,59.8593]]],terms_url:"https://hri.fi/data/en_GB/dataset/paakaupunkiseudun-ortokuva-2017",terms_text:"© Espoon, Helsingin ja Vantaan kaupungit, Kirkkonummen ja Nurmijärven kunnat sekä HSL ja HSY",best:true,description:"Ortophotos from the municipalities of Espoo, Helsinki, Vantaa, Kirkkonummi and Nurmijärvi + HSL and HSY",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/fi/hri_logo.png"},{id:"hu-hillshade",name:"Hillshade Hungary",type:"tms",template:"https://{switch:a,b,c}.map.turistautak.hu/tiles/shading/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[15,45],[24,45],[24,49],[15,49],[15,45]]],terms_text:"SRTM",overlay:true},{id:"IBGE_DF_Addresses",name:"IBGE Distrito Federal",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/wille/cirnnxni1000jg8nfppc8g7pm/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g",zoomExtent:[0,20],polygon:[[[-48.2444,-16.0508],[-48.2444,-15.5005],[-47.5695,-15.5005],[-47.5695,-16.0508],[-48.2444,-16.0508]]],terms_text:"IBGE",description:"Addresses data from IBGE",overlay:true},{id:"IBGE_Setores_Rurais",name:"IBGE Mapa de Setores Rurais",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.i00mo1kj/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",zoomExtent:[0,14],polygon:[[[-69.94793,-4.23168],[-69.45659,-1.49119],[-69.3973,-1.36508],[-69.42989,-1.22173],[-69.39523,-1.12555],[-69.44292,-1.03351],[-69.41861,-0.99827],[-69.528,-0.92514],[-69.52577,-0.86807],[-69.62491,-0.74667],[-69.56179,-0.63692],[-69.60783,-0.5008],[-69.8446,-0.33732],[-69.92054,-0.32573],[-70.04323,-0.18998],[-70.04302,0.56359],[-69.80272,0.57162],[-69.6711,0.66759],[-69.60529,0.61328],[-69.59701,0.6542],[-69.48002,0.73577],[-69.35277,0.61416],[-69.28914,0.64997],[-69.29484,0.60389],[-69.19975,0.60591],[-69.19425,0.64982],[-69.11563,0.64484],[-69.19001,0.74056],[-69.14881,0.76751],[-69.13576,0.87204],[-69.18846,0.91324],[-69.1646,0.94156],[-69.21679,0.97245],[-69.19773,0.99974],[-69.24494,1.05655],[-69.37641,1.08794],[-69.42312,1.04265],[-69.60989,1.09826],[-69.67718,1.06994],[-69.70963,1.11817],[-69.84266,1.07272],[-69.83972,1.71893],[-69.78236,1.69244],[-69.53464,1.77691],[-69.39109,1.72935],[-68.1645,1.72945],[-68.19207,1.7797],[-68.23954,1.77044],[-68.22688,1.82918],[-68.28555,1.83084],[-68.19583,2.03479],[-68.18033,1.9767],[-68.14417,1.97854],[-68.09043,1.89774],[-67.90162,1.81165],[-67.76942,2.00924],[-67.55095,2.04769],[-67.49519,2.16312],[-67.39404,2.22894],[-67.32672,2.06387],[-67.33083,1.94158],[-67.22831,1.84127],[-67.15384,1.8315],[-67.15922,1.67504],[-67.08017,1.38546],[-67.13923,1.32002],[-67.08675,1.16704],[-66.85119,1.22896],[-66.31032,0.74494],[-66.19737,0.78161],[-66.07783,0.76174],[-66.07024,0.8123],[-65.96712,0.81511],[-65.88369,0.94159],[-65.77261,0.95859],[-65.7421,1.00125],[-65.58894,1.00471],[-65.49624,0.87415],[-65.60623,0.70748],[-65.54116,0.64881],[-65.44499,0.68921],[-65.39213,0.75692],[-65.41198,0.82415],[-65.32734,0.93596],[-65.21302,0.90282],[-65.1749,0.94131],[-65.15831,1.1246],[-65.07232,1.15303],[-65.06317,1.11205],[-65.01361,1.10905],[-64.97445,1.20288],[-64.90439,1.25153],[-64.86966,1.22713],[-64.80053,1.31527],[-64.74446,1.22569],[-64.5789,1.34041],[-64.52608,1.44322],[-64.43586,1.47006],[-64.3939,1.52901],[-64.35111,1.52921],[-64.34777,1.49508],[-64.41019,1.40301],[-64.33791,1.36134],[-64.3136,1.45617],[-64.19707,1.52071],[-64.0735,1.64902],[-64.05781,1.92899],[-63.97219,1.99194],[-63.83555,1.96644],[-63.71155,2.04645],[-63.66501,2.01861],[-63.6268,2.11222],[-63.56474,2.13571],[-63.44059,2.126],[-63.36742,2.26864],[-63.37088,2.41121],[-63.42123,2.45102],[-63.46036,2.39684],[-63.56398,2.44573],[-63.76805,2.43994],[-63.84358,2.4916],[-64.01914,2.46135],[-64.0573,2.49752],[-63.98033,2.7237],[-64.07709,2.87262],[-64.07156,2.92142],[-64.12349,2.99048],[-64.15754,2.98243],[-64.14592,3.03459],[-64.22642,3.12356],[-64.19795,3.20121],[-64.2444,3.43036],[-64.17437,3.56841],[-64.281,3.70928],[-64.54357,3.85713],[-64.72239,4.11775],[-64.80203,4.17422],[-64.81123,4.27048],[-64.69522,4.25323],[-64.623,4.135],[-64.5565,4.10529],[-64.164,4.127],[-63.964,3.868],[-63.928,3.925],[-63.85,3.95],[-63.682,3.908],[-63.676,4.019],[-63.591,3.886],[-63.497,3.84],[-63.489,3.874],[-63.434,3.865],[-63.428,3.977],[-63.204,3.952],[-63.226,3.836],[-63.103,3.794],[-63.059,3.748],[-63.081,3.694],[-62.96,3.608],[-62.835,3.739],[-62.743,3.674],[-62.729,3.805],[-62.788,3.894],[-62.753,4.032],[-62.555,4.019],[-62.552,4.109],[-62.437,4.183],[-62.14308,4.07768],[-62.071,4.126],[-62.076,4.154],[-61.982,4.181],[-61.93175,4.12009],[-61.92213,4.16126],[-61.824,4.164],[-61.802,4.229],[-61.724,4.27],[-61.56,4.252],[-61.508,4.322],[-61.513,4.406],[-61.288,4.458],[-61.323,4.535],[-61.217,4.536],[-61.14559,4.48016],[-61.095,4.522],[-60.994,4.519],[-60.932,4.587],[-60.949,4.653],[-60.899,4.717],[-60.751,4.756],[-60.591,4.927],[-60.661,5.164],[-60.73197,5.21203],[-60.434,5.182],[-60.20825,5.28346],[-60.172,5.227],[-60.135,5.249],[-60.094,5.14],[-59.96984,5.06334],[-60.02524,4.7065],[-60.0705,4.61688],[-60.15725,4.57247],[-60.16114,4.51773],[-59.79503,4.46554],[-59.66948,4.37629],[-59.7319,4.28587],[-59.73069,4.18076],[-59.61818,4.13166],[-59.65406,4.06943],[-59.58417,3.96851],[-59.5153,3.94493],[-59.59279,3.88538],[-59.59631,3.79386],[-59.66555,3.78126],[-59.66842,3.70277],[-59.86728,3.57776],[-59.80205,3.50156],[-59.8408,3.43174],[-59.80488,3.35695],[-59.907,3.212],[-59.98944,2.88185],[-59.99,2.686],[-59.895,2.482],[-59.89872,2.36245],[-59.72315,2.27614],[-59.751,1.859],[-59.677,1.839],[-59.663,1.871],[-59.69,1.757],[-59.539,1.723],[-59.381,1.507],[-59.329,1.514],[-59.327,1.464],[-59.284,1.45],[-59.253,1.389],[-58.978,1.302],[-58.918,1.317],[-58.886,1.261],[-58.912,1.239],[-58.82512,1.17127],[-58.73956,1.1999],[-58.69456,1.29732],[-58.49622,1.26796],[-58.45787,1.37145],[-58.50511,1.40317],[-58.50873,1.46295],[-58.38559,1.46999],[-58.39472,1.52651],[-58.32237,1.59702],[-58.236,1.54669],[-58.16064,1.56011],[-58.12942,1.4989],[-58.00423,1.50303],[-57.99009,1.65844],[-57.85206,1.66782],[-57.77431,1.72973],[-57.70509,1.73093],[-57.65042,1.68237],[-57.5376,1.7005],[-57.50187,1.78609],[-57.43776,1.82681],[-57.43343,1.90598],[-57.36768,1.92372],[-57.36912,1.95638],[-57.30712,1.99665],[-57.22923,1.93759],[-57.08668,2.02644],[-57.01421,1.91489],[-56.91971,1.93036],[-56.79793,1.85336],[-56.72096,1.92582],[-56.62145,1.94588],[-56.57976,1.90588],[-56.45126,1.95614],[-56.24404,1.87808],[-56.1709,1.90048],[-56.11762,1.85097],[-55.95638,1.84509],[-55.90385,1.88803],[-55.93635,1.98647],[-55.9031,2.04108],[-56.00307,2.1676],[-56.05505,2.18464],[-56.04288,2.22778],[-56.13887,2.26574],[-56.09012,2.37228],[-56.02181,2.34247],[-55.97052,2.52931],[-55.76663,2.45524],[-55.71028,2.39917],[-55.49971,2.44324],[-55.38533,2.41836],[-55.32019,2.51537],[-55.23474,2.50338],[-55.1234,2.56762],[-55.10302,2.52564],[-54.95424,2.58359],[-54.86846,2.43989],[-54.68917,2.45389],[-54.68861,2.32472],[-54.54667,2.31833],[-54.53778,2.26556],[-54.46861,2.21306],[-54.24917,2.14667],[-54.18056,2.1725],[-54.11083,2.11222],[-54.06139,2.19167],[-53.94083,2.21917],[-53.93194,2.27194],[-53.88667,2.26778],[-53.745,2.37389],[-53.73389,2.31222],[-53.52972,2.24917],[-53.45861,2.2575],[-53.32833,2.35333],[-53.21667,2.25333],[-53.27899,2.18603],[-53.11861,2.2225],[-52.99472,2.17528],[-52.90972,2.19583],[-52.84722,2.28556],[-52.67528,2.37389],[-52.59444,2.47389],[-52.54028,2.57028],[-52.56417,2.63944],[-52.43944,2.87778],[-52.39583,2.90222],[-52.33187,3.16938],[-52.21472,3.26833],[-51.97104,3.70696],[-51.92148,3.72422],[-51.922,3.7792],[-51.79731,3.88888],[-51.77783,3.97406],[-51.65867,4.05276],[-51.61325,4.17437],[-51.63716,4.50834],[-51.49427,4.67426],[-51.11466,4.42286],[-50.94232,4.20165],[-50.85475,3.92491],[-50.85507,3.45573],[-50.75331,2.94057],[-50.29908,2.33079],[-49.73896,1.79143],[-48.23746,-0.07449],[-44.84728,-1.07246],[-43.54602,-2.04705],[-43.24389,-2.12403],[-42.78189,-2.33053],[-41.78084,-2.51859],[-41.5085,-2.68486],[-40.66365,-2.63829],[-40.50396,-2.57531],[-39.8907,-2.65328],[-39.15187,-3.04444],[-38.57151,-3.48047],[-38.34306,-3.54434],[-38.21421,-3.74103],[-38.12555,-3.80544],[-37.90182,-4.07265],[-37.77934,-4.18046],[-37.63401,-4.24454],[-37.51218,-4.41535],[-37.22122,-4.51045],[-37.07874,-4.71355],[-36.91716,-4.71372],[-36.62299,-4.85815],[-36.18969,-4.88505],[-35.93627,-4.83327],[-35.56471,-4.90758],[-35.33677,-4.99239],[-35.17659,-5.12497],[-34.79469,-6.33583],[-34.71587,-6.74615],[-34.62306,-6.90323],[-34.59953,-7.11133],[-34.64374,-7.98735],[-34.81497,-8.62472],[-35.0253,-9.13761],[-35.55848,-9.81261],[-35.69663,-9.90026],[-35.96401,-10.31281],[-36.06155,-10.37447],[-36.26639,-10.64593],[-36.61764,-10.81082],[-36.78725,-10.95151],[-36.99511,-11.29602],[-37.11368,-11.41261],[-37.46002,-12.10275],[-37.89668,-12.75844],[-38.22146,-13.09717],[-38.61146,-13.26537],[-38.85337,-14.65508],[-38.74388,-15.60089],[-38.66456,-15.74741],[-38.64697,-15.88327],[-38.8013,-16.24838],[-38.92933,-16.80775],[-38.53193,-17.80026],[-38.49171,-18.0046],[-38.53661,-18.09683],[-38.67053,-18.16855],[-39.35288,-18.10892],[-39.4675,-18.30359],[-39.54529,-18.78548],[-39.49227,-19.40134],[-39.63477,-19.74403],[-39.86353,-19.88681],[-40.17827,-20.75426],[-40.81442,-21.67672],[-40.76948,-21.87786],[-40.81442,-22.09702],[-41.5086,-22.52638],[-41.59666,-22.83627],[-41.79292,-23.08823],[-41.91484,-23.18527],[-43.19603,-23.26703],[-44.07735,-23.40501],[-45.13508,-24.12014],[-46.61368,-24.67512],[-47.85376,-25.47012],[-48.2801,-26.23036],[-48.34897,-26.75081],[-48.11076,-27.28208],[-48.21148,-27.85592],[-48.40713,-28.43255],[-48.68615,-28.76016],[-48.9156,-28.86305],[-49.1579,-29.02871],[-49.52748,-29.42005],[-49.82565,-29.86559],[-50.17344,-30.64282],[-50.60441,-31.24135],[-51.18785,-31.77646],[-51.74211,-32.10539],[-51.89236,-32.29596],[-52.06117,-32.38504],[-52.27087,-32.92102],[-52.45986,-33.25369],[-52.61505,-33.42291],[-53.18109,-33.86891],[-53.43053,-33.73947],[-53.43951,-33.69347],[-53.53228,-33.6888],[-53.51819,-33.15342],[-53.44438,-33.05296],[-53.24468,-32.93489],[-53.31008,-32.91875],[-53.29454,-32.89931],[-53.18496,-32.85043],[-53.14569,-32.79202],[-53.0858,-32.78835],[-53.07558,-32.74088],[-53.24992,-32.6041],[-53.39137,-32.58573],[-53.46423,-32.48446],[-53.58321,-32.45192],[-53.74599,-32.07848],[-53.83375,-32.05524],[-53.84978,-32.00064],[-53.96073,-31.95532],[-53.96972,-31.91765],[-54.10019,-31.92825],[-54.4549,-31.65295],[-54.4528,-31.59959],[-54.58676,-31.45656],[-54.8367,-31.442],[-54.88623,-31.3773],[-54.94087,-31.38068],[-55.00723,-31.26692],[-55.07446,-31.33216],[-55.24003,-31.26062],[-55.29118,-31.14226],[-55.34037,-31.13144],[-55.34981,-31.03922],[-55.42306,-31.01823],[-55.57742,-30.83309],[-55.65834,-30.864],[-55.66621,-30.95395],[-55.723,-30.943],[-55.727,-30.979],[-55.882,-31.077],[-56.00989,-31.08267],[-56.02241,-30.78565],[-56.12508,-30.73871],[-56.17074,-30.61517],[-56.26095,-30.58509],[-56.29193,-30.51967],[-56.38177,-30.49956],[-56.46126,-30.38486],[-56.54706,-30.35946],[-56.54115,-30.31291],[-56.6187,-30.30054],[-56.64628,-30.20346],[-56.77662,-30.1633],[-56.80777,-30.10301],[-57.07113,-30.08671],[-57.22081,-30.28928],[-57.31303,-30.25785],[-57.39229,-30.30474],[-57.46574,-30.26589],[-57.52431,-30.28569],[-57.56087,-30.21134],[-57.64744,-30.19483],[-57.48047,-30.12315],[-57.33713,-29.99284],[-57.294,-29.831],[-57.121,-29.765],[-56.89888,-29.53179],[-56.81905,-29.48816],[-56.76618,-29.37768],[-56.70164,-29.35913],[-56.59315,-29.12516],[-56.418,-29.075],[-56.40775,-28.9748],[-56.29995,-28.89614],[-56.29652,-28.8027],[-56.17858,-28.75922],[-56.00984,-28.60718],[-56.01249,-28.50873],[-55.88357,-28.47923],[-55.87739,-28.36159],[-55.75157,-28.37095],[-55.69433,-28.42204],[-55.67047,-28.33218],[-55.77415,-28.27414],[-55.7757,-28.24481],[-55.63167,-28.17719],[-55.60747,-28.11604],[-55.55957,-28.16523],[-55.4952,-28.07682],[-55.44611,-28.09787],[-55.368,-28.029],[-55.38299,-27.97948],[-55.343,-27.972],[-55.32706,-27.92664],[-55.26574,-27.92969],[-55.196,-27.856],[-55.133,-27.897],[-55.106,-27.846],[-55.035,-27.858],[-55.081,-27.779],[-54.936,-27.772],[-54.90617,-27.63871],[-54.85,-27.624],[-54.814,-27.533],[-54.775,-27.586],[-54.67926,-27.57394],[-54.67709,-27.508],[-54.621,-27.541],[-54.574,-27.453],[-54.5246,-27.5059],[-54.444,-27.472],[-54.47081,-27.42674],[-54.41,-27.405],[-54.35466,-27.46528],[-54.34067,-27.40311],[-54.28484,-27.44819],[-54.261,-27.397],[-54.21736,-27.38603],[-54.172,-27.254],[-54.15619,-27.29619],[-54.08872,-27.30149],[-54.01026,-27.19978],[-53.96219,-27.19698],[-53.95195,-27.15169],[-53.79879,-27.14629],[-53.80233,-27.04028],[-53.76087,-27.06543],[-53.78585,-27.02674],[-53.7473,-27.03218],[-53.7092,-26.93414],[-53.67125,-26.94222],[-53.69684,-26.86015],[-53.66059,-26.85814],[-53.75814,-26.72045],[-53.7205,-26.65099],[-53.75864,-26.64113],[-53.63739,-26.24968],[-53.742,-26.108],[-53.73409,-26.04333],[-53.83619,-25.97166],[-53.82214,-25.79377],[-53.89113,-25.62286],[-53.94895,-25.6117],[-53.95638,-25.64628],[-54.01,-25.567],[-54.07592,-25.55766],[-54.098,-25.619],[-54.099,-25.495],[-54.206,-25.541],[-54.178,-25.584],[-54.23,-25.562],[-54.25,-25.597],[-54.28,-25.556],[-54.38395,-25.59747],[-54.43288,-25.69756],[-54.4927,-25.6181],[-54.59354,-25.59275],[-54.61941,-25.45312],[-54.4295,-25.15915],[-54.43548,-24.94769],[-54.32437,-24.66059],[-54.32714,-24.47073],[-54.25877,-24.36377],[-54.34537,-24.14705],[-54.28223,-24.07336],[-54.43984,-23.90446],[-54.66978,-23.81262],[-54.70533,-23.86452],[-54.89,-23.898],[-54.924,-23.959],[-55.06223,-23.99335],[-55.107,-23.961],[-55.22907,-24.01383],[-55.30415,-23.96504],[-55.34542,-23.99458],[-55.41423,-23.9645],[-55.44167,-23.70084],[-55.47306,-23.64834],[-55.53989,-23.625],[-55.52356,-23.19733],[-55.54199,-23.1561],[-55.59635,-23.14993],[-55.66578,-22.85274],[-55.61432,-22.65521],[-55.72364,-22.55166],[-55.74302,-22.39266],[-55.78939,-22.3846],[-55.84304,-22.28725],[-56.20983,-22.27805],[-56.36485,-22.16949],[-56.39404,-22.07434],[-56.50711,-22.09561],[-56.63705,-22.26341],[-56.70344,-22.21693],[-56.72026,-22.26479],[-56.79344,-22.24238],[-56.84285,-22.30155],[-56.88343,-22.24755],[-56.9967,-22.22246],[-57.3744,-22.23204],[-57.5804,-22.17534],[-57.6106,-22.09462],[-57.70751,-22.09111],[-57.80183,-22.15072],[-57.99384,-22.09023],[-58.00946,-22.04038],[-57.91281,-21.88266],[-57.96603,-21.85045],[-57.90866,-21.77355],[-57.94714,-21.74413],[-57.88329,-21.68903],[-57.93436,-21.65037],[-57.91387,-21.59021],[-57.96795,-21.52432],[-57.8535,-21.33109],[-57.92019,-21.27655],[-57.85066,-21.22407],[-57.86834,-21.04417],[-57.81919,-20.94066],[-57.92836,-20.90036],[-57.8552,-20.83403],[-57.89863,-20.78872],[-57.96183,-20.7916],[-57.93478,-20.74565],[-57.86732,-20.73265],[-57.92414,-20.66392],[-57.98848,-20.69879],[-57.99847,-20.43551],[-58.09339,-20.35554],[-58.09596,-20.25445],[-58.16216,-20.25953],[-58.12152,-20.19246],[-58.16932,-20.1694],[-57.95347,-20.02094],[-57.90248,-20.04207],[-57.85796,-19.9703],[-58.131,-19.758],[-57.784,-19.033],[-57.694,-19.011],[-57.719,-18.899],[-57.766,-18.899],[-57.557,-18.24],[-57.453,-18.231],[-57.574,-18.131],[-57.72302,-17.83074],[-57.68472,-17.8306],[-57.70991,-17.72702],[-57.783,-17.639],[-57.73696,-17.5583],[-57.883,-17.449],[-57.996,-17.515],[-58.06,-17.45],[-58.116,-17.451],[-58.151,-17.384],[-58.263,-17.344],[-58.396,-17.181],[-58.423,-16.989],[-58.474,-16.935],[-58.47,-16.703],[-58.436,-16.592],[-58.333,-16.49],[-58.32227,-16.26559],[-58.388,-16.261],[-58.43059,-16.32264],[-60.17335,-16.26672],[-60.238,-15.473],[-60.57543,-15.09677],[-60.244,-15.096],[-60.272,-14.62],[-60.321,-14.608],[-60.492,-14.188],[-60.479,-14.097],[-60.38066,-13.9888],[-60.45062,-13.9364],[-60.45599,-13.85422],[-60.49068,-13.85782],[-60.46776,-13.79446],[-60.76755,-13.68329],[-60.87678,-13.62149],[-60.91857,-13.54334],[-61.0056,-13.552],[-61.0129,-13.48925],[-61.0938,-13.49081],[-61.10314,-13.53056],[-61.18155,-13.50557],[-61.19236,-13.53695],[-61.29954,-13.47718],[-61.46527,-13.55427],[-61.57927,-13.48711],[-61.852,-13.538],[-61.892,-13.431],[-61.96968,-13.40759],[-61.97592,-13.36695],[-62.11498,-13.25932],[-62.115,-13.163],[-62.15254,-13.15993],[-62.16703,-13.11346],[-62.19,-13.153],[-62.214,-13.111],[-62.27269,-13.15687],[-62.39178,-13.13471],[-62.453,-13.064],[-62.612,-13.041],[-62.65,-12.965],[-62.729,-13.02],[-62.779,-13.009],[-62.89672,-12.8539],[-63.01134,-12.83602],[-63.08186,-12.72323],[-63.06163,-12.68584],[-63.15726,-12.6138],[-63.24621,-12.66222],[-63.23713,-12.69043],[-63.30125,-12.68138],[-63.44052,-12.608],[-63.43627,-12.56526],[-63.50641,-12.56562],[-63.55295,-12.50598],[-63.7848,-12.42871],[-63.88957,-12.44745],[-63.89949,-12.50204],[-63.95144,-12.53179],[-64.13464,-12.47732],[-64.16781,-12.51503],[-64.17504,-12.46675],[-64.22945,-12.45419],[-64.29018,-12.50313],[-64.29452,-12.4582],[-64.41057,-12.44436],[-64.51217,-12.3551],[-64.51256,-12.22562],[-64.70406,-12.1827],[-64.70719,-12.08684],[-64.75486,-12.15762],[-64.7688,-12.09356],[-64.83747,-12.11786],[-64.80954,-12.05633],[-64.84077,-12.01027],[-65.03548,-11.99408],[-65.01398,-11.90303],[-65.0727,-11.86587],[-65.08672,-11.7082],[-65.18953,-11.72353],[-65.18216,-11.75609],[-65.2593,-11.71053],[-65.21178,-11.52857],[-65.3074,-11.49957],[-65.33276,-11.33986],[-65.29053,-11.32275],[-65.34347,-11.3082],[-65.35834,-11.26834],[-65.35938,-11.22067],[-65.31294,-11.19578],[-65.35387,-11.18419],[-65.36177,-11.14031],[-65.28269,-11.09009],[-65.30071,-11.03142],[-65.25053,-10.98506],[-65.27476,-10.87302],[-65.35376,-10.78881],[-65.34667,-10.68155],[-65.40569,-10.63935],[-65.43011,-10.48505],[-65.288,-10.219],[-65.333,-9.965],[-65.28588,-9.84413],[-65.39313,-9.68683],[-65.44394,-9.66957],[-65.4883,-9.71015],[-65.55611,-9.84498],[-65.627,-9.83804],[-65.66963,-9.78129],[-65.71023,-9.80857],[-65.68395,-9.74992],[-65.7432,-9.78296],[-65.77013,-9.73442],[-65.79437,-9.79295],[-65.79962,-9.75663],[-65.86532,-9.79533],[-65.87184,-9.75307],[-65.91976,-9.75314],[-65.98222,-9.81011],[-66.151,-9.785],[-66.426,-9.899],[-66.435,-9.866],[-66.61995,-9.89353],[-66.63701,-9.94983],[-66.8751,-10.08268],[-66.9528,-10.18886],[-66.99683,-10.20017],[-67.01537,-10.25919],[-67.17745,-10.33923],[-67.31545,-10.31932],[-67.31155,-10.37716],[-67.40717,-10.37386],[-67.44361,-10.45492],[-67.57925,-10.5028],[-67.64028,-10.59807],[-67.67631,-10.60484],[-67.70825,-10.71083],[-67.86386,-10.64067],[-68.03289,-10.65486],[-68.10456,-10.71426],[-68.10333,-10.77541],[-68.27819,-10.98926],[-68.71576,-11.14483],[-68.75767,-11.00079],[-68.9118,-11.02192],[-69.41453,-10.92575],[-69.73653,-10.97445],[-69.76903,-10.92972],[-69.93442,-10.9219],[-70.15869,-11.04096],[-70.30672,-11.06983],[-70.43675,-11.03923],[-70.53033,-10.93465],[-70.62103,-10.99982],[-70.62338,-9.82054],[-70.53663,-9.76584],[-70.59972,-9.56264],[-70.55282,-9.57093],[-70.56894,-9.53127],[-70.50506,-9.50557],[-70.49665,-9.42489],[-70.59581,-9.4425],[-70.6632,-9.52601],[-70.75067,-9.56043],[-70.79332,-9.63846],[-70.96337,-9.74891],[-70.99391,-9.81721],[-71.13974,-9.85702],[-71.22052,-9.96968],[-72.1804,-9.99967],[-72.15136,-9.79742],[-72.26296,-9.75085],[-72.25282,-9.61633],[-72.28821,-9.60316],[-72.2829,-9.53995],[-72.35688,-9.4946],[-72.51954,-9.49128],[-72.71676,-9.4122],[-73.2038,-9.40715],[-73.07352,-9.23461],[-73.0093,-9.22236],[-73.02612,-9.17786],[-72.9582,-9.14302],[-72.94091,-8.98494],[-72.99931,-8.91778],[-73.05901,-8.90561],[-73.14992,-8.6839],[-73.20907,-8.6857],[-73.28745,-8.61948],[-73.3055,-8.47197],[-73.38956,-8.46878],[-73.41286,-8.41099],[-73.53744,-8.34587],[-73.62739,-8.02187],[-73.73175,-7.9684],[-73.7725,-7.90237],[-73.76164,-7.85803],[-73.69706,-7.86527],[-73.6843,-7.77644],[-73.82217,-7.71788],[-73.99094,-7.53635],[-73.948,-7.52661],[-73.91981,-7.46568],[-73.96394,-7.34764],[-73.87014,-7.37882],[-73.7003,-7.30429],[-73.79842,-7.11306],[-73.71046,-6.84019],[-73.53639,-6.6834],[-73.39115,-6.64193],[-73.35281,-6.59327],[-73.22741,-6.58884],[-73.18797,-6.52302],[-73.13523,-6.51046],[-73.10473,-6.40666],[-73.24664,-6.14963],[-73.23821,-6.04399],[-73.1868,-6.00512],[-73.15207,-5.86796],[-73.05303,-5.79517],[-72.95912,-5.65689],[-72.95888,-5.46613],[-72.86052,-5.27117],[-72.88725,-5.16307],[-72.73986,-5.08859],[-72.72765,-5.05199],[-72.6212,-5.0518],[-72.598,-4.98386],[-72.38202,-4.87296],[-72.36895,-4.80387],[-72.12601,-4.73454],[-72.04335,-4.62384],[-72.00689,-4.64622],[-71.99464,-4.60996],[-71.94743,-4.60877],[-71.91909,-4.5298],[-71.88549,-4.53803],[-71.9073,-4.51644],[-71.76637,-4.50446],[-71.75109,-4.46887],[-71.70817,-4.51165],[-71.65479,-4.47246],[-71.65032,-4.50395],[-71.61548,-4.4687],[-71.6335,-4.51524],[-71.59625,-4.52928],[-71.53703,-4.46442],[-71.49428,-4.48701],[-71.50716,-4.43909],[-71.43438,-4.42882],[-71.42562,-4.47058],[-71.35026,-4.42728],[-71.30752,-4.46288],[-71.32091,-4.42009],[-71.27782,-4.44217],[-71.26975,-4.385],[-71.20263,-4.37987],[-71.19422,-4.42471],[-71.14478,-4.38158],[-71.11491,-4.41119],[-71.10616,-4.37764],[-70.99389,-4.38654],[-70.99595,-4.34632],[-70.9357,-4.38432],[-70.84483,-4.27905],[-70.86447,-4.25245],[-70.81677,-4.23005],[-70.8458,-4.21872],[-70.75901,-4.15944],[-70.68147,-4.20791],[-70.64256,-4.12805],[-70.62521,-4.19151],[-70.56118,-4.1775],[-70.57357,-4.21169],[-70.54796,-4.13671],[-70.51036,-4.14824],[-70.50417,-4.20098],[-70.48535,-4.16132],[-70.43435,-4.16266],[-70.43146,-4.13217],[-70.33892,-4.17997],[-70.32281,-4.14206],[-70.28769,-4.16555],[-70.29141,-4.28709],[-70.21457,-4.29749],[-70.19194,-4.36179],[-70.15508,-4.27308],[-70.11749,-4.28585],[-70.10881,-4.25454],[-70.04189,-4.29409],[-70.07948,-4.31428],[-70.02826,-4.3703],[-69.99182,-4.37482],[-69.94793,-4.23168]],[[-34.00035,-3.76654],[-34.01797,-3.84985],[-34.00664,-3.91809],[-33.98608,-3.95952],[-33.95923,-3.99217],[-33.8921,-4.03653],[-33.81658,-4.05077],[-33.72931,-4.03151],[-33.66638,-3.9838],[-33.62736,-3.9185],[-33.61519,-3.84985],[-33.63239,-3.76864],[-33.68693,-3.69537],[-33.74987,-3.65978],[-33.81658,-3.6489],[-33.89336,-3.66397],[-33.96007,-3.70877],[-34.00035,-3.76654]],[[-32.5538,-4.00884],[-32.59937,-3.9531],[-32.64061,-3.87309],[-32.61755,-3.73712],[-32.58338,-3.70527],[-32.54228,-3.65606],[-32.4592,-3.63029],[-32.35174,-3.63887],[-32.30049,-3.67684],[-32.24749,-3.75266],[-32.23155,-3.81889],[-32.2357,-3.90247],[-32.30194,-3.9883],[-32.42898,-4.0384],[-32.5538,-4.00884]],[[-29.50321,0.79391],[-29.54097,0.8689],[-29.54727,0.92553],[-29.52367,0.99422],[-29.48958,1.06134],[-29.43136,1.10224],[-29.35899,1.1206],[-29.29238,1.11378],[-29.22158,1.0776],[-29.16285,1.00314],[-29.14501,0.92605],[-29.14764,0.88358],[-29.17176,0.8196],[-29.24885,0.74357],[-29.29448,0.72521],[-29.36371,0.71892],[-29.43556,0.73937],[-29.50321,0.79391]],[[-29.09537,-20.42649],[-29.19756,-20.33509],[-29.3343,-20.28932],[-29.46741,-20.3288],[-29.54604,-20.42958],[-29.55396,-20.52706],[-29.51696,-20.62613],[-29.40995,-20.68955],[-29.27599,-20.72578],[-29.15968,-20.66209],[-29.07188,-20.57088],[-28.9712,-20.64769],[-28.83286,-20.69814],[-28.67968,-20.62099],[-28.63549,-20.49284],[-28.63412,-20.47146],[-28.7431,-20.30094],[-28.8683,-20.27288],[-29.0031,-20.32416],[-29.09537,-20.42649]]],terms_text:"IBGE",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/IBGE_Setores_Rurais.png"},{id:"IBGE_Setores_Urbanos",name:"IBGE Mapa de Setores Urbanos",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.hgda0m6h/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",zoomExtent:[0,19],polygon:[[[-69.94793,-4.23168],[-69.45659,-1.49119],[-69.3973,-1.36508],[-69.42989,-1.22173],[-69.39523,-1.12555],[-69.44292,-1.03351],[-69.41861,-0.99827],[-69.528,-0.92514],[-69.52577,-0.86807],[-69.62491,-0.74667],[-69.56179,-0.63692],[-69.60783,-0.5008],[-69.8446,-0.33732],[-69.92054,-0.32573],[-70.04323,-0.18998],[-70.04302,0.56359],[-69.80272,0.57162],[-69.6711,0.66759],[-69.60529,0.61328],[-69.59701,0.6542],[-69.48002,0.73577],[-69.35277,0.61416],[-69.28914,0.64997],[-69.29484,0.60389],[-69.19975,0.60591],[-69.19425,0.64982],[-69.11563,0.64484],[-69.19001,0.74056],[-69.14881,0.76751],[-69.13576,0.87204],[-69.18846,0.91324],[-69.1646,0.94156],[-69.21679,0.97245],[-69.19773,0.99974],[-69.24494,1.05655],[-69.37641,1.08794],[-69.42312,1.04265],[-69.60989,1.09826],[-69.67718,1.06994],[-69.70963,1.11817],[-69.84266,1.07272],[-69.83972,1.71893],[-69.78236,1.69244],[-69.53464,1.77691],[-69.39109,1.72935],[-68.1645,1.72945],[-68.19207,1.7797],[-68.23954,1.77044],[-68.22688,1.82918],[-68.28555,1.83084],[-68.19583,2.03479],[-68.18033,1.9767],[-68.14417,1.97854],[-68.09043,1.89774],[-67.90162,1.81165],[-67.76942,2.00924],[-67.55095,2.04769],[-67.49519,2.16312],[-67.39404,2.22894],[-67.32672,2.06387],[-67.33083,1.94158],[-67.22831,1.84127],[-67.15384,1.8315],[-67.15922,1.67504],[-67.08017,1.38546],[-67.13923,1.32002],[-67.08675,1.16704],[-66.85119,1.22896],[-66.31032,0.74494],[-66.19737,0.78161],[-66.07783,0.76174],[-66.07024,0.8123],[-65.96712,0.81511],[-65.88369,0.94159],[-65.77261,0.95859],[-65.7421,1.00125],[-65.58894,1.00471],[-65.49624,0.87415],[-65.60623,0.70748],[-65.54116,0.64881],[-65.44499,0.68921],[-65.39213,0.75692],[-65.41198,0.82415],[-65.32734,0.93596],[-65.21302,0.90282],[-65.1749,0.94131],[-65.15831,1.1246],[-65.07232,1.15303],[-65.06317,1.11205],[-65.01361,1.10905],[-64.97445,1.20288],[-64.90439,1.25153],[-64.86966,1.22713],[-64.80053,1.31527],[-64.74446,1.22569],[-64.5789,1.34041],[-64.52608,1.44322],[-64.43586,1.47006],[-64.3939,1.52901],[-64.35111,1.52921],[-64.34777,1.49508],[-64.41019,1.40301],[-64.33791,1.36134],[-64.3136,1.45617],[-64.19707,1.52071],[-64.0735,1.64902],[-64.05781,1.92899],[-63.97219,1.99194],[-63.83555,1.96644],[-63.71155,2.04645],[-63.66501,2.01861],[-63.6268,2.11222],[-63.56474,2.13571],[-63.44059,2.126],[-63.36742,2.26864],[-63.37088,2.41121],[-63.42123,2.45102],[-63.46036,2.39684],[-63.56398,2.44573],[-63.76805,2.43994],[-63.84358,2.4916],[-64.01914,2.46135],[-64.0573,2.49752],[-63.98033,2.7237],[-64.07709,2.87262],[-64.07156,2.92142],[-64.12349,2.99048],[-64.15754,2.98243],[-64.14592,3.03459],[-64.22642,3.12356],[-64.19795,3.20121],[-64.2444,3.43036],[-64.17437,3.56841],[-64.281,3.70928],[-64.54357,3.85713],[-64.72239,4.11775],[-64.80203,4.17422],[-64.81123,4.27048],[-64.69522,4.25323],[-64.623,4.135],[-64.5565,4.10529],[-64.164,4.127],[-63.964,3.868],[-63.928,3.925],[-63.85,3.95],[-63.682,3.908],[-63.676,4.019],[-63.591,3.886],[-63.497,3.84],[-63.489,3.874],[-63.434,3.865],[-63.428,3.977],[-63.204,3.952],[-63.226,3.836],[-63.103,3.794],[-63.059,3.748],[-63.081,3.694],[-62.96,3.608],[-62.835,3.739],[-62.743,3.674],[-62.729,3.805],[-62.788,3.894],[-62.753,4.032],[-62.555,4.019],[-62.552,4.109],[-62.437,4.183],[-62.14308,4.07768],[-62.071,4.126],[-62.076,4.154],[-61.982,4.181],[-61.93175,4.12009],[-61.92213,4.16126],[-61.824,4.164],[-61.802,4.229],[-61.724,4.27],[-61.56,4.252],[-61.508,4.322],[-61.513,4.406],[-61.288,4.458],[-61.323,4.535],[-61.217,4.536],[-61.14559,4.48016],[-61.095,4.522],[-60.994,4.519],[-60.932,4.587],[-60.949,4.653],[-60.899,4.717],[-60.751,4.756],[-60.591,4.927],[-60.661,5.164],[-60.73197,5.21203],[-60.434,5.182],[-60.20825,5.28346],[-60.172,5.227],[-60.135,5.249],[-60.094,5.14],[-59.96984,5.06334],[-60.02524,4.7065],[-60.0705,4.61688],[-60.15725,4.57247],[-60.16114,4.51773],[-59.79503,4.46554],[-59.66948,4.37629],[-59.7319,4.28587],[-59.73069,4.18076],[-59.61818,4.13166],[-59.65406,4.06943],[-59.58417,3.96851],[-59.5153,3.94493],[-59.59279,3.88538],[-59.59631,3.79386],[-59.66555,3.78126],[-59.66842,3.70277],[-59.86728,3.57776],[-59.80205,3.50156],[-59.8408,3.43174],[-59.80488,3.35695],[-59.907,3.212],[-59.98944,2.88185],[-59.99,2.686],[-59.895,2.482],[-59.89872,2.36245],[-59.72315,2.27614],[-59.751,1.859],[-59.677,1.839],[-59.663,1.871],[-59.69,1.757],[-59.539,1.723],[-59.381,1.507],[-59.329,1.514],[-59.327,1.464],[-59.284,1.45],[-59.253,1.389],[-58.978,1.302],[-58.918,1.317],[-58.886,1.261],[-58.912,1.239],[-58.82512,1.17127],[-58.73956,1.1999],[-58.69456,1.29732],[-58.49622,1.26796],[-58.45787,1.37145],[-58.50511,1.40317],[-58.50873,1.46295],[-58.38559,1.46999],[-58.39472,1.52651],[-58.32237,1.59702],[-58.236,1.54669],[-58.16064,1.56011],[-58.12942,1.4989],[-58.00423,1.50303],[-57.99009,1.65844],[-57.85206,1.66782],[-57.77431,1.72973],[-57.70509,1.73093],[-57.65042,1.68237],[-57.5376,1.7005],[-57.50187,1.78609],[-57.43776,1.82681],[-57.43343,1.90598],[-57.36768,1.92372],[-57.36912,1.95638],[-57.30712,1.99665],[-57.22923,1.93759],[-57.08668,2.02644],[-57.01421,1.91489],[-56.91971,1.93036],[-56.79793,1.85336],[-56.72096,1.92582],[-56.62145,1.94588],[-56.57976,1.90588],[-56.45126,1.95614],[-56.24404,1.87808],[-56.1709,1.90048],[-56.11762,1.85097],[-55.95638,1.84509],[-55.90385,1.88803],[-55.93635,1.98647],[-55.9031,2.04108],[-56.00307,2.1676],[-56.05505,2.18464],[-56.04288,2.22778],[-56.13887,2.26574],[-56.09012,2.37228],[-56.02181,2.34247],[-55.97052,2.52931],[-55.76663,2.45524],[-55.71028,2.39917],[-55.49971,2.44324],[-55.38533,2.41836],[-55.32019,2.51537],[-55.23474,2.50338],[-55.1234,2.56762],[-55.10302,2.52564],[-54.95424,2.58359],[-54.86846,2.43989],[-54.68917,2.45389],[-54.68861,2.32472],[-54.54667,2.31833],[-54.53778,2.26556],[-54.46861,2.21306],[-54.24917,2.14667],[-54.18056,2.1725],[-54.11083,2.11222],[-54.06139,2.19167],[-53.94083,2.21917],[-53.93194,2.27194],[-53.88667,2.26778],[-53.745,2.37389],[-53.73389,2.31222],[-53.52972,2.24917],[-53.45861,2.2575],[-53.32833,2.35333],[-53.21667,2.25333],[-53.27899,2.18603],[-53.11861,2.2225],[-52.99472,2.17528],[-52.90972,2.19583],[-52.84722,2.28556],[-52.67528,2.37389],[-52.59444,2.47389],[-52.54028,2.57028],[-52.56417,2.63944],[-52.43944,2.87778],[-52.39583,2.90222],[-52.33187,3.16938],[-52.21472,3.26833],[-51.97104,3.70696],[-51.92148,3.72422],[-51.922,3.7792],[-51.79731,3.88888],[-51.77783,3.97406],[-51.65867,4.05276],[-51.61325,4.17437],[-51.63716,4.50834],[-51.49427,4.67426],[-51.11466,4.42286],[-50.94232,4.20165],[-50.85475,3.92491],[-50.85507,3.45573],[-50.75331,2.94057],[-50.29908,2.33079],[-49.73896,1.79143],[-48.23746,-0.07449],[-44.84728,-1.07246],[-43.54602,-2.04705],[-43.24389,-2.12403],[-42.78189,-2.33053],[-41.78084,-2.51859],[-41.5085,-2.68486],[-40.66365,-2.63829],[-40.50396,-2.57531],[-39.8907,-2.65328],[-39.15187,-3.04444],[-38.57151,-3.48047],[-38.34306,-3.54434],[-38.21421,-3.74103],[-38.12555,-3.80544],[-37.90182,-4.07265],[-37.77934,-4.18046],[-37.63401,-4.24454],[-37.51218,-4.41535],[-37.22122,-4.51045],[-37.07874,-4.71355],[-36.91716,-4.71372],[-36.62299,-4.85815],[-36.18969,-4.88505],[-35.93627,-4.83327],[-35.56471,-4.90758],[-35.33677,-4.99239],[-35.17659,-5.12497],[-34.79469,-6.33583],[-34.71587,-6.74615],[-34.62306,-6.90323],[-34.59953,-7.11133],[-34.64374,-7.98735],[-34.81497,-8.62472],[-35.0253,-9.13761],[-35.55848,-9.81261],[-35.69663,-9.90026],[-35.96401,-10.31281],[-36.06155,-10.37447],[-36.26639,-10.64593],[-36.61764,-10.81082],[-36.78725,-10.95151],[-36.99511,-11.29602],[-37.11368,-11.41261],[-37.46002,-12.10275],[-37.89668,-12.75844],[-38.22146,-13.09717],[-38.61146,-13.26537],[-38.85337,-14.65508],[-38.74388,-15.60089],[-38.66456,-15.74741],[-38.64697,-15.88327],[-38.8013,-16.24838],[-38.92933,-16.80775],[-38.53193,-17.80026],[-38.49171,-18.0046],[-38.53661,-18.09683],[-38.67053,-18.16855],[-39.35288,-18.10892],[-39.4675,-18.30359],[-39.54529,-18.78548],[-39.49227,-19.40134],[-39.63477,-19.74403],[-39.86353,-19.88681],[-40.17827,-20.75426],[-40.81442,-21.67672],[-40.76948,-21.87786],[-40.81442,-22.09702],[-41.5086,-22.52638],[-41.59666,-22.83627],[-41.79292,-23.08823],[-41.91484,-23.18527],[-43.19603,-23.26703],[-44.07735,-23.40501],[-45.13508,-24.12014],[-46.61368,-24.67512],[-47.85376,-25.47012],[-48.2801,-26.23036],[-48.34897,-26.75081],[-48.11076,-27.28208],[-48.21148,-27.85592],[-48.40713,-28.43255],[-48.68615,-28.76016],[-48.9156,-28.86305],[-49.1579,-29.02871],[-49.52748,-29.42005],[-49.82565,-29.86559],[-50.17344,-30.64282],[-50.60441,-31.24135],[-51.18785,-31.77646],[-51.74211,-32.10539],[-51.89236,-32.29596],[-52.06117,-32.38504],[-52.27087,-32.92102],[-52.45986,-33.25369],[-52.61505,-33.42291],[-53.18109,-33.86891],[-53.43053,-33.73947],[-53.43951,-33.69347],[-53.53228,-33.6888],[-53.51819,-33.15342],[-53.44438,-33.05296],[-53.24468,-32.93489],[-53.31008,-32.91875],[-53.29454,-32.89931],[-53.18496,-32.85043],[-53.14569,-32.79202],[-53.0858,-32.78835],[-53.07558,-32.74088],[-53.24992,-32.6041],[-53.39137,-32.58573],[-53.46423,-32.48446],[-53.58321,-32.45192],[-53.74599,-32.07848],[-53.83375,-32.05524],[-53.84978,-32.00064],[-53.96073,-31.95532],[-53.96972,-31.91765],[-54.10019,-31.92825],[-54.4549,-31.65295],[-54.4528,-31.59959],[-54.58676,-31.45656],[-54.8367,-31.442],[-54.88623,-31.3773],[-54.94087,-31.38068],[-55.00723,-31.26692],[-55.07446,-31.33216],[-55.24003,-31.26062],[-55.29118,-31.14226],[-55.34037,-31.13144],[-55.34981,-31.03922],[-55.42306,-31.01823],[-55.57742,-30.83309],[-55.65834,-30.864],[-55.66621,-30.95395],[-55.723,-30.943],[-55.727,-30.979],[-55.882,-31.077],[-56.00989,-31.08267],[-56.02241,-30.78565],[-56.12508,-30.73871],[-56.17074,-30.61517],[-56.26095,-30.58509],[-56.29193,-30.51967],[-56.38177,-30.49956],[-56.46126,-30.38486],[-56.54706,-30.35946],[-56.54115,-30.31291],[-56.6187,-30.30054],[-56.64628,-30.20346],[-56.77662,-30.1633],[-56.80777,-30.10301],[-57.07113,-30.08671],[-57.22081,-30.28928],[-57.31303,-30.25785],[-57.39229,-30.30474],[-57.46574,-30.26589],[-57.52431,-30.28569],[-57.56087,-30.21134],[-57.64744,-30.19483],[-57.48047,-30.12315],[-57.33713,-29.99284],[-57.294,-29.831],[-57.121,-29.765],[-56.89888,-29.53179],[-56.81905,-29.48816],[-56.76618,-29.37768],[-56.70164,-29.35913],[-56.59315,-29.12516],[-56.418,-29.075],[-56.40775,-28.9748],[-56.29995,-28.89614],[-56.29652,-28.8027],[-56.17858,-28.75922],[-56.00984,-28.60718],[-56.01249,-28.50873],[-55.88357,-28.47923],[-55.87739,-28.36159],[-55.75157,-28.37095],[-55.69433,-28.42204],[-55.67047,-28.33218],[-55.77415,-28.27414],[-55.7757,-28.24481],[-55.63167,-28.17719],[-55.60747,-28.11604],[-55.55957,-28.16523],[-55.4952,-28.07682],[-55.44611,-28.09787],[-55.368,-28.029],[-55.38299,-27.97948],[-55.343,-27.972],[-55.32706,-27.92664],[-55.26574,-27.92969],[-55.196,-27.856],[-55.133,-27.897],[-55.106,-27.846],[-55.035,-27.858],[-55.081,-27.779],[-54.936,-27.772],[-54.90617,-27.63871],[-54.85,-27.624],[-54.814,-27.533],[-54.775,-27.586],[-54.67926,-27.57394],[-54.67709,-27.508],[-54.621,-27.541],[-54.574,-27.453],[-54.5246,-27.5059],[-54.444,-27.472],[-54.47081,-27.42674],[-54.41,-27.405],[-54.35466,-27.46528],[-54.34067,-27.40311],[-54.28484,-27.44819],[-54.261,-27.397],[-54.21736,-27.38603],[-54.172,-27.254],[-54.15619,-27.29619],[-54.08872,-27.30149],[-54.01026,-27.19978],[-53.96219,-27.19698],[-53.95195,-27.15169],[-53.79879,-27.14629],[-53.80233,-27.04028],[-53.76087,-27.06543],[-53.78585,-27.02674],[-53.7473,-27.03218],[-53.7092,-26.93414],[-53.67125,-26.94222],[-53.69684,-26.86015],[-53.66059,-26.85814],[-53.75814,-26.72045],[-53.7205,-26.65099],[-53.75864,-26.64113],[-53.63739,-26.24968],[-53.742,-26.108],[-53.73409,-26.04333],[-53.83619,-25.97166],[-53.82214,-25.79377],[-53.89113,-25.62286],[-53.94895,-25.6117],[-53.95638,-25.64628],[-54.01,-25.567],[-54.07592,-25.55766],[-54.098,-25.619],[-54.099,-25.495],[-54.206,-25.541],[-54.178,-25.584],[-54.23,-25.562],[-54.25,-25.597],[-54.28,-25.556],[-54.38395,-25.59747],[-54.43288,-25.69756],[-54.4927,-25.6181],[-54.59354,-25.59275],[-54.61941,-25.45312],[-54.4295,-25.15915],[-54.43548,-24.94769],[-54.32437,-24.66059],[-54.32714,-24.47073],[-54.25877,-24.36377],[-54.34537,-24.14705],[-54.28223,-24.07336],[-54.43984,-23.90446],[-54.66978,-23.81262],[-54.70533,-23.86452],[-54.89,-23.898],[-54.924,-23.959],[-55.06223,-23.99335],[-55.107,-23.961],[-55.22907,-24.01383],[-55.30415,-23.96504],[-55.34542,-23.99458],[-55.41423,-23.9645],[-55.44167,-23.70084],[-55.47306,-23.64834],[-55.53989,-23.625],[-55.52356,-23.19733],[-55.54199,-23.1561],[-55.59635,-23.14993],[-55.66578,-22.85274],[-55.61432,-22.65521],[-55.72364,-22.55166],[-55.74302,-22.39266],[-55.78939,-22.3846],[-55.84304,-22.28725],[-56.20983,-22.27805],[-56.36485,-22.16949],[-56.39404,-22.07434],[-56.50711,-22.09561],[-56.63705,-22.26341],[-56.70344,-22.21693],[-56.72026,-22.26479],[-56.79344,-22.24238],[-56.84285,-22.30155],[-56.88343,-22.24755],[-56.9967,-22.22246],[-57.3744,-22.23204],[-57.5804,-22.17534],[-57.6106,-22.09462],[-57.70751,-22.09111],[-57.80183,-22.15072],[-57.99384,-22.09023],[-58.00946,-22.04038],[-57.91281,-21.88266],[-57.96603,-21.85045],[-57.90866,-21.77355],[-57.94714,-21.74413],[-57.88329,-21.68903],[-57.93436,-21.65037],[-57.91387,-21.59021],[-57.96795,-21.52432],[-57.8535,-21.33109],[-57.92019,-21.27655],[-57.85066,-21.22407],[-57.86834,-21.04417],[-57.81919,-20.94066],[-57.92836,-20.90036],[-57.8552,-20.83403],[-57.89863,-20.78872],[-57.96183,-20.7916],[-57.93478,-20.74565],[-57.86732,-20.73265],[-57.92414,-20.66392],[-57.98848,-20.69879],[-57.99847,-20.43551],[-58.09339,-20.35554],[-58.09596,-20.25445],[-58.16216,-20.25953],[-58.12152,-20.19246],[-58.16932,-20.1694],[-57.95347,-20.02094],[-57.90248,-20.04207],[-57.85796,-19.9703],[-58.131,-19.758],[-57.784,-19.033],[-57.694,-19.011],[-57.719,-18.899],[-57.766,-18.899],[-57.557,-18.24],[-57.453,-18.231],[-57.574,-18.131],[-57.72302,-17.83074],[-57.68472,-17.8306],[-57.70991,-17.72702],[-57.783,-17.639],[-57.73696,-17.5583],[-57.883,-17.449],[-57.996,-17.515],[-58.06,-17.45],[-58.116,-17.451],[-58.151,-17.384],[-58.263,-17.344],[-58.396,-17.181],[-58.423,-16.989],[-58.474,-16.935],[-58.47,-16.703],[-58.436,-16.592],[-58.333,-16.49],[-58.32227,-16.26559],[-58.388,-16.261],[-58.43059,-16.32264],[-60.17335,-16.26672],[-60.238,-15.473],[-60.57543,-15.09677],[-60.244,-15.096],[-60.272,-14.62],[-60.321,-14.608],[-60.492,-14.188],[-60.479,-14.097],[-60.38066,-13.9888],[-60.45062,-13.9364],[-60.45599,-13.85422],[-60.49068,-13.85782],[-60.46776,-13.79446],[-60.76755,-13.68329],[-60.87678,-13.62149],[-60.91857,-13.54334],[-61.0056,-13.552],[-61.0129,-13.48925],[-61.0938,-13.49081],[-61.10314,-13.53056],[-61.18155,-13.50557],[-61.19236,-13.53695],[-61.29954,-13.47718],[-61.46527,-13.55427],[-61.57927,-13.48711],[-61.852,-13.538],[-61.892,-13.431],[-61.96968,-13.40759],[-61.97592,-13.36695],[-62.11498,-13.25932],[-62.115,-13.163],[-62.15254,-13.15993],[-62.16703,-13.11346],[-62.19,-13.153],[-62.214,-13.111],[-62.27269,-13.15687],[-62.39178,-13.13471],[-62.453,-13.064],[-62.612,-13.041],[-62.65,-12.965],[-62.729,-13.02],[-62.779,-13.009],[-62.89672,-12.8539],[-63.01134,-12.83602],[-63.08186,-12.72323],[-63.06163,-12.68584],[-63.15726,-12.6138],[-63.24621,-12.66222],[-63.23713,-12.69043],[-63.30125,-12.68138],[-63.44052,-12.608],[-63.43627,-12.56526],[-63.50641,-12.56562],[-63.55295,-12.50598],[-63.7848,-12.42871],[-63.88957,-12.44745],[-63.89949,-12.50204],[-63.95144,-12.53179],[-64.13464,-12.47732],[-64.16781,-12.51503],[-64.17504,-12.46675],[-64.22945,-12.45419],[-64.29018,-12.50313],[-64.29452,-12.4582],[-64.41057,-12.44436],[-64.51217,-12.3551],[-64.51256,-12.22562],[-64.70406,-12.1827],[-64.70719,-12.08684],[-64.75486,-12.15762],[-64.7688,-12.09356],[-64.83747,-12.11786],[-64.80954,-12.05633],[-64.84077,-12.01027],[-65.03548,-11.99408],[-65.01398,-11.90303],[-65.0727,-11.86587],[-65.08672,-11.7082],[-65.18953,-11.72353],[-65.18216,-11.75609],[-65.2593,-11.71053],[-65.21178,-11.52857],[-65.3074,-11.49957],[-65.33276,-11.33986],[-65.29053,-11.32275],[-65.34347,-11.3082],[-65.35834,-11.26834],[-65.35938,-11.22067],[-65.31294,-11.19578],[-65.35387,-11.18419],[-65.36177,-11.14031],[-65.28269,-11.09009],[-65.30071,-11.03142],[-65.25053,-10.98506],[-65.27476,-10.87302],[-65.35376,-10.78881],[-65.34667,-10.68155],[-65.40569,-10.63935],[-65.43011,-10.48505],[-65.288,-10.219],[-65.333,-9.965],[-65.28588,-9.84413],[-65.39313,-9.68683],[-65.44394,-9.66957],[-65.4883,-9.71015],[-65.55611,-9.84498],[-65.627,-9.83804],[-65.66963,-9.78129],[-65.71023,-9.80857],[-65.68395,-9.74992],[-65.7432,-9.78296],[-65.77013,-9.73442],[-65.79437,-9.79295],[-65.79962,-9.75663],[-65.86532,-9.79533],[-65.87184,-9.75307],[-65.91976,-9.75314],[-65.98222,-9.81011],[-66.151,-9.785],[-66.426,-9.899],[-66.435,-9.866],[-66.61995,-9.89353],[-66.63701,-9.94983],[-66.8751,-10.08268],[-66.9528,-10.18886],[-66.99683,-10.20017],[-67.01537,-10.25919],[-67.17745,-10.33923],[-67.31545,-10.31932],[-67.31155,-10.37716],[-67.40717,-10.37386],[-67.44361,-10.45492],[-67.57925,-10.5028],[-67.64028,-10.59807],[-67.67631,-10.60484],[-67.70825,-10.71083],[-67.86386,-10.64067],[-68.03289,-10.65486],[-68.10456,-10.71426],[-68.10333,-10.77541],[-68.27819,-10.98926],[-68.71576,-11.14483],[-68.75767,-11.00079],[-68.9118,-11.02192],[-69.41453,-10.92575],[-69.73653,-10.97445],[-69.76903,-10.92972],[-69.93442,-10.9219],[-70.15869,-11.04096],[-70.30672,-11.06983],[-70.43675,-11.03923],[-70.53033,-10.93465],[-70.62103,-10.99982],[-70.62338,-9.82054],[-70.53663,-9.76584],[-70.59972,-9.56264],[-70.55282,-9.57093],[-70.56894,-9.53127],[-70.50506,-9.50557],[-70.49665,-9.42489],[-70.59581,-9.4425],[-70.6632,-9.52601],[-70.75067,-9.56043],[-70.79332,-9.63846],[-70.96337,-9.74891],[-70.99391,-9.81721],[-71.13974,-9.85702],[-71.22052,-9.96968],[-72.1804,-9.99967],[-72.15136,-9.79742],[-72.26296,-9.75085],[-72.25282,-9.61633],[-72.28821,-9.60316],[-72.2829,-9.53995],[-72.35688,-9.4946],[-72.51954,-9.49128],[-72.71676,-9.4122],[-73.2038,-9.40715],[-73.07352,-9.23461],[-73.0093,-9.22236],[-73.02612,-9.17786],[-72.9582,-9.14302],[-72.94091,-8.98494],[-72.99931,-8.91778],[-73.05901,-8.90561],[-73.14992,-8.6839],[-73.20907,-8.6857],[-73.28745,-8.61948],[-73.3055,-8.47197],[-73.38956,-8.46878],[-73.41286,-8.41099],[-73.53744,-8.34587],[-73.62739,-8.02187],[-73.73175,-7.9684],[-73.7725,-7.90237],[-73.76164,-7.85803],[-73.69706,-7.86527],[-73.6843,-7.77644],[-73.82217,-7.71788],[-73.99094,-7.53635],[-73.948,-7.52661],[-73.91981,-7.46568],[-73.96394,-7.34764],[-73.87014,-7.37882],[-73.7003,-7.30429],[-73.79842,-7.11306],[-73.71046,-6.84019],[-73.53639,-6.6834],[-73.39115,-6.64193],[-73.35281,-6.59327],[-73.22741,-6.58884],[-73.18797,-6.52302],[-73.13523,-6.51046],[-73.10473,-6.40666],[-73.24664,-6.14963],[-73.23821,-6.04399],[-73.1868,-6.00512],[-73.15207,-5.86796],[-73.05303,-5.79517],[-72.95912,-5.65689],[-72.95888,-5.46613],[-72.86052,-5.27117],[-72.88725,-5.16307],[-72.73986,-5.08859],[-72.72765,-5.05199],[-72.6212,-5.0518],[-72.598,-4.98386],[-72.38202,-4.87296],[-72.36895,-4.80387],[-72.12601,-4.73454],[-72.04335,-4.62384],[-72.00689,-4.64622],[-71.99464,-4.60996],[-71.94743,-4.60877],[-71.91909,-4.5298],[-71.88549,-4.53803],[-71.9073,-4.51644],[-71.76637,-4.50446],[-71.75109,-4.46887],[-71.70817,-4.51165],[-71.65479,-4.47246],[-71.65032,-4.50395],[-71.61548,-4.4687],[-71.6335,-4.51524],[-71.59625,-4.52928],[-71.53703,-4.46442],[-71.49428,-4.48701],[-71.50716,-4.43909],[-71.43438,-4.42882],[-71.42562,-4.47058],[-71.35026,-4.42728],[-71.30752,-4.46288],[-71.32091,-4.42009],[-71.27782,-4.44217],[-71.26975,-4.385],[-71.20263,-4.37987],[-71.19422,-4.42471],[-71.14478,-4.38158],[-71.11491,-4.41119],[-71.10616,-4.37764],[-70.99389,-4.38654],[-70.99595,-4.34632],[-70.9357,-4.38432],[-70.84483,-4.27905],[-70.86447,-4.25245],[-70.81677,-4.23005],[-70.8458,-4.21872],[-70.75901,-4.15944],[-70.68147,-4.20791],[-70.64256,-4.12805],[-70.62521,-4.19151],[-70.56118,-4.1775],[-70.57357,-4.21169],[-70.54796,-4.13671],[-70.51036,-4.14824],[-70.50417,-4.20098],[-70.48535,-4.16132],[-70.43435,-4.16266],[-70.43146,-4.13217],[-70.33892,-4.17997],[-70.32281,-4.14206],[-70.28769,-4.16555],[-70.29141,-4.28709],[-70.21457,-4.29749],[-70.19194,-4.36179],[-70.15508,-4.27308],[-70.11749,-4.28585],[-70.10881,-4.25454],[-70.04189,-4.29409],[-70.07948,-4.31428],[-70.02826,-4.3703],[-69.99182,-4.37482],[-69.94793,-4.23168]],[[-34.00035,-3.76654],[-34.01797,-3.84985],[-34.00664,-3.91809],[-33.98608,-3.95952],[-33.95923,-3.99217],[-33.8921,-4.03653],[-33.81658,-4.05077],[-33.72931,-4.03151],[-33.66638,-3.9838],[-33.62736,-3.9185],[-33.61519,-3.84985],[-33.63239,-3.76864],[-33.68693,-3.69537],[-33.74987,-3.65978],[-33.81658,-3.6489],[-33.89336,-3.66397],[-33.96007,-3.70877],[-34.00035,-3.76654]],[[-32.5538,-4.00884],[-32.59937,-3.9531],[-32.64061,-3.87309],[-32.61755,-3.73712],[-32.58338,-3.70527],[-32.54228,-3.65606],[-32.4592,-3.63029],[-32.35174,-3.63887],[-32.30049,-3.67684],[-32.24749,-3.75266],[-32.23155,-3.81889],[-32.2357,-3.90247],[-32.30194,-3.9883],[-32.42898,-4.0384],[-32.5538,-4.00884]],[[-29.50321,0.79391],[-29.54097,0.8689],[-29.54727,0.92553],[-29.52367,0.99422],[-29.48958,1.06134],[-29.43136,1.10224],[-29.35899,1.1206],[-29.29238,1.11378],[-29.22158,1.0776],[-29.16285,1.00314],[-29.14501,0.92605],[-29.14764,0.88358],[-29.17176,0.8196],[-29.24885,0.74357],[-29.29448,0.72521],[-29.36371,0.71892],[-29.43556,0.73937],[-29.50321,0.79391]],[[-29.09537,-20.42649],[-29.19756,-20.33509],[-29.3343,-20.28932],[-29.46741,-20.3288],[-29.54604,-20.42958],[-29.55396,-20.52706],[-29.51696,-20.62613],[-29.40995,-20.68955],[-29.27599,-20.72578],[-29.15968,-20.66209],[-29.07188,-20.57088],[-28.9712,-20.64769],[-28.83286,-20.69814],[-28.67968,-20.62099],[-28.63549,-20.49284],[-28.63412,-20.47146],[-28.7431,-20.30094],[-28.8683,-20.27288],[-29.0031,-20.32416],[-29.09537,-20.42649]]],terms_text:"IBGE",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/IBGE_Setores_Rurais.png"},{id:"IBGE_BC250_Aglomerado_Rural",name:"IBGE-BC250-Aglomerado Rural Isolado",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Aglomerado_Rural_Isolado_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Pista_Pouso",name:"IBGE-BC250-Pista de Pouso",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Pista_Ponto_Pouso_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Rios_Drenagem",name:"IBGE-BC250-Rios Drenagem",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Trecho_Drenagem_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Terra_Indegina",name:"IBGE-BC250-Terra Indigena",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Terra_Indigena_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Rodoviario",name:"IBGE-BC250-Trecho Rodoviario",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Trecho_Rodoviario_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image/png&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Uso_Sustentavel",name:"IBGE-BC250-Unidade de Uso Sistentável - APA",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Unidade_Uso_Sustentavel_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Villa",name:"IBGE-BC250-Villa",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Vila_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BCIM_Gerador_Eletrica",name:"IBGE-BCIM-Estações Geradora de Energia Elétrica",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BCIM_Est_Gerad_Energia_Eletrica_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BCIM_Municipio",name:"IBGE-BCIM-Município",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BCIM_Municipio_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"ign-topografico-tms",name:"IGN topographical map (TMS)",type:"tms",template:"https://ide.ign.gob.ar/geoservicios/rest/services/Mapas_IGN/mapa_topografico/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,20],polygon:[[[-55.5438,-35.77219],[-64.31743,-49.44788],[-61.52546,-55.68296],[-66.04226,-55.24192],[-66.6896,-55.17191],[-66.86233,-55.04496],[-67.23387,-54.9245],[-67.47633,-54.92785],[-67.71808,-54.91261],[-67.96138,-54.88571],[-68.18753,-54.89288],[-68.61804,-54.92151],[-68.66375,-52.66716],[-68.51023,-52.39432],[-70.01629,-52.05707],[-72.05562,-52.01749],[-72.09055,-51.93758],[-72.02273,-51.88832],[-72.49598,-51.597],[-72.3623,-51.25935],[-72.46252,-51.08654],[-72.31217,-50.90093],[-72.39293,-50.69005],[-72.49148,-50.66866],[-72.59646,-50.73916],[-72.76983,-50.68829],[-73.22154,-50.87193],[-73.22709,-50.66897],[-73.39438,-50.58008],[-73.57703,-50.15788],[-73.53993,-50.01443],[-73.61453,-49.91795],[-73.52684,-49.7716],[-73.02779,-49.70085],[-73.02788,-49.23743],[-73.16148,-49.13062],[-72.96385,-48.89084],[-72.80952,-48.90039],[-72.59462,-48.77255],[-72.63621,-48.45823],[-72.46698,-48.45706],[-72.42158,-48.31422],[-72.3428,-48.29046],[-72.37166,-48.15995],[-72.57678,-47.96054],[-72.5731,-47.72062],[-72.3839,-47.57888],[-72.38448,-47.41759],[-72.07162,-47.2755],[-72.04726,-47.14867],[-71.93566,-47.15037],[-72.00956,-47.08473],[-72.00759,-46.78833],[-71.71488,-46.64453],[-71.7985,-46.26925],[-71.97019,-46.14972],[-71.63332,-45.97063],[-71.66595,-45.89232],[-71.77408,-45.85187],[-71.8548,-45.61169],[-71.7885,-45.50505],[-71.58354,-45.45607],[-71.58236,-45.36316],[-71.40574,-45.27206],[-71.61593,-45.03146],[-72.07949,-44.93988],[-72.11766,-44.73884],[-71.47444,-44.68048],[-71.2897,-44.75036],[-71.28469,-44.60892],[-71.20209,-44.5359],[-71.40536,-44.44891],[-71.86374,-44.44274],[-71.9047,-44.10354],[-71.70007,-43.98287],[-71.78725,-43.80985],[-71.63263,-43.65888],[-71.87866,-43.56195],[-71.95542,-43.44292],[-71.91512,-43.319],[-71.80268,-43.29535],[-71.73869,-43.19234],[-71.94149,-43.11061],[-72.18001,-42.8948],[-72.18733,-42.66619],[-72.06314,-42.53751],[-72.0441,-42.41231],[-72.14365,-42.40333],[-72.20024,-42.17229],[-72.17802,-42.13207],[-72.06032,-42.10593],[-71.78041,-42.12128],[-71.83133,-41.78089],[-71.94135,-41.60926],[-71.9023,-41.06778],[-72.02097,-40.73647],[-71.91507,-40.61832],[-71.87117,-40.38959],[-71.76665,-40.35676],[-71.87961,-40.24227],[-71.8856,-40.10093],[-71.67779,-39.92156],[-71.74365,-39.86164],[-71.77001,-39.61946],[-71.68665,-39.50983],[-71.58545,-39.55159],[-71.45202,-39.31025],[-71.47673,-38.89162],[-71.25594,-38.74909],[-70.95844,-38.70272],[-70.89411,-38.57644],[-71.03346,-38.45451],[-71.08724,-38.09054],[-71.23505,-37.86541],[-71.26668,-37.68295],[-71.18031,-37.4828],[-71.27241,-37.28686],[-71.17697,-37.1077],[-71.27586,-36.9637],[-71.20495,-36.91075],[-71.2345,-36.83303],[-71.07654,-36.43571],[-70.96469,-36.43366],[-70.90086,-36.34336],[-70.77062,-36.35412],[-70.59553,-36.12118],[-70.44219,-36.14876],[-70.42788,-35.73781],[-70.50607,-35.38014],[-70.59764,-35.34459],[-70.63128,-35.23712],[-70.42629,-35.12462],[-70.32933,-34.83081],[-70.35687,-34.72532],[-70.07752,-34.38253],[-70.06901,-34.24694],[-69.87771,-34.20233],[-69.95948,-33.77235],[-69.83371,-33.34911],[-70.02502,-33.37388],[-70.14906,-33.04145],[-70.06223,-33.01233],[-70.00981,-32.90747],[-70.19517,-32.75732],[-70.19589,-32.50891],[-70.28486,-32.45564],[-70.44343,-32.05325],[-70.41077,-31.9809],[-70.29402,-31.95849],[-70.5117,-31.85844],[-70.62295,-31.59949],[-70.59941,-31.29869],[-70.5377,-31.08557],[-70.35748,-31.0002],[-70.20264,-30.32249],[-69.97775,-30.32288],[-69.847,-30.16294],[-70.01824,-30.10003],[-69.95038,-29.73744],[-70.03755,-29.35428],[-69.97565,-29.18743],[-69.85112,-29.06923],[-69.70118,-28.37779],[-69.20484,-27.90816],[-68.84844,-27.13115],[-68.76133,-27.08588],[-68.60693,-27.09636],[-68.3489,-26.92771],[-68.64137,-26.50722],[-68.60352,-26.25391],[-68.45177,-26.1377],[-68.63052,-25.43524],[-68.55582,-25.14476],[-68.44595,-25.0658],[-68.62011,-24.81717],[-68.55162,-24.58836],[-68.28078,-24.34935],[-67.32648,-24.02538],[-66.99882,-23.00044],[-67.18775,-22.81375],[-67.08088,-22.62433],[-67.03366,-22.53815],[-66.84345,-22.39746],[-66.73734,-22.22282],[-66.38248,-22.07602],[-66.28978,-21.76554],[-66.21845,-21.72575],[-65.89675,-21.88263],[-65.71368,-22.09054],[-65.61493,-22.09152],[-65.60973,-22.09505],[-65.60607,-22.09358],[-65.60256,-22.09658],[-65.60015,-22.09543],[-65.59229,-22.09511],[-65.59015,-22.09735],[-65.58691,-22.09645],[-65.58512,-22.08432],[-65.57523,-22.07312],[-65.47487,-22.08487],[-64.99026,-22.06739],[-64.59768,-22.19269],[-64.52643,-22.29504],[-64.33114,-22.68517],[-64.10381,-22.34114],[-64.10712,-22.32023],[-64.06522,-22.23093],[-64.04702,-22.23757],[-64.03654,-22.19469],[-64.0029,-22.10735],[-63.99022,-22.07925],[-63.97147,-22.07619],[-63.94118,-21.99823],[-63.70932,-21.99896],[-63.68839,-22.01037],[-63.68079,-22.03116],[-63.68507,-22.04019],[-63.68156,-22.05185],[-63.67659,-22.03287],[-63.67201,-22.02293],[-63.66821,-22.01634],[-63.67191,-22.01399],[-63.66566,-21.99839],[-62.79606,-21.98778],[-62.74618,-22.10033],[-62.18511,-22.50843],[-61.93761,-22.97376],[-61.45605,-23.36182],[-61.05842,-23.56621],[-60.95137,-23.75997],[-60.28746,-24.01906],[-60.03728,-24.00408],[-59.46607,-24.33428],[-59.12256,-24.59772],[-58.46645,-24.84584],[-58.332,-24.98132],[-58.2349,-24.91756],[-57.8565,-25.08005],[-57.76981,-25.15013],[-57.75374,-25.17277],[-57.71597,-25.26456],[-57.71837,-25.27146],[-57.71111,-25.27265],[-57.71008,-25.28146],[-57.70692,-25.2845],[-57.70438,-25.28159],[-57.70273,-25.28239],[-57.70175,-25.28459],[-57.69741,-25.28283],[-57.69281,-25.28588],[-57.69733,-25.29337],[-57.70246,-25.29847],[-57.69612,-25.30832],[-57.69763,-25.3199],[-57.69143,-25.32127],[-57.67993,-25.33318],[-57.64822,-25.3679],[-57.63902,-25.38287],[-57.61504,-25.38841],[-57.59954,-25.39704],[-57.57673,-25.42029],[-57.56698,-25.43147],[-57.55477,-25.43999],[-57.55285,-25.44705],[-57.55811,-25.45717],[-57.55763,-25.46897],[-57.56523,-25.48014],[-57.56806,-25.49501],[-57.57722,-25.50575],[-57.57566,-25.52264],[-57.5661,-25.54112],[-57.56809,-25.55797],[-57.58142,-25.57145],[-57.59952,-25.57438],[-57.60444,-25.59855],[-57.6122,-25.61963],[-57.6367,-25.61807],[-57.66569,-25.60273],[-57.67006,-25.65579],[-57.67513,-25.66052],[-57.68626,-25.66287],[-57.69808,-25.65933],[-57.71855,-25.64914],[-57.72537,-25.71924],[-57.77786,-25.77559],[-57.84986,-26.01142],[-58.08597,-26.14202],[-58.13896,-26.66834],[-58.28224,-26.80127],[-58.32056,-26.82169],[-58.3167,-26.86081],[-58.32384,-26.87074],[-58.56858,-27.20629],[-57.90834,-27.24265],[-56.99114,-27.41858],[-56.60886,-27.36586],[-56.40607,-27.52701],[-56.32355,-27.36897],[-56.09353,-27.25219],[-55.76168,-27.38106],[-55.65541,-27.30153],[-55.67524,-27.17004],[-55.59643,-27.06538],[-55.40826,-26.91763],[-55.20788,-26.89214],[-54.97304,-26.63717],[-54.8532,-26.59894],[-54.72264,-26.31238],[-54.73235,-25.98554],[-54.65309,-25.84138],[-54.71357,-25.66721],[-54.62995,-25.55106],[-54.44288,-25.5795],[-54.11451,-25.4396],[-53.80059,-25.65093],[-53.766,-25.94301],[-53.59024,-26.19274],[-53.67264,-26.61495],[-53.61669,-26.95395],[-53.76351,-27.18917],[-54.15393,-27.36033],[-54.26461,-27.49923],[-54.79439,-27.6397],[-55.0044,-27.90341],[-55.19076,-27.92946],[-55.41589,-28.14304],[-55.66542,-28.26547],[-55.61633,-28.32205],[-55.65957,-28.46539],[-55.83413,-28.42136],[-55.87339,-28.49468],[-56.13558,-28.7265],[-56.37343,-29.10817],[-56.569,-29.13892],[-56.76306,-29.48638],[-57.05958,-29.72263],[-57.24463,-29.86452],[-57.3045,-30.03966],[-57.61942,-30.20517],[-57.60863,-30.32424],[-57.82983,-30.53118],[-57.75241,-30.68756],[-57.75273,-30.91942],[-57.93419,-31.27388],[-57.99,-31.36053],[-57.98302,-31.3734],[-57.97736,-31.38022],[-57.97778,-31.38599],[-57.98203,-31.39213],[-58.00944,-31.41341],[-58.06637,-31.47395],[-57.92613,-31.57745],[-57.98622,-31.77449],[-58.12179,-31.89772],[-58.11905,-32.14059],[-58.04227,-32.29153],[-58.14327,-32.45845],[-58.0758,-33.00587],[-58.18964,-33.09402],[-58.2723,-33.1061],[-58.31012,-33.1048],[-58.35418,-33.1221],[-58.37567,-33.17644],[-58.44465,-33.5853],[-58.43016,-33.71813],[-58.42434,-33.86887],[-58.41858,-33.91742],[-58.33697,-34.00477],[-58.241,-34.16246],[-57.84696,-34.50017],[-55.5438,-35.77219]]],terms_url:"http://www.ign.gob.ar/",terms_text:"Instituto Geográfico Nacional de la República Argentina",icon:"http://www.ign.gob.ar/sites/default/files/favicon.png"},{id:"Haiti-Drone",name:"Imagerie Drone (Haiti)",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/iomhaiti/{zoom}/{x}/{y}",zoomExtent:[0,21],polygon:[[[-72.15474,19.6879],[-72.15458,19.6878],[-72.15485,19.68776],[-72.15472,19.68685],[-72.15431,19.68707],[-72.15463,19.68544],[-72.15301,19.68499],[-72.15086,19.68435],[-72.15045,19.68479],[-72.15078,19.68315],[-72.15223,19.6833],[-72.15282,19.68066],[-72.15186,19.68051],[-72.15191,19.68034],[-72.15227,19.68035],[-72.15238,19.67972],[-72.15328,19.67965],[-72.15333,19.67698],[-72.15308,19.67694],[-72.15348,19.67638],[-72.14878,19.67107],[-72.13664,19.67081],[-72.13557,19.67408],[-72.13573,19.68351],[-72.13679,19.68407],[-72.13695,19.68559],[-72.13778,19.685],[-72.13782,19.68727],[-72.13888,19.68767],[-72.13881,19.69013],[-72.13853,19.68949],[-72.13806,19.68964],[-72.13869,19.69232],[-72.13825,19.69276],[-72.13948,19.69737],[-72.14101,19.7],[-72.1437,19.70112],[-72.14851,19.70015],[-72.14772,19.70268],[-72.14874,19.7029],[-72.1616,19.70357],[-72.16578,19.698],[-72.165,19.69324],[-72.16223,19.68901],[-72.15474,19.6879]],[[-72.13106,19.67189],[-72.12598,19.67728],[-72.12554,19.67762],[-72.12169,19.67764],[-72.11497,19.6726],[-72.11527,19.66872],[-72.11982,19.66275],[-72.12278,19.66257],[-72.1249,19.6627],[-72.12858,19.66454],[-72.13081,19.66617],[-72.13167,19.66879],[-72.13156,19.671],[-72.13106,19.67189]],[[-71.84579,19.67098],[-71.84294,19.67595],[-71.841,19.67595],[-71.83802,19.67553],[-71.83787,19.6745],[-71.83905,19.67439],[-71.83901,19.67411],[-71.83984,19.67395],[-71.83891,19.67361],[-71.83802,19.67209],[-71.83801,19.67263],[-71.83767,19.67272],[-71.83763,19.67254],[-71.83544,19.67321],[-71.83533,19.673],[-71.83312,19.67346],[-71.83267,19.67168],[-71.83216,19.67209],[-71.83072,19.66949],[-71.8306,19.66976],[-71.83022,19.66989],[-71.82918,19.66721],[-71.82907,19.66721],[-71.82891,19.66679],[-71.82895,19.66662],[-71.82883,19.66635],[-71.82856,19.66648],[-71.82887,19.66725],[-71.82876,19.66741],[-71.8278,19.66782],[-71.82771,19.66786],[-71.82783,19.66796],[-71.82718,19.66812],[-71.82718,19.66809],[-71.82644,19.66839],[-71.82641,19.66832],[-71.8262,19.66843],[-71.82618,19.66836],[-71.82589,19.66842],[-71.82589,19.66866],[-71.82516,19.66875],[-71.82545,19.66916],[-71.82293,19.66957],[-71.82271,19.66967],[-71.82277,19.66976],[-71.82018,19.67099],[-71.81985,19.67045],[-71.8198,19.6706],[-71.81947,19.67076],[-71.81825,19.67134],[-71.81814,19.67114],[-71.81758,19.67143],[-71.81696,19.67077],[-71.81764,19.6719],[-71.81714,19.67204],[-71.81582,19.6718],[-71.81384,19.67119],[-71.81233,19.6707],[-71.81218,19.67043],[-71.81243,19.67015],[-71.81192,19.67001],[-71.81188,19.67058],[-71.81117,19.67035],[-71.80959,19.66985],[-71.8078,19.66928],[-71.8056,19.66861],[-71.80514,19.66689],[-71.80512,19.66523],[-71.80523,19.66198],[-71.80656,19.65239],[-71.80734,19.64829],[-71.80997,19.64683],[-71.81475,19.64545],[-71.81477,19.64556],[-71.815,19.64551],[-71.81495,19.64538],[-71.81599,19.64502],[-71.81589,19.64489],[-71.81659,19.64461],[-71.81901,19.6438],[-71.82115,19.64345],[-71.82216,19.64333],[-71.8269,19.64321],[-71.82805,19.64322],[-71.83045,19.64408],[-71.83064,19.64486],[-71.82953,19.64504],[-71.82961,19.64561],[-71.82994,19.64557],[-71.83037,19.64517],[-71.83047,19.64535],[-71.83081,19.6452],[-71.83102,19.64511],[-71.83125,19.64585],[-71.83111,19.64582],[-71.83137,19.64659],[-71.83289,19.64619],[-71.83446,19.64571],[-71.83447,19.64631],[-71.83422,19.64619],[-71.8342,19.64655],[-71.83467,19.6463],[-71.83491,19.64639],[-71.8348,19.64622],[-71.83544,19.64585],[-71.8355,19.6458],[-71.83647,19.64613],[-71.83764,19.64727],[-71.83791,19.64789],[-71.83905,19.6508],[-71.84569,19.66962],[-71.84579,19.67098]],[[-72.09888,18.54843],[-72.09907,18.54838],[-72.09991,18.54809],[-72.10234,18.54813],[-72.10252,18.54814],[-72.10229,18.54826],[-72.10229,18.54828],[-72.10256,18.54815],[-72.10272,18.54814],[-72.10343,18.54871],[-72.10354,18.5489],[-72.10352,18.54974],[-72.10349,18.54974],[-72.10351,18.55003],[-72.10285,18.55018],[-72.1029,18.55025],[-72.10287,18.55031],[-72.10352,18.55024],[-72.1035,18.55152],[-72.10338,18.55152],[-72.10308,18.55161],[-72.10348,18.55162],[-72.10342,18.55435],[-72.10243,18.5555],[-72.10149,18.55562],[-72.10062,18.55559],[-72.0979,18.55521],[-72.09688,18.55466],[-72.09652,18.55421],[-72.09661,18.55417],[-72.09651,18.55417],[-72.09654,18.55398],[-72.09644,18.55355],[-72.09628,18.55357],[-72.09621,18.5532],[-72.09599,18.55337],[-72.09564,18.55267],[-72.09556,18.55185],[-72.09685,18.55035],[-72.09729,18.55032],[-72.09699,18.5502],[-72.09888,18.54843]],[[-72.25425,18.56826],[-72.25603,18.57178],[-72.25579,18.5748],[-72.2535,18.57555],[-72.25228,18.57555],[-72.24999,18.57409],[-72.24739,18.56983],[-72.24601,18.56673],[-72.24585,18.56295],[-72.24794,18.56254],[-72.25015,18.5628],[-72.25192,18.56508],[-72.25425,18.56826]],[[-72.30315,18.53327],[-72.30313,18.53318],[-72.30483,18.53111],[-72.30974,18.53111],[-72.31643,18.53243],[-72.32341,18.53661],[-72.32614,18.53878],[-72.32619,18.54264],[-72.31705,18.55406],[-72.31309,18.55406],[-72.29875,18.54533],[-72.29886,18.54073],[-72.2963,18.54047],[-72.29546,18.53952],[-72.29619,18.53386],[-72.29719,18.53322],[-72.3007,18.53328],[-72.30227,18.53423],[-72.30285,18.53352],[-72.3031,18.53334],[-72.30318,18.5334],[-72.30358,18.53356],[-72.30308,18.53465],[-72.30371,18.53399],[-72.30453,18.53441],[-72.3044,18.53451],[-72.30627,18.53526],[-72.30631,18.53527],[-72.30612,18.53576],[-72.30612,18.53582],[-72.30637,18.53589],[-72.30627,18.53549],[-72.30667,18.53509],[-72.3062,18.53497],[-72.30589,18.53494],[-72.30554,18.53468],[-72.30549,18.53461],[-72.30556,18.53451],[-72.30467,18.53423],[-72.30476,18.53388],[-72.30433,18.53375],[-72.30426,18.53363],[-72.30315,18.53327]],[[-72.29814,18.4775],[-72.29357,18.49486],[-72.29222,18.49643],[-72.29317,18.49725],[-72.28923,18.50571],[-72.28781,18.5081],[-72.28505,18.51199],[-72.28402,18.51132],[-72.28086,18.51588],[-72.27732,18.5176],[-72.27235,18.51752],[-72.26627,18.51446],[-72.26659,18.50668],[-72.26926,18.50462],[-72.2662,18.50298],[-72.26882,18.49652],[-72.26915,18.49594],[-72.27027,18.49615],[-72.27027,18.4956],[-72.26907,18.49557],[-72.26929,18.49377],[-72.2737,18.486],[-72.27467,18.48504],[-72.27518,18.4834],[-72.27654,18.48134],[-72.27735,18.4815],[-72.2783,18.48097],[-72.27785,18.4807],[-72.2771,18.48012],[-72.279,18.47758],[-72.27972,18.47729],[-72.28064,18.47764],[-72.28137,18.47716],[-72.28084,18.47698],[-72.28128,18.47584],[-72.28232,18.47518],[-72.28516,18.4751],[-72.28499,18.47637],[-72.28544,18.47698],[-72.28628,18.47563],[-72.28693,18.47547],[-72.2866,18.47519],[-72.2866,18.475],[-72.29098,18.47473],[-72.29466,18.47494],[-72.29739,18.47684],[-72.29814,18.4775]],[[-72.34667,18.52224],[-72.34683,18.52443],[-72.34753,18.52776],[-72.34555,18.52911],[-72.34031,18.52922],[-72.33833,18.52803],[-72.3369,18.53012],[-72.33381,18.52967],[-72.32893,18.52708],[-72.32865,18.52533],[-72.32921,18.52327],[-72.33041,18.52205],[-72.33216,18.52218],[-72.33225,18.5192],[-72.33692,18.51836],[-72.3382,18.51847],[-72.33815,18.51818],[-72.3412,18.51779],[-72.34549,18.5172],[-72.34926,18.51728],[-72.35043,18.51889],[-72.35035,18.52061],[-72.34968,18.52204],[-72.34667,18.52224]],[[-72.33031,18.54865],[-72.34297,18.55081],[-72.34332,18.55306],[-72.34131,18.56143],[-72.33906,18.56136],[-72.33847,18.56383],[-72.33753,18.56543],[-72.33484,18.56506],[-72.33118,18.56383],[-72.33121,18.56162],[-72.32321,18.56069],[-72.32124,18.5596],[-72.3208,18.5587],[-72.32088,18.55788],[-72.32595,18.55803],[-72.32662,18.5582],[-72.32592,18.55775],[-72.3251,18.55738],[-72.32338,18.55226],[-72.3246,18.54785],[-72.3289,18.54837],[-72.32998,18.54895],[-72.33031,18.54865]],[[-72.32314,18.52698],[-72.32234,18.52807],[-72.32096,18.52797],[-72.32078,18.52713],[-72.32085,18.52537],[-72.32146,18.52496],[-72.32257,18.52489],[-72.32285,18.52533],[-72.32324,18.52648],[-72.32314,18.52698]],[[-72.21608,18.64578],[-72.21596,18.65538],[-72.20303,18.65583],[-72.19471,18.65534],[-72.19222,18.65456],[-72.19206,18.65213],[-72.19348,18.64776],[-72.20125,18.63852],[-72.20693,18.63882],[-72.2121,18.64241],[-72.21181,18.64306],[-72.21217,18.64269],[-72.2128,18.64276],[-72.21347,18.64313],[-72.21356,18.64375],[-72.21542,18.64439],[-72.21589,18.64503],[-72.21608,18.64578]],[[-72.28677,18.6482],[-72.2901,18.65274],[-72.28981,18.65365],[-72.29007,18.65427],[-72.29072,18.65377],[-72.29103,18.65447],[-72.29125,18.65422],[-72.29168,18.65589],[-72.29122,18.65661],[-72.29227,18.65597],[-72.29269,18.65675],[-72.29307,18.65673],[-72.29413,18.65818],[-72.29602,18.66084],[-72.29597,18.66191],[-72.29329,18.66457],[-72.29067,18.666],[-72.28959,18.66613],[-72.28959,18.66657],[-72.2877,18.66647],[-72.28758,18.66766],[-72.28312,18.66972],[-72.27965,18.66965],[-72.27843,18.66908],[-72.2784,18.66877],[-72.27774,18.66917],[-72.27744,18.66914],[-72.27701,18.66832],[-72.27656,18.66811],[-72.27654,18.66806],[-72.27523,18.66852],[-72.27493,18.66746],[-72.27464,18.66743],[-72.27347,18.66821],[-72.27323,18.66827],[-72.27268,18.66716],[-72.27191,18.66743],[-72.27188,18.66734],[-72.26881,18.66819],[-72.26883,18.66718],[-72.26908,18.66682],[-72.26881,18.66679],[-72.26811,18.66707],[-72.26763,18.66738],[-72.26756,18.66669],[-72.26686,18.66695],[-72.26559,18.66736],[-72.26545,18.66701],[-72.26475,18.66741],[-72.26299,18.66819],[-72.26285,18.66818],[-72.26265,18.66761],[-72.2623,18.66771],[-72.26248,18.66792],[-72.26248,18.66823],[-72.26231,18.66826],[-72.2621,18.66797],[-72.26228,18.66892],[-72.26015,18.6689],[-72.25427,18.66879],[-72.25054,18.66835],[-72.25044,18.66954],[-72.24779,18.66989],[-72.24152,18.66979],[-72.24142,18.67419],[-72.23892,18.67398],[-72.23872,18.67346],[-72.23837,18.67331],[-72.2387,18.67395],[-72.23755,18.6739],[-72.23742,18.67351],[-72.23774,18.67334],[-72.23751,18.67326],[-72.23684,18.67349],[-72.23644,18.67241],[-72.23551,18.6726],[-72.2354,18.67242],[-72.2353,18.6729],[-72.23455,18.67269],[-72.23431,18.67246],[-72.23424,18.67347],[-72.23341,18.67346],[-72.23329,18.6733],[-72.23274,18.67329],[-72.23271,18.6735],[-72.2277,18.67253],[-72.22653,18.67165],[-72.2268,18.67157],[-72.2275,18.67159],[-72.22749,18.67145],[-72.22729,18.67146],[-72.22728,18.6713],[-72.22721,18.67136],[-72.22618,18.67137],[-72.2256,18.67088],[-72.22551,18.66945],[-72.22611,18.66969],[-72.22618,18.66959],[-72.22598,18.66955],[-72.22578,18.66914],[-72.22533,18.66946],[-72.22497,18.66947],[-72.22458,18.66788],[-72.22355,18.6677],[-72.22359,18.66759],[-72.22246,18.66763],[-72.22237,18.66702],[-72.22233,18.66709],[-72.22192,18.66703],[-72.22081,18.6669],[-72.22081,18.66653],[-72.22087,18.66636],[-72.2206,18.66681],[-72.22039,18.66664],[-72.21843,18.66505],[-72.21829,18.6641],[-72.21835,18.66084],[-72.21872,18.66065],[-72.21869,18.6606],[-72.21873,18.66045],[-72.21898,18.66032],[-72.21878,18.6602],[-72.2187,18.66024],[-72.21858,18.66004],[-72.21861,18.66],[-72.21878,18.66013],[-72.219,18.66002],[-72.21891,18.65991],[-72.21897,18.65979],[-72.21838,18.65958],[-72.21847,18.65397],[-72.2201,18.65116],[-72.2258,18.64695],[-72.2283,18.64573],[-72.23793,18.64586],[-72.23776,18.6447],[-72.24004,18.64325],[-72.2456,18.64335],[-72.24827,18.64504],[-72.24875,18.64367],[-72.25111,18.64298],[-72.25124,18.64334],[-72.25126,18.64316],[-72.25148,18.64314],[-72.25133,18.64297],[-72.25336,18.64235],[-72.25352,18.64268],[-72.25395,18.64254],[-72.25415,18.64293],[-72.25439,18.64287],[-72.25438,18.64275],[-72.25642,18.64232],[-72.25669,18.64314],[-72.25688,18.64286],[-72.25682,18.64253],[-72.25884,18.6421],[-72.25889,18.64225],[-72.25926,18.64223],[-72.25965,18.64241],[-72.25922,18.64069],[-72.25995,18.64048],[-72.26012,18.64063],[-72.26012,18.63994],[-72.26153,18.63947],[-72.26261,18.6391],[-72.26545,18.63873],[-72.27194,18.63868],[-72.2722,18.63886],[-72.27303,18.63942],[-72.27317,18.64126],[-72.27387,18.64103],[-72.27422,18.64161],[-72.27522,18.6417],[-72.27545,18.64157],[-72.27555,18.64169],[-72.27554,18.64175],[-72.27647,18.64186],[-72.27675,18.6419],[-72.2763,18.6426],[-72.27742,18.643],[-72.27798,18.64272],[-72.27858,18.64313],[-72.27857,18.64323],[-72.2789,18.64335],[-72.27985,18.64397],[-72.28587,18.64697],[-72.28677,18.6482]],[[-72.55572,18.53059],[-72.55559,18.5367],[-72.555,18.53797],[-72.5488,18.53792],[-72.54866,18.53728],[-72.54884,18.53063],[-72.54937,18.5301],[-72.55513,18.53012],[-72.55572,18.53059]],[[-72.62353,18.50799],[-72.62344,18.50952],[-72.62261,18.51043],[-72.62049,18.51185],[-72.61834,18.51075],[-72.61622,18.50832],[-72.61626,18.50647],[-72.61866,18.50444],[-72.6204,18.5045],[-72.62283,18.507],[-72.62353,18.50799]]]},{id:"osmim-imagicode-S2A_R119_N09_20160327T050917",name:"imagico.de: Adams Bridge",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R119_N09_20160327T050917&z={zoom}&x={x}&y={-y}",endDate:"2016-03-27T00:00:00.000Z",startDate:"2016-03-27T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[79.01779,8.82757],[79.01402,9.64678],[80.17642,9.65042],[80.17728,8.8313],[79.01779,8.82757]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Supplementing incomplete coverage in other sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80700162014211LGN00",name:"imagico.de: Alaska Range",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80700162014211LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-07-31T00:00:00.000Z",startDate:"2014-07-31T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-152.70873,62.30357],[-152.70839,62.58153],[-152.00835,63.54646],[-148.99432,63.5333],[-148.99432,62.30357],[-152.70873,62.30357]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent summer image of the Alaska Range for mapping natural features (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-aral2",name:"imagico.de: Aral Sea (high water level)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=aral2&z={zoom}&x={x}&y={-y}",endDate:"2016-03-03T00:00:00.000Z",startDate:"2016-03-03T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[58.049,43.2623],[58.049,46.7189],[58.1014,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4675,45.3416],[60.6317,43.2623],[58.049,43.2623]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Water and wetland extents, dams etc. - some remaining winter ice in the north (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-aral1",name:"imagico.de: Aral Sea (low water level)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=aral1&z={zoom}&x={x}&y={-y}",endDate:"2016-09-09T00:00:00.000Z",startDate:"2016-09-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[58.049,43.2623],[58.049,46.7334],[58.096,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4685,45.3544],[60.6267,43.2623],[58.049,43.2623]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Water and wetland extents, dams etc. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R067_S40_20170417T140051",name:"imagico.de: Bahía Blanca (high tide)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170417T140051&z={zoom}&x={x}&y={-y}",endDate:"2017-04-17T00:00:00.000Z",startDate:"2017-04-17T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Tidal flats and islands at the coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R067_S40_20170127T140051",name:"imagico.de: Bahía Blanca (low tide)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170127T140051&z={zoom}&x={x}&y={-y}",endDate:"2017-01-27T00:00:00.000Z",startDate:"2017-01-27T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Tidal flats and islands at the coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81190582014075LGN00",name:"imagico.de: Bakun Reservoir",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81190582014075LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-03-16T00:00:00.000Z",startDate:"2014-03-16T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[114.36,2.02846],[113.53448,2.03],[113.53619,3.07077],[114.76512,3.06751],[114.76254,2.08816],[114.36,2.02846]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in older pre-2011 images (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81250592016107LGN00",name:"imagico.de: Batam",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81250592016107LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[104.00155,-0.00008],[104.00137,1.45099],[104.91015,1.45116],[104.91015,-0.00008],[104.00155,-0.00008]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing Islands in OSM (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80770232017156LGN00",name:"imagico.de: Bogoslof Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80770232017156LGN00&z={zoom}&x={x}&y={-y}",endDate:"2017-06-05T00:00:00.000Z",startDate:"2017-06-05T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-168.2544,53.8749],[-168.2544,54.0213],[-167.8591,54.0213],[-167.8591,53.8749],[-168.2544,53.8749]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image from after the eruption (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81800982013291LGN00",name:"imagico.de: Bouvet Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81800982013291LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-10-18T00:00:00.000Z",startDate:"2013-10-18T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[3.24653,-54.47047],[3.24653,-54.37539],[3.46385,-54.37539],[3.46385,-54.47047],[3.24653,-54.47047]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",best:true,description:"For more accurate coastline and glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R017_S67_20170223T022551",name:"imagico.de: Bunger Hills",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R017_S67_20170223T022551&z={zoom}&x={x}&y={-y}",endDate:"2017-02-23T00:00:00.000Z",startDate:"2017-02-23T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[96.1197,-67.6542],[96.1201,-67.1899],[98.7331,-65.044],[105.1028,-65.044],[105.1028,-65.7224],[103.3017,-67.6542],[96.1197,-67.6542]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Largest ice free area at the East Antarctic coast - shows considerable amounts of non-permanent ice. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R065_N47_20160929T102022",name:"imagico.de: Central Alps in late September 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R065_N47_20160929T102022&z={zoom}&x={x}&y={-y}",endDate:"2016-09-29T00:00:00.000Z",startDate:"2016-09-29T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[10.55906,45.95485],[7.47396,45.95533],[7.55585,46.2708],[8.0547,47.66469],[11.75245,47.66481],[11.75245,46.81334],[11.38424,45.95509],[10.55906,45.95485]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping - beware of some fresh snow at higher altitudes (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82050982015344LGN00",name:"imagico.de: Clerke Rocks",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82050982015344LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-12-10T00:00:00.000Z",startDate:"2015-12-10T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-34.17701,-55.29693],[-35.19599,-55.28285],[-35.16664,-54.72097],[-34.12517,-54.73465],[-34.1401,-55.29693],[-34.17701,-55.29693]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R086_N60_20160831T213532",name:"imagico.de: Cook Inlet",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R086_N60_20160831T213532&z={zoom}&x={x}&y={-y}",endDate:"2016-08-31T00:00:00.000Z",startDate:"2016-08-31T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-154.5102,59.4577],[-154.5097,60.6888],[-153.5403,62.1718],[-148.0423,62.1718],[-148.0445,61.5342],[-149.7291,59.4584],[-154.5102,59.4577]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Tidal flats and glaciers in surrounding mountains (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-EO1A0040712016264110KF",name:"imagico.de: Coropuna",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=EO1A0040712016264110KF&z={zoom}&x={x}&y={-y}",endDate:"2016-09-21T00:00:00.000Z",startDate:"2016-09-21T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-72.75945,-15.68684],[-72.75945,-15.4957],[-72.74434,-15.4263],[-72.41286,-15.4263],[-72.41286,-15.65296],[-72.42411,-15.68667],[-72.75945,-15.68684]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R022_N06_20151221T103009",name:"imagico.de: Cotonou",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R022_N06_20151221T103009&z={zoom}&x={x}&y={-y}",endDate:"2015-12-21T00:00:00.000Z",startDate:"2015-12-21T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[1.83975,6.2578],[1.83975,7.11427],[2.5494,7.11427],[2.5494,6.48905],[2.49781,6.25806],[1.83975,6.2578]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Patchy and partly cloudy coverage in usual sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R040_N01_20160311T164128",name:"imagico.de: Darwin and Wolf islands, Galapagos",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R040_N01_20160311T164128&z={zoom}&x={x}&y={-y}",endDate:"2016-03-11T00:00:00.000Z",startDate:"2016-03-11T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-92.05216,1.3213],[-92.05216,1.72181],[-91.74849,1.72181],[-91.74849,1.3213],[-92.05216,1.3213]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image, only old and poor images in other sources currently (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80360072014245LGN00",name:"imagico.de: Eastern Devon Island coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80360072014245LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-09-02T00:00:00.000Z",startDate:"2014-09-02T00:00:00.000Z",zoomExtent:[0,11],polygon:[[[-84.34799,74.38946],[-84.34799,75.8903],[-79.14871,75.8903],[-79.14871,74.38946],[-84.34799,74.38946]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coastline mostly mapped meanwhile (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82160152013239LGN00",name:"imagico.de: Eastern Iceland",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82160152013239LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-08-27T00:00:00.000Z",startDate:"2013-08-27T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-13.04701,64.21109],[-15.16496,64.22408],[-15.16805,64.81573],[-13.04357,64.8036],[-13.04701,64.21109]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing islets and inaccurate coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-AST_L1T_00302052007154424_20150518041444_91492",name:"imagico.de: El Altar",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00302052007154424_20150518041444_91492&z={zoom}&x={x}&y={-y}",endDate:"2012-02-05T00:00:00.000Z",startDate:"2012-02-05T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-78.532,-1.80509],[-78.532,-1.60811],[-78.33562,-1.60811],[-78.33562,-1.80509],[-78.532,-1.80509]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"2007 ASTER image offering better glacier coverage than common sources (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R009_S61_20160109",name:"imagico.de: Elephant Island/Clarence Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R009_S61_20160109&z={zoom}&x={x}&y={-y}",endDate:"2016-01-09T00:00:00.000Z",startDate:"2016-01-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-56.13476,-61.63472],[-56.13476,-61.19936],[-55.83264,-60.84015],[-53.72343,-60.83982],[-53.72343,-61.63472],[-56.13476,-61.63472]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Fairly clear up-to-date image for updating glacier edges (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-enderby",name:"imagico.de: Enderby Land and Kemp Coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=enderby&z={zoom}&x={x}&y={-y}",endDate:"2017-03-27T00:00:00.000Z",startDate:"2017-01-25T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[45.4547,-68.5091],[45.4547,-67.5724],[49.7155,-65.7176],[59.2693,-65.7176],[67.3735,-67.3449],[67.3735,-68.2581],[67.088,-68.5091],[45.4547,-68.5091]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Sentinel-2 images of Enderby Land and Kemp Coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82100502015347LGN00",name:"imagico.de: Fogo, Cape Verde",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82100502015347LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-12-13T00:00:00.000Z",startDate:"2015-12-13T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-24.75878,14.74814],[-24.75878,15.09249],[-24.26706,15.09249],[-24.26706,14.74814],[-24.75878,14.74814]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Image from after the 2014/2015 eruption (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-greenland",name:"imagico.de: Greenland mosaic",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=greenland&z={zoom}&x={x}&y={-y}",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-43.9774,59.7171],[-44.545,59.7302],[-44.9203,59.7672],[-45.3587,59.8218],[-45.763,59.8848],[-46.0859,59.9827],[-46.3381,60.119],[-46.577,60.2652],[-46.8114,60.4418],[-47.2635,60.5314],[-47.6937,60.5549],[-48.1457,60.6192],[-48.5771,60.7015],[-48.8689,60.8506],[-49.0578,61.0555],[-49.396,61.2957],[-49.7601,61.4934],[-50.2064,61.7324],[-50.4699,61.9539],[-50.8647,62.1596],[-51.0631,62.3869],[-51.2121,62.6001],[-51.3005,62.8389],[-51.4238,62.9979],[-51.6767,63.1944],[-51.9465,63.4079],[-52.0253,63.6377],[-52.2255,63.8378],[-52.3658,64.0705],[-52.4829,64.3792],[-52.4988,64.6788],[-52.789,64.9063],[-53.2046,65.1321],[-53.6649,65.4753],[-53.9977,65.8019],[-54.1348,66.1568],[-54.1441,66.5235],[-54.2285,66.8319],[-54.4519,67.303],[-54.5141,67.7648],[-54.604,68.2021],[-54.568,68.5698],[-54.598,68.8347],[-54.7606,69.1207],[-55.0028,69.4125],[-55.2735,69.6187],[-55.3808,69.8283],[-55.3945,70.0838],[-55.3094,70.2573],[-55.4307,70.479],[-55.5501,70.6707],[-55.7654,70.861],[-56.2489,71.2343],[-56.5018,71.5429],[-56.5867,71.9015],[-56.5189,72.2355],[-56.5085,72.5258],[-56.8923,72.8144],[-57.4027,73.1054],[-57.8066,73.4566],[-58.1461,73.7696],[-58.3554,74.0972],[-58.5125,74.3783],[-58.7336,74.6328],[-59.3551,74.8869],[-60.1412,75.102],[-61.0067,75.2763],[-61.911,75.3886],[-62.4706,75.5595],[-62.9776,75.7454],[-64.1463,75.779],[-65.4481,75.7235],[-66.7068,75.6792],[-67.8379,75.6525],[-69.0456,75.6195],[-70.055,75.5344],[-71.0898,75.4705],[-72.1119,75.4476],[-74.2311,76.4102],[-74.5601,76.5328],[-74.5601,82.6959],[-14.4462,82.6959],[-14.3994,82.5997],[-13.5339,82.4379],[-12.0312,82.3426],[-10.7796,82.3196],[-10.7796,80.1902],[-11.2123,80.069],[-11.136,79.8103],[-10.7796,79.5176],[-10.7796,79.0441],[-11.2626,78.7128],[-12.2579,78.3558],[-13.2398,78.1272],[-13.7649,77.9279],[-14.1169,77.6779],[-14.7129,77.5278],[-15.5507,77.3655],[-16.0936,77.0771],[-16.0586,76.5548],[-15.838,75.9611],[-15.6879,75.4726],[-16.253,75.058],[-17.0427,74.6425],[-18.3155,74.2702],[-19.4463,73.9378],[-19.8329,73.632],[-20.2938,73.3524],[-20.7831,73.0446],[-21.01,72.6766],[-20.8774,72.2926],[-20.7672,71.8726],[-20.7765,71.4304],[-20.9411,70.9802],[-21.219,70.6126],[-21.5326,70.3001],[-21.8039,70.0911],[-22.166,69.8947],[-22.4831,69.7539],[-22.9027,69.6585],[-23.3545,69.544],[-23.9177,69.4036],[-24.1794,69.3088],[-24.6745,69.1084],[-25.1222,68.9555],[-25.6659,68.7995],[-26.0994,68.583],[-26.6316,68.4043],[-27.7638,68.2813],[-28.4575,68.0023],[-29.353,67.8135],[-30.6456,67.4911],[-31.7673,67.0005],[-32.9783,66.2596],[-33.9313,66.0156],[-34.8956,65.7403],[-35.5914,65.5208],[-36.1483,65.372],[-36.7532,65.2559],[-37.1858,65.1349],[-37.6032,64.9727],[-38.0624,64.4901],[-38.5304,64.1244],[-39.0545,63.7213],[-39.3131,63.4405],[-39.5739,62.7506],[-39.9532,62.2739],[-40.2757,61.8547],[-40.714,61.3365],[-41.2091,60.8495],[-41.821,60.5526],[-42.4368,60.3264],[-42.8643,60.0299],[-43.1131,59.9147],[-43.3282,59.83],[-43.5459,59.7695],[-43.797,59.7284],[-43.9774,59.7171]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Landsat mosaic of Greenland (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R047_S54_20160411T044330",name:"imagico.de: Heard Island coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R047_S54_20160411T044330&z={zoom}&x={x}&y={-y}",endDate:"2016-04-12T00:00:00.000Z",startDate:"2016-04-12T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[73.06897,-53.27059],[73.06897,-52.87549],[73.67338,-52.87673],[74.08863,-52.9495],[74.08863,-53.27059],[73.06897,-53.27059]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image of Heard island with interior mostly cloud covered but mostly well visible coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82280982013259LGN00",name:"imagico.de: Isla Londonderry",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82280982013259LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-09-16T00:00:00.000Z",startDate:"2013-09-16T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-69.8568,-55.55949],[-72.26521,-55.14943],[-72.26521,-54.51089],[-72.08531,-54.17909],[-69.49116,-54.17889],[-69.4915,-55.28379],[-69.62231,-55.5591],[-69.8568,-55.55949]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"A lot of very coarse coastlines could be improved here, much snow cover though so no use for glacier mapping (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_kangerlussuaq_20151008",name:"imagico.de: Kangerlussuaq Autumn",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20151008&z={zoom}&x={x}&y={-y}",endDate:"2015-10-08T00:00:00.000Z",startDate:"2015-10-08T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[-50.6992,66.9888],[-50.721,67.0017],[-50.7341,67.0125],[-50.7396,67.0193],[-50.7396,67.0212],[-50.7158,67.0265],[-50.7017,67.0265],[-50.6829,67.0176],[-50.6686,67.0077],[-50.6638,66.998],[-50.6642,66.9946],[-50.6891,66.9888],[-50.6992,66.9888]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image of the airport and settlement - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_kangerlussuaq_20160518",name:"imagico.de: Kangerlussuaq Spring",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20160518&z={zoom}&x={x}&y={-y}",endDate:"2016-05-18T00:00:00.000Z",startDate:"2016-05-18T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[-50.7519,66.9996],[-50.7555,67.0023],[-50.7555,67.0033],[-50.6395,67.0297],[-50.6162,67.0339],[-50.6097,67.0281],[-50.6331,67.022],[-50.7323,66.9996],[-50.7519,66.9996]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image of the airport and roads - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R021_N44_20160807T083013",name:"imagico.de: Kerch Strait",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20160807T083013&z={zoom}&x={x}&y={-y}",endDate:"2016-08-07T00:00:00.000Z",startDate:"2016-08-07T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[35.93259,44.96237],[35.93259,45.55926],[37.36991,45.55926],[37.36991,44.96237],[35.93259,44.96237]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"State of bridge construction in August 2016 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R021_N44_20180429T082601",name:"imagico.de: Kerch Strait 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20180429T082601&z={zoom}&x={x}&y={-y}",endDate:"2018-04-29T00:00:00.000Z",startDate:"2018-04-29T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[35.8787,45.0348],[35.8787,45.6095],[36.9208,45.6095],[36.9208,45.0348],[35.8787,45.0348]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Bridge and surrounding after completion in April 2018 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ls_polar2",name:"imagico.de: Landsat off-nadir July 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ls_polar2&z={zoom}&x={x}&y={-y}",endDate:"2016-07-17T00:00:00.000Z",startDate:"2016-07-17T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-79.05175,81.91484],[-79.05175,83.43339],[-73.6039,83.80225],[-26.42449,83.80225],[-21.493,83.50352],[-16.88835,83.15095],[-16.88835,81.91484],[-79.05175,81.91484]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Latest images north of the regular Landsat limit (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-larsen_2018",name:"imagico.de: Larsen C ice shelf after calving",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=larsen_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-01-06T00:00:00.000Z",startDate:"2018-01-06T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-62.7282,-68.9652],[-64.0489,-68.7318],[-64.0486,-68.5373],[-60.8845,-65.9399],[-59.9187,-65.9389],[-59.1088,-66.0775],[-59.1088,-68.8359],[-59.2544,-68.9652],[-62.7282,-68.9652]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"For updating the ice edge after the 2017 iceberg calving (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-AST_L1T_00311162013112731_20150618142416_109190",name:"imagico.de: Leskov Island ASTER",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00311162013112731_20150618142416_109190&z={zoom}&x={x}&y={-y}",endDate:"2013-11-16T00:00:00.000Z",startDate:"2013-11-16T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-28.21075,-56.72108],[-28.21075,-56.62498],[-27.96956,-56.62498],[-27.96956,-56.72108],[-28.21075,-56.72108]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81991002015286LGN00",name:"imagico.de: Leskov Island Landsat",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81991002015286LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-10-13T00:00:00.000Z",startDate:"2015-10-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-27.99293,-56.73479],[-28.22776,-56.73262],[-28.22416,-56.60075],[-27.96975,-56.60283],[-27.97319,-56.73479],[-27.99293,-56.73479]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2B_R005_S69_20180222T061749",name:"imagico.de: Lützow-Holm Bay",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2B_R005_S69_20180222T061749&z={zoom}&x={x}&y={-y}",endDate:"2018-02-22T00:00:00.000Z",startDate:"2018-02-22T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[35.124,-70.3693],[35.1241,-69.2795],[36.3864,-68.4765],[42.2208,-68.4762],[42.2208,-70.3651],[35.124,-70.3693]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late season image or an area poorly mapped in OSM at the moment - lots of sea ice, be careful with distinguishing sea ice from ice shelves and floating glacier tongues. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ls_polar",name:"imagico.de: May 2013 off-nadir Landsat",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ls_polar&z={zoom}&x={x}&y={-y}",endDate:"2013-05-17T00:00:00.000Z",startDate:"2013-05-17T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-85.76109,81.39333],[-89.83016,82.14952],[-89.83153,82.24405],[-84.99342,82.73099],[-79.95207,83.13108],[-74.55641,83.46267],[-69.35851,83.70451],[-28.20784,83.70451],[-23.06624,83.46532],[-17.96584,83.15518],[-17.96721,82.72386],[-22.78197,81.4419],[-85.76109,81.39333]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"First available image north of the regular Landsat limit, mostly with seasonal snow cover so difficult to interpret (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R042_S78_20170214T202521",name:"imagico.de: McMurdo Sound and Dry Valleys",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R042_S78_20170214T202521&z={zoom}&x={x}&y={-y}",endDate:"2017-02-14T00:00:00.000Z",startDate:"2017-02-14T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[162.9125,-78.4514],[162.6595,-78.4257],[159.2712,-77.6013],[159.2712,-77.4108],[164.157,-76.477],[169.7813,-76.4764],[169.7813,-78.4514],[162.9125,-78.4514]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late season image - not ice minimum, be careful with distinguishing sea ice from ice shelves. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R092_S02_20160613T075613",name:"imagico.de: Mount Kenya 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S02_20160613T075613&z={zoom}&x={x}&y={-y}",endDate:"2016-06-13T00:00:00.000Z",startDate:"2016-06-13T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[37.20666,-0.26685],[37.20666,-0.01193],[37.56552,-0.01193],[37.56552,-0.26685],[37.20666,-0.26685]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R092_S05_20160802T075556",name:"imagico.de: Mount Kilimanjaro 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S05_20160802T075556&z={zoom}&x={x}&y={-y}",endDate:"2016-08-02T00:00:00.000Z",startDate:"2016-08-02T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[37.24769,-3.22921],[37.24769,-2.96816],[37.61581,-2.96816],[37.61581,-3.22921],[37.24769,-3.22921]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80940622015159LGN00",name:"imagico.de: New Ireland",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80940622015159LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-06-08T00:00:00.000Z",startDate:"2015-06-08T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[150.38853,-2.80053],[150.38853,-2.3834],[150.83348,-2.3834],[150.83348,-2.80053],[150.38853,-2.80053]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Many missing islands in OSM (mostly mapped meanwhile) (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-northsea_s2_2016",name:"imagico.de: North Sea Coast 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2016&z={zoom}&x={x}&y={-y}",endDate:"2016-09-25T00:00:00.000Z",startDate:"2016-09-25T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[5.1562,52.8755],[5.1615,53.0325],[6.4155,55.7379],[9.8813,55.7459],[9.8813,53.2428],[9.6846,52.8877],[5.1562,52.8755]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-northsea_s2_2017",name:"imagico.de: North Sea Coast 2017",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2017&z={zoom}&x={x}&y={-y}",endDate:"2017-06-02T00:00:00.000Z",startDate:"2017-06-02T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[5.1713,53.0918],[6.477,55.8973],[9.8813,55.8973],[9.8813,53.2761],[9.7789,53.0918],[5.1713,53.0918]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-northsea_s2_2018",name:"imagico.de: North Sea Coast spring 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-05-08T00:00:00.000Z",startDate:"2018-05-08T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[5.3179,53.0918],[5.322,53.4418],[6.7023,56.3572],[9.8813,56.3578],[9.8813,53.2819],[9.7758,53.0921],[5.3179,53.0918]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-caspian_2018",name:"imagico.de: Northeast Caspian Sea 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=caspian_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-05-16T00:00:00.000Z",startDate:"2018-05-16T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[51.0243,45.0729],[51.0243,46.569],[52.4259,46.5687],[53.6471,46.3177],[53.6474,45.0729],[51.0243,45.0729]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coastal contruction and Kashagan oil field in Kazakhstan in May 2018 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ural_s2_2016",name:"imagico.de: Northern and Polar Ural mountains August 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ural_s2_2016&z={zoom}&x={x}&y={-y}",endDate:"2016-08-12T00:00:00.000Z",startDate:"2016-08-12T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[59.19898,64.89205],[59.19898,66.91656],[60.73329,68.44289],[67.73295,68.44327],[67.73295,67.74883],[64.21647,64.91957],[59.19898,64.89205]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late summer imagery with few clouds - caution: not all visible snow is glaciers (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ndvina",name:"imagico.de: Northern Dvina delta at low tide",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ndvina&z={zoom}&x={x}&y={-y}",endDate:"2015-09-13T00:00:00.000Z",startDate:"2015-09-13T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[37.7291,64.1971],[37.7291,65.1161],[37.8592,65.2705],[41.3223,65.2705],[41.3223,64.3142],[41.2114,64.1973],[37.7291,64.1971]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Beaches, tidal flats and other costal forms (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-nellesmere_ast",name:"imagico.de: Northern Ellesmere Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast&z={zoom}&x={x}&y={-y}",endDate:"2012-07-09T00:00:00.000Z",startDate:"2012-07-09T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-81.62923,82.4597],[-83.03136,82.47986],[-83.03136,83.05876],[-72.80309,83.09567],[-65.65786,83.03232],[-65.81167,82.4597],[-81.62923,82.4597]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Assembled from July 2012 ASTER imagery (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-nellesmere_ast_2016",name:"imagico.de: Northern Ellesmere Island July 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast_2016&z={zoom}&x={x}&y={-y}",endDate:"2012-07-15T00:00:00.000Z",startDate:"2012-07-08T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-78.89729,82.17577],[-82.64501,82.19426],[-82.64501,83.08067],[-66.58986,83.08497],[-63.78011,82.98908],[-63.78011,82.72198],[-65.0092,82.17577],[-78.89729,82.17577]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Assembled from July 2016 ASTER imagery (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81960222015233LGN00vis",name:"imagico.de: Northern German west coast tidalflats",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00vis&z={zoom}&x={x}&y={-y}",endDate:"2015-08-21T00:00:00.000Z",startDate:"2015-08-21T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[7.63568,53.28027],[7.63568,53.6677],[8.49433,55.50246],[9.20775,55.48106],[9.20775,53.28027],[7.63568,53.28027]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81960222015233LGN00ir",name:"imagico.de: Northern German west coast tidalflats (infrared)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00ir&z={zoom}&x={x}&y={-y}",endDate:"2015-08-21T00:00:00.000Z",startDate:"2015-08-21T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[7.63568,53.28027],[7.63568,53.66811],[8.49433,55.50246],[9.20775,55.48106],[9.20775,53.28027],[7.63568,53.28027]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ngreenland_ast",name:"imagico.de: Northern Greenland ASTER",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ngreenland_ast&z={zoom}&x={x}&y={-y}",endDate:"2012-08-13T00:00:00.000Z",startDate:"2005-06-21T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-52.49222,82.48972],[-52.49222,82.94295],[-49.28696,83.47312],[-44.5285,83.73214],[-29.5253,83.73214],[-25.26398,83.58271],[-21.18393,83.39776],[-21.18393,82.74312],[-23.40454,82.48972],[-52.49222,82.48972]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Assembled from mostly 2012 ASTER imagery, some 2005 images mainly in the northeast (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-EO1A1350972013086110KF",name:"imagico.de: Northwest Heard Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=EO1A1350972013086110KF&z={zoom}&x={x}&y={-y}",endDate:"2013-03-13T00:00:00.000Z",startDate:"2013-03-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[73.2279,-53.20333],[73.2279,-53.01073],[73.25949,-52.94944],[73.78992,-52.94944],[73.78992,-53.06048],[73.71783,-53.20333],[73.2279,-53.20333]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Glaciers of Northwest Heard Island (mapped meanwhile) (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R111_N09_20160604T154554",name:"imagico.de: Panama Canal",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R111_N09_20160604T154554&z={zoom}&x={x}&y={-y}",endDate:"2016-06-07T00:00:00.000Z",startDate:"2016-06-07T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-80.01654,8.84898],[-80.01654,9.41481],[-79.46859,9.41481],[-79.46859,8.84898],[-80.01654,8.84898]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Images of the new locks (but partly cloudy) (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-EO1A0120532016364110KF",name:"imagico.de: Panama Canal - Pacific side",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=EO1A0120532016364110KF&z={zoom}&x={x}&y={-y}",endDate:"2016-12-30T00:00:00.000Z",startDate:"2016-12-30T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-79.62539,8.77083],[-79.68684,8.82197],[-79.68667,8.93705],[-79.65363,9.09294],[-79.26816,9.09294],[-79.32833,8.77083],[-79.62539,8.77083]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"New locks with less clouds than in the Sentinel-2 image - make sure to check image alignment (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R078_N68_20160930T081002",name:"imagico.de: Pechora Sea Coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N68_20160930T081002&z={zoom}&x={x}&y={-y}",endDate:"2016-09-30T00:00:00.000Z",startDate:"2016-09-30T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[53.1802,67.5344],[53.1821,68.414],[54.2107,69.3367],[55.3584,70.2786],[59.004,70.2786],[60.6947,69.977],[61.9837,69.7161],[61.9823,68.9395],[59.9153,67.5344],[53.1802,67.5344]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Sentinel-2 image of the Pechora Sea coast in autumn 2016 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81511242016033LGN00",name:"imagico.de: Pensacola Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81511242016033LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-02-02T00:00:00.000Z",startDate:"2016-02-02T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-53.20922,-84.12525],[-60.61538,-83.78609],[-60.61538,-82.29969],[-48.72405,-82.29987],[-44.52178,-82.43683],[-44.51354,-84.12525],[-53.20922,-84.12525]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R136_N41_20150831T093006",name:"imagico.de: Prokletije Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R136_N41_20150831T093006&z={zoom}&x={x}&y={-y}",endDate:"2015-08-31T00:00:00.000Z",startDate:"2015-08-31T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[19.11233,42.15316],[19.08426,43.08074],[20.63299,43.09603],[20.63788,42.16779],[19.11233,42.15316]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Late summer imagery where usual sources are severely limited by clouds and snow (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-DMS_1142622_03746_20110415_17533956",name:"imagico.de: Qasigiannguit",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142622_03746_20110415_17533956&z={zoom}&x={x}&y={-y}",endDate:"2011-04-15T00:00:00.000Z",startDate:"2011-04-15T00:00:00.000Z",zoomExtent:[0,15],polygon:[[[-51.23857,68.79972],[-51.24334,68.85303],[-51.15167,68.85303],[-51.14038,68.80116],[-51.23857,68.79972]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image of the settlement - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81510432015030LGN00",name:"imagico.de: Rann of Kutch",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81510432015030LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[67.9684,22.36265],[67.86231,22.38392],[67.86231,24.88693],[71.48986,24.88693],[71.48986,22.36265],[67.9684,22.36265]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Land/water distinction difficult to properly map based on Bing/Mapbox images (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R093_N41_20150828T092005",name:"imagico.de: Rila and Pirin Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R093_N41_20150828T092005&z={zoom}&x={x}&y={-y}",endDate:"2015-08-28T00:00:00.000Z",startDate:"2015-08-28T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[23.80811,41.58488],[22.99238,41.60195],[23.01186,42.29984],[23.99402,42.28339],[23.96561,41.58488],[23.80811,41.58488]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Late summer imagery where usual sources are severely limited by clouds and snow (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81730602015040LGN00",name:"imagico.de: Rwenzori Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81730602015040LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-02-09T00:00:00.000Z",startDate:"2015-02-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[29.7663,0.20689],[29.7663,0.50918],[30.0346,0.50918],[30.0346,0.20689],[29.7663,0.20689]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image of most of the remaining Rwenzori Mountains glaciers (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R078_N01_20160702T082522",name:"imagico.de: Rwenzori Mountains 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N01_20160702T082522&z={zoom}&x={x}&y={-y}",endDate:"2016-07-02T00:00:00.000Z",startDate:"2016-07-02T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[29.80514,0.23586],[29.80514,0.46709],[30.02503,0.46709],[30.02503,0.23586],[29.80514,0.23586]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80611072014036LGN00",name:"imagico.de: Scott Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80611072014036LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-02-05T00:00:00.000Z",startDate:"2014-02-05T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-180,-67.42635],[-180,-67.32544],[-179.82473,-67.32538],[-179.82473,-67.42635],[-180,-67.42635]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82100972015347LGN00",name:"imagico.de: Shag Rocks",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82100972015347LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-12-13T00:00:00.000Z",startDate:"2015-12-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-42.12875,-53.7205],[-42.14626,-53.45782],[-41.67573,-53.44586],[-41.65582,-53.70872],[-42.12875,-53.7205]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81130622013270LGN00",name:"imagico.de: Southeastern Sulawesi",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81130622013270LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-09-27T00:00:00.000Z",startDate:"2013-09-27T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[120.84382,-3.59545],[120.84382,-3.15985],[120.98184,-2.51468],[122.62618,-2.51468],[122.62618,-3.00215],[122.5007,-3.59545],[120.84382,-3.59545]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing islands and coarse coastline due to cloud cover in Bing, lakes could also use additional detail (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80281222016035LGN00",name:"imagico.de: Southern Transantarctic Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80281222016035LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-02-04T00:00:00.000Z",startDate:"2016-02-04T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[156.96951,-84.50098],[154.50858,-84.46255],[154.50858,-82.60681],[175.46774,-82.58505],[177.00583,-83.52807],[177.00583,-84.19262],[171.93839,-84.34633],[166.83798,-84.4437],[161.67029,-84.50045],[156.96951,-84.50098]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81030632015286LGN00",name:"imagico.de: Sudirman Range 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81030632015286LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-10-13T00:00:00.000Z",startDate:"2015-10-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[136.4226,-4.2853],[136.4226,-3.6447],[137.7971,-3.6447],[137.7971,-4.2853],[136.4226,-4.2853]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Older image of the Sudirman Range with no fresh snow showing glacier extent (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R088_S05_20160812T011732",name:"imagico.de: Sudirman Range 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R088_S05_20160812T011732&z={zoom}&x={x}&y={-y}",endDate:"2016-08-12T00:00:00.000Z",startDate:"2016-08-12T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[136.8044,-4.2585],[136.8044,-3.7836],[137.7701,-3.7836],[137.7701,-4.2585],[136.8044,-4.2585]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Cloud free image of the Sudirman Range but with fresh snow (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-s2sval",name:"imagico.de: Svalbard mosaic",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=s2sval&z={zoom}&x={x}&y={-y}",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[16.6108,76.4137],[16.4731,76.4268],[16.3788,76.4589],[14.4124,77.1324],[14.0784,77.2536],[10.9875,78.4054],[10.631,78.5605],[10.2314,78.8392],[10.3952,79.6074],[10.516,79.7731],[10.9632,79.8707],[20.2294,80.849],[20.4702,80.8493],[25.1752,80.6817],[33.4391,80.3438],[33.7809,80.3016],[34.0395,80.239],[33.977,80.1527],[25.5722,76.5917],[25.2739,76.481],[25.1416,76.4327],[24.937,76.4176],[16.6108,76.4137]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Sentinel-2 mosaic of Svalbard (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-DMS_1142636_160xx_20110507_1822xxxx",name:"imagico.de: Thule Air Base",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142636_160xx_20110507_1822xxxx&z={zoom}&x={x}&y={-y}",endDate:"2011-05-07T00:00:00.000Z",startDate:"2011-05-07T00:00:00.000Z",zoomExtent:[0,15],polygon:[[[-68.93977,76.51133],[-68.93977,76.5499],[-68.76635,76.55176],[-68.50993,76.55176],[-68.50744,76.51612],[-68.67897,76.51194],[-68.93977,76.51133]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_thule2_2015.09.25",name:"imagico.de: Thule Airbase DMS low altitude overflight September 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_thule2_2015.09.25&z={zoom}&x={x}&y={-y}",endDate:"2015-09-25T00:00:00.000Z",startDate:"2015-09-25T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[-68.74292,76.52636],[-68.74446,76.5284],[-68.74807,76.54939],[-68.74615,76.56017],[-68.72276,76.56022],[-68.72017,76.55775],[-68.71853,76.52921],[-68.71978,76.52637],[-68.74292,76.52636]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS aerial images from Thule Airbase - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_thule_2015.10.06",name:"imagico.de: Thule Airbase DMS overflight October 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.10.06&z={zoom}&x={x}&y={-y}",endDate:"2015-10-06T00:00:00.000Z",startDate:"2015-10-06T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[-68.81924,76.5251],[-68.82651,76.54177],[-68.77345,76.5439],[-68.7021,76.54545],[-68.59177,76.5456],[-68.59183,76.52793],[-68.6597,76.5251],[-68.81924,76.5251]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS aerial images from Thule Airbase - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_thule_2015.09.25",name:"imagico.de: Thule Airbase DMS overflight September 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.09.25&z={zoom}&x={x}&y={-y}",endDate:"2015-09-25T00:00:00.000Z",startDate:"2015-09-25T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[-68.77771,76.50688],[-68.77662,76.57064],[-68.68115,76.57065],[-68.6763,76.55384],[-68.6762,76.53074],[-68.68523,76.50688],[-68.77771,76.50688]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS aerial images from Thule Airbase - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R094_N79_20160812T105622",name:"imagico.de: Ushakov Island August 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R094_N79_20160812T105622&z={zoom}&x={x}&y={-y}",endDate:"2016-08-12T00:00:00.000Z",startDate:"2016-08-12T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[78.45886,80.72643],[78.45886,80.9099],[80.48892,80.9099],[80.48892,80.72643],[78.45886,80.72643]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late summer imagery with few clouds (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80910682014358LGN00",name:"imagico.de: Vanatinai",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80910682014358LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-12-24T00:00:00.000Z",startDate:"2014-12-24T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[153.06138,-11.78923],[153.06138,-11.28869],[153.10927,-11.07229],[154.41201,-11.07229],[154.41201,-11.78923],[153.06138,-11.78923]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coarse coastline due to cloud cover in Bing/Mapbox (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82330892016031LGN00",name:"imagico.de: Volcán Calbuco",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82330892016031LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-01-31T00:00:00.000Z",startDate:"2016-01-31T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-72.86696,-41.51741],[-72.86696,-41.04527],[-72.23181,-41.04527],[-71.8751,-41.10829],[-72.00007,-41.51741],[-72.86696,-41.51741]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Image from after the 2015 eruption (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R089_N52_20160623T024048",name:"imagico.de: Vostochny Cosmodrome",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R089_N52_20160623T024048&z={zoom}&x={x}&y={-y}",endDate:"2016-06-23T00:00:00.000Z",startDate:"2016-06-23T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[126.36143,51.37553],[126.34804,52.33932],[128.60762,52.3409],[128.61174,51.37553],[126.36143,51.37553]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image showing newest features (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-walps_autumn_2017",name:"imagico.de: Western Alps autumn colors 2017",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=walps_autumn_2017&z={zoom}&x={x}&y={-y}",endDate:"2017-10-17T00:00:00.000Z",startDate:"2017-10-17T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[4.6412,43.2493],[4.3118,43.2653],[4.3118,44.2167],[5.2562,46.965],[5.9151,48.7177],[7.3866,48.7467],[10.088,48.7467],[10.088,48.7032],[7.7819,43.2813],[7.76,43.2653],[7.3646,43.2493],[4.6412,43.2493]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Autumn colors in the Alps, Jura and southwestern Germany  (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81490352013282LGN00",name:"imagico.de: Western Karakoram",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81490352013282LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-10-09T00:00:00.000Z",startDate:"2013-10-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[75.98364,34.97851],[73.96164,35.36957],[74.44281,37.09391],[76.50601,36.70267],[75.98364,34.97851]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Represents approximately minimum snow cover so can be well used for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R039_S15_20160510T145731",name:"imagico.de: Willkanuta Mountains and Quelccaya Ice Cap",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R039_S15_20160510T145731&z={zoom}&x={x}&y={-y}",endDate:"2016-05-10T00:00:00.000Z",startDate:"2016-05-10T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-71.18071,-14.49785],[-71.17976,-13.71029],[-70.55637,-13.71263],[-70.55637,-14.49785],[-71.18071,-14.49785]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Poor and outdated imagery in other sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"IPR-orotofoto-last-tms",name:"IPR ortofoto LAST (tmsproxy)",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_ipr_last.php/{zoom}/{x}/{y}.jpg",zoomExtent:[1,20],polygon:[[[14.81232,49.93089],[14.18755,49.87687],[14.12025,50.19882],[14.74502,50.25247],[14.81232,49.93089]]]},{id:"IPR-orotofoto-vege-tms",name:"IPR ortofoto Low-Vegetation (tmsproxy)",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_ipr_vege.php/{zoom}/{x}/{y}.jpg",zoomExtent:[1,20],polygon:[[[14.30454,49.99538],[14.31604,49.94205],[14.35,49.94508],[14.35384,49.92726],[14.42385,49.93352],[14.42009,49.95097],[14.48865,49.95709],[14.48479,49.97501],[14.55386,49.98117],[14.55012,49.99852],[14.58455,50.00159],[14.5883,49.98424],[14.69168,49.99346],[14.67634,50.06453],[14.71279,50.06777],[14.70115,50.12158],[14.6647,50.11834],[14.661,50.13543],[14.62755,50.13246],[14.61965,50.16895],[14.58543,50.16591],[14.58163,50.18344],[14.40776,50.168],[14.41156,50.15045],[14.37765,50.14744],[14.3738,50.16524],[14.33893,50.16214],[14.34278,50.14434],[14.27368,50.1382],[14.27749,50.12058],[14.2088,50.11447],[14.21289,50.09557],[14.24656,50.09857],[14.25417,50.06336],[14.21987,50.0603],[14.2237,50.04259],[14.258,50.04565],[14.26953,49.99226],[14.30454,49.99538]]]},{id:"GSGS3906",name:"Ireland British War Office 1:25k GSGS 3906",type:"tms",template:"https://mapwarper.net/layers/tile/101/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[-9.31139,51.43828],[-7.36131,51.99302],[-7.33934,52.13149],[-6.9658,52.06231],[-6.23796,52.1534],[-6.21049,52.52928],[-5.98253,52.80079],[-5.96056,53.67037],[-6.20775,53.67851],[-6.22423,53.95255],[-5.86442,54.12513],[-5.85893,54.20392],[-5.53483,54.23122],[-5.39476,54.44739],[-5.50188,54.70052],[-6.21873,55.38194],[-6.86418,55.2162],[-7.25145,55.46455],[-7.53435,55.30853],[-8.25395,55.26787],[-8.61101,54.97259],[-8.49016,54.89369],[-8.83897,54.68306],[-8.42699,54.52397],[-8.75108,54.31302],[-9.29765,54.38985],[-10.05296,54.37866],[-10.30015,54.05747],[-10.02275,53.79386],[-10.30565,53.55142],[-9.99803,53.24354],[-9.09166,53.19256],[-9.81676,53.1102],[-9.48167,52.96984],[-9.70415,52.68107],[-10.00627,52.63608],[-9.78929,52.52426],[-9.99803,52.32663],[-10.64348,52.1753],[-10.39629,51.9761],[-10.16832,51.64668],[-10.28642,51.57334],[-9.88542,51.57163],[-9.79204,51.44684],[-9.31139,51.43828]]],terms_url:"https://wiki.openstreetmap.org/wiki/Ireland/Background_Imagery#Trinity_College_Dublin",terms_text:"Glucksman Map Library, Trinity College Dublin",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ie/IrelandBritishWarOffice-GSGS3906.png"},{id:"Israel_Hiking",name:"Israel Hiking",type:"tms",template:"https://israelhiking.osm.org.il/Tiles/{zoom}/{x}/{y}.png",zoomExtent:[7,16],polygon:[[[34.64563,32.92073],[34.98374,33.13352],[35.15662,33.09994],[35.31781,33.11463],[35.36541,33.06285],[35.46229,33.09994],[35.51741,33.12652],[35.5266,33.21531],[35.53893,33.25442],[35.56446,33.2969],[35.61264,33.27918],[35.67429,33.30627],[35.70785,33.34269],[35.75363,33.35091],[35.81509,33.3392],[35.91531,32.9406],[35.80834,32.772],[35.77835,32.72446],[35.59491,32.62828],[35.5729,32.36541],[35.59461,32.21856],[35.55452,32.02901],[35.57225,31.75415],[35.48771,31.41951],[35.4209,31.25116],[35.47936,31.1783],[35.42771,30.95172],[35.3321,30.77107],[35.20709,30.53307],[35.17202,30.11204],[35.07514,29.83713],[35.02336,29.64569],[34.93992,29.39946],[34.89517,29.37711],[34.84785,29.59084],[34.69667,30.10714],[34.52423,30.40912],[34.48879,30.64515],[34.07929,31.52265],[34.64563,32.92073]]],terms_url:"https://israelhiking.osm.org.il/",terms_text:"Tiles © IsraelHiking, CC BY-SA-NC 3.0. Data by OpenStreetMap under ODbL.",description:"Israel Hiking map",icon:"https://israelhiking.osm.org.il/content/favicons/favicon.ico"},{id:"Israel_MTB",name:"Israel MTB",type:"tms",template:"https://israelhiking.osm.org.il/MTBTiles/{zoom}/{x}/{y}.png",zoomExtent:[7,16],polygon:[[[34.64563,32.92073],[34.98374,33.13352],[35.15662,33.09994],[35.31781,33.11463],[35.36541,33.06285],[35.46229,33.09994],[35.51741,33.12652],[35.5266,33.21531],[35.53893,33.25442],[35.56446,33.2969],[35.61264,33.27918],[35.67429,33.30627],[35.70785,33.34269],[35.75363,33.35091],[35.81509,33.3392],[35.91531,32.9406],[35.80834,32.772],[35.77835,32.72446],[35.59491,32.62828],[35.5729,32.36541],[35.59461,32.21856],[35.55452,32.02901],[35.57225,31.75415],[35.48771,31.41951],[35.4209,31.25116],[35.47936,31.1783],[35.42771,30.95172],[35.3321,30.77107],[35.20709,30.53307],[35.17202,30.11204],[35.07514,29.83713],[35.02336,29.64569],[34.93992,29.39946],[34.89517,29.37711],[34.84785,29.59084],[34.69667,30.10714],[34.52423,30.40912],[34.48879,30.64515],[34.07929,31.52265],[34.64563,32.92073]]],terms_url:"https://israelhiking.osm.org.il/",terms_text:"Tiles © IsraelHiking, CC BY-SA-NC 3.0. Data by OpenStreetMap under ODbL.",description:"Israel MTB map",icon:"https://israelhiking.osm.org.il/content/favicons/favicon.ico"},{id:"ITACyL-Castile-and-Leon",name:"ITACyL - Castile and León",type:"wms",template:"http://orto.wms.itacyl.es/WMS?REQUEST=GetMap&SERVICE=WMS&VERSION=1.1.1&LAYERS=Ortofoto_CyL&SRS={proj}&FORMAT=image/jpeg&STYLES=Default&TRANSPARENT=TRUE&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[-1.9358,41.43834],[-1.89601,41.43869],[-1.89536,41.39687],[-1.9767,41.39616],[-1.97639,41.37623],[-2.06201,41.37548],[-2.06262,41.41471],[-2.10458,41.41434],[-2.10363,41.35367],[-2.14448,41.35331],[-2.1419,41.18683],[-2.06204,41.18753],[-2.06171,41.16624],[-2.02046,41.16661],[-2.01887,41.06334],[-2.10083,41.06262],[-2.10114,41.08296],[-2.22733,41.08185],[-2.22704,41.0635],[-2.26912,41.06313],[-2.2688,41.04257],[-2.35325,41.04182],[-2.35356,41.06148],[-2.39487,41.06112],[-2.39457,41.04206],[-2.43722,41.04168],[-2.43756,41.06315],[-2.47928,41.06278],[-2.47991,41.10369],[-2.52078,41.10333],[-2.5211,41.12429],[-2.60415,41.12357],[-2.60481,41.16628],[-2.6471,41.16591],[-2.64808,41.22931],[-2.72874,41.2286],[-2.72907,41.24974],[-2.89552,41.24828],[-2.89649,41.31063],[-2.9363,41.31028],[-2.93571,41.27231],[-3.14692,41.27046],[-3.14723,41.29045],[-3.22828,41.28974],[-3.22767,41.25008],[-3.39581,41.2486],[-3.39518,41.20808],[-3.43492,41.20773],[-3.43429,41.16696],[-3.47877,41.16657],[-3.47844,41.14556],[-3.60336,41.14446],[-3.6027,41.10169],[-3.64539,41.10131],[-3.64508,41.08159],[-3.68735,41.08122],[-3.68673,41.04104],[-3.72866,41.04067],[-3.72803,40.9998],[-3.76896,40.99944],[-3.76864,40.97886],[-3.85473,40.97811],[-3.8544,40.95653],[-3.89857,40.95615],[-3.89764,40.89575],[-3.93906,40.89539],[-3.93716,40.77204],[-4.06198,40.77093],[-4.06133,40.72926],[-4.10372,40.72888],[-4.10311,40.68918],[-4.14628,40.6888],[-4.14498,40.60421],[-4.19025,40.60381],[-4.18994,40.58362],[-4.22946,40.58327],[-4.22979,40.60487],[-4.27054,40.60451],[-4.26958,40.54211],[-4.31384,40.54171],[-4.31163,40.39758],[-4.39376,40.39685],[-4.39345,40.37677],[-4.43723,40.37638],[-4.43623,40.31123],[-4.52192,40.31046],[-4.52037,40.20897],[-4.56131,40.2086],[-4.56099,40.18763],[-4.68895,40.18649],[-4.68933,40.21101],[-4.73192,40.21063],[-4.73252,40.24966],[-4.76838,40.24934],[-4.76809,40.23035],[-4.81104,40.22996],[-4.81147,40.20726],[-4.8542,40.18414],[-4.85264,40.12563],[-4.93699,40.12488],[-4.93638,40.08529],[-5.35538,40.08155],[-5.35606,40.12562],[-5.44027,40.12487],[-5.44091,40.16673],[-5.60382,40.16527],[-5.60448,40.20881],[-5.68646,40.20808],[-5.68712,40.25131],[-6.02166,40.24834],[-6.02295,40.33257],[-6.10433,40.33184],[-6.1056,40.41451],[-6.18951,40.41376],[-6.19018,40.45745],[-6.26971,40.45675],[-6.26909,40.41653],[-6.35192,40.41579],[-6.35128,40.37422],[-6.43325,40.37349],[-6.43264,40.33361],[-6.52245,40.33281],[-6.52116,40.24849],[-6.59942,40.24779],[-6.59886,40.21128],[-6.85568,40.20899],[-6.85634,40.25257],[-6.93622,40.25186],[-6.93751,40.33657],[-6.85111,40.33734],[-6.86001,40.91672],[-6.93544,40.91605],[-6.93741,41.0435],[-6.85482,41.04423],[-6.85548,41.08706],[-6.77015,41.08781],[-6.77245,41.23623],[-6.68379,41.23701],[-6.60436,41.2377],[-6.60524,41.29474],[-6.5193,41.29549],[-6.51991,41.33479],[-6.43673,41.33552],[-6.43801,41.41814],[-6.35318,41.41888],[-6.35447,41.50141],[-6.26889,41.50216],[-6.2708,41.6245],[-6.35661,41.62375],[-6.35724,41.66401],[-6.43548,41.66333],[-6.4349,41.62651],[-6.52279,41.62575],[-6.52343,41.66635],[-6.6034,41.66565],[-6.60733,41.9166],[-7.02209,41.913],[-7.02406,42.03872],[-7.1054,42.03801],[-7.10613,42.08421],[-7.0208,42.08495],[-7.02276,42.2094],[-6.93699,42.21014],[-6.93763,42.25087],[-6.8548,42.25159],[-6.85545,42.29329],[-6.77342,42.294],[-6.77403,42.33244],[-6.85325,42.33176],[-6.85523,42.4569],[-7.10341,42.45477],[-7.10811,42.75115],[-7.02199,42.75189],[-7.02241,42.77825],[-6.93976,42.77896],[-6.94199,42.91962],[-6.77302,42.92106],[-6.77363,42.95958],[-6.52329,42.96172],[-6.52391,43.00095],[-6.43893,43.00167],[-6.44024,43.08361],[-5.93782,43.08789],[-5.93708,43.04189],[-5.85421,43.0426],[-5.85357,43.00258],[-5.77236,43.00327],[-5.77363,43.08308],[-5.6027,43.08453],[-5.60202,43.04222],[-5.52161,43.04291],[-5.52226,43.08409],[-5.4376,43.08481],[-5.43827,43.12651],[-5.10444,43.12935],[-5.10573,43.2099],[-5.02386,43.2106],[-5.02451,43.25117],[-4.90017,43.25222],[-4.89941,43.20501],[-4.81126,43.20576],[-4.80966,43.10538],[-4.76975,43.10571],[-4.76937,43.08168],[-4.72945,43.08202],[-4.72881,43.04219],[-4.56322,43.0436],[-4.56353,43.06296],[-4.39599,43.06438],[-4.39566,43.04336],[-4.3537,43.04371],[-4.35266,42.97836],[-4.23013,42.9794],[-4.22913,42.91625],[-4.18774,42.9166],[-4.18706,42.87407],[-4.10552,42.87476],[-4.10486,42.83348],[-3.97801,42.83457],[-3.97733,42.79214],[-3.9375,42.79248],[-3.93781,42.81183],[-3.85397,42.81254],[-3.85427,42.83193],[-3.89573,42.83158],[-3.89607,42.85343],[-3.93821,42.85307],[-3.93889,42.89577],[-3.9806,42.89542],[-3.98093,42.91627],[-4.0222,42.91591],[-4.0229,42.96014],[-3.97851,42.96052],[-3.97946,43.01999],[-3.93883,43.02034],[-3.93918,43.04239],[-3.89704,43.04275],[-3.89738,43.06414],[-3.85424,43.06451],[-3.8549,43.10583],[-3.77086,43.10654],[-3.77116,43.12515],[-3.72819,43.12551],[-3.72853,43.14656],[-3.68713,43.14691],[-3.68778,43.18786],[-3.60365,43.18858],[-3.60331,43.16747],[-3.52278,43.16815],[-3.52243,43.14619],[-3.39669,43.14726],[-3.39699,43.16601],[-3.35444,43.16637],[-3.35479,43.18837],[-3.31268,43.18873],[-3.31299,43.20828],[-3.22993,43.20899],[-3.22959,43.18768],[-3.10343,43.18875],[-3.10274,43.14562],[-3.14546,43.14526],[-3.14516,43.1271],[-3.10617,43.12743],[-3.10445,43.01915],[-3.02075,43.01987],[-3.0201,42.97903],[-2.9811,42.97936],[-2.97977,42.8958],[-3.10476,42.89473],[-3.10276,42.76928],[-3.02199,42.76997],[-3.02168,42.74983],[-2.98024,42.75019],[-2.97988,42.7275],[-2.89613,42.72822],[-2.89679,42.76967],[-2.8534,42.77004],[-2.85405,42.81087],[-2.68577,42.81231],[-2.68544,42.79159],[-2.64523,42.79194],[-2.64489,42.77024],[-2.52005,42.7713],[-2.51936,42.72827],[-2.5607,42.72791],[-2.56038,42.7076],[-2.51944,42.70795],[-2.5181,42.62357],[-2.60404,42.62283],[-2.60439,42.64497],[-2.77154,42.64353],[-2.77188,42.66544],[-2.81176,42.6651],[-2.8121,42.68624],[-2.85469,42.68588],[-2.85337,42.60302],[-2.89413,42.60267],[-2.89379,42.58159],[-3.0619,42.58015],[-3.06031,42.47952],[-3.02191,42.47985],[-3.0199,42.3525],[-3.06255,42.35213],[-3.06029,42.20906],[-3.1012,42.20871],[-3.10086,42.18682],[-3.06175,42.18716],[-3.0611,42.14559],[-3.02029,42.14594],[-3.01963,42.10375],[-2.89602,42.10482],[-2.89501,42.04071],[-2.81222,42.04143],[-2.81353,42.1246],[-2.76871,42.12499],[-2.76905,42.14674],[-2.72695,42.14711],[-2.7266,42.12485],[-2.68706,42.12519],[-2.68605,42.06109],[-2.72804,42.06073],[-2.72739,42.0193],[-2.60343,42.02037],[-2.60376,42.04135],[-2.561,42.04173],[-2.56198,42.10411],[-2.52266,42.10445],[-2.52299,42.12577],[-2.47933,42.12615],[-2.47963,42.145],[-2.35517,42.14608],[-2.3555,42.16747],[-2.31184,42.16785],[-2.3115,42.14605],[-2.2699,42.14641],[-2.26924,42.1048],[-2.2295,42.10515],[-2.22981,42.12514],[-2.14467,42.12587],[-2.14432,42.10386],[-2.10385,42.10421],[-2.10156,41.95811],[-1.97689,41.95919],[-1.97655,41.93765],[-1.93473,41.93801],[-1.93504,41.95776],[-1.89453,41.95811],[-1.89483,41.97715],[-1.854,41.97751],[-1.85304,41.91638],[-1.81381,41.91672],[-1.81151,41.76984],[-1.7706,41.77019],[-1.76866,41.64582],[-1.85335,41.64508],[-1.85305,41.62567],[-1.89471,41.6253],[-1.89403,41.58215],[-1.97716,41.58142],[-1.97683,41.56021],[-1.9377,41.56055],[-1.9358,41.43834]]],terms_text:"ITACyL"},{id:"finds.jp_KBN_2500",name:"Japan GSI KIBAN 2500",type:"tms",template:"http://www.finds.jp/ws/tmc/1.0.0/KBN2500FN-900913-L/{zoom}/{x}/{y}.png",zoomExtent:[15,20],polygon:[[[140.88867,45.67548],[140.71289,45.41388],[141.04248,43.80282],[139.96582,43.35714],[138.99902,42.01665],[139.04297,41.26129],[137.5708,38.58253],[132.69287,36.86204],[130.84717,34.93999],[129.74854,34.994],[129.02344,34.56086],[128.36426,33.21112],[127.90283,31.87756],[128.4082,29.89781],[125.8374,26.78485],[123.33252,25.0657],[122.58545,24.42715],[123.53027,23.44309],[125.88135,24.10665],[129.96826,26.31311],[132.1875,30.20211],[134.42871,32.43561],[136.82373,33.28462],[137.85645,34.21634],[138.64746,33.24788],[138.58154,32.00808],[139.6582,28.67131],[141.65771,29.66896],[142.0752,32.06396],[141.21826,33.37641],[141.56982,35.44277],[141.43799,36.52729],[142.82227,39.16414],[143.04199,40.89691],[145.92041,42.40723],[146.18408,43.03678],[145.74463,43.54855],[145.32715,43.67582],[145.30518,43.91372],[145.61279,44.2452],[145.41504,44.62175],[144.38232,44.52784],[142.31689,45.53714],[141.3501,45.70618],[140.88867,45.67548]]],terms_url:"http://www.finds.jp/siteinfo/c_tou.html.ja",terms_text:"GSI KIBAN 2500",description:"GSI Kiban 2500 via finds.jp. Good for tracing, but a bit older."},{id:"gsi.go.jp",name:"Japan GSI ortho Imagery",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/ort/{zoom}/{x}/{y}.jpg",zoomExtent:[5,19],polygon:[[[130.35021,31.45741],[130.26851,31.45817],[130.20875,31.44939],[130.1002,31.44996],[130.09237,31.3919],[130.13355,31.37528],[130.35043,31.37528],[130.35021,31.45741]],[[130.4193,31.41715],[130.417,31.41672],[130.41677,31.47525],[130.34179,31.47506],[130.34179,31.48374],[130.33362,31.48374],[130.33329,31.50044],[130.36675,31.49997],[130.36664,31.52458],[130.35019,31.52544],[130.35041,31.54986],[130.32523,31.55024],[130.32501,31.60029],[130.31661,31.63336],[130.31634,31.65084],[130.3752,31.65084],[130.31164,31.67599],[130.29194,31.69179],[130.29105,31.73235],[130.2521,31.73387],[130.24986,31.71693],[130.24427,31.71712],[130.21629,31.75804],[130.17533,31.75919],[130.17422,31.78259],[130.18384,31.79096],[130.23644,31.79096],[130.26911,31.77003],[130.36334,31.75785],[130.42668,31.70893],[130.62409,31.7076],[130.62588,31.68627],[130.61088,31.62245],[130.55582,31.50249],[130.54239,31.41715],[130.42158,31.41715],[130.4193,31.41715]],[[130.52516,31.24184],[130.54441,31.24107],[130.56858,31.21715],[130.59924,31.21657],[130.59924,31.26633],[130.57641,31.26633],[130.57351,31.31625],[130.6308,31.28393],[130.68989,31.27666],[130.66706,31.26059],[130.66594,31.21925],[130.64401,31.18135],[130.59007,31.14688],[130.54239,31.17503],[130.54239,31.1913],[130.50009,31.19207],[130.50009,31.21581],[130.52494,31.21715],[130.52516,31.24184]],[[130.74987,31.16622],[130.74965,31.24107],[130.77449,31.25887],[130.77718,31.33307],[130.75122,31.37455],[130.74898,31.41658],[130.67557,31.46852],[130.67489,31.50077],[131.40006,31.5002],[131.40834,31.45916],[131.36694,31.40932],[131.3656,31.35142],[131.31703,31.34206],[131.29957,31.36595],[131.24317,31.36633],[131.19952,31.43358],[131.14782,31.45019],[131.13394,31.45],[131.1326,31.42899],[131.10059,31.42536],[131.05091,31.41639],[131.04912,31.39155],[131.08403,31.35085],[131.11626,31.35085],[131.11783,31.33422],[130.99943,31.33365],[130.99965,31.25102],[130.87521,31.25064],[130.87454,31.16679],[130.74987,31.16622]],[[130.86625,30.47468],[130.86602,30.49937],[130.93362,30.57493],[130.93227,30.61597],[131.00636,30.61655],[131.04933,30.59112],[131.04933,30.54275],[130.99203,30.50843],[130.99114,30.47526],[130.86625,30.47468]],[[137.87486,36.37519],[138.00005,36.37494],[138.00005,36.30839],[138.04159,36.30827],[138.04191,36.29175],[138.08306,36.29162],[138.08353,36.2499],[138.13307,36.24996],[138.13354,36.16677],[138.16654,36.1667],[138.16694,36.12485],[138.04167,36.12491],[138.04144,36.04158],[137.87479,36.04152],[137.87486,36.37519]],[[138.37446,35.83393],[138.4998,35.83285],[138.4998,35.75042],[138.74936,35.7506],[138.7507,35.58332],[138.62447,35.58386],[138.62536,35.49991],[138.37491,35.49972],[138.37446,35.83393]],[[135.79179,35.64165],[135.8006,35.64923],[135.834,35.65052],[135.8916,35.62003],[135.89271,35.6091],[135.95776,35.60858],[135.9834,35.6172],[135.98435,35.641],[135.95095,35.6419],[135.95048,35.68305],[135.94225,35.69204],[135.94178,35.73239],[136.00809,35.77516],[136.03167,35.77503],[136.05018,35.75012],[136.05003,35.66646],[136.0084,35.65836],[136.00856,35.61694],[136.03404,35.60022],[136.06664,35.59996],[136.06617,35.61656],[136.1002,35.62492],[136.1002,35.69127],[136.07598,35.69166],[136.07503,35.74922],[136.08342,35.76694],[136.12441,35.76605],[136.15021,35.7004],[136.15875,35.64216],[136.17442,35.62492],[136.17553,35.58342],[136.1749,35.55813],[136.15859,35.55832],[136.15875,35.56701],[136.1165,35.56675],[136.11626,35.52555],[136.04045,35.5247],[136.01684,35.50311],[136.01661,35.48334],[135.97543,35.48334],[135.94141,35.50885],[135.94186,35.56641],[135.93358,35.57487],[135.90873,35.57514],[135.90851,35.59953],[135.83185,35.59972],[135.7928,35.62519],[135.79179,35.64165]],[[135.80916,35.47505],[135.77044,35.53345],[135.7579,35.53326],[135.74168,35.51641],[135.70072,35.51705],[135.67464,35.53363],[135.67543,35.56659],[135.6996,35.58333],[135.81654,35.58343],[135.81654,35.56804],[135.85817,35.54956],[135.85851,35.52543],[135.8509,35.5247],[135.85012,35.47514],[135.80916,35.47505]],[[135.58333,35.44132],[135.61656,35.44989],[135.64163,35.47496],[135.71639,35.47478],[135.71728,35.46703],[135.81442,35.46539],[135.86668,35.44187],[135.86679,35.40868],[135.81722,35.40822],[135.81677,35.38496],[135.77548,35.3835],[135.75835,35.40804],[135.59183,35.4084],[135.58322,35.42536],[135.58333,35.44132]],[[135.40011,35.43312],[135.42496,35.44189],[135.45803,35.45008],[135.45899,35.49164],[135.46642,35.49184],[135.46619,35.50807],[135.44181,35.51709],[135.43968,35.53293],[135.45843,35.55804],[135.52324,35.55811],[135.52498,35.5091],[135.54152,35.50008],[135.54152,35.4834],[135.57515,35.48366],[135.57491,35.49164],[135.60878,35.49171],[135.60894,35.46684],[135.59208,35.45826],[135.53305,35.45826],[135.50029,35.45008],[135.50045,35.4415],[135.50789,35.42506],[135.53337,35.42513],[135.53297,35.38346],[135.5416,35.38333],[135.54176,35.36688],[135.5086,35.35836],[135.50892,35.34216],[135.50013,35.34164],[135.50013,35.41662],[135.39987,35.41655],[135.40011,35.43312]],[[133.70822,35.45816],[133.70822,35.33319],[133.12484,35.33328],[133.12495,35.3749],[132.95877,35.37508],[132.95821,35.4578],[132.87506,35.45853],[132.87461,35.52504],[132.95015,35.52522],[132.9497,35.55819],[133.01674,35.55855],[133.01685,35.56675],[133.03352,35.56693],[133.03308,35.59205],[133.06687,35.59187],[133.06654,35.6168],[133.14135,35.61671],[133.14151,35.59181],[133.36667,35.59186],[133.36689,35.57484],[133.34216,35.57447],[133.34194,35.558],[133.33321,35.55026],[133.28363,35.55017],[133.28341,35.49178],[133.33354,35.4916],[133.33354,35.47529],[133.41714,35.47492],[133.41714,35.37516],[133.49995,35.37534],[133.49973,35.45806],[133.45854,35.45806],[133.45854,35.51629],[133.49212,35.5335],[133.54136,35.54161],[133.58343,35.54197],[133.58355,35.45843],[133.70822,35.45816]],[[133.84174,35.46646],[133.84158,35.58367],[133.975,35.58329],[133.97532,35.5086],[134.00823,35.50834],[134.0334,35.49971],[134.0421,35.47497],[134.04432,35.45834],[134.08357,35.4586],[134.08309,35.53359],[134.13326,35.54969],[134.23328,35.55999],[134.27491,35.58342],[134.33299,35.58367],[134.33521,35.49172],[134.36654,35.49224],[134.36654,35.49997],[134.41718,35.49971],[134.41592,35.5417],[134.6253,35.54157],[134.62514,35.37554],[134.70839,35.37463],[134.70823,35.33398],[134.41655,35.33359],[134.41592,35.37528],[134.39218,35.37541],[134.39155,35.35011],[134.37477,35.33346],[134.20005,35.33359],[134.19939,35.35874],[134.24997,35.39971],[134.27515,35.39962],[134.27504,35.39205],[134.35819,35.39314],[134.35852,35.3999],[134.3752,35.39999],[134.37441,35.42489],[134.33256,35.42507],[134.33278,35.41659],[134.04954,35.41659],[134.05077,35.39178],[134.0661,35.39187],[134.06711,35.39999],[134.14187,35.40017],[134.14164,35.36678],[134.18339,35.35847],[134.18372,35.33337],[133.78309,35.33364],[133.78331,35.34159],[133.82472,35.3592],[133.82505,35.38311],[133.84173,35.40838],[133.89981,35.40893],[133.89981,35.41677],[133.85829,35.41659],[133.8574,35.46646],[133.84174,35.46646]],[[133.24987,33.66667],[133.41786,33.66674],[133.52485,33.66674],[133.52493,33.79178],[133.64157,33.79185],[133.64188,33.66681],[133.75006,33.66687],[133.75029,33.62517],[133.79152,33.62498],[133.79168,33.5084],[133.73336,33.5084],[133.73328,33.51658],[133.64196,33.51671],[133.60833,33.48346],[133.52493,33.46682],[133.47492,33.41935],[133.43313,33.38321],[133.37497,33.38334],[133.37497,33.49157],[133.20817,33.49191],[133.20824,33.55827],[133.24947,33.55833],[133.24987,33.66667]],[[134.3501,33.73355],[134.4832,33.73368],[134.48336,33.66732],[134.43366,33.65033],[134.43287,33.63412],[134.35279,33.63347],[134.3501,33.73355]],[[140.31656,36.21656],[140.31671,36.44984],[140.34973,36.44994],[140.35012,36.51668],[140.47467,36.51671],[140.47483,36.59159],[140.62489,36.59204],[140.62467,36.63354],[140.64974,36.6348],[140.65041,36.71684],[140.69912,36.81554],[140.71006,36.91306],[140.70838,36.95687],[140.74956,36.95866],[140.75323,37.06176],[140.75001,37.16671],[141.00832,37.16666],[141.00837,37.0917],[140.98331,37.05828],[140.98333,36.95834],[140.90834,36.90002],[140.81672,36.89999],[140.80828,36.87498],[140.80833,36.85],[140.81655,36.85004],[140.81669,36.8415],[140.81669,36.81816],[140.79988,36.80832],[140.7834,36.79992],[140.775,36.79523],[140.77498,36.78339],[140.75836,36.775],[140.75825,36.75837],[140.75002,36.75831],[140.74689,36.71939],[140.73336,36.65048],[140.69167,36.58337],[140.65003,36.51336],[140.64998,36.38351],[140.59986,36.27483],[140.57499,36.24796],[140.57463,36.21729],[140.31656,36.21656]],[[141.2166,41.24992],[141.41662,41.24971],[141.39858,41.17052],[141.40426,41.0968],[141.39503,41.04046],[141.39858,40.97185],[141.40625,40.91003],[141.41136,40.83011],[141.41307,40.80204],[141.42245,40.74987],[141.34161,40.75084],[141.3149,40.74556],[141.29203,40.74169],[141.23322,40.7419],[141.23307,40.85837],[141.25026,40.85858],[141.24941,40.91647],[141.17412,40.9169],[141.22498,40.9948],[141.23819,41.0696],[141.2497,41.1258],[141.27143,41.15875],[141.23336,41.22995],[141.2166,41.24992]],[[141.25854,41.3166],[141.15015,41.31672],[141.1499,41.39163],[141.18877,41.39205],[141.21625,41.37916],[141.25849,41.36012],[141.25854,41.3166]],[[141.05841,45.2584],[141.03453,45.25833],[141.00874,45.25815],[141.0083,45.27495],[140.99994,45.27495],[141.00002,45.30371],[140.99999,45.30828],[140.99196,45.30846],[140.99171,45.34162],[140.98351,45.34172],[140.98336,45.34998],[140.97477,45.35008],[140.97502,45.3667],[140.96664,45.36675],[140.96685,45.39818],[140.9665,45.42499],[140.9584,45.42484],[140.95816,45.43314],[140.95012,45.4335],[140.94967,45.51651],[140.97443,45.51672],[140.97448,45.50014],[140.98307,45.50042],[140.98332,45.46697],[140.99045,45.46704],[140.99135,45.45876],[141.00019,45.45813],[141.00035,45.45002],[141.01627,45.4502],[141.01637,45.47496],[141.04992,45.47532],[141.04992,45.46676],[141.06614,45.46679],[141.0665,45.4502],[141.07463,45.44999],[141.07498,45.34178],[141.0666,45.34168],[141.06418,45.30611],[141.06644,45.30565],[141.06629,45.28484],[141.05906,45.28357],[141.05841,45.2584]],[[144.27488,42.96671],[144.27502,42.99155],[144.25861,42.99145],[144.25805,42.98314],[144.20818,42.98319],[144.20854,42.97472],[144.16684,42.97503],[144.16684,43.00496],[144.16642,43.04178],[144.07486,43.04188],[144.07493,43.10025],[144.24988,43.1],[144.24988,43.1168],[144.29179,43.11675],[144.292,43.0919],[144.4168,43.09185],[144.4168,43.1168],[144.56654,43.1168],[144.56675,42.99171],[144.50005,42.9915],[144.5002,42.92481],[144.46653,42.92501],[144.31739,42.96675],[144.27488,42.96671]],[[140.69973,42.57513],[140.70015,42.61647],[140.84451,42.61673],[140.99961,42.61669],[141.00006,42.54168],[141.24984,42.54168],[141.24994,42.58336],[141.29163,42.58332],[141.29158,42.6251],[141.37501,42.62498],[141.37501,42.66662],[141.49992,42.66666],[141.49992,42.8165],[141.47496,42.8165],[141.47511,42.83341],[141.81236,42.83357],[141.95752,42.83328],[141.94355,42.77977],[141.95762,42.77896],[141.95832,42.7502],[141.99991,42.75086],[141.9992,42.71493],[142.00031,42.67632],[142.01799,42.65076],[142.09082,42.65002],[142.09122,42.5251],[142.02472,42.5251],[141.96033,42.52495],[141.8665,42.52518],[141.8656,42.57713],[141.83577,42.58519],[141.80482,42.57417],[141.74646,42.57705],[141.73069,42.61477],[141.61707,42.61055],[141.52134,42.60331],[141.45615,42.57587],[141.3562,42.52866],[141.27523,42.48822],[141.19507,42.43791],[141.10476,42.3914],[141.05393,42.33165],[141.0254,42.29161],[140.95187,42.29146],[140.9147,42.32682],[140.89451,42.37174],[140.88426,42.42723],[140.85041,42.46096],[140.76643,42.49978],[140.76663,42.52821],[140.69973,42.57513]],[[140.75005,43.23374],[140.82762,43.2135],[140.88245,43.22531],[140.97338,43.24601],[141.02139,43.24311],[141.04213,43.20211],[141.08346,43.18205],[141.17267,43.16382],[141.25678,43.19366],[141.37528,43.33327],[141.62491,43.33335],[141.62451,43.4168],[141.79146,43.4168],[141.79197,43.83339],[142.12487,43.83332],[142.12487,43.75022],[142.16656,43.74993],[142.16656,43.83317],[142.24954,43.83325],[142.24984,43.8581],[142.27465,43.8581],[142.27465,43.87425],[142.26671,43.8749],[142.26651,43.91688],[142.24994,43.9171],[142.25001,44.5],[142.49997,44.50013],[142.49977,43.88366],[142.51674,43.88344],[142.51644,43.83346],[142.62473,43.83346],[142.62473,43.58331],[142.54176,43.58403],[142.54196,43.50008],[142.50057,43.50022],[142.50037,43.25006],[142.25054,43.25014],[142.25004,43.45838],[142.00031,43.45816],[142.00001,43.41724],[141.91703,43.41688],[141.91703,43.33342],[141.87494,43.33327],[141.87454,43.17487],[141.93351,43.17473],[141.93391,43.15868],[141.99137,43.15802],[141.99207,43.1334],[141.87524,43.13332],[141.87484,43.00012],[141.49984,43.00027],[141.50015,42.91683],[141.25021,42.91631],[141.25001,42.9999],[141.12505,43.00005],[141.12525,43.08323],[140.99988,43.0836],[141.00008,43.16638],[140.75086,43.1666],[140.75005,43.23374]],[[140.59121,41.78353],[140.58382,41.8334],[140.58453,41.87732],[140.59092,41.91613],[140.60797,41.94403],[140.57544,41.95914],[140.58439,41.99979],[140.7104,42.00011],[140.86894,42.00011],[140.91724,42.00053],[140.99041,41.91909],[141.04737,41.90693],[141.12722,41.88398],[141.17552,41.83732],[141.20194,41.81488],[141.18418,41.78321],[141.11301,41.76711],[141.05689,41.71559],[140.99382,41.69968],[140.94267,41.70414],[140.89238,41.73563],[140.84806,41.74326],[140.80018,41.75672],[140.73299,41.74634],[140.69705,41.73234],[140.6881,41.76986],[140.59121,41.78353]],[[140.2418,42.2338],[140.24159,42.25827],[140.21005,42.25797],[140.20804,42.27485],[140.26611,42.27514],[140.2651,42.29179],[140.29001,42.2912],[140.29182,42.26779],[140.33914,42.24139],[140.34145,42.21662],[140.29323,42.21662],[140.2418,42.2338]],[[140.55007,42.08447],[140.54977,42.11387],[140.58066,42.11193],[140.62636,42.12069],[140.63365,42.12136],[140.6336,42.10061],[140.60853,42.09964],[140.60848,42.08327],[140.54972,42.08312],[140.55007,42.08447]],[[140.6583,41.06668],[140.67117,40.91974],[140.84492,40.91652],[140.91726,40.91688],[140.91712,40.87597],[140.9846,40.87533],[140.98503,40.79278],[141.13391,40.79192],[141.13972,40.68034],[141.17424,40.68174],[141.18504,40.60057],[141.43351,40.60078],[141.43308,40.51757],[141.18305,40.51649],[141.18362,40.58223],[141.16714,40.59172],[141.04397,40.59237],[141.04283,40.65825],[140.98402,40.65836],[140.72646,40.65857],[140.72589,40.57521],[140.66849,40.57467],[140.60883,40.57489],[140.60925,40.48311],[140.55058,40.483],[140.54888,40.51757],[140.40028,40.51692],[140.40013,40.5832],[140.25665,40.58233],[140.24898,40.63292],[140.33251,40.63292],[140.33251,40.66687],[140.41676,40.66698],[140.41704,40.73311],[140.33194,40.73375],[140.33351,40.75851],[140.28421,40.75818],[140.28037,40.85679],[140.30254,40.98507],[140.31845,41.00019],[140.42443,41.0004],[140.42443,40.90029],[140.55044,40.89975],[140.54994,41.06668],[140.6583,41.06668]],[[140.01669,40.33381],[140.25252,40.33381],[140.25006,39.33298],[139.98341,39.3332],[140.05622,39.72433],[140.00614,39.77043],[139.94073,39.88023],[139.94158,40.01081],[139.94055,40.08509],[139.94116,40.10876],[140.01669,40.33381]],[[139.85814,39.04176],[139.87552,39.04137],[139.87703,39.00009],[139.91671,39.00001],[139.9167,38.79173],[139.75493,38.79165],[139.7502,38.79386],[139.79376,38.89687],[139.79014,38.9254],[139.83615,38.99102],[139.85814,39.04176]],[[139.37551,38.1174],[139.38053,37.95893],[139.417,37.95845],[139.417,37.87413],[139.37571,37.8746],[139.37611,37.83296],[139.29234,37.83145],[139.30007,37.78074],[139.29173,37.68357],[139.29193,37.66473],[139.22935,37.6594],[139.18113,37.61024],[139.14537,37.60769],[139.12367,37.62671],[139.09816,37.65018],[139.08831,37.6664],[138.99951,37.66656],[138.99942,37.79171],[138.81261,37.79199],[138.86834,37.84689],[138.9915,37.91333],[139.08231,37.9775],[139.27679,38.03417],[139.37551,38.1174]],[[139.96008,38.49993],[140.50033,38.50009],[140.50023,38.16654],[140.37496,38.16654],[140.37536,38.08348],[140.2504,38.08293],[140.21705,38.07407],[140.22136,38.0422],[140.2512,38.04196],[140.2504,38.00017],[140.23372,37.99962],[140.23352,37.94197],[140.20861,37.9411],[140.20841,37.90013],[140.19253,37.89965],[140.19123,37.88372],[140.15838,37.883],[140.15828,37.85811],[140.0753,37.85945],[140.0741,37.87476],[140.05019,37.87571],[140.05019,37.89252],[140.05762,37.89355],[140.05813,37.92541],[140.0741,37.92573],[140.0742,37.94197],[140.09871,37.95369],[140.09821,37.99234],[140.10182,38.00041],[140.12282,38.00081],[140.11549,38.01806],[140.08977,38.02795],[140.0747,38.04133],[140.06727,38.03492],[140.06707,37.99186],[140.01634,37.9917],[140.01584,38.066],[139.99805,38.06656],[139.99966,38.13739],[139.99956,38.17514],[139.99795,38.3337],[139.95787,38.33378],[139.95837,38.50028],[139.96008,38.49993]],[[140.70822,38.7833],[140.70837,39.15023],[141.04194,39.14957],[141.04167,39.50008],[141.00147,39.49986],[140.99893,39.91638],[141.25077,39.91692],[141.25037,39.5007],[141.16709,39.50008],[141.16699,39.45627],[141.16669,39.40273],[141.16689,39.25073],[141.20798,39.24996],[141.20898,38.87471],[141.03399,38.8751],[141.03339,38.78354],[140.86794,38.78315],[140.70822,38.7833]],[[141.3759,38.36972],[141.37476,38.49992],[141.24904,38.50025],[141.25134,38.66886],[141.52524,38.66653],[141.54981,38.63369],[141.55052,38.55563],[141.55549,38.47938],[141.56558,38.39559],[141.54626,38.37398],[141.55919,38.32429],[141.59854,38.31226],[141.59527,38.26063],[141.50762,38.23664],[141.46983,38.24479],[141.39226,38.27725],[141.41158,38.34781],[141.3759,38.36972]],[[131.04175,33.7381],[131.0413,33.70887],[130.99956,33.70858],[131.00035,33.68392],[131.04959,33.68392],[131.05014,33.64171],[131.0751,33.64201],[131.07588,33.61683],[131.10039,33.61666],[131.10084,33.60082],[131.17448,33.60007],[131.19999,33.58422],[131.20066,33.55868],[131.2405,33.55868],[131.28258,33.54207],[131.33137,33.52528],[131.41821,33.55065],[131.51625,33.55084],[131.51692,33.5667],[131.63353,33.56688],[131.63308,33.47545],[131.7423,33.47452],[131.74946,33.45939],[131.75014,33.33289],[131.60756,33.33401],[131.60801,33.37421],[131.52565,33.37458],[131.52467,33.26691],[131.5769,33.25843],[131.64942,33.28332],[131.71634,33.28388],[131.77497,33.26687],[131.78385,33.25028],[131.83291,33.25015],[131.88403,33.2745],[131.90825,33.2749],[131.90809,33.25849],[131.87517,33.20607],[131.84985,33.18276],[131.85032,33.14964],[131.87525,33.15038],[131.90777,33.14129],[131.9171,33.13332],[131.91733,33.10858],[131.9505,33.09967],[131.95019,33.08349],[131.98279,33.08336],[131.98279,33.10007],[132.00036,33.1169],[132.0252,33.1169],[132.02473,33.0998],[132.00843,33.09172],[132.00843,33.06718],[132.01745,33.06705],[132.01715,33.04988],[131.99181,33.04211],[131.92518,33.04092],[131.9255,33.025],[131.95003,33.025],[131.95045,33.01347],[131.95034,32.97482],[131.98326,32.97536],[131.98492,32.95941],[132.0261,32.95922],[132.05828,32.95862],[132.05844,32.99142],[132.07198,32.9917],[132.08297,32.98332],[132.09168,32.92635],[132.02473,32.92542],[132.02473,32.90058],[132.03349,32.88294],[132.00795,32.88357],[131.98326,32.85871],[131.99988,32.8498],[132.01715,32.8429],[132.01603,32.82654],[131.97551,32.78396],[131.93411,32.76746],[131.8992,32.76614],[131.89179,32.71661],[131.83317,32.6507],[131.78369,32.64894],[131.78415,32.58396],[131.74185,32.58283],[131.7082,32.56669],[131.70773,32.54294],[131.74159,32.50852],[131.74141,32.45129],[131.70804,32.44216],[131.70112,32.40878],[131.65787,32.39219],[131.64226,32.33355],[131.59948,32.27572],[131.57492,32.18338],[131.54184,32.08474],[131.542,32.00009],[131.49975,32.00023],[131.50038,31.74971],[131.4586,31.75011],[131.45876,31.79182],[131.24969,31.79169],[131.24969,32.16704],[131.37488,32.16717],[131.37504,32.25046],[131.49991,32.25019],[131.49991,32.33341],[131.54137,32.33341],[131.54167,32.62506],[131.66645,32.62515],[131.66633,32.66662],[131.74993,32.66652],[131.75006,32.91664],[131.5977,32.91688],[131.25044,32.91663],[131.24902,33.00042],[131.49971,33.00002],[131.49987,33.06345],[131.50018,33.13915],[131.4804,33.16631],[131.284,33.16618],[131.26706,33.20035],[131.26627,33.25039],[131.29966,33.26985],[131.29951,33.31999],[131.24427,33.34114],[131.17511,33.34154],[131.17527,33.35806],[131.07525,33.35806],[131.07572,33.33347],[131.00055,33.33321],[131.00007,33.2496],[130.91445,33.2496],[130.7497,33.25013],[130.7497,33.08374],[130.62546,33.08321],[130.62546,33.00002],[130.72796,33.00171],[130.87492,33.00018],[130.8753,32.79131],[130.96677,32.79185],[130.96709,32.85808],[130.92531,32.85781],[130.92531,32.95029],[130.96679,32.95831],[131.00012,32.91683],[131.00017,32.50007],[130.66647,32.50046],[130.66669,32.33306],[130.62506,32.33306],[130.62461,32.24943],[130.49972,32.25037],[130.50039,32.12517],[130.33275,32.12498],[130.3437,32.16133],[130.34954,32.20815],[130.42748,32.29423],[130.46637,32.40054],[130.4939,32.40073],[130.523,32.43304],[130.54941,32.44456],[130.54986,32.4659],[130.48383,32.46647],[130.47421,32.47535],[130.4751,32.50064],[130.5089,32.54197],[130.62439,32.62571],[130.62484,32.6666],[130.52569,32.66679],[130.52524,32.68337],[130.55859,32.71671],[130.55903,32.7745],[130.57493,32.78372],[130.57493,32.82172],[130.50935,32.84185],[130.50778,32.86986],[130.44155,32.89158],[130.41624,32.94258],[130.41579,32.97488],[130.37438,33.00098],[130.37528,33.08315],[130.24927,33.08372],[130.24905,33.16076],[130.15863,33.09741],[130.17775,33.07174],[130.18369,33.06684],[130.18369,33.03401],[130.19958,33.025],[130.19977,33.00001],[130.12479,33.00001],[130.12457,32.96678],[130.0409,32.9407],[130.02501,32.94164],[130.02456,32.91647],[130.12457,32.9172],[130.12457,32.86739],[130.15031,32.86683],[130.19578,32.8661],[130.23334,32.89183],[130.29198,32.89183],[130.29243,32.84991],[130.29153,32.7916],[130.2922,32.71725],[130.18343,32.65791],[130.15034,32.65002],[130.11539,32.64962],[130.11744,32.70014],[130.15903,32.71706],[130.24856,32.75867],[130.24968,32.79085],[130.1333,32.79235],[130.12569,32.76751],[130.00147,32.74963],[129.9294,32.67317],[129.80048,32.57459],[129.80003,32.54704],[129.77425,32.54749],[129.71767,32.54987],[129.71632,32.59043],[129.7499,32.67487],[129.75012,32.72459],[129.80025,32.72553],[129.74161,32.77523],[129.62411,32.8501],[129.62646,32.91787],[129.83159,32.91738],[129.87121,32.91644],[129.89269,32.94105],[129.93343,33.00827],[129.967,33.07469],[130.05809,33.12025],[130.05876,33.21693],[130.24946,33.21674],[130.2499,33.33331],[130.21566,33.3335],[130.0422,33.33331],[129.92559,33.33294],[129.90836,33.35837],[129.90791,33.38304],[129.86695,33.38285],[129.86697,33.36012],[129.83338,33.34079],[129.80093,33.34098],[129.80003,33.31592],[129.75057,33.31686],[129.75034,33.27533],[129.72572,33.27477],[129.6917,33.30807],[129.69237,33.25025],[129.87479,33.25025],[129.8759,33.21299],[129.87521,33.11856],[129.87523,33.03323],[129.80831,33.03305],[129.7499,33.05031],[129.734,33.058],[129.72658,33.08172],[129.69842,33.09982],[129.62413,33.09928],[129.62374,33.12377],[129.62501,33.24201],[129.59255,33.24108],[129.59255,33.29928],[129.54197,33.3004],[129.50012,33.31761],[129.49989,33.41686],[129.59949,33.41593],[129.66753,33.40864],[129.66775,33.43274],[129.8336,33.56656],[129.93208,33.56787],[129.93522,33.40827],[130.04131,33.3836],[130.04108,33.48428],[130.24901,33.48465],[130.25057,33.61681],[130.28504,33.63405],[130.28303,33.69151],[130.30888,33.69151],[130.32365,33.66712],[130.39225,33.69179],[130.41777,33.72484],[130.43388,33.77546],[130.39024,33.87047],[130.39113,33.92509],[130.50774,33.92621],[130.60555,33.89166],[130.66665,33.9496],[130.74991,34.00844],[130.84973,34.00825],[130.8504,34.14155],[130.88308,34.19192],[130.85801,34.27519],[130.83228,34.36706],[130.97127,34.45052],[131.08608,34.43336],[131.19307,34.44166],[131.29356,34.44092],[131.36518,34.44591],[131.37548,34.5328],[131.44934,34.55013],[131.57445,34.69176],[131.62526,34.69158],[131.78596,34.70078],[131.86989,34.77435],[131.99545,34.88146],[132.37594,35.16739],[132.74972,35.16684],[132.75084,35.08318],[132.6255,35.08337],[132.62505,34.91671],[132.3755,34.91689],[132.37527,34.83426],[132.12482,34.83298],[132.12482,34.75008],[132.00038,34.7499],[132.00038,34.5833],[131.74989,34.58326],[131.75139,34.37954],[131.75147,34.1671],[132.12497,34.16683],[132.12481,34.2914],[132.25016,34.29193],[132.24929,34.40917],[132.25016,34.49983],[132.37249,34.49996],[132.37503,34.58339],[132.49167,34.58339],[132.49182,34.70831],[132.59177,34.70824],[132.58365,34.5417],[132.84148,34.54133],[132.84193,34.66623],[133.08343,34.66678],[133.08365,34.76631],[133.20743,34.76687],[133.20787,34.66678],[133.49973,34.66642],[133.50026,34.83314],[133.7012,34.83357],[133.69941,34.87526],[133.74984,34.87535],[133.74984,34.9999],[133.8751,35.00003],[133.87518,35.12504],[133.97425,35.12517],[133.97546,35.00097],[134.0585,34.99997],[134.05816,35.07464],[134.16654,35.0748],[134.1667,35.00016],[134.75338,35.00016],[134.83324,34.99997],[134.8333,35.04176],[135.24494,35.04176],[135.37472,35.04153],[135.37535,35.0836],[135.74948,35.08335],[135.75066,35.25004],[135.87474,35.2503],[135.87529,35.33388],[136.00001,35.33356],[136.00024,35.2587],[135.98331,35.24255],[135.93361,35.20027],[135.93306,35.1667],[135.97539,35.16664],[135.97523,35.15597],[136.04993,35.15829],[136.04993,35.21663],[136.05895,35.22484],[136.12455,35.23344],[136.12536,35.25011],[136.16667,35.24997],[136.16651,35.36441],[136.16664,35.45873],[136.33347,35.45857],[136.37478,35.33382],[136.49981,35.33356],[136.49965,35.49981],[136.74991,35.58365],[137.00003,35.58344],[136.99984,35.41254],[136.99999,35.33351],[137.24995,35.33357],[137.24998,34.91665],[137.6249,34.91658],[137.62516,35.00034],[137.69186,35.00052],[137.69182,35.06711],[137.74199,35.06668],[137.74222,35.10789],[137.77489,35.10844],[137.77474,35.15015],[138.16671,35.15021],[138.16666,35.2918],[138.38224,35.29138],[138.50029,35.29187],[138.50119,35.33333],[138.38256,35.33369],[138.38319,35.44169],[138.49985,35.44208],[138.49988,35.4584],[138.66644,35.45855],[138.66704,35.37476],[138.70818,35.37519],[138.70818,35.33348],[138.8334,35.33357],[138.83329,35.40832],[139.0082,35.40836],[139.00858,35.39192],[139.1243,35.39228],[139.12498,35.41668],[139.25001,35.41667],[139.24995,35.49996],[139.12487,35.50005],[139.12492,35.5833],[138.99999,35.58333],[138.99999,35.6667],[139.1249,35.66678],[139.12504,35.8092],[139.12474,35.91713],[139.00053,35.91713],[139.00006,36.00001],[139.12492,36.00012],[139.12547,36.11894],[139.12495,36.16664],[139,36.16668],[138.99941,36.25031],[138.95831,36.25002],[138.95822,36.29127],[138.91663,36.29166],[138.91678,36.37496],[138.95845,36.37565],[138.95836,36.45832],[139.08379,36.45868],[139.08334,36.5],[139.25009,36.50012],[139.2496,36.54136],[139.37464,36.54189],[139.37505,36.62499],[139.45022,36.62528],[139.44999,36.66667],[139.66374,36.66671],[139.75002,36.66665],[139.75005,36.75003],[140,36.75001],[139.99998,36.62209],[140.00001,36.41668],[140.25001,36.41666],[140.24999,36.04158],[140.50004,36.04158],[140.49989,35.83349],[140.41632,35.83374],[140.4168,35.7919],[140.45874,35.79113],[140.45874,35.72461],[140.51666,35.72486],[140.51691,35.7417],[140.59144,35.74174],[140.5915,35.94177],[140.65002,35.94164],[140.64994,36.00837],[140.67503,36.00834],[140.71403,35.92326],[140.77327,35.83877],[140.81532,35.78508],[140.89133,35.7501],[140.89211,35.71717],[140.86632,35.67853],[140.80694,35.70622],[140.72767,35.6761],[140.68235,35.68891],[140.60194,35.63074],[140.48545,35.54409],[140.4095,35.42897],[140.40816,35.33353],[140.30722,35.33371],[140.30767,35.41748],[140.30946,35.45851],[140.20762,35.45905],[140.20829,35.37478],[140.12503,35.37478],[140.12436,35.33408],[140.29155,35.33316],[140.29245,35.20909],[140.31707,35.20836],[140.31662,35.18422],[140.35042,35.18257],[140.3431,35.13152],[140.23201,35.10096],[140.13697,35.09271],[140.05542,35.03643],[139.98865,34.98849],[139.96379,34.91688],[139.91222,34.88262],[139.82272,34.89218],[139.78337,34.93633],[139.73961,34.95322],[139.7443,34.99303],[139.81476,35.00932],[139.7963,35.05283],[139.80169,35.09108],[139.80766,35.1529],[139.80866,35.19667],[139.85153,35.24127],[139.8325,35.29189],[139.74927,35.2961],[139.76149,35.33517],[139.79232,35.35267],[139.81035,35.49933],[140.0035,35.49988],[140.03349,35.53668],[140.06639,35.58384],[139.79714,35.58311],[139.80005,35.50079],[139.77087,35.47343],[139.70992,35.44207],[139.6987,35.40282],[139.66887,35.36715],[139.68478,35.30781],[139.73549,35.2728],[139.75069,35.25934],[139.73734,35.23092],[139.74388,35.20852],[139.69714,35.18971],[139.67426,35.1702],[139.68932,35.15394],[139.68151,35.13477],[139.62355,35.12199],[139.59783,35.1285],[139.60224,35.17253],[139.58363,35.18959],[139.59033,35.24164],[139.5496,35.28403],[139.49879,35.30084],[139.42314,35.30942],[139.29131,35.30066],[139.23074,35.27778],[139.15546,35.23542],[139.15031,35.17507],[139.16665,35.13316],[139.12502,35.13298],[139.09436,35.13335],[139.05832,35.13316],[139.05671,35.00443],[139.03348,34.98385],[138.99968,34.98367],[139.00057,34.88274],[139.14136,34.88348],[139.11002,34.84602],[139.08129,34.79529],[139.01691,34.74107],[138.9999,34.64151],[138.90044,34.6097],[138.87367,34.59159],[138.80026,34.59988],[138.75773,34.65881],[138.72528,34.67575],[138.72528,34.72506],[138.83316,34.72598],[138.83383,34.74952],[138.7419,34.75106],[138.7338,34.8136],[138.74985,34.90057],[138.76065,34.93773],[138.75028,34.98313],[138.77855,35.04352],[138.87546,35.03316],[138.87703,35.04929],[138.85845,35.04984],[138.76804,35.12107],[138.68294,35.12223],[138.61873,35.09015],[138.55409,35.05201],[138.54926,34.99442],[138.49996,34.95392],[138.39142,34.91129],[138.35562,34.86759],[138.33929,34.80042],[138.27635,34.72246],[138.24467,34.66616],[138.24396,34.58503],[138.12662,34.58573],[138.01467,34.62561],[137.88184,34.65541],[137.79532,34.63718],[137.68991,34.65307],[137.57654,34.66441],[137.38135,34.64618],[137.18402,34.58409],[137.03187,34.5662],[137.00794,34.57573],[137.0254,34.61792],[137.0599,34.66613],[137.17517,34.66686],[137.30767,34.75996],[137.29894,34.77595],[137.29088,34.79231],[137.25037,34.79213],[137.21635,34.76768],[137.15816,34.74911],[137.08318,34.75076],[137.03215,34.76345],[136.94061,34.80848],[136.93456,34.77522],[136.98335,34.72575],[137.06751,34.74212],[137.06773,34.70183],[137.02454,34.70809],[137.01581,34.64937],[136.98179,34.65029],[136.82601,34.74911],[136.84884,34.82319],[136.79266,34.82521],[136.79132,35.00048],[136.75081,35.00012],[136.74991,34.95849],[136.68277,34.96069],[136.6624,34.89701],[136.59078,34.80003],[136.53863,34.72704],[136.58294,34.62506],[136.75682,34.54181],[136.85798,34.54126],[136.93945,34.54347],[136.91675,34.49231],[136.94081,34.46687],[136.94113,34.40866],[136.92404,34.35876],[136.90742,34.30209],[136.90045,34.2666],[136.84981,34.23416],[136.81693,34.1923],[136.79948,34.19254],[136.79996,34.22906],[136.74203,34.25863],[136.73325,34.28285],[136.70896,34.28334],[136.64264,34.25902],[136.5594,34.22605],[136.53564,34.22167],[136.50068,34.20864],[136.44007,34.20053],[136.38325,34.16675],[136.3334,34.14802],[136.31583,34.08487],[136.2674,34.08316],[136.12497,34.08343],[136.12449,34.16688],[136.24968,34.16688],[136.24984,34.25012],[136.37486,34.25025],[136.37468,34.33331],[136.50021,34.33302],[136.49973,34.49192],[136.45843,34.49127],[136.45811,34.5416],[136.4168,34.54186],[136.41664,34.62516],[136.37494,34.62464],[136.37469,34.68106],[136.37485,34.74974],[136.33402,34.75026],[136.33354,34.79109],[136.37485,34.79213],[136.37533,34.95858],[136.33323,34.95858],[136.33323,34.83345],[136.29239,34.83371],[136.29208,34.792],[136.24966,34.79213],[136.24998,34.70838],[136.29192,34.70851],[136.2916,34.62475],[136.12487,34.62512],[136.12498,34.66674],[136.04161,34.66655],[136.04094,34.7499],[136.00023,34.75009],[135.99991,34.65993],[135.99975,34.58387],[136.04153,34.58374],[136.04185,34.50017],[136.04989,34.49997],[136.05005,34.42503],[135.91674,34.425],[135.91667,34.35836],[135.81665,34.35837],[135.81661,34.31668],[135.74991,34.31672],[135.75007,34.29167],[135.64152,34.29176],[135.64186,34.27512],[135.53325,34.27489],[135.53348,34.25834],[135.475,34.25834],[135.47511,34.22498],[135.37507,34.22512],[135.3749,34.20814],[135.50001,34.20837],[135.50001,33.66652],[135.87502,33.66661],[135.87558,33.74983],[136.03371,33.75021],[136.01272,33.71062],[135.99681,33.67327],[135.97948,33.63389],[135.97195,33.61271],[135.95831,33.56798],[135.85332,33.50522],[135.85353,33.48302],[135.87591,33.4814],[135.86057,33.44051],[135.77718,33.42558],[135.7418,33.42534],[135.74163,33.4665],[135.68498,33.47915],[135.59008,33.49633],[135.47373,33.52819],[135.3902,33.5752],[135.37485,33.61633],[135.37533,33.64967],[135.33371,33.6498],[135.32468,33.66653],[135.45794,33.66666],[135.45842,33.74987],[135.41727,33.75],[135.41663,33.78802],[135.41743,33.83273],[135.37517,33.83326],[135.37517,33.79171],[135.3284,33.78999],[135.28777,33.75622],[135.21503,33.7698],[135.14371,33.85113],[135.12013,33.87826],[135.05776,33.87991],[135.05947,33.96479],[135.07709,34.00837],[135.11345,34.05029],[135.06515,34.06759],[135.07041,34.121],[135.15522,34.16286],[135.1163,34.18742],[135.06316,34.25849],[135.04915,34.27082],[134.99554,34.27152],[134.9955,34.29122],[134.99945,34.29894],[135.00904,34.30357],[135.1457,34.34721],[135.20804,34.35108],[135.24174,34.39165],[135.19145,34.42482],[135.25012,34.46056],[135.29487,34.42658],[135.30902,34.44119],[135.36647,34.53277],[135.39147,34.53394],[135.38308,34.63128],[135.36409,34.66669],[135.29161,34.66695],[135.29061,34.6245],[135.08349,34.62463],[135.04725,34.61643],[134.92905,34.64799],[134.826,34.69662],[134.75874,34.74267],[134.71632,34.74982],[134.52561,34.74969],[134.41657,34.70885],[134.31671,34.66669],[134.25055,34.66656],[134.24992,34.68309],[134.15797,34.68348],[134.15781,34.70013],[134.12505,34.7],[134.12474,34.58386],[134.11666,34.55845],[134.02519,34.55024],[134.02535,34.44785],[134.02788,34.41639],[134.19168,34.41678],[134.19152,34.38401],[134.28347,34.38296],[134.28347,34.33371],[134.38082,34.29415],[134.40952,34.26539],[134.43268,34.24648],[134.56265,34.25055],[134.66663,34.24963],[134.64146,34.04963],[134.70809,33.96554],[134.74006,33.92825],[134.71221,33.86773],[134.76918,33.86691],[134.76712,33.82524],[134.66742,33.7754],[134.63102,33.77487],[134.50018,33.77493],[134.49978,33.95855],[134.4582,33.95874],[134.45816,34.00006],[134.34679,33.99889],[134.06047,33.99988],[133.74955,34.00047],[133.74998,34.33337],[133.875,34.33342],[133.87494,34.41668],[133.95888,34.41683],[133.95843,34.44157],[133.85055,34.44157],[133.84966,34.46621],[133.82537,34.46704],[133.81642,34.44222],[133.84205,34.43326],[133.84194,34.41656],[133.75822,34.41715],[133.74122,34.44175],[133.6913,34.44152],[133.69085,34.45739],[133.69097,34.46639],[133.70004,34.48346],[133.61655,34.48355],[133.61689,34.45827],[133.53351,34.45887],[133.53329,34.41752],[133.4897,34.41743],[133.46642,34.43313],[133.46631,34.44992],[133.4503,34.45002],[133.45008,34.4166],[133.41713,34.41696],[133.41668,34.35786],[133.34174,34.3583],[133.30304,34.37515],[133.2748,34.35876],[133.21655,34.35],[133.16694,34.35007],[133.16662,34.36659],[133.09184,34.36659],[133.09176,34.3417],[133.05837,34.34164],[133.05829,34.32491],[132.90003,34.32517],[132.89148,34.29164],[132.7917,34.29164],[132.79133,34.28281],[132.792,34.24212],[132.77492,34.22513],[132.71629,34.22499],[132.71652,34.21655],[132.75854,34.21636],[132.775,34.20877],[132.79218,34.20095],[132.79223,34.14177],[132.74138,34.14173],[132.70838,34.16655],[132.63354,34.16665],[132.61664,34.1917],[132.59185,34.1916],[132.5749,34.1666],[132.54155,34.16674],[132.54178,34.14196],[132.42515,34.14165],[132.42503,34.16657],[132.3749,34.16663],[132.37515,34.18348],[132.40833,34.18343],[132.3752,34.2168],[132.34991,34.23331],[132.35014,34.25834],[132.35814,34.25843],[132.35819,34.27503],[132.33922,34.25834],[132.29166,34.22494],[132.24992,34.22494],[132.25003,34.2043],[132.25809,34.18324],[132.28327,34.18352],[132.28321,34.19995],[132.29183,34.20837],[132.32501,34.20847],[132.31684,34.1753],[132.25843,34.17533],[132.25843,34.14171],[132.2502,34.11675],[132.21669,34.11684],[132.21685,34.0585],[132.22491,34.05827],[132.22502,33.99163],[132.21669,33.99177],[132.21652,33.97516],[132.25037,33.97526],[132.25014,33.91622],[131.95761,33.91733],[131.95783,33.92512],[131.91755,33.92495],[131.91586,33.95863],[131.88699,33.96671],[131.87569,33.95891],[131.84973,33.92502],[131.80049,33.92439],[131.79948,33.95046],[131.7752,33.95057],[131.75058,33.9668],[131.70828,33.97508],[131.70918,33.92551],[131.68366,33.92513],[131.68321,33.95056],[131.6916,33.96717],[131.69988,33.98323],[131.68332,33.99937],[131.68354,34.01681],[131.69999,34.017],[131.70011,34.03314],[131.68209,34.03352],[131.67515,34.02581],[131.62513,34.02488],[131.59122,33.97515],[131.38721,33.97497],[131.29981,33.91685],[131.16675,33.91667],[131.1172,33.97473],[131.06078,34.02462],[131.03349,34.02557],[131.04198,34.00848],[131.04175,33.7381]],[[135.98583,35.86595],[135.93905,35.95517],[135.95723,36.1316],[136.15271,36.29666],[136.6596,36.75695],[136.65846,37.00603],[136.66642,37.33477],[136.85167,37.42328],[137.11307,37.5288],[137.31877,37.54953],[137.39151,37.50356],[137.34765,37.35791],[137.20218,37.24762],[137.09307,37.06828],[137.0223,36.83795],[137.09532,36.80133],[137.22971,36.77368],[137.35387,36.80451],[137.39706,36.90966],[137.50588,36.95883],[137.72267,37.01579],[137.95199,37.10656],[138.053,37.16975],[138.18626,37.18254],[138.28854,37.24861],[138.43501,37.34512],[138.54909,37.41229],[138.61842,37.49225],[138.73903,37.51536],[138.78378,37.5674],[138.82185,37.62796],[138.91491,37.63009],[138.924,37.6032],[139.01321,37.59757],[139.01421,37.53507],[139.03452,37.52325],[139.03793,37.45798],[139.04887,37.42358],[139.13027,37.42312],[139.23881,37.4326],[139.26282,37.33326],[139.12289,37.32784],[139.11408,37.26354],[139.11422,37.16748],[139.05555,37.16658],[138.82825,37.17133],[138.87072,37.2338],[138.89104,37.31316],[138.72965,37.33259],[138.71403,37.29474],[138.71715,37.1642],[138.53517,37.16533],[138.39907,37.16692],[138.37478,37.13261],[138.3725,36.99907],[138.08823,36.99839],[138.08596,36.91586],[137.89233,36.91768],[137.87798,36.83517],[137.66517,36.8321],[137.52111,36.83142],[137.51216,36.74222],[137.39482,36.74427],[137.37138,36.58325],[137.29367,36.58371],[137.18016,36.55028],[137.21383,36.53133],[137.26384,36.33176],[136.63321,36.33496],[136.50436,36.29227],[136.39412,36.29444],[136.38034,36.25493],[136.37778,36.17665],[136.38218,36.09507],[136.38758,36.00065],[136.2593,35.99399],[136.25532,35.90923],[136.24992,35.83337],[136.12207,35.82876],[136.11184,35.88725],[136.05984,35.91165],[136.01793,35.86676],[135.98583,35.86595]],[[140.03281,37.29986],[140.03344,37.34643],[140.03344,37.47427],[140.03407,37.48281],[139.99973,37.48356],[140.00036,37.44198],[139.94212,37.44173],[139.94197,37.35007],[139.89116,37.35007],[139.89116,37.41698],[139.81725,37.41647],[139.81266,37.57468],[139.74192,37.57556],[139.74224,37.79174],[139.81789,37.79162],[139.98296,37.79112],[139.98359,37.58334],[140.0412,37.58334],[140.04151,37.47502],[140.1591,37.47528],[140.15815,37.63311],[140.3745,37.63399],[140.37481,37.83338],[140.5,37.83525],[140.49989,37.91662],[140.53144,37.9168],[140.62489,37.9167],[140.62489,37.84641],[140.62534,37.33359],[140.57502,37.33284],[140.57486,37.25881],[140.4579,37.25855],[140.45774,37.2084],[140.2501,37.20866],[140.24994,37.29998],[140.03281,37.29986]],[[141.00075,38.16707],[140.84264,38.16752],[140.68779,38.16405],[140.70788,38.09499],[140.70868,38.03346],[140.61627,38.03362],[140.53369,38.11364],[140.5359,38.14478],[140.61948,38.14478],[140.62471,38.2048],[140.6231,38.27376],[140.63073,38.33902],[140.81255,38.33698],[141.00362,38.33398],[141.00075,38.16707]],[[129.44454,34.73675],[129.52524,34.65452],[129.35703,34.19046],[129.23088,34.06063],[129.15132,34.11616],[129.27179,34.63488],[129.44454,34.73675]]],terms_url:"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan",description:"Japan GSI ortho Imagery. Usually better than bing, but a bit older."},{id:"gsi.go.jp_std_map",name:"Japan GSI Standard Map",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/std/{zoom}/{x}/{y}.png",zoomExtent:[5,18],polygon:[[[141.85547,44.64912],[140.22949,43.9691],[138.95508,41.80408],[139.48242,40.17887],[138.86719,38.30718],[136.31836,37.19533],[132.14355,35.13788],[128.93555,33.35806],[129.50684,32.4727],[129.77051,31.69078],[130.20996,30.90223],[131.2207,30.78904],[131.66016,32.32428],[132.71484,32.87959],[133.76953,33.17434],[136.75781,33.87042],[139.30664,35.06597],[140.88867,35.17381],[141.15234,36.5626],[142.11914,39.94344],[141.76758,42.68243],[141.85547,44.64912]]],terms_url:"https://maps.gsi.go.jp/help/use.html",terms_text:"GSI Japan",description:"Japan GSI Standard Map. Widely covered."},{id:"kalmar-orto-2014",name:"Kalmar North Orthophoto 2014",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2014/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.28473,56.70827],[16.38856,56.70798],[16.40843,56.7615],[16.46269,56.75672],[16.47753,56.76023],[16.48815,56.77023],[16.48754,56.79231],[16.48254,56.79547],[16.47667,56.8223],[16.4687,56.82614],[16.48584,56.86271],[16.48809,56.87369],[16.45694,56.87786],[16.46288,56.88769],[16.42696,56.88757],[16.39809,56.89604],[16.36791,56.8952],[16.36717,56.85985],[16.36431,56.84636],[16.36001,56.83657],[16.34423,56.82532],[16.32675,56.79284],[16.26114,56.74422],[16.28473,56.70827]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for the north coast of the municipality of Kalmar 2014",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{id:"kalmar-orto-2016",name:"Kalmar South Orthophoto 2016",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2016/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.156,56.45834],[16.11389,56.46083],[16.09246,56.46633],[16.0724,56.4662],[16.07126,56.51153],[16.08516,56.56847],[16.14417,56.63933],[16.21168,56.68491],[16.28412,56.71655],[16.25135,56.74358],[16.25045,56.75062],[16.29558,56.7512],[16.33516,56.72511],[16.38922,56.71885],[16.41137,56.67602],[16.4053,56.66294],[16.33101,56.625],[16.28048,56.613],[16.21561,56.51967],[16.156,56.45834]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for the south coast of the municipality of Kalmar 2016",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{id:"kalmar-orto-2018",name:"Kalmar Urban Orthophoto 2018",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2018/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.3416,56.81756],[16.32773,56.7973],[16.36692,56.78706],[16.37105,56.79153],[16.36978,56.80511],[16.35645,56.8133],[16.3416,56.81756]],[[16.39207,56.79339],[16.4608,56.78944],[16.48817,56.79067],[16.4833,56.76986],[16.46612,56.76711],[16.45409,56.76774],[16.43173,56.77309],[16.43178,56.77663],[16.40554,56.77214],[16.39325,56.77349],[16.39207,56.79339]],[[16.29836,56.79102],[16.28796,56.7883],[16.27727,56.78367],[16.27623,56.77952],[16.2862,56.7761],[16.3108,56.77696],[16.3118,56.78086],[16.30364,56.78883],[16.29836,56.79102]],[[16.20686,56.63637],[16.22098,56.62389],[16.2453,56.62467],[16.26751,56.62951],[16.28724,56.63831],[16.37871,56.65462],[16.38806,56.6897],[16.38664,56.72867],[16.31586,56.72879],[16.29956,56.7219],[16.29331,56.70021],[16.26799,56.66889],[16.23945,56.66991],[16.2266,56.6624],[16.21411,56.64972],[16.20686,56.63637]],[[16.15172,56.67843],[16.15712,56.69334],[16.15268,56.70297],[16.13274,56.71254],[16.10987,56.71964],[16.08638,56.7112],[16.07969,56.70056],[16.08149,56.69566],[16.09534,56.69599],[16.12877,56.67766],[16.15172,56.67843]],[[15.97369,56.62759],[16.00164,56.63215],[16.04126,56.62999],[16.05658,56.62489],[16.06201,56.61794],[16.09186,56.60378],[16.10527,56.5926],[16.09581,56.58161],[16.03481,56.60405],[16.0305,56.61252],[16.0088,56.60223],[15.98755,56.59742],[15.98449,56.57141],[15.94887,56.57264],[15.91878,56.55184],[15.90892,56.55393],[15.89921,56.56867],[15.9188,56.57287],[15.94612,56.57491],[15.96371,56.59004],[15.9496,56.59724],[15.94308,56.60903],[15.95726,56.61598],[15.97589,56.62005],[15.97369,56.62759]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for urban areas of the municipality of Kalmar 2018",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{id:"Aargau-AGIS-2014",name:"Kanton Aargau 25cm (AGIS 2014)",type:"tms",template:"https://mapproxy.osm.ch/tiles/AGIS2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,19],polygon:[[[8.09602,47.57882],[8.10323,47.57879],[8.10323,47.58583],[8.10591,47.58732],[8.11019,47.58878],[8.11589,47.5893],[8.12168,47.58916],[8.12546,47.58873],[8.12959,47.58888],[8.13023,47.59122],[8.132,47.59358],[8.13506,47.59546],[8.13831,47.59698],[8.14161,47.59939],[8.14534,47.60076],[8.14961,47.60144],[8.15438,47.60127],[8.15751,47.60063],[8.16119,47.59914],[8.16255,47.59976],[8.16438,47.60148],[8.16653,47.60399],[8.17087,47.60673],[8.17608,47.60838],[8.17912,47.60868],[8.18153,47.6118],[8.18304,47.61489],[8.18498,47.6176],[8.18953,47.62151],[8.19212,47.62321],[8.22261,47.623],[8.22561,47.6212],[8.22849,47.61842],[8.22959,47.61621],[8.23008,47.61501],[8.23261,47.61686],[8.23657,47.61803],[8.24,47.61835],[8.24351,47.61783],[8.24749,47.61877],[8.25066,47.61988],[8.25708,47.6208],[8.26104,47.62069],[8.26491,47.61935],[8.26732,47.61769],[8.26902,47.61531],[8.27579,47.61702],[8.28106,47.61707],[8.28772,47.61626],[8.29421,47.61442],[8.29947,47.61221],[8.30311,47.60977],[8.30287,47.59447],[8.30438,47.59227],[8.30591,47.59109],[8.30791,47.59019],[8.31236,47.58917],[8.31655,47.58713],[8.32049,47.58436],[8.32598,47.57888],[8.32864,47.57716],[8.33219,47.57604],[8.33902,47.57577],[8.34702,47.57628],[8.35962,47.57552],[8.36475,47.57436],[8.37207,47.57377],[8.38002,47.57233],[8.38194,47.57496],[8.38387,47.57686],[8.38879,47.58027],[8.39232,47.58174],[8.39611,47.58247],[8.40013,47.58255],[8.40432,47.58158],[8.41158,47.57928],[8.418,47.57602],[8.42381,47.57452],[8.43039,47.57228],[8.43275,47.57035],[8.4336,47.56849],[8.43353,47.56669],[8.4319,47.56444],[8.4286,47.56217],[8.42575,47.56121],[8.4259,47.55854],[8.42498,47.55624],[8.42353,47.55469],[8.42296,47.5537],[8.4246,47.5517],[8.42492,47.54981],[8.42434,47.54836],[8.42539,47.54679],[8.425,47.54418],[8.4233,47.5422],[8.421,47.54106],[8.41832,47.54049],[8.41551,47.54062],[8.4139,47.53924],[8.41283,47.5372],[8.41194,47.53626],[8.41241,47.53415],[8.41185,47.53237],[8.41117,47.53158],[8.40143,47.53169],[8.40124,47.52443],[8.39936,47.5222],[8.39666,47.52082],[8.39385,47.51988],[8.39085,47.51973],[8.38877,47.52014],[8.38809,47.5146],[8.38551,47.51075],[8.38366,47.50944],[8.36776,47.50953],[8.36739,47.48709],[8.3751,47.48689],[8.37889,47.4853],[8.38196,47.48188],[8.38184,47.47521],[8.38328,47.47192],[8.38244,47.46879],[8.37943,47.46643],[8.37751,47.4659],[8.37787,47.46496],[8.38238,47.46423],[8.38671,47.46097],[8.39171,47.45743],[8.39315,47.45349],[8.39514,47.45031],[8.39418,47.44722],[8.39171,47.44535],[8.3896,47.44449],[8.38996,47.44339],[8.39111,47.4416],[8.39213,47.43924],[8.39339,47.4359],[8.39249,47.43411],[8.39369,47.43143],[8.39568,47.42854],[8.39959,47.42463],[8.39953,47.41954],[8.449,47.41897],[8.45369,47.41233],[8.45369,47.40451],[8.44858,47.39649],[8.40362,47.39685],[8.40483,47.39392],[8.4029,47.38903],[8.4035,47.38553],[8.40314,47.38304],[8.40483,47.37905],[8.40844,47.37575],[8.41379,47.37338],[8.4159,47.37016],[8.41584,47.36539],[8.4144,47.36327],[8.41494,47.35912],[8.41722,47.35573],[8.41632,47.35231],[8.41355,47.34913],[8.41367,47.34688],[8.41476,47.3448],[8.41885,47.34244],[8.42264,47.34052],[8.42469,47.33718],[8.42421,47.33163],[8.42914,47.33286],[8.4351,47.33192],[8.43763,47.33281],[8.44328,47.33506],[8.44527,47.33746],[8.45213,47.3402],[8.45761,47.33975],[8.46212,47.33649],[8.46278,47.33322],[8.46043,47.32829],[8.45797,47.32457],[8.45556,47.32005],[8.44918,47.31495],[8.44713,47.31217],[8.44021,47.30948],[8.43624,47.29817],[8.43311,47.29593],[8.42806,47.29397],[8.42318,47.29001],[8.41656,47.28789],[8.41024,47.28728],[8.4035,47.28409],[8.40188,47.2805],[8.40862,47.27593],[8.41066,47.2716],[8.40892,47.26613],[8.41235,47.2618],[8.41235,47.25873],[8.41109,47.25608],[8.41698,47.25142],[8.41885,47.2475],[8.41801,47.24305],[8.4144,47.23904],[8.41373,47.23565],[8.4106,47.23226],[8.40435,47.22797],[8.40296,47.2256],[8.40398,47.22127],[8.40856,47.21718],[8.40928,47.21326],[8.40844,47.20945],[8.41012,47.20258],[8.41319,47.19678],[8.41271,47.1924],[8.4088,47.18799],[8.40814,47.18475],[8.4091,47.1812],[8.41518,47.17915],[8.41915,47.17563],[8.42294,47.16553],[8.42294,47.15747],[8.42011,47.15325],[8.42246,47.14838],[8.42276,47.14392],[8.42053,47.13954],[8.41584,47.13524],[8.40898,47.13274],[8.40386,47.13201],[8.40116,47.13258],[8.39532,47.1327],[8.38437,47.1345],[8.37895,47.13385],[8.37245,47.13442],[8.36908,47.13659],[8.368,47.13876],[8.35656,47.14228],[8.35409,47.14564],[8.35331,47.14916],[8.3506,47.15161],[8.3503,47.15419],[8.34772,47.15669],[8.34561,47.15923],[8.34086,47.16164],[8.33935,47.16512],[8.3373,47.16896],[8.33315,47.17154],[8.33261,47.17351],[8.33062,47.17792],[8.33002,47.18717],[8.32924,47.18786],[8.32936,47.19494],[8.32292,47.19514],[8.32148,47.19854],[8.32196,47.20115],[8.31835,47.21043],[8.31413,47.21178],[8.31089,47.2153],[8.31107,47.21857],[8.31221,47.2198],[8.30884,47.22433],[8.30932,47.22646],[8.30715,47.23042],[8.30727,47.2321],[8.30595,47.23582],[8.30607,47.23949],[8.30378,47.24366],[8.30144,47.24677],[8.29554,47.24836],[8.29187,47.25293],[8.28814,47.25869],[8.28766,47.26143],[8.28627,47.26519],[8.28723,47.26805],[8.28838,47.26964],[8.2823,47.27478],[8.27718,47.27576],[8.27273,47.27531],[8.26749,47.27593],[8.26533,47.27719],[8.2616,47.27695],[8.25793,47.27781],[8.25576,47.27887],[8.25317,47.27678],[8.25034,47.27548],[8.2501,47.27348],[8.24956,47.27017],[8.24559,47.26715],[8.24095,47.26678],[8.23452,47.26727],[8.23145,47.26278],[8.2309,47.25931],[8.22663,47.24942],[8.222,47.24713],[8.21526,47.24431],[8.21363,47.24203],[8.21309,47.23602],[8.21123,47.23246],[8.21285,47.22548],[8.21117,47.22266],[8.20689,47.22053],[8.19762,47.22065],[8.19149,47.21861],[8.16976,47.21865],[8.16543,47.22315],[8.16085,47.22405],[8.15351,47.2294],[8.15171,47.2332],[8.14822,47.23647],[8.14798,47.241],[8.14635,47.24203],[8.13823,47.24166],[8.13558,47.23941],[8.12673,47.23606],[8.1218,47.23631],[8.11614,47.23872],[8.10675,47.23945],[8.10266,47.24113],[8.09983,47.24436],[8.09766,47.2493],[8.09797,47.25069],[8.09339,47.25567],[8.08852,47.2569],[8.08485,47.25583],[8.08323,47.25405],[8.07995,47.25246],[8.0769,47.25054],[8.06854,47.24284],[8.06325,47.24098],[8.05134,47.23865],[8.04857,47.23886],[8.03575,47.23747],[8.0322,47.23555],[8.02714,47.23534],[8.01139,47.23967],[8.00927,47.24116],[8.00791,47.24312],[8.00783,47.24821],[8.00857,47.25042],[8.0084,47.25769],[8.00712,47.25922],[8.00299,47.26162],[8.00052,47.26486],[7.99759,47.26789],[7.99627,47.27271],[7.99474,47.27369],[7.98993,47.27121],[7.97278,47.26907],[7.96857,47.27008],[7.96737,47.27098],[7.95861,47.27112],[7.9601,47.26748],[7.96274,47.26396],[7.96576,47.26171],[7.96699,47.25879],[7.96695,47.25001],[7.95963,47.24582],[7.95112,47.23918],[7.94469,47.236],[7.93733,47.23106],[7.93405,47.23051],[7.9298,47.23077],[7.9178,47.23305],[7.90784,47.23837],[7.89793,47.2377],[7.8695,47.23207],[7.85478,47.22719],[7.85137,47.22713],[7.83958,47.22947],[7.83584,47.22976],[7.83082,47.23259],[7.82707,47.23505],[7.82431,47.23831],[7.82129,47.24042],[7.82014,47.24264],[7.81822,47.24562],[7.81771,47.24917],[7.81822,47.25082],[7.81835,47.25371],[7.81988,47.25587],[7.82116,47.2568],[7.82112,47.25778],[7.8192,47.26058],[7.81912,47.26154],[7.81686,47.26486],[7.8175,47.26731],[7.81958,47.26982],[7.82439,47.27158],[7.82805,47.2721],[7.83592,47.27837],[7.83707,47.28342],[7.84005,47.2872],[7.84201,47.29067],[7.84588,47.29427],[7.84763,47.2982],[7.85137,47.30299],[7.8529,47.30741],[7.85571,47.31032],[7.86065,47.31254],[7.86422,47.31349],[7.87018,47.31672],[7.87631,47.31736],[7.88082,47.31716],[7.88337,47.31667],[7.88588,47.31941],[7.88886,47.32131],[7.88805,47.32443],[7.88907,47.3287],[7.8915,47.33262],[7.8978,47.34014],[7.9001,47.34156],[7.90005,47.3432],[7.90222,47.34557],[7.90635,47.34704],[7.90963,47.34735],[7.91359,47.34626],[7.91618,47.34456],[7.91699,47.34303],[7.92401,47.33899],[7.93839,47.33792],[7.94929,47.33784],[7.95431,47.33596],[7.95593,47.33317],[7.95691,47.32968],[7.95571,47.32535],[7.96993,47.32797],[7.97308,47.33017],[7.98333,47.33432],[7.98563,47.33692],[7.98954,47.33818],[7.99248,47.33827],[7.99784,47.34017],[7.99635,47.34257],[7.99601,47.34588],[7.99733,47.34859],[8.00116,47.35081],[8.00137,47.3569],[8.00261,47.3577],[8.00418,47.36044],[8.00976,47.36419],[8.01125,47.36598],[8.01746,47.36926],[8.01912,47.37157],[8.0198,47.37376],[8.02023,47.37598],[8.02172,47.37837],[8.02193,47.38093],[8.02282,47.38286],[8.02078,47.38857],[8.01606,47.38929],[8.01265,47.38897],[8.00772,47.39012],[8.00367,47.39205],[8.00163,47.39479],[8.00155,47.39998],[8.00023,47.40306],[7.99801,47.40453],[7.99261,47.40551],[7.98776,47.40637],[7.98418,47.40839],[7.98027,47.4081],[7.9732,47.41127],[7.96963,47.41383],[7.95695,47.41893],[7.95529,47.4218],[7.95593,47.42402],[7.95746,47.42621],[7.96274,47.42828],[7.97746,47.43254],[7.97567,47.43732],[7.97614,47.44138],[7.97431,47.44368],[7.95129,47.45111],[7.94861,47.4539],[7.94818,47.4566],[7.94678,47.45755],[7.94039,47.45669],[7.93588,47.45738],[7.93631,47.47625],[7.9318,47.47605],[7.92469,47.47717],[7.91571,47.47743],[7.90903,47.47947],[7.90316,47.47967],[7.90295,47.48965],[7.8969,47.4898],[7.8918,47.49405],[7.89086,47.49765],[7.8878,47.49931],[7.88631,47.5023],[7.87999,47.50397],[7.87403,47.50787],[7.86994,47.50944],[7.87006,47.51239],[7.86435,47.51245],[7.85851,47.51543],[7.8558,47.51854],[7.85625,47.52147],[7.8549,47.52474],[7.85183,47.5285],[7.84647,47.52714],[7.84148,47.52777],[7.8413,47.52406],[7.84015,47.51587],[7.83943,47.51259],[7.83688,47.51256],[7.83679,47.51049],[7.83352,47.50949],[7.83156,47.50765],[7.82981,47.50552],[7.82522,47.50354],[7.82049,47.5004],[7.81475,47.49491],[7.81181,47.49261],[7.80645,47.4914],[7.80403,47.49146],[7.80049,47.49014],[7.77977,47.49028],[7.77871,47.49304],[7.7796,47.496],[7.78386,47.5004],[7.78203,47.50368],[7.78088,47.5073],[7.78109,47.51018],[7.77977,47.51265],[7.77969,47.51529],[7.77045,47.51802],[7.75905,47.52003],[7.75266,47.52009],[7.74781,47.51957],[7.73368,47.52291],[7.72781,47.52719],[7.71985,47.52978],[7.71262,47.53095],[7.70764,47.5344],[7.70551,47.53917],[7.70696,47.54279],[7.71415,47.54627],[7.72245,47.54756],[7.749,47.54977],[7.75428,47.55339],[7.76654,47.55615],[7.77168,47.55761],[7.78007,47.55836],[7.78577,47.55982],[7.7902,47.5616],[7.79398,47.56634],[7.80492,47.57237],[7.80611,47.57989],[7.81173,47.58954],[7.81577,47.59218],[7.82211,47.59352],[7.83645,47.59163],[7.83952,47.59045],[7.84305,47.58778],[7.84875,47.58899],[7.85624,47.59189],[7.86488,47.59393],[7.87126,47.5943],[7.87726,47.59367],[7.88535,47.59424],[7.89343,47.59301],[7.90109,47.58976],[7.90833,47.58514],[7.91386,47.57923],[7.91867,47.57194],[7.91956,47.56772],[7.91875,47.56433],[7.9156,47.56008],[7.91577,47.55715],[7.91841,47.55405],[7.92126,47.55261],[7.92552,47.55227],[7.93471,47.55221],[7.9405,47.55078],[7.94326,47.54968],[7.94356,47.55052],[7.94458,47.55589],[7.94841,47.55979],[7.95394,47.56229],[7.96003,47.56333],[7.96577,47.56272],[7.97203,47.5612],[7.97833,47.56057],[7.98624,47.56094],[7.99718,47.56212],[8.0045,47.56137],[8.01114,47.55974],[8.01641,47.55701],[8.02046,47.55574],[8.0262,47.55741],[8.03799,47.55876],[8.04254,47.56028],[8.0485,47.56333],[8.05454,47.56798],[8.05931,47.56921],[8.0622,47.56895],[8.06693,47.57002],[8.07242,47.56973],[8.07739,47.56795],[8.08182,47.56436],[8.08522,47.56281],[8.08791,47.56298],[8.09259,47.56559],[8.09395,47.56809],[8.09484,47.57587],[8.09602,47.57882]]],terms_text:"AGIS OF2014"},{id:"Aargau-AGIS-2016",name:"Kanton Aargau 25cm (AGIS 2016)",type:"tms",template:"https://mapproxy.osm.ch/tiles/AGIS2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[8,19],polygon:[[[7.70438,47.55794],[7.77076,47.55772],[7.77103,47.58025],[7.80408,47.58017],[7.80433,47.60248],[7.93713,47.60217],[7.93703,47.57962],[8.00374,47.57917],[8.00338,47.55687],[8.0364,47.55665],[8.03681,47.57928],[8.10313,47.57881],[8.10387,47.60112],[8.17011,47.60086],[8.17036,47.6235],[8.30311,47.62235],[8.30305,47.59988],[8.3362,47.59927],[8.33585,47.5771],[8.36913,47.57694],[8.36943,47.59931],[8.43564,47.59877],[8.43454,47.53133],[8.40144,47.53162],[8.40096,47.50926],[8.3678,47.50959],[8.3675,47.48698],[8.40042,47.48666],[8.39939,47.41929],[8.46558,47.4187],[8.46515,47.39647],[8.43206,47.39654],[8.43125,47.3516],[8.46434,47.35128],[8.46327,47.28387],[8.42997,47.28421],[8.42714,47.12676],[8.3293,47.12753],[8.32937,47.13007],[8.32833,47.13007],[8.3285,47.14529],[8.3294,47.19502],[8.2964,47.19526],[8.29714,47.24022],[8.2641,47.24046],[8.26446,47.26297],[8.23141,47.26316],[8.23075,47.21822],[8.09886,47.21912],[8.09874,47.24135],[8.066,47.24176],[8.06552,47.2192],[7.99993,47.21952],[8.00003,47.26433],[7.96735,47.26462],[7.96675,47.21961],[7.80153,47.22029],[7.80244,47.28791],[7.83518,47.28772],[7.83543,47.31017],[7.86837,47.31017],[7.86885,47.35542],[8.00097,47.3543],[8.00156,47.39928],[7.9353,47.39976],[7.93607,47.46716],[7.90278,47.46729],[7.90303,47.48981],[7.86987,47.48998],[7.86993,47.5125],[7.83689,47.51258],[7.83665,47.4901],[7.77027,47.49026],[7.77045,47.51274],[7.70452,47.51307],[7.70438,47.55794]]],terms_text:"AGIS OF2016",best:true},{id:"Basel-Landschaft-2015",name:"Kanton Basel-Landschaft 10cm (2015)",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTBASELLANDSCHAFT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[18,21],polygon:[[[7.37028,47.41368],[7.35758,47.41508],[7.35792,47.41827],[7.35354,47.41961],[7.34488,47.42402],[7.33973,47.42971],[7.33269,47.43024],[7.32685,47.43192],[7.32528,47.43489],[7.3305,47.44176],[7.33899,47.44109],[7.34496,47.43608],[7.35266,47.43436],[7.3812,47.43208],[7.37599,47.41431],[7.37815,47.414],[7.38204,47.41331],[7.38839,47.41398],[7.41371,47.41093],[7.42074,47.4111],[7.42748,47.41448],[7.43811,47.41274],[7.4484,47.41507],[7.45558,47.42792],[7.45062,47.43534],[7.43784,47.44632],[7.42542,47.44328],[7.4209,47.44594],[7.42242,47.45072],[7.4288,47.45388],[7.43003,47.45949],[7.44577,47.46197],[7.44717,47.45696],[7.45651,47.44926],[7.49236,47.45897],[7.53068,47.46119],[7.52745,47.47391],[7.53633,47.48383],[7.53623,47.49105],[7.5326,47.49097],[7.53179,47.4974],[7.52004,47.49678],[7.51223,47.49892],[7.50935,47.50888],[7.49908,47.51628],[7.49787,47.52125],[7.50228,47.51491],[7.51746,47.51728],[7.5222,47.51409],[7.53096,47.52905],[7.51935,47.53472],[7.51075,47.52899],[7.5023,47.5284],[7.49804,47.53615],[7.50545,47.54438],[7.51676,47.54541],[7.52732,47.55278],[7.55466,47.56437],[7.56458,47.55704],[7.56124,47.55172],[7.55875,47.55235],[7.55588,47.54434],[7.56479,47.54569],[7.58726,47.5419],[7.58269,47.53247],[7.58948,47.52792],[7.59025,47.51979],[7.59478,47.51929],[7.61378,47.53925],[7.6223,47.53977],[7.62285,47.55004],[7.61774,47.55437],[7.61762,47.55865],[7.63273,47.56149],[7.63997,47.55816],[7.649,47.5483],[7.66131,47.54483],[7.66586,47.53746],[7.67467,47.53375],[7.69494,47.5325],[7.71347,47.53978],[7.71596,47.53582],[7.72362,47.53675],[7.72716,47.53293],[7.73322,47.53275],[7.73797,47.52732],[7.74902,47.52498],[7.75786,47.52605],[7.78763,47.52012],[7.79014,47.51864],[7.78887,47.50683],[7.7928,47.50068],[7.78663,47.49312],[7.79889,47.49565],[7.79816,47.4994],[7.7994,47.49748],[7.80742,47.49714],[7.81471,47.5048],[7.83198,47.51474],[7.83321,47.53382],[7.84653,47.53266],[7.85233,47.53524],[7.86257,47.52692],[7.86396,47.51931],[7.87666,47.52269],[7.87567,47.51319],[7.89399,47.50606],[7.90477,47.49218],[7.90482,47.48491],[7.93329,47.48141],[7.94702,47.48489],[7.94003,47.46202],[7.94885,47.46378],[7.95761,47.45881],[7.95785,47.45128],[7.94678,47.44319],[7.95003,47.43172],[7.96183,47.42183],[7.95657,47.41968],[7.95504,47.41561],[7.94839,47.41627],[7.93493,47.41177],[7.93672,47.40806],[7.93266,47.40527],[7.90974,47.39852],[7.89022,47.40714],[7.88333,47.4061],[7.88344,47.4012],[7.8777,47.40126],[7.86914,47.39551],[7.87943,47.38799],[7.87881,47.38351],[7.86265,47.38198],[7.84012,47.37476],[7.83055,47.36512],[7.80217,47.3611],[7.79637,47.35347],[7.79356,47.33905],[7.78529,47.33788],[7.76896,47.33891],[7.76642,47.34273],[7.75152,47.34433],[7.73415,47.35776],[7.72791,47.36886],[7.70195,47.37245],[7.6442,47.36721],[7.64176,47.38047],[7.63558,47.38059],[7.63332,47.38291],[7.63331,47.38534],[7.63725,47.38607],[7.63272,47.41003],[7.66405,47.41002],[7.6798,47.41751],[7.68658,47.43366],[7.68297,47.43872],[7.68485,47.44784],[7.69227,47.45421],[7.69883,47.45586],[7.69993,47.46191],[7.70988,47.46938],[7.69976,47.48063],[7.66833,47.48635],[7.66612,47.49687],[7.65217,47.49581],[7.64865,47.49183],[7.65539,47.49021],[7.65051,47.48826],[7.65593,47.48739],[7.64442,47.48564],[7.64097,47.48273],[7.6073,47.4894],[7.60885,47.48353],[7.60563,47.47936],[7.60815,47.47521],[7.60449,47.47045],[7.61887,47.46745],[7.62607,47.46291],[7.62217,47.46195],[7.61646,47.44523],[7.6158,47.43275],[7.59207,47.43271],[7.58121,47.42878],[7.57842,47.43491],[7.5689,47.4369],[7.5683,47.42233],[7.58074,47.4147],[7.52524,47.41163],[7.53117,47.40353],[7.51862,47.38822],[7.5113,47.38974],[7.50226,47.38481],[7.49233,47.38523],[7.47841,47.39056],[7.47747,47.40128],[7.46448,47.40251],[7.46092,47.40068],[7.45002,47.40393],[7.44951,47.39976],[7.4434,47.40231],[7.44131,47.40018],[7.44357,47.3889],[7.43732,47.38089],[7.41169,47.38057],[7.41628,47.38479],[7.41449,47.3943],[7.39894,47.39684],[7.39592,47.40338],[7.38869,47.40302],[7.38405,47.41236],[7.37968,47.41281],[7.37584,47.41401],[7.37028,47.41368]]],terms_url:"https://www.geo.bl.ch/fileadmin/user_upload/Geodaten/Nutzungsbedingungen_GBD_BL_V3p2.pdf",terms_text:"Geodaten des Kantons Basel-Landschaft 2015",best:true},{id:"KTBASELSTADT2015",name:"Kanton Basel-Stadt 2015",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTBASELSTADT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[7.492,47.4817],[7.492,47.6342],[7.784,47.6342],[7.784,47.4817],[7.492,47.4817]]],terms_text:"Kanton Basel-Stadt OF 2015"},{id:"KTBASELSTADT2017",name:"Kanton Basel-Stadt 2017",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTBASELSTADT2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[7.67138,47.59522],[7.67996,47.60078],[7.68451,47.60182],[7.69438,47.60171],[7.69395,47.59667],[7.68708,47.59355],[7.67884,47.58712],[7.68571,47.58538],[7.68906,47.57612],[7.69412,47.5734],[7.6924,47.56691],[7.6847,47.5617],[7.66425,47.56164],[7.64872,47.55689],[7.63035,47.55869],[7.62357,47.55666],[7.62786,47.55145],[7.62738,47.53658],[7.61833,47.53662],[7.61335,47.53262],[7.59962,47.51911],[7.58503,47.51917],[7.58409,47.52636],[7.57713,47.53163],[7.58125,47.53986],[7.5719,47.54148],[7.55387,47.54148],[7.55379,47.55122],[7.55653,47.55828],[7.5537,47.56031],[7.55379,47.57473],[7.56434,47.58122],[7.57936,47.57988],[7.58331,47.59019],[7.58563,47.59233],[7.59207,47.59239],[7.59851,47.59071],[7.60915,47.58643],[7.60923,47.5811],[7.6191,47.58046],[7.63687,47.59314],[7.63782,47.59557],[7.64168,47.59887],[7.64528,47.60026],[7.66494,47.59618],[7.67138,47.59522]]],terms_text:"Kanton Basel-Stadt OF 2017",best:true},{id:"Solothurn-sogis2014-tms",name:"Kanton Solothurn (SOGIS)",type:"tms",template:"https://mapproxy.osm.ch/tiles/sogis2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[15,19],polygon:[[[7.95595,47.47162],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39022],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.94122,47.30978],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84832,47.27416],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24777],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.6499,47.22083],[7.66308,47.22073],[7.6631,47.21178],[7.66297,47.20273],[7.67617,47.2027],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53095,47.13097],[7.51767,47.13097],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47813,47.07705],[7.46493,47.07708],[7.46498,47.06807],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.3727,47.15796],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.20287],[7.33307,47.2029],[7.33307,47.22096],[7.34614,47.22096],[7.34614,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.5046,47.29288],[7.50473,47.30183],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.3988,47.36484],[7.39889,47.39182],[7.38564,47.39181],[7.38564,47.4008],[7.37234,47.4008],[7.37234,47.40978],[7.34584,47.40978],[7.34584,47.41878],[7.31925,47.41878],[7.31925,47.44578],[7.4121,47.44578],[7.4121,47.49078],[7.42535,47.49078],[7.42535,47.49981],[7.43856,47.49981],[7.43856,47.50876],[7.49177,47.50876],[7.49178,47.63468],[7.7845,47.63428],[7.78415,47.57123],[7.81074,47.57114],[7.81074,47.56216],[7.82395,47.56206],[7.82387,47.54414],[7.86368,47.54397],[7.86363,47.53498],[7.87679,47.53495],[7.87675,47.52599],[7.8901,47.52596],[7.89006,47.51695],[7.90319,47.51692],[7.9031,47.49886],[7.91649,47.49883],[7.91645,47.48976],[7.95612,47.48967],[7.95595,47.47162]]],terms_text:"Orthofoto WMS Solothurn",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ch/KantonSolothurn-SOGIS-wms.png"},{id:"Solothurn-infrared-SOGIS",name:"Kanton Solothurn Infrarot (SOGIS)",type:"wms",template:"https://geoweb.so.ch/wms/sogis_orthofoto.wms?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Orthofoto_CIR_SO&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[15,19],polygon:[[[7.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53093,47.12196],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47816,47.09496],[7.49144,47.09499],[7.4914,47.07702],[7.47816,47.07705],[7.4782,47.06804],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.39913,47.15804],[7.39913,47.14901],[7.3727,47.14898],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.19391],[7.33307,47.19394],[7.33307,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.49149,47.29289],[7.49162,47.30184],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.43862,47.36492],[7.43867,47.37389],[7.42538,47.37395],[7.42543,47.40081],[7.38558,47.4009],[7.38567,47.4098],[7.35915,47.4098],[7.35915,47.41878],[7.37239,47.41884],[7.37247,47.43682],[7.38571,47.43682],[7.38571,47.44104],[7.39563,47.44016],[7.3963,47.44258],[7.40761,47.4411],[7.40793,47.44225],[7.40313,47.44246],[7.39738,47.44331],[7.39832,47.44583],[7.41214,47.44583],[7.41228,47.45478],[7.43867,47.45488],[7.4388,47.47053],[7.45007,47.46941],[7.45007,47.47223],[7.44647,47.47223],[7.44647,47.47381],[7.44293,47.4739],[7.44288,47.47553],[7.43921,47.4756],[7.43921,47.4772],[7.43557,47.47729],[7.43548,47.47899],[7.4174,47.47896],[7.41744,47.48573],[7.42099,47.48573],[7.42108,47.49082],[7.42763,47.49073],[7.42852,47.49349],[7.43099,47.49643],[7.43485,47.49889],[7.4419,47.49552],[7.44665,47.49455],[7.45011,47.49176],[7.45087,47.4907],[7.46451,47.49073],[7.46456,47.48903],[7.46819,47.489],[7.46819,47.48566],[7.47187,47.48573],[7.47192,47.48233],[7.48269,47.48239],[7.48264,47.48388],[7.48623,47.48397],[7.48637,47.48566],[7.48991,47.48566],[7.49,47.4907],[7.4997,47.49073],[7.49965,47.4914],[7.49175,47.49194],[7.49175,47.49513],[7.49822,47.49479],[7.49889,47.49585],[7.49566,47.49628],[7.49171,47.49625],[7.4918,47.49973],[7.50504,47.4997],[7.50504,47.50874],[7.5448,47.50871],[7.54474,47.45482],[7.49169,47.45469],[7.49175,47.44581],[7.46529,47.44577],[7.46522,47.40983],[7.49156,47.40979],[7.49175,47.39192],[7.50489,47.39183],[7.50489,47.40068],[7.51821,47.40077],[7.51834,47.41876],[7.55794,47.41872],[7.55813,47.44581],[7.58453,47.44572],[7.58441,47.43667],[7.61094,47.43662],[7.611,47.4637],[7.59767,47.4637],[7.59793,47.49964],[7.62433,47.49969],[7.62445,47.4906],[7.63778,47.49055],[7.63784,47.4996],[7.67757,47.49947],[7.67745,47.49047],[7.70385,47.49043],[7.70391,47.48146],[7.71711,47.48129],[7.71711,47.45452],[7.70397,47.45452],[7.70385,47.44559],[7.69046,47.44551],[7.69033,47.40957],[7.67713,47.40949],[7.67713,47.40068],[7.65066,47.40068],[7.65047,47.37365],[7.67706,47.37357],[7.67706,47.38251],[7.71667,47.38251],[7.71679,47.37344],[7.74307,47.3734],[7.74307,47.35538],[7.7562,47.35534],[7.75633,47.3464],[7.78261,47.34627],[7.78292,47.36433],[7.79612,47.36428],[7.79619,47.37327],[7.82265,47.37314],[7.82271,47.38229],[7.84912,47.38212],[7.84924,47.39106],[7.86251,47.39097],[7.86263,47.40906],[7.8759,47.40897],[7.87602,47.41803],[7.90242,47.41795],[7.90242,47.40897],[7.92889,47.4088],[7.92914,47.41782],[7.94215,47.41769],[7.94266,47.46276],[7.95592,47.46259],[7.95612,47.47164],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39015],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.9412,47.30992],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84843,47.27415],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24765],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.66305,47.22971],[7.6631,47.21178],[7.67621,47.21169],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70248,47.16663],[7.71567,47.16663],[7.71558,47.15769],[7.70239,47.15766],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792]]],terms_text:"Orthofoto WMS Solothurn",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ch/KantonSolothurn-SOGIS-wms.png"},{id:"KTTHURGAU2017",name:"Kanton Thurgau OF 2017",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTTHURGAU2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[8,21],polygon:[[[8.63768,47.70041],[8.78328,47.6988],[8.78304,47.68533],[8.87027,47.68427],[8.86997,47.6709],[8.89901,47.67047],[8.89867,47.65698],[8.9277,47.65661],[8.92828,47.67015],[8.95726,47.66973],[8.95774,47.68327],[9.19061,47.67994],[9.19027,47.66645],[9.21922,47.66603],[9.21899,47.65256],[9.24784,47.6521],[9.24747,47.63864],[9.3057,47.63765],[9.30526,47.6242],[9.33417,47.62371],[9.33348,47.59674],[9.39151,47.59577],[9.39114,47.58235],[9.42007,47.58176],[9.4186,47.54139],[9.44754,47.54084],[9.44717,47.5273],[9.47605,47.52681],[9.47519,47.49986],[9.50414,47.49935],[9.5031,47.47242],[9.41596,47.47392],[9.41554,47.46045],[9.3576,47.46141],[9.35818,47.47498],[9.32896,47.47534],[9.32864,47.46188],[9.18361,47.4642],[9.18411,47.47769],[9.15492,47.4781],[9.15466,47.46463],[9.06736,47.46583],[9.06718,47.45234],[9.09609,47.45193],[9.09582,47.43853],[9.06663,47.43883],[9.06642,47.42537],[9.00829,47.4262],[9.00714,47.38573],[8.97811,47.38616],[8.9774,47.35913],[8.9194,47.35989],[8.92032,47.38697],[8.89136,47.38725],[8.89286,47.44117],[8.86398,47.44149],[8.86604,47.52251],[8.80784,47.52317],[8.80894,47.56373],[8.77985,47.56403],[8.78024,47.57751],[8.72209,47.57814],[8.72337,47.63213],[8.6652,47.63273],[8.6658,47.6598],[8.63674,47.66],[8.63768,47.70041]]],terms_text:"Kanton Thurgau OF 2017",best:true},{id:"KTZUERICH2015",name:"Kanton Zürich 2015  10cm",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTZUERICH2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Kanton Zürich Orthophotos 2014/2015",best:true},{id:"Kanton-Zuerich-2015",name:"Kanton Zürich Orthophotos 2014/2015 10cm",type:"wms",template:"https://wms.zh.ch/OrthoZHWMS?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orthophotos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Kanton Zürich Orthophotos 2014/2015",best:true},{id:"kartverket-abas",name:"Kartverket Administrative Boundaries overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.adm_enheter?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=avtaltavgrensningslinje,territorialgrense,riksgrense,fylker,kommuner&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/data/Kartdata/Grenser/",terms_text:"© Kartverket",description:"Official administrative boundaries at the national, county and municipality levels",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-luftfartshindre",name:"Kartverket Aviation Obstructions overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.nrl?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nrl3_wms&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[7,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kartverket.no/kart/Nasjonalt-register-over-luftfartshindre/",terms_text:"© Kartverket",description:"Vertical obstructions to aircrafts, above 15m in rural areas and 30m in urban areas (e.g. masts, towers, high buildings, power lines)",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-matrikkel",name:"Kartverket Cadastral overlay",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.matrikkel?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=matrikkel_WMS&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[14,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"http://www.seeiendom.no/",terms_text:"© Kartverket",description:"Real estate boundaries from the official land register (`matrikkelen´). Monthly update.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-hoydekurver",name:"Kartverket Contour Lines overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.topo4?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=hoydetall5linje,hoydetall5punkt,hoydepunkt,vannpunkt,hoydekurver_1m,hoydekurver_5m,N50Hoydekurver,N250Hoydekurver,N500Hoydekurver,N1000Hoydekurver,N2000Hoydekurver&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[9,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/Prosjekter/Nasjonal-detaljert-hoydemodell/",terms_text:"© Kartverket",description:"Contours for Norway",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-dom-skygge",name:"Kartverket DOM Digital Surface Model",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.hoyde-dom_somlos_skyggerelieff?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=las_dom_skyggerelieff_somlos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://hoydedata.no/",terms_text:"© Kartverket",description:"Shaded relief representation of the Norwegian digital surface model (DOM), i.e. earth surface including trees, buildings and other objects on top of it.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-dtm-skygge",name:"Kartverket DTM Digital Terrain Model",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.hoyde-dtm_somlos_skyggerelieff?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=las_dtm_skyggerelieff_somlos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://hoydedata.no/",terms_text:"© Kartverket",description:"Shaded relief representation of the Norwegian digital terrain model (DTM), i.e. earth surface without trees, buildings and other objects.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-ok-1st",name:"Kartverket Economic Maps (historic)",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.n5raster2?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=n5raster_foerstegang_metadata,n5raster_foerstegang&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[11,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/kunnskap/historie/kartverkets-historiske-arkiv/",terms_text:"© Kartverket",description:"1st edition of historic Economic maps for Norway 1960-90s (`Økonomisk kartverk´). Available from zoom 16. Please correct local imagery offset.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-friluft",name:"Kartverket Hiking Trails",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.friluftsruter2?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Fotrute&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://kartverket.no/geodataarbeid/temadata/nasjonal-database-for-tur--og-friluftsruter/",terms_text:"© Kartverket",description:"Hiking trails from the Norwegian database `Tur- og Friluftsruter´, including DNT routes.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-fjellskygge",name:"Kartverket Hillshade overlay",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=fjellskygge&zoom={zoom}&x={x}&y={y}",zoomExtent:[9,15],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kartkatalog.geonorge.no/metadata/kartverket/fjellskygge-cache/cca7c129-fe66-4c96-9091-40d92290dd81",terms_text:"© Kartverket",description:"Hillshade for Norway",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-historic",name:"Kartverket Historic maps",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.historiskekart?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=amt1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,15],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/kart/historiske-kart/",terms_text:"© Kartverket",description:"Historic maps - for the time being `Amtskartserien´ 1826-1917.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-topo4",name:"Kartverket N50 topo",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo4&zoom={zoom}&x={x}&y={y}",zoomExtent:[3,15],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://wiki.openstreetmap.org/wiki/No:Kartverket_import",terms_text:"© Kartverket",description:"Topographic map N50, equivalent to Norway 1:50.000 paper map series.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-sjokart",name:"Kartverket Nautical Charts",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=sjokartraster&zoom={zoom}&x={x}&y={y}",zoomExtent:[3,20],polygon:[[[-15.01273,-60.16205],[33.3326,-60.17016],[33.32144,-73.0009],[-15.0239,-72.99613],[-15.01273,-60.16205]],[[-173.00076,-70.54952],[-125.00321,-70.54878],[-125.00167,-78.99977],[-172.99922,-79.0002],[-173.00076,-70.54952]],[[3.24857,56.08599],[2.60924,56.59428],[1.47215,58.45924],[1.77704,61.36251],[-0.49301,63.88665],[-13.73292,69.76376],[-12.43655,72.58741],[-5.11965,74.39626],[-3.60356,79.12998],[5.85587,82.34863],[34.98861,82.3401],[37.96874,78.62784],[37.99619,75.79673],[36.95796,73.68962],[32.07458,70.27336],[30.3511,69.56882],[21.46179,69.57098],[18.3032,68.36681],[14.47997,66.2558],[11.50266,63.28307],[11.50166,58.95444],[11.08246,58.96771],[10.03051,58.25173],[8.88244,57.69534],[3.24857,56.08599]]],terms_url:"https://www.kartverket.no/Kart/Sjokart/",terms_text:"© Kartverket",description:"Norwegian nautical charts (includes Spitsbergen/Svalbard and Antarctica). Raster representation of paper charts. Updated biweekly.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-vegnett",name:"Kartverket Road Network",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.vegnett?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=all&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://www.kartverket.no/data/kartdata/vegdata/",terms_text:"© Kartverket",description:"Norwegian road network from the National Road database (NVDB). Colours represent national, county, municipal, private and forest roads + footways/cycleways.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"Katowice-buildings",name:"Katowice: Buildings",type:"wms",template:"http://mapserver.um.katowice.pl/services/ortowms/MapServer/WMSServer?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=4,5,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.90884,50.24006],[18.90851,50.23542],[18.94279,50.23515],[18.94399,50.27138],[18.95469,50.27485],[18.95571,50.2894],[18.96692,50.29364],[18.98752,50.2848],[18.99888,50.2847],[18.99907,50.29368],[18.98892,50.29377],[18.98934,50.30244],[19.0094,50.30196],[19.03401,50.28842],[19.05533,50.30139],[19.07901,50.30087],[19.07908,50.29297],[19.12296,50.27784],[19.12267,50.25523],[19.11079,50.2428],[19.1098,50.17946],[19.12065,50.17936],[19.11957,50.14359],[19.10777,50.14386],[19.0973,50.13916],[19.09656,50.12786],[19.06379,50.12786],[19.02985,50.14009],[19.03007,50.16177],[19.01909,50.16698],[19.00848,50.16707],[18.96329,50.1498],[18.92907,50.15008],[18.92915,50.15426],[18.91854,50.15419],[18.91878,50.20421],[18.90792,50.20429],[18.90808,50.21297],[18.88588,50.21314],[18.88639,50.24024],[18.90884,50.24006]]],terms_text:"Urząd Miasta Katowic"},{id:"Katowice-aerial_image",name:"Katowice: Orthophotomap (aerial image)",type:"wms",template:"http://mapserver.um.katowice.pl/services/ortowms/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[18.90884,50.24006],[18.90851,50.23542],[18.94279,50.23515],[18.94399,50.27138],[18.95469,50.27485],[18.95571,50.2894],[18.96692,50.29364],[18.98752,50.2848],[18.99888,50.2847],[18.99907,50.29368],[18.98892,50.29377],[18.98934,50.30244],[19.0094,50.30196],[19.03401,50.28842],[19.05533,50.30139],[19.07901,50.30087],[19.07908,50.29297],[19.12296,50.27784],[19.12267,50.25523],[19.11079,50.2428],[19.1098,50.17946],[19.12065,50.17936],[19.11957,50.14359],[19.10777,50.14386],[19.0973,50.13916],[19.09656,50.12786],[19.06379,50.12786],[19.02985,50.14009],[19.03007,50.16177],[19.01909,50.16698],[19.00848,50.16707],[18.96329,50.1498],[18.92907,50.15008],[18.92915,50.15426],[18.91854,50.15419],[18.91878,50.20421],[18.90792,50.20429],[18.90808,50.21297],[18.88588,50.21314],[18.88639,50.24024],[18.90884,50.24006]]],terms_text:"Urząd Miasta Katowic"},{id:"kelowna_2012",name:"Kelowna 2012",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna2012/{zoom}/{x}/{y}.png",endDate:"2012-05-14T00:00:00.000Z",startDate:"2012-05-13T00:00:00.000Z",zoomExtent:[9,20],polygon:[[[-119.58673,49.79281],[-119.54657,49.79281],[-119.54657,49.80138],[-119.53434,49.80138],[-119.53434,49.80473],[-119.52962,49.80473],[-119.52962,49.81196],[-119.51045,49.81196],[-119.51157,49.87443],[-119.51089,49.87449],[-119.51141,49.88433],[-119.51141,49.92218],[-119.49386,49.92235],[-119.49405,49.9313],[-119.48039,49.93175],[-119.48046,49.94075],[-119.46667,49.94099],[-119.46928,49.99137],[-119.45513,49.99161],[-119.45567,50.01212],[-119.44167,50.01239],[-119.44173,50.01363],[-119.42215,50.01404],[-119.4221,50.01193],[-119.41213,50.01217],[-119.41261,50.02169],[-119.41234,50.02169],[-119.41248,50.02508],[-119.41209,50.02508],[-119.4122,50.02708],[-119.41261,50.02707],[-119.41283,50.03219],[-119.39363,50.03264],[-119.39353,50.03078],[-119.37957,50.03101],[-119.37954,50.02876],[-119.37358,50.02886],[-119.37154,49.97936],[-119.35735,49.97936],[-119.35484,49.92561],[-119.32681,49.92572],[-119.32566,49.88041],[-119.31389,49.88065],[-119.31371,49.87717],[-119.31322,49.87722],[-119.31315,49.87497],[-119.31245,49.87491],[-119.31223,49.87236],[-119.31176,49.87233],[-119.3116,49.86961],[-119.31122,49.86942],[-119.31092,49.86324],[-119.31037,49.86327],[-119.30951,49.85124],[-119.31064,49.85123],[-119.31039,49.84626],[-119.32453,49.846],[-119.3246,49.84507],[-119.3367,49.84488],[-119.33675,49.84351],[-119.33794,49.84347],[-119.3378,49.83821],[-119.33836,49.8381],[-119.33837,49.83512],[-119.33909,49.83511],[-119.3388,49.83212],[-119.33915,49.83206],[-119.33917,49.82933],[-119.33946,49.82933],[-119.33959,49.82679],[-119.35001,49.82658],[-119.34937,49.81806],[-119.4047,49.81638],[-119.40457,49.8099],[-119.41016,49.8099],[-119.41029,49.80728],[-119.43195,49.80691],[-119.43226,49.7908],[-119.44598,49.79055],[-119.44529,49.78202],[-119.49674,49.78116],[-119.49661,49.77849],[-119.54184,49.77751],[-119.54159,49.77183],[-119.55603,49.77149],[-119.55612,49.77184],[-119.57157,49.77151],[-119.57162,49.77173],[-119.58192,49.77149],[-119.58201,49.77177],[-119.5923,49.77152],[-119.59234,49.77181],[-119.60038,49.7716],[-119.60119,49.78391],[-119.58644,49.78439],[-119.58673,49.79281]]],description:"High quality aerial imagery taken for the City of Kelowna"},{id:"kelowna_roads",name:"Kelowna Roads overlay",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna_overlay/{zoom}/{x}/{y}.png",zoomExtent:[9,20],polygon:[[[-119.58673,49.79281],[-119.54657,49.79281],[-119.54657,49.80138],[-119.53434,49.80138],[-119.53434,49.80473],[-119.52962,49.80473],[-119.52962,49.81196],[-119.51045,49.81196],[-119.51157,49.87443],[-119.51089,49.87449],[-119.51141,49.88433],[-119.51141,49.92218],[-119.49386,49.92235],[-119.49405,49.9313],[-119.48039,49.93175],[-119.48046,49.94075],[-119.46667,49.94099],[-119.46928,49.99137],[-119.45513,49.99161],[-119.45567,50.01212],[-119.44167,50.01239],[-119.44173,50.01363],[-119.42215,50.01404],[-119.4221,50.01193],[-119.41213,50.01217],[-119.41261,50.02169],[-119.41234,50.02169],[-119.41248,50.02508],[-119.41209,50.02508],[-119.4122,50.02708],[-119.41261,50.02707],[-119.41283,50.03219],[-119.39363,50.03264],[-119.39353,50.03078],[-119.37957,50.03101],[-119.37954,50.02876],[-119.37358,50.02886],[-119.37154,49.97936],[-119.35735,49.97936],[-119.35484,49.92561],[-119.32681,49.92572],[-119.32566,49.88041],[-119.31389,49.88065],[-119.31371,49.87717],[-119.31322,49.87722],[-119.31315,49.87497],[-119.31245,49.87491],[-119.31223,49.87236],[-119.31176,49.87233],[-119.3116,49.86961],[-119.31122,49.86942],[-119.31092,49.86324],[-119.31037,49.86327],[-119.30951,49.85124],[-119.31064,49.85123],[-119.31039,49.84626],[-119.32453,49.846],[-119.3246,49.84507],[-119.3367,49.84488],[-119.33675,49.84351],[-119.33794,49.84347],[-119.3378,49.83821],[-119.33836,49.8381],[-119.33837,49.83512],[-119.33909,49.83511],[-119.3388,49.83212],[-119.33915,49.83206],[-119.33917,49.82933],[-119.33946,49.82933],[-119.33959,49.82679],[-119.35001,49.82658],[-119.34937,49.81806],[-119.4047,49.81638],[-119.40457,49.8099],[-119.41016,49.8099],[-119.41029,49.80728],[-119.43195,49.80691],[-119.43226,49.7908],[-119.44598,49.79055],[-119.44529,49.78202],[-119.49674,49.78116],[-119.49661,49.77849],[-119.54184,49.77751],[-119.54159,49.77183],[-119.55603,49.77149],[-119.55612,49.77184],[-119.57157,49.77151],[-119.57162,49.77173],[-119.58192,49.77149],[-119.58201,49.77177],[-119.5923,49.77152],[-119.59234,49.77181],[-119.60038,49.7716],[-119.60119,49.78391],[-119.58644,49.78439],[-119.58673,49.79281]]],overlay:true},{id:"kystverket-navigasjon",name:"Kystverket Navigational Aid overlay",type:"wms",template:"https://nfs.kystverket.no/arcgis/services/nfs/NFSSistOperativ/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=17,16,15,14,12,10,9,8,7,4&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[12,19],polygon:[[[3.24857,56.08599],[2.60924,56.59428],[1.47215,58.45924],[1.77704,61.36251],[-0.49301,63.88665],[-13.73292,69.76376],[-12.43655,72.58741],[-5.11965,74.39626],[-3.60356,79.12998],[5.85587,82.34863],[34.98861,82.3401],[37.96874,78.62784],[37.99619,75.79673],[36.95796,73.68962],[32.07458,70.27336],[30.3511,69.56882],[21.46179,69.57098],[18.3032,68.36681],[14.47997,66.2558],[11.50266,63.28307],[11.50166,58.95444],[11.08246,58.96771],[10.03051,58.25173],[8.88244,57.69534],[3.24857,56.08599]]],terms_url:"http://kystverket.no/Maritim-infrastruktur/Fyr-og-merker-/",terms_text:"© Kystverket",description:"Beacons, buoys, lights and fairways maintained by the Norwegian Coastal Administration",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Coat_of_arms_of_the_Norwegian_Coastal_Administration.svg/143px-Coat_of_arms_of_the_Norwegian_Coastal_Administration.svg.png",overlay:true},{id:"landsat_233055",name:"Landsat 233055",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_233055/{zoom}/{x}/{y}.png",endDate:"2013-09-03T00:00:00.000Z",startDate:"2013-09-03T00:00:00.000Z",zoomExtent:[5,14],polygon:[[[-60.855,6.1765],[-60.47626,7.91883],[-62.16169,8.27787],[-62.53225,6.53755],[-60.855,6.1765]]],description:"Recent Landsat imagery"},{id:"osmse-ekonomiska",name:"Lantmäteriet Economic Map 1950–1980",type:"tms",template:"https://mapproxy.openstreetmap.se/tms/1.0.0/ek_EPSG3857/{zoom}/{x}/{-y}.jpeg",zoomExtent:[3,17],polygon:[[[12.71117,55.2666],[14.38109,55.29163],[19.65453,57.24934],[19.85228,59.75087],[17.77587,61.13794],[18.06151,62.27815],[20.97289,63.5779],[24.35668,65.60842],[23.96117,66.79191],[20.61034,66.45189],[17.13866,63.96632],[11.99706,61.03702],[12.29369,60.31607],[10.70067,58.81375],[12.71117,55.2666]]],terms_url:"https://www.lantmateriet.se",terms_text:"© Lantmäteriet",description:"Scan of \"Economic maps\" ca. 1950–1980",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lantmateriet-orto1960",name:"Lantmäteriet Historic Orthophoto 1960",type:"wms",template:"https://api.lantmateriet.se/historiska-ortofoton/wms/v1/token/9b342b7d9f12d4ddb92277be9869d860/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.Histortho_60&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Mosaic of Swedish orthophotos from the period 1955–1965. Older and younger pictures may occur.",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lantmateriet-orto1975",name:"Lantmäteriet Historic Orthophoto 1975",type:"wms",template:"https://api.lantmateriet.se/historiska-ortofoton/wms/v1/token/9b342b7d9f12d4ddb92277be9869d860/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.Histortho_75&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[17.85131,60.87407],[14.74558,60.53889],[11.60239,59.56416],[10.51799,58.66559],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Mosaic of Swedish orthophotos from the period 1970–1980. Is under construction.",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lantmateriet-topowebb",name:"Lantmäteriet Topographic Map",type:"tms",template:"https://api.lantmateriet.se/open/topowebb-ccby/v1/wmts/token/9b342b7d9f12d4ddb92277be9869d860/1.0.0/topowebb/default/3857/{zoom}/{y}/{x}.png",zoomExtent:[3,15],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Topographic map of Sweden 1:50 000",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lu.geoportail.opendata.ortholatest",name:"Latest available ortho geoportail.lu",type:"tms",template:"https://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_latest/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2017-06-22T00:00:00.000Z",startDate:"2017-06-14T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",best:true,icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"landsat_047026",name:"Latest southwest British Columbia Landsat",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_047026/{zoom}/{x}/{y}.png",endDate:"2013-09-12T00:00:00.000Z",startDate:"2013-09-12T00:00:00.000Z",zoomExtent:[5,13],polygon:[[[-121.93555,47.78206],[-121.57206,48.64101],[-121.20155,49.48462],[-121.83755,49.60232],[-122.4767,49.71617],[-123.11891,49.82688],[-123.76023,49.93358],[-124.08877,49.08705],[-124.41289,48.22526],[-123.79277,48.11973],[-123.17279,48.01096],[-122.55355,47.89823],[-121.93555,47.78206]]],description:"Recent lower-resolution landsat imagery for southwest British Columbia"},{id:"Lausanne-2012",name:"Lausanne - Orthophoto technique 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/lausanne2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.66668,46.49441],[6.61637,46.49406],[6.61636,46.49836],[6.60135,46.49825],[6.60131,46.50227],[6.55923,46.50194],[6.55773,46.59687],[6.72895,46.59805],[6.7304,46.49004],[6.67702,46.48978],[6.67703,46.49011],[6.67345,46.49006],[6.67347,46.49041],[6.66672,46.49036],[6.66668,46.49441]]],terms_url:"http://carto.lausanne.ch/lausanne-gc/",terms_text:"Ville de Lausanne - Orthophoto technique 2012"},{id:"linkoping-orto",name:"Linköping Orthophoto",type:"wms",template:"http://kartan.linkoping.se/wms?servicename=wms_ortofoto&FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Kommun_2010_25cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,20],polygon:[[[15.36884,58.6305],[15.41279,58.65623],[15.46635,58.6339],[15.54291,58.64408],[15.54119,58.60672],[15.58376,58.6414],[15.7592,58.55267],[15.76675,58.52006],[15.91438,58.51755],[16.08089,58.37148],[15.82718,58.30588],[15.84915,58.21449],[15.65861,58.15513],[15.56763,58.19134],[15.55939,58.14661],[15.50171,58.07679],[15.37777,58.05881],[15.28713,58.1031],[15.27203,58.13483],[15.35889,58.16455],[15.32387,58.38012],[15.24971,58.40027],[15.3582,58.47288],[15.36884,58.6305]]],terms_url:"https://www.linkoping.se/open/",terms_text:"© Linköping municipality",best:true,description:"Orthophotos from the municipality of Linköping 2010, open data",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Linköping_vapen.svg/198px-Linköping_vapen.svg.png"},{id:"LINZ_NZ_Aerial_Imagery",name:"LINZ NZ Aerial Imagery",type:"tms",template:"https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/set=2/EPSG:3857/{zoom}/{x}/{y}.png",zoomExtent:[0,21],polygon:[[[167.25037,-47.21957],[167.24487,-47.28016],[167.50305,-47.37975],[168.25012,-47.1561],[168.74451,-46.7963],[169.32678,-46.75492],[169.78271,-46.60417],[170.42542,-46.11133],[170.80444,-45.95115],[170.95276,-45.44086],[171.30981,-44.91036],[171.40869,-44.39062],[172.56226,-43.92955],[172.90283,-43.9691],[173.16101,-43.90977],[173.25989,-43.69568],[172.97424,-43.5366],[172.76001,-43.37711],[173.15002,-43.17714],[173.70483,-42.63396],[174.36401,-41.7836],[174.32007,-41.40978],[174.84741,-41.52914],[175.07263,-41.70573],[175.50659,-41.67291],[176.2262,-41.10833],[176.83044,-40.42604],[177.17102,-39.67337],[177.03918,-39.39375],[177.44568,-39.18118],[177.60498,-39.33005],[177.97852,-39.36828],[178.33557,-38.65978],[178.70911,-37.74466],[178.62671,-37.54458],[178.3136,-37.43125],[177.62146,-37.37889],[177.03918,-37.39635],[176.56128,-37.37016],[176.33606,-37.05956],[176.00647,-36.29742],[175.67688,-36.05354],[174.67163,-35.1783],[173.19397,-34.28445],[172.67761,-34.23451],[172.38647,-34.40238],[172.47986,-34.71904],[172.98523,-35.32185],[173.56201,-36.14231],[174.30908,-37.07709],[174.55627,-38.05242],[174.47937,-38.65549],[174.32556,-38.86537],[173.79822,-38.95941],[173.60596,-39.23225],[173.69934,-39.56335],[174.58923,-39.95607],[174.98474,-40.21664],[174.98474,-40.49292],[174.72107,-40.80549],[174.14978,-40.65147],[173.28186,-40.4344],[172.58972,-40.35073],[172.08435,-40.53468],[171.76575,-40.82628],[171.57349,-41.39742],[171.28235,-41.65239],[170.87585,-42.53284],[170.354,-42.87194],[168.27759,-43.92955],[167.6239,-44.47691],[166.55273,-45.38688],[166.27258,-45.91677],[166.48132,-46.22545],[167.67883,-46.47192],[167.25037,-47.21957]]],terms_url:"https://www.linz.govt.nz/data/licensing-and-using-data/attributing-elevation-or-aerial-imagery-data",terms_text:"Sourced from LINZ CC-BY 4.0",best:true},{id:"LINZ_NZ_Topo50_Gridless_Maps",name:"LINZ NZ Topo50 Gridless Maps",type:"tms",template:"https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/layer=2343/EPSG:3857/{zoom}/{x}/{y}.png",zoomExtent:[0,21],polygon:[[[167.25037,-47.21957],[167.24487,-47.28016],[167.50305,-47.37975],[168.25012,-47.1561],[168.74451,-46.7963],[169.32678,-46.75492],[169.78271,-46.60417],[170.42542,-46.11133],[170.80444,-45.95115],[170.95276,-45.44086],[171.30981,-44.91036],[171.40869,-44.39062],[172.56226,-43.92955],[172.90283,-43.9691],[173.16101,-43.90977],[173.25989,-43.69568],[172.97424,-43.5366],[172.76001,-43.37711],[173.15002,-43.17714],[173.70483,-42.63396],[174.36401,-41.7836],[174.32007,-41.40978],[174.84741,-41.52914],[175.07263,-41.70573],[175.50659,-41.67291],[176.2262,-41.10833],[176.83044,-40.42604],[177.17102,-39.67337],[177.03918,-39.39375],[177.44568,-39.18118],[177.60498,-39.33005],[177.97852,-39.36828],[178.33557,-38.65978],[178.70911,-37.74466],[178.62671,-37.54458],[178.3136,-37.43125],[177.62146,-37.37889],[177.03918,-37.39635],[176.56128,-37.37016],[176.33606,-37.05956],[176.00647,-36.29742],[175.67688,-36.05354],[174.67163,-35.1783],[173.19397,-34.28445],[172.67761,-34.23451],[172.38647,-34.40238],[172.47986,-34.71904],[172.98523,-35.32185],[173.56201,-36.14231],[174.30908,-37.07709],[174.55627,-38.05242],[174.47937,-38.65549],[174.32556,-38.86537],[173.79822,-38.95941],[173.60596,-39.23225],[173.69934,-39.56335],[174.58923,-39.95607],[174.98474,-40.21664],[174.98474,-40.49292],[174.72107,-40.80549],[174.14978,-40.65147],[173.28186,-40.4344],[172.58972,-40.35073],[172.08435,-40.53468],[171.76575,-40.82628],[171.57349,-41.39742],[171.28235,-41.65239],[170.87585,-42.53284],[170.354,-42.87194],[168.27759,-43.92955],[167.6239,-44.47691],[166.55273,-45.38688],[166.27258,-45.91677],[166.48132,-46.22545],[167.67883,-46.47192],[167.25037,-47.21957]]],terms_url:"https://data.linz.govt.nz/layer/2343-nz-mainland-topo50-gridless-maps",terms_text:"CC BY 4.0 Land Information New Zealand"},{id:"ORT10LT",name:"Lithuania - NŽT ORT10LT",type:"tms",template:"https://ort10lt.openmap.lt/g16/{zoom}/{x}/{y}.jpeg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[4,18],polygon:[[[26.21384,55.85075],[26.38583,55.70453],[26.63036,55.68067],[26.62053,55.56892],[26.52422,55.50992],[26.55415,55.38883],[26.43993,55.34794],[26.79197,55.3212],[26.82913,55.27635],[26.74346,55.25399],[26.67648,55.15883],[26.46112,55.12856],[26.35774,55.15054],[26.22963,55.10732],[26.27138,55.07759],[26.20851,54.99741],[26.06191,54.94161],[25.85782,54.9276],[25.74298,54.81506],[25.76261,54.5769],[25.53194,54.34182],[25.67716,54.32381],[25.78573,54.23362],[25.78588,54.15506],[25.55508,54.14619],[25.51095,54.17503],[25.58967,54.22858],[25.51362,54.30785],[25.26893,54.27447],[25.0706,54.13363],[24.95737,54.17206],[24.81338,54.14486],[24.77902,54.09991],[24.87128,54.0349],[24.81957,53.99772],[24.68459,53.96211],[24.69787,54.01714],[24.62591,54.0105],[24.43426,53.90144],[24.35206,53.89679],[24.20161,53.97001],[23.96833,53.9267],[23.91302,53.96968],[23.77812,53.89892],[23.70977,53.93945],[23.53704,53.94307],[23.48224,53.98938],[23.52734,54.04735],[23.48586,54.15323],[23.38679,54.22484],[23.04212,54.31597],[23.01021,54.3828],[22.85469,54.4104],[22.792,54.36332],[22.70234,54.4529],[22.68386,54.58597],[22.74897,54.63198],[22.74297,54.72682],[22.88668,54.8135],[22.8204,54.91198],[22.6424,54.97134],[22.58924,55.07024],[22.0806,55.02448],[22.03241,55.0841],[21.91307,55.08168],[21.64919,55.18081],[21.50151,55.18682],[21.38437,55.2937],[21.27098,55.24501],[21.09836,55.25639],[20.94217,55.28245],[21.08635,55.56183],[21.03995,55.83636],[21.06403,56.06995],[21.20478,56.08117],[21.2308,56.16233],[21.5021,56.2955],[21.72359,56.31382],[21.83566,56.37162],[21.96954,56.37665],[22.0153,56.42428],[22.43727,56.4064],[22.68,56.35159],[22.91917,56.37902],[22.94668,56.41465],[23.09325,56.30464],[23.17034,56.36677],[23.30645,56.38305],[23.55717,56.33382],[23.7648,56.37332],[23.76669,56.32381],[24.019,56.32976],[24.12146,56.2489],[24.28574,56.30064],[24.45415,56.25816],[24.57947,56.28824],[24.62841,56.37533],[24.90238,56.48053],[25.12774,56.20591],[25.57714,56.18241],[25.67312,56.14937],[26.21384,55.85075]]],terms_url:"https://www.geoportal.lt",terms_text:"NŽT ORT10LT",best:true},{id:"mapbox_locator_overlay",name:"Locator Overlay",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/openstreetmap.map-inh76ba2/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",zoomExtent:[0,16],overzoom:false,terms_url:"https://www.mapbox.com/about/maps",terms_text:"Terms & Feedback","default":true,description:"Shows major features to help orient you.",overlay:true},{id:"Lodz-buildings",name:"Łódź: Buildings",type:"wms",template:"http://gis.mapa.lodz.pl/awiskts/services/WMS_publikowane/LODZ/MapServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Budynki,Ulice,Adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Lodz-2015",name:"Łódź: Orthophotomap 2015 (aerial image)",type:"wms",template:"http://gis.mapa.lodz.pl/awiskts/services/Ortofotomapa/Ortofotomapa/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Lodz-2017",name:"Łódź: Orthophotomap 2017 (aerial image)",type:"wms",template:"https://mapa.lodz.pl/3/services/OGC/Ortofotomapa/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Loire_Atlantique-Orthophotos-2012",name:"Loire-Atlantique - Orthophotos 2012 - 20 cm",type:"tms",template:"http://{switch:a,b,c,d,e,f,g,h}.tiles.cg44.makina-corpus.net/ortho-2012/{zoom}/{x}/{-y}.jpg",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-1.48638,46.87691],[-1.54437,46.84873],[-1.73468,46.87246],[-1.89276,46.94234],[-1.95475,46.98084],[-2.07067,47.08521],[-2.2678,47.12656],[-2.22627,47.17124],[-2.19217,47.16914],[-2.19341,47.25546],[-2.29694,47.22769],[-2.41658,47.25336],[-2.54862,47.28575],[-2.63913,47.41678],[-2.50573,47.50812],[-2.31063,47.53021],[-2.24836,47.52384],[-2.23223,47.51499],[-2.12109,47.54674],[-2.11783,47.60126],[-2.1001,47.61123],[-2.09981,47.62005],[-2.11141,47.62873],[-2.10055,47.65141],[-2.08121,47.66578],[-1.98016,47.70751],[-1.83077,47.72419],[-1.67455,47.72544],[-1.63735,47.77463],[-1.49601,47.81752],[-1.49911,47.84166],[-1.38133,47.84415],[-1.346,47.81086],[-1.23007,47.78587],[-1.21643,47.75838],[-1.22635,47.73628],[-1.21086,47.7317],[-1.18668,47.73462],[-1.15196,47.69332],[-1.13151,47.63654],[-1.09121,47.6332],[-0.99265,47.6027],[-0.98459,47.58598],[-1.0317,47.55001],[-1.13585,47.55628],[-1.13275,47.5161],[-1.0317,47.51778],[-0.94863,47.50103],[-0.93686,47.47715],[-0.93376,47.43859],[-0.9009,47.39874],[-0.92694,47.37482],[-0.97157,47.35845],[-1.28339,47.32736],[-1.23379,47.26093],[-1.20032,47.26935],[-1.16498,47.24957],[-1.14143,47.1763],[-1.1563,47.15818],[-1.20652,47.12402],[-1.20838,47.10968],[-1.15568,47.10504],[-1.14081,47.08056],[-1.09431,47.0717],[-1.09989,47.03199],[-1.14453,47.01636],[-1.21582,47.02904],[-1.26727,47.06325],[-1.28524,47.02185],[-1.34972,47.02397],[-1.33918,46.969],[-1.3491,46.94446],[-1.45014,46.91186],[-1.47504,46.9176],[-1.48775,46.93063],[-1.49235,46.98433],[-1.48644,46.99943],[-1.49213,47.02722],[-1.52764,47.00541],[-1.52961,46.97252],[-1.50507,46.94439],[-1.50222,46.92973],[-1.51142,46.91371],[-1.48622,46.89724],[-1.48638,46.87691]]],terms_url:"http://data2.loire-atlantique.fr/licences/",terms_text:"Département de Loire-Atlantique"},{id:"Loire_Atlantique-Orthophotos-2016",name:"Loire-Atlantique - Orthophotos 2016 - 10 cm",type:"wms",template:"https://wms-vuduciel2.makina-corpus.net/geoserver/wms?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=cg44:ortho44-2016&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-1.48638,46.87691],[-1.54437,46.84873],[-1.73468,46.87246],[-1.89276,46.94234],[-1.95475,46.98084],[-2.07067,47.08521],[-2.2678,47.12656],[-2.22627,47.17124],[-2.19217,47.16914],[-2.19341,47.25546],[-2.29694,47.22769],[-2.41658,47.25336],[-2.54862,47.28575],[-2.63913,47.41678],[-2.50573,47.50812],[-2.31063,47.53021],[-2.24836,47.52384],[-2.23223,47.51499],[-2.12109,47.54674],[-2.11783,47.60126],[-2.1001,47.61123],[-2.09981,47.62005],[-2.11141,47.62873],[-2.10055,47.65141],[-2.08121,47.66578],[-1.98016,47.70751],[-1.83077,47.72419],[-1.67455,47.72544],[-1.63735,47.77463],[-1.49601,47.81752],[-1.49911,47.84166],[-1.38133,47.84415],[-1.346,47.81086],[-1.23007,47.78587],[-1.21643,47.75838],[-1.22635,47.73628],[-1.21086,47.7317],[-1.18668,47.73462],[-1.15196,47.69332],[-1.13151,47.63654],[-1.09121,47.6332],[-0.99265,47.6027],[-0.98459,47.58598],[-1.0317,47.55001],[-1.13585,47.55628],[-1.13275,47.5161],[-1.0317,47.51778],[-0.94863,47.50103],[-0.93686,47.47715],[-0.93376,47.43859],[-0.9009,47.39874],[-0.92694,47.37482],[-0.97157,47.35845],[-1.28339,47.32736],[-1.23379,47.26093],[-1.20032,47.26935],[-1.16498,47.24957],[-1.14143,47.1763],[-1.1563,47.15818],[-1.20652,47.12402],[-1.20838,47.10968],[-1.15568,47.10504],[-1.14081,47.08056],[-1.09431,47.0717],[-1.09989,47.03199],[-1.14453,47.01636],[-1.21582,47.02904],[-1.26727,47.06325],[-1.28524,47.02185],[-1.34972,47.02397],[-1.33918,46.969],[-1.3491,46.94446],[-1.45014,46.91186],[-1.47504,46.9176],[-1.48775,46.93063],[-1.49235,46.98433],[-1.48644,46.99943],[-1.49213,47.02722],[-1.52764,47.00541],[-1.52961,46.97252],[-1.50507,46.94439],[-1.50222,46.92973],[-1.51142,46.91371],[-1.48622,46.89724],[-1.48638,46.87691]]],terms_url:"http://data2.loire-atlantique.fr/licences/",terms_text:"© Loire-Atlantique ouverture des données publiques"},{id:"Lombardia-Italy-CTR-DBT",name:"Lombardia - Italy (CTR DBT)",type:"wms",template:"https://www.cartografia.servizirl.it/arcgis/services/wms/ctr_wms/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Sfondo%20C.T.R.%2010000&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4816,45.28938],[8.63085,45.01372],[8.78009,44.98189],[8.86775,45.02712],[9.07148,44.80063],[9.14966,44.79055],[9.19467,44.67106],[9.31549,44.65758],[9.36997,44.698],[9.37945,44.82752],[9.33207,44.91483],[9.41025,45.03716],[9.78692,45.04386],[9.78692,45.00032],[9.93853,45.002],[9.93379,45.08903],[10.00013,45.09071],[10.00013,44.99697],[10.20149,45.002],[10.20149,44.95004],[10.40523,44.9534],[10.40523,44.90476],[10.49288,44.90308],[10.49288,44.8628],[10.6516,44.85776],[10.64686,44.90308],[11.35282,44.89469],[11.35519,44.93663],[11.45706,44.93328],[11.44758,44.97351],[11.3623,45.00032],[11.35282,45.09238],[11.25806,45.09572],[11.25806,45.13752],[11.16094,45.14253],[11.16094,45.18262],[11.05196,45.19097],[11.05196,45.23436],[10.9572,45.23269],[10.9572,45.28605],[10.8577,45.28438],[10.85534,45.32271],[10.74636,45.32937],[10.75347,45.47408],[10.64686,45.48073],[10.60301,45.51074],[10.57636,45.47379],[10.53549,45.50036],[10.59116,45.53148],[10.61666,45.61304],[10.87429,45.84001],[10.82217,45.85982],[10.67529,45.85817],[10.57342,45.8103],[10.58624,46.00773],[10.5016,46.01596],[10.59325,46.11529],[10.60896,46.35583],[10.65634,46.38688],[10.64686,46.46037],[10.4147,46.57285],[10.32705,46.56797],[10.25124,46.65422],[10.07357,46.62494],[10.02382,46.53212],[10.02855,46.43588],[10.07357,46.39832],[10.12095,46.39669],[10.0783,46.32802],[10.14464,46.26582],[10.10436,46.24781],[9.97407,46.40812],[9.71111,46.3689],[9.68742,46.32312],[9.61872,46.30675],[9.55712,46.32475],[9.50264,46.39015],[9.47895,46.5256],[9.25626,46.51582],[9.22546,46.44078],[9.27284,46.34438],[9.17098,46.19044],[9.04305,46.12808],[9.062,46.09195],[8.97435,46.04593],[8.98856,46.00152],[8.93882,45.97354],[9.04068,45.8961],[9.01936,45.84827],[8.84879,46.0081],[8.89854,46.07059],[8.8251,46.11823],[8.70902,46.11659],[8.67823,46.07552],[8.7185,46.01468],[8.55504,45.90434],[8.59768,45.83836],[8.53372,45.79378],[8.6877,45.49235],[8.78009,45.41591],[8.68533,45.37931],[8.71139,45.34103],[8.69481,45.32104],[8.62848,45.37765],[8.5124,45.35768],[8.4816,45.28938]]],terms_url:"https://www.dati.gov.it/content/italian-open-data-license-v20",terms_text:"CTR DBT 10000 Regione Lombardia"},{id:"Lombardia-Italy-CTR",name:"Lombardia - Italy (CTR)",type:"wms",template:"https://www.cartografia.regione.lombardia.it/ArcGIS10/services/wms/ctr_wms/MapServer/WMSServer?STYLES=&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4816,45.28938],[8.63085,45.01372],[8.78009,44.98189],[8.86775,45.02712],[9.07148,44.80063],[9.14966,44.79055],[9.19467,44.67106],[9.31549,44.65758],[9.36997,44.698],[9.37945,44.82752],[9.33207,44.91483],[9.41025,45.03716],[9.78692,45.04386],[9.78692,45.00032],[9.93853,45.002],[9.93379,45.08903],[10.00013,45.09071],[10.00013,44.99697],[10.20149,45.002],[10.20149,44.95004],[10.40523,44.9534],[10.40523,44.90476],[10.49288,44.90308],[10.49288,44.8628],[10.6516,44.85776],[10.64686,44.90308],[11.35282,44.89469],[11.35519,44.93663],[11.45706,44.93328],[11.44758,44.97351],[11.3623,45.00032],[11.35282,45.09238],[11.25806,45.09572],[11.25806,45.13752],[11.16094,45.14253],[11.16094,45.18262],[11.05196,45.19097],[11.05196,45.23436],[10.9572,45.23269],[10.9572,45.28605],[10.8577,45.28438],[10.85534,45.32271],[10.74636,45.32937],[10.75347,45.47408],[10.64686,45.48073],[10.60301,45.51074],[10.57636,45.47379],[10.53549,45.50036],[10.59116,45.53148],[10.61666,45.61304],[10.87429,45.84001],[10.82217,45.85982],[10.67529,45.85817],[10.57342,45.8103],[10.58624,46.00773],[10.5016,46.01596],[10.59325,46.11529],[10.60896,46.35583],[10.65634,46.38688],[10.64686,46.46037],[10.4147,46.57285],[10.32705,46.56797],[10.25124,46.65422],[10.07357,46.62494],[10.02382,46.53212],[10.02855,46.43588],[10.07357,46.39832],[10.12095,46.39669],[10.0783,46.32802],[10.14464,46.26582],[10.10436,46.24781],[9.97407,46.40812],[9.71111,46.3689],[9.68742,46.32312],[9.61872,46.30675],[9.55712,46.32475],[9.50264,46.39015],[9.47895,46.5256],[9.25626,46.51582],[9.22546,46.44078],[9.27284,46.34438],[9.17098,46.19044],[9.04305,46.12808],[9.062,46.09195],[8.97435,46.04593],[8.98856,46.00152],[8.93882,45.97354],[9.04068,45.8961],[9.01936,45.84827],[8.84879,46.0081],[8.89854,46.07059],[8.8251,46.11823],[8.70902,46.11659],[8.67823,46.07552],[8.7185,46.01468],[8.55504,45.90434],[8.59768,45.83836],[8.53372,45.79378],[8.6877,45.49235],[8.78009,45.41591],[8.68533,45.37931],[8.71139,45.34103],[8.69481,45.32104],[8.62848,45.37765],[8.5124,45.35768],[8.4816,45.28938]]],terms_url:"https://www.dati.gov.it/content/italian-open-data-license-v20",terms_text:"Regione Lombardia - Infrastruttura per l'informazione territoriale"},{id:"londrina2011",name:"Londrina Ortofoto 2011",type:"tms",template:"https://siglon.londrina.pr.gov.br/arcgis/rest/services/Imagens/Ortofotos_2011_Paranacidade/MapServer/WMTS/tile/1.0.0/Imagens_Ortofotos_2011_Paranacidade/default/GoogleMapsCompatible/{zoom}/{y}/{x}",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-51.10903,-23.39275],[-51.11015,-23.39112],[-51.11198,-23.3896],[-51.11358,-23.38977],[-51.121,-23.38593],[-51.12225,-23.38511],[-51.12483,-23.3835],[-51.12538,-23.38187],[-51.12482,-23.3777],[-51.12446,-23.37505],[-51.12437,-23.3723],[-51.12244,-23.37033],[-51.12302,-23.36643],[-51.12856,-23.36548],[-51.12832,-23.35884],[-51.12477,-23.35476],[-51.12703,-23.35091],[-51.12412,-23.3468],[-51.12025,-23.34781],[-51.11765,-23.33969],[-51.11265,-23.34129],[-51.1094,-23.33489],[-51.10756,-23.33409],[-51.10486,-23.33398],[-51.10253,-23.33419],[-51.09987,-23.33102],[-51.09801,-23.32936],[-51.09999,-23.32831],[-51.10323,-23.32532],[-51.10473,-23.32319],[-51.10466,-23.32129],[-51.10515,-23.31844],[-51.10636,-23.31575],[-51.10661,-23.31467],[-51.1105,-23.31167],[-51.11158,-23.30842],[-51.0995,-23.30947],[-51.0974,-23.30863],[-51.09512,-23.30745],[-51.09202,-23.30494],[-51.09036,-23.30371],[-51.09205,-23.29875],[-51.09269,-23.2975],[-51.09408,-23.29295],[-51.10074,-23.29332],[-51.10102,-23.28871],[-51.10068,-23.28837],[-51.10085,-23.28778],[-51.09938,-23.28664],[-51.09632,-23.27791],[-51.10285,-23.27302],[-51.10836,-23.27034],[-51.1131,-23.2684],[-51.1316,-23.26534],[-51.13188,-23.26201],[-51.13173,-23.25506],[-51.1329,-23.25468],[-51.13296,-23.25075],[-51.13474,-23.25127],[-51.13534,-23.25133],[-51.13517,-23.24359],[-51.13535,-23.24118],[-51.13752,-23.24219],[-51.13885,-23.2435],[-51.14109,-23.24521],[-51.14717,-23.24318],[-51.14761,-23.23828],[-51.14908,-23.23588],[-51.14977,-23.23681],[-51.15139,-23.23854],[-51.15289,-23.23884],[-51.15384,-23.23895],[-51.1582,-23.23814],[-51.16045,-23.23816],[-51.16035,-23.24658],[-51.15912,-23.24783],[-51.16131,-23.24777],[-51.16659,-23.24594],[-51.17193,-23.24582],[-51.17205,-23.24956],[-51.17424,-23.2484],[-51.17514,-23.24932],[-51.17686,-23.24816],[-51.17947,-23.25169],[-51.18135,-23.25381],[-51.18274,-23.25363],[-51.18379,-23.25326],[-51.18496,-23.2533],[-51.18627,-23.25215],[-51.18665,-23.24748],[-51.19118,-23.24914],[-51.19142,-23.25286],[-51.19369,-23.25278],[-51.19384,-23.26074],[-51.20097,-23.26055],[-51.20127,-23.2426],[-51.20994,-23.24278],[-51.2109,-23.26988],[-51.21969,-23.27222],[-51.22597,-23.27453],[-51.22934,-23.2786],[-51.23452,-23.2816],[-51.23498,-23.28325],[-51.23507,-23.28544],[-51.23371,-23.2859],[-51.23216,-23.28802],[-51.2287,-23.29229],[-51.2274,-23.2946],[-51.22679,-23.29548],[-51.2256,-23.29657],[-51.22393,-23.29721],[-51.22048,-23.30073],[-51.21864,-23.3013],[-51.21668,-23.30212],[-51.21424,-23.30441],[-51.21097,-23.30697],[-51.22328,-23.3183],[-51.22439,-23.31459],[-51.22521,-23.31289],[-51.22512,-23.31258],[-51.22521,-23.31251],[-51.22553,-23.31253],[-51.22595,-23.31239],[-51.22617,-23.31183],[-51.22936,-23.31489],[-51.22802,-23.31661],[-51.22789,-23.31902],[-51.22767,-23.32023],[-51.22723,-23.32151],[-51.22739,-23.32223],[-51.22725,-23.32285],[-51.23033,-23.32558],[-51.23046,-23.32671],[-51.22954,-23.32789],[-51.22916,-23.3305],[-51.22929,-23.33178],[-51.22681,-23.33447],[-51.22602,-23.33657],[-51.22473,-23.33839],[-51.2221,-23.34023],[-51.22257,-23.34196],[-51.22381,-23.34339],[-51.22384,-23.34531],[-51.22441,-23.347],[-51.22454,-23.34829],[-51.22404,-23.34968],[-51.22351,-23.35011],[-51.22382,-23.35077],[-51.22305,-23.35174],[-51.2226,-23.35296],[-51.22587,-23.35481],[-51.2265,-23.36706],[-51.22354,-23.36915],[-51.22367,-23.37968],[-51.22038,-23.38163],[-51.21647,-23.3817],[-51.21416,-23.37995],[-51.20928,-23.37395],[-51.20738,-23.36814],[-51.20629,-23.36723],[-51.20472,-23.36627],[-51.19823,-23.36668],[-51.19297,-23.36651],[-51.18986,-23.36544],[-51.18806,-23.36464],[-51.18718,-23.36453],[-51.1858,-23.36374],[-51.18304,-23.36359],[-51.18071,-23.36376],[-51.17907,-23.36158],[-51.17764,-23.35836],[-51.16684,-23.35626],[-51.16614,-23.35854],[-51.16476,-23.36039],[-51.16077,-23.35922],[-51.15983,-23.3666],[-51.16204,-23.36861],[-51.16276,-23.37416],[-51.15845,-23.3758],[-51.15505,-23.37631],[-51.15396,-23.37903],[-51.15299,-23.38105],[-51.15119,-23.38208],[-51.14917,-23.38251],[-51.14722,-23.38216],[-51.14518,-23.38259],[-51.1441,-23.38376],[-51.14512,-23.38808],[-51.1418,-23.3894],[-51.14031,-23.3888],[-51.14068,-23.39161],[-51.14127,-23.39354],[-51.14094,-23.39443],[-51.14046,-23.39536],[-51.13939,-23.3951],[-51.13739,-23.39315],[-51.13609,-23.3898],[-51.13429,-23.38976],[-51.13216,-23.39007],[-51.13172,-23.39286],[-51.12259,-23.38864],[-51.12228,-23.39166],[-51.11883,-23.39317],[-51.11568,-23.39335],[-51.10903,-23.39275]],[[-51.13829,-23.41601],[-51.13331,-23.41867],[-51.13209,-23.41644],[-51.13002,-23.41829],[-51.12869,-23.41901],[-51.12824,-23.42103],[-51.12696,-23.42186],[-51.12533,-23.42269],[-51.12445,-23.42097],[-51.12151,-23.42411],[-51.12063,-23.42327],[-51.11971,-23.42312],[-51.11977,-23.42157],[-51.1188,-23.42155],[-51.11643,-23.42084],[-51.11943,-23.41917],[-51.11787,-23.41678],[-51.11655,-23.41731],[-51.1157,-23.4157],[-51.11512,-23.41309],[-51.11908,-23.41111],[-51.1196,-23.4117],[-51.12052,-23.41489],[-51.12148,-23.41714],[-51.12309,-23.41863],[-51.12755,-23.41654],[-51.12803,-23.4174],[-51.1312,-23.41557],[-51.1308,-23.41477],[-51.13279,-23.41264],[-51.13522,-23.41106],[-51.13586,-23.41096],[-51.13682,-23.41119],[-51.13721,-23.41158],[-51.1373,-23.41324],[-51.13743,-23.41471],[-51.13829,-23.41601]],[[-51.18929,-23.61469],[-51.18869,-23.61385],[-51.18818,-23.61339],[-51.18731,-23.61302],[-51.18629,-23.61314],[-51.18402,-23.61396],[-51.18349,-23.61397],[-51.18183,-23.61284],[-51.1814,-23.61344],[-51.18063,-23.61314],[-51.18001,-23.61409],[-51.17866,-23.61329],[-51.18065,-23.6106],[-51.17972,-23.61018],[-51.18062,-23.60849],[-51.18212,-23.6085],[-51.18261,-23.60775],[-51.1832,-23.60804],[-51.18415,-23.60628],[-51.18511,-23.60666],[-51.18649,-23.6047],[-51.18902,-23.6061],[-51.18821,-23.60742],[-51.18919,-23.60802],[-51.1889,-23.60953],[-51.18962,-23.60993],[-51.19119,-23.61119],[-51.19015,-23.61245],[-51.19054,-23.61276],[-51.19029,-23.61378],[-51.18929,-23.61469]],[[-51.08006,-23.52984],[-51.07962,-23.52205],[-51.08468,-23.52194],[-51.08582,-23.52404],[-51.08589,-23.52704],[-51.08579,-23.52777],[-51.0853,-23.52806],[-51.08514,-23.52857],[-51.08512,-23.52982],[-51.08471,-23.53024],[-51.08343,-23.53024],[-51.0833,-23.52978],[-51.08006,-23.52984]]],terms_url:"http://siglon.londrina.pr.gov.br",terms_text:"Prefeitura do Londrinas, PR"},{id:"LPI_NSW_Administrative_Boundaries_County",name:"LPI NSW Administrative Boundaries County",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=4&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_LGA",name:"LPI NSW Administrative Boundaries LGA",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=6&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_NPWS_Reserve",name:"LPI NSW Administrative Boundaries NPWS Reserve",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=1&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_Parish",name:"LPI NSW Administrative Boundaries Parish",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=3&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_StateForest",name:"LPI NSW Administrative Boundaries State Forest",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=2&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_Suburb",name:"LPI NSW Administrative Boundaries Suburb",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=7&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"NSW_LPI_BaseMap",name:"LPI NSW Base Map",type:"tms",template:"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Base_Map/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,19],polygon:[[[140.99486,-28.95297],[148.96114,-28.89977],[148.98701,-28.48623],[151.01361,-28.47865],[151.10847,-28.70329],[151.87599,-28.68312],[151.93348,-28.40788],[152.25544,-28.23327],[153.06608,-28.21047],[153.14082,-28.1091],[153.47351,-28.11648],[153.35765,-27.69361],[159.49383,-27.69925],[159.4857,-37.84741],[149.52569,-37.82815],[149.91596,-37.487],[148.04859,-36.81317],[147.9681,-36.15679],[146.71477,-36.28666],[145.30046,-36.15679],[144.53007,-36.14751],[142.8398,-35.02543],[142.35686,-34.78025],[141.97741,-34.40162],[140.99503,-34.13718],[140.99486,-28.95297]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017"},{id:"NSW_LPI_Imagery",name:"LPI NSW Imagery",type:"tms",template:"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Imagery/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,21],polygon:[[[140.98687,-28.98878],[148.99515,-28.97275],[148.99667,-28.49151],[151.0029,-28.49307],[151.0029,-28.72617],[151.49151,-28.73239],[151.49187,-28.71553],[151.92282,-28.71964],[151.92516,-28.48971],[151.99559,-28.48987],[151.99899,-28.11927],[152.49676,-28.12209],[152.49682,-28.11464],[153.00446,-28.11544],[153.00446,-28.1204],[153.50386,-28.11934],[153.50393,-28.12271],[153.59194,-28.12236],[153.59266,-28.17769],[153.61112,-28.17579],[153.61139,-28.18252],[153.74268,-28.21621],[153.77873,-28.71091],[152.6238,-32.58772],[152.3124,-32.63288],[151.41419,-33.57904],[150.89299,-35.26487],[150.46207,-35.77773],[150.01565,-37.51036],[149.99181,-37.51268],[149.51978,-37.51307],[149.51996,-37.52169],[149.4463,-37.53537],[149.06334,-37.5358],[148.98366,-37.52176],[148.98169,-37.5192],[148.98638,-37.2585],[148.48754,-37.26585],[148.48248,-37.00927],[147.99439,-37.01434],[147.98829,-36.53322],[147.95297,-36.52607],[147.94865,-36.0686],[147.5035,-36.07168],[147.50477,-36.2651],[146.492,-36.26613],[146.49225,-36.2565],[145.99298,-36.25343],[145.99659,-36.01881],[145.98316,-36.01871],[145.96245,-36.0219],[145.94624,-36.01209],[145.94543,-36.00603],[145.50415,-36.00136],[145.50379,-36.01091],[145.0072,-36.00362],[145.00354,-36.15204],[144.48608,-36.14231],[144.48741,-36.01375],[143.98747,-36.00241],[143.99329,-35.57238],[143.49717,-35.58371],[143.4918,-35.40656],[143.46134,-35.36749],[143.45856,-35.35559],[143.48978,-35.33965],[143.48955,-35.33221],[143.4317,-35.25706],[143.25055,-35.26066],[143.24384,-35.01327],[142.99333,-35.01772],[142.99198,-34.79619],[142.49714,-34.80323],[142.49732,-34.80076],[142.42114,-34.80176],[142.42092,-34.78383],[142.23309,-34.78592],[142.23077,-34.78075],[142.227,-34.50613],[141.99753,-34.50837],[141.9946,-34.25267],[141.49823,-34.25569],[141.49817,-34.25228],[140.99454,-34.25284],[140.98687,-28.98878]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",best:true},{id:"NSW_LPI_Imagery_Dates",name:"LPI NSW Imagery Dates",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Imagery_Dates/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=0&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[0,21],polygon:[[[140.98687,-28.98878],[148.99515,-28.97275],[148.99667,-28.49151],[151.0029,-28.49307],[151.0029,-28.72617],[151.49151,-28.73239],[151.49187,-28.71553],[151.92282,-28.71964],[151.92516,-28.48971],[151.99559,-28.48987],[151.99899,-28.11927],[152.49676,-28.12209],[152.49682,-28.11464],[153.00446,-28.11544],[153.00446,-28.1204],[153.50386,-28.11934],[153.50393,-28.12271],[153.59194,-28.12236],[153.59266,-28.17769],[153.61112,-28.17579],[153.61139,-28.18252],[153.74268,-28.21621],[153.77873,-28.71091],[152.6238,-32.58772],[152.3124,-32.63288],[151.41419,-33.57904],[150.89299,-35.26487],[150.46207,-35.77773],[150.01565,-37.51036],[149.99181,-37.51268],[149.51978,-37.51307],[149.51996,-37.52169],[149.4463,-37.53537],[149.06334,-37.5358],[148.98366,-37.52176],[148.98169,-37.5192],[148.98638,-37.2585],[148.48754,-37.26585],[148.48248,-37.00927],[147.99439,-37.01434],[147.98829,-36.53322],[147.95297,-36.52607],[147.94865,-36.0686],[147.5035,-36.07168],[147.50477,-36.2651],[146.492,-36.26613],[146.49225,-36.2565],[145.99298,-36.25343],[145.99659,-36.01881],[145.98316,-36.01871],[145.96245,-36.0219],[145.94624,-36.01209],[145.94543,-36.00603],[145.50415,-36.00136],[145.50379,-36.01091],[145.0072,-36.00362],[145.00354,-36.15204],[144.48608,-36.14231],[144.48741,-36.01375],[143.98747,-36.00241],[143.99329,-35.57238],[143.49717,-35.58371],[143.4918,-35.40656],[143.46134,-35.36749],[143.45856,-35.35559],[143.48978,-35.33965],[143.48955,-35.33221],[143.4317,-35.25706],[143.25055,-35.26066],[143.24384,-35.01327],[142.99333,-35.01772],[142.99198,-34.79619],[142.49714,-34.80323],[142.49732,-34.80076],[142.42114,-34.80176],[142.42092,-34.78383],[142.23309,-34.78592],[142.23077,-34.78075],[142.227,-34.50613],[141.99753,-34.50837],[141.9946,-34.25267],[141.49823,-34.25569],[141.49817,-34.25228],[140.99454,-34.25284],[140.98687,-28.98878]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"NSW_LPI_TopographicMap",name:"LPI NSW Topographic Map",type:"tms",template:"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Topo_Map/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,16],polygon:[[[140.99884,-28.99924],[148.95024,-28.99937],[148.94988,-28.96653],[148.99983,-28.96653],[149.00009,-28.81658],[149.10007,-28.81658],[149.0997,-28.74885],[148.99985,-28.74974],[148.99982,-28.50003],[151.00005,-28.50052],[151.00059,-28.73258],[151.02395,-28.73274],[151.02413,-28.74188],[151.03293,-28.74188],[151.03383,-28.75054],[151.99998,-28.74953],[151.99998,-28.71645],[152.0334,-28.71661],[152.03322,-28.6832],[152.00007,-28.68335],[151.99988,-28.64163],[151.98299,-28.64139],[151.98317,-28.62491],[151.93313,-28.62475],[151.93341,-28.50007],[151.99989,-28.50023],[151.99986,-28.37496],[152.24997,-28.37507],[152.24994,-28.25001],[152.99972,-28.24986],[152.9999,-28.28324],[153.1165,-28.2834],[153.11659,-28.24986],[153.16663,-28.25001],[153.16672,-28.23316],[153.24999,-28.23324],[153.25003,-28.12497],[153.62496,-28.12508],[153.62484,-28.49991],[153.7498,-28.49999],[153.74959,-28.7498],[153.62481,-28.75011],[153.62497,-28.99993],[153.49977,-29.00006],[153.49984,-29.49951],[153.3748,-29.50005],[153.37541,-29.87503],[153.49991,-29.87514],[153.49991,-30.00009],[153.24989,-29.99976],[153.25002,-30.19177],[153.27482,-30.19162],[153.27482,-30.21685],[153.21661,-30.21661],[153.21661,-30.25006],[153.25002,-30.25006],[153.24975,-30.37519],[153.12436,-30.37497],[153.12465,-30.62504],[153.03317,-30.62505],[153.03339,-30.87508],[153.12492,-30.87503],[153.12493,-31.12505],[153.00824,-31.12497],[153.00829,-31.24998],[153,-31.25],[152.99994,-31.62499],[152.87494,-31.62505],[152.87496,-31.74995],[152.78329,-31.75],[152.7832,-31.87486],[152.74991,-31.87501],[152.75004,-32.00002],[152.6249,-31.99994],[152.62491,-32.5],[152.49998,-32.49996],[152.50003,-32.56664],[152.41667,-32.56634],[152.41676,-32.625],[152.34985,-32.62499],[152.34985,-32.63323],[152.28308,-32.63322],[152.28326,-32.62498],[152.24948,-32.62498],[152.24981,-32.87491],[151.87457,-32.87504],[151.87485,-33.00001],[151.74977,-33.00015],[151.75047,-33.25004],[151.62524,-33.24974],[151.62508,-33.37516],[151.49958,-33.37514],[151.50031,-33.62494],[151.37415,-33.62437],[151.37279,-34.00196],[151.24778,-34.00112],[151.24778,-34.24931],[150.99573,-34.25015],[151.00081,-34.62483],[150.87174,-34.6265],[150.87276,-35.12427],[150.76706,-35.12344],[150.76909,-35.24638],[150.62579,-35.2497],[150.62803,-35.37515],[150.49997,-35.37515],[150.49591,-35.6275],[150.37192,-35.62503],[150.37497,-35.7538],[150.26724,-35.75132],[150.2652,-35.87412],[150.24792,-35.87083],[150.24589,-36.37488],[150.12292,-36.37488],[150.12597,-36.62243],[150.02535,-36.62407],[150.0284,-36.74713],[149.99283,-36.74958],[150.00401,-37.12245],[150.05889,-37.12731],[150.05686,-37.37809],[149.99791,-37.37324],[149.99994,-37.48301],[149.98774,-37.48462],[149.98571,-37.508],[148.06846,-36.80624],[147.99306,-36.138],[147.81483,-36.00556],[147.38939,-36.01137],[147.38221,-36.13103],[146.99725,-36.12755],[146.98863,-36.25283],[146.49564,-36.24471],[146.50426,-36.12639],[145.00118,-36.00795],[145.01541,-36.25421],[144.50725,-36.24765],[144.49912,-36.0211],[143.99654,-35.98105],[143.33826,-35.23318],[142.40976,-34.76694],[142.03614,-34.37588],[140.99652,-34.13858],[140.99884,-28.99924]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017"},{id:"orthophoto_lyon_2012",name:"Lyon Orthophoto 2012-03 10cm",type:"wms",template:"https://download.data.grandlyon.com/wms/grandlyon?language=fre&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1830_5150_10cm_CC46,1830_5155_10cm_CC46,1830_5160_10cm_CC46,1830_5165_10cm_CC46,1830_5170_10cm_CC46,1830_5175_10cm_CC46,1830_5180_10cm_CC46,1830_5185_10cm_CC46,1830_5190_10cm_CC46,1835_5150_10cm_CC46,1835_5155_10cm_CC46,1835_5160_10cm_CC46,1835_5165_10cm_CC46,1835_5170_10cm_CC46,1835_5175_10cm_CC46,1835_5180_10cm_CC46,1835_5185_10cm_CC46,1835_5190_10cm_CC46,1840_5150_10cm_CC46,1840_5155_10cm_CC46,1840_5160_10cm_CC46,1840_5165_10cm_CC46,1840_5170_10cm_CC46,1840_5175_10cm_CC46,1840_5180_10cm_CC46,1840_5185_10cm_CC46,1840_5190_10cm_CC46,1845_5150_10cm_CC46,1845_5155_10cm_CC46,1845_5160_10cm_CC46,1845_5165_10cm_CC46,1845_5170_10cm_CC46,1845_5175_10cm_CC46,1845_5180_10cm_CC46,1845_5185_10cm_CC46,1845_5190_10cm_CC46,1850_5155_10cm_CC46,1850_5160_10cm_CC46,1850_5165_10cm_CC46,1850_5170_10cm_CC46,1850_5175_10cm_CC46,1850_5180_10cm_CC46,1850_5185_10cm_CC46,1855_5155_10cm_CC46,1855_5165_10cm_CC46,1855_5170_10cm_CC46,1855_5175_10cm_CC46,1855_5180_10cm_CC46,1855_5185_10cm_CC46,1860_5155_10cm_CC46,1860_5160_10cm_CC46,1860_5165_10cm_CC46,1860_5170_10cm_CC46,1860_5175_10cm_CC46,1860_5180_10cm_CC46,1860_5185_10cm_CC46,1865_5155_10cm_CC46,1865_5160_10cm_CC46,1865_5165_10cm_CC46,1865_5170_10cm_CC46&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-03-01T00:00:00.000Z",startDate:"2012-03-01T00:00:00.000Z",polygon:[[[4.69049,45.54652],[4.83131,45.54652],[4.83131,45.57131],[4.88344,45.57131],[4.88344,45.59745],[5.16622,45.59745],[5.16622,45.74533],[5.10793,45.74533],[5.10793,45.88145],[4.90698,45.88145],[4.90698,45.92107],[4.84377,45.92107],[4.84377,45.94011],[4.71543,45.94011],[4.71543,45.87018],[4.67458,45.87018],[4.67458,45.7178],[4.69567,45.7178],[4.69049,45.54652]]],terms_url:"https://data.grandlyon.com/imagerie/orthophotographie-2012-du-grand-lyon",terms_text:"Grand Lyon Smart Data DSIT"},{id:"orthophoto_lyon_2015_8cm",name:"Lyon Orthophoto 2015-05 8cm",type:"wms",template:"https://download.data.grandlyon.com/wms/grandlyon?language=fre&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1835_5155_8cm_CC46,1835_5160_8cm_CC46,1835_5165_8cm_CC46,1835_5170_8cm_CC46,1835_5180_8cm_CC46,1835_5175_8cm_CC46,1845_5175_8cm_CC46,1845_5180_8cm_CC46,1845_5185_8cm_CC46,1845_5190_8cm_CC46,1850_5165_8cm_CC46,1850_5160_8cm_CC46,1850_5155_8cm_CC46,1850_5170_8cm_CC46,1850_5175_8cm_CC46,1850_5180_8cm_CC46,1850_5185_8cm_CC46,1855_5155_8cm_CC46,1855_5160_8cm_CC46,1855_5185_8cm_CC46,1855_5180_8cm_CC46,1855_5175_8cm_CC46,1855_5170_8cm_CC46,1855_5165_8cm_CC46,1860_5160_8cm_CC46,1860_5155_8cm_CC46,1860_5165_8cm_CC46,1835_5185_8cm_CC46,1835_5190_8cm_CC46,1835_5195_8cm_CC46,1840_5160_8cm_CC46,1840_5155_8cm_CC46,1840_5150_8cm_CC46,1830_5195_8cm_CC46,1830_5190_8cm_CC46,1830_5175_8cm_CC46,1830_5170_8cm_CC46,1830_5165_8cm_CC46,1830_5160_8cm_CC46,1830_5155_8cm_CC46,1830_5180_8cm_CC46,1830_5185_8cm_CC46,1835_5150_8cm_CC46,1860_5170_8cm_CC46,1860_5175_8cm_CC46,1840_5180_8cm_CC46,1840_5175_8cm_CC46,1840_5185_8cm_CC46,1840_5190_8cm_CC46,1840_5195_8cm_CC46,1845_5150_8cm_CC46,1845_5155_8cm_CC46,1845_5160_8cm_CC46,1845_5170_8cm_CC46,1845_5165_8cm_CC46,1840_5170_8cm_CC46,1840_5165_8cm_CC46,1860_5180_8cm_CC46,1860_5185_8cm_CC46,1865_5155_8cm_CC46,1865_5160_8cm_CC46,1865_5165_8cm_CC46,1865_5170_8cm_CC46,1830_5150_8cm_CC46&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-05-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",polygon:[[[4.66489,45.54688],[4.88253,45.54348],[4.88435,45.59745],[5.16623,45.59242],[5.17217,45.74532],[5.10793,45.74653],[5.11305,45.88145],[4.90698,45.88508],[4.90822,45.92106],[4.84377,45.92212],[4.84497,45.9581],[4.67729,45.96069],[4.66489,45.54688]]],terms_url:"https://data.grandlyon.com/imagerie/orthophotographie-2015-du-grand-lyon",terms_text:"Métropole de Lyon DINSI",best:true},{id:"MainRoadsWA_Road_Hierarchy",name:"Main Roads WA Road Hierarchy",type:"wms",template:"https://services.slip.wa.gov.au/public/services/SLIP_Public_Services/Transport/MapServer/WMSServer?LAYERS=8&TRANSPARENT=TRUE&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&FORMAT=image%2Fpng&SRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}",projection:"EPSG:3857",zoomExtent:[0,21],polygon:[[[129.00009,-31.68764],[128.99872,-14.58225],[127.08984,-12.29707],[124.76074,-12.98315],[121.24512,-15.70766],[119.0918,-17.60214],[115.53223,-18.85431],[112.41211,-20.46819],[111.24756,-22.83695],[111.00586,-25.62172],[111.64307,-29.66896],[111.68701,-32.3614],[112.14844,-34.47034],[113.35693,-36.10238],[116.98242,-36.70366],[119.44336,-36.94989],[122.27783,-36.61553],[125.99121,-35.40696],[127.59521,-34.57895],[128.86963,-33.59632],[129.00009,-31.68764]]],terms_url:"https://catalogue.data.wa.gov.au/dataset/clss-road-hierarchy",terms_text:"Main Roads Western Australia",overlay:true},{id:"mainzlatestaerialimagery",name:"Mainz latest aerial imagery",type:"wms",template:"https://gint.mainz.de/gint1-cgi/mapserv?map=/data/mapbender-int/umn-www/client/a62/luftbild.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Luftbild_f_mz_2018&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[17,22],polygon:[[[8.10355,49.865],[8.38356,49.865],[8.38356,50.0466],[8.10355,50.0466],[8.10355,49.865]]],terms_url:"https://www.mainz.de/vv/oe/100140100000035141.php#tab-infos",terms_text:"Vermessung und Geoinformation Mainz",icon:"https://www.mainz.de/configuration.inc.php.media/27432/Logo-72px.png"},{id:"major_isidoro",name:"Major Isidoro AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Major%20Isidoro&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.94048,-9.57588],[-36.94106,-9.48536],[-37.03215,-9.48606],[-37.03164,-9.57639],[-36.94048,-9.57588]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Mapbox",name:"Mapbox Satellite",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/mapbox.satellite/{zoom}/{x}/{y}@2x.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",tileSize:512,zoomExtent:[0,22],terms_url:"https://www.mapbox.com/about/maps",terms_text:"Terms & Feedback","default":true,description:"Satellite and aerial imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/MapBoxSatellite.png"},{id:"Maps4BW-LGL_BW",name:"Maps4BW (LGL-BW, www.lgl-bw.de)",type:"wms",template:"https://owsproxy.lgl-bw.de/owsproxy/ows/WMS_Maps4BW?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=webatlasde&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[9.06954,49.57679],[9.10577,49.57952],[9.16079,49.58263],[9.24212,49.58402],[9.27192,49.63515],[9.30454,49.65561],[9.36753,49.65893],[9.38253,49.64341],[9.41191,49.66033],[9.39602,49.67143],[9.41828,49.69706],[9.40378,49.71957],[9.37769,49.70357],[9.35828,49.70334],[9.29438,49.73958],[9.31467,49.76859],[9.42435,49.79099],[9.50417,49.78962],[9.51808,49.78214],[9.65623,49.79286],[9.65317,49.73944],[9.63435,49.70076],[9.67054,49.69515],[9.67721,49.71846],[9.71079,49.72918],[9.8014,49.73429],[9.83728,49.70237],[9.87656,49.61362],[9.83362,49.55607],[9.84954,49.54793],[9.87463,49.5836],[9.91419,49.58955],[9.93066,49.56097],[9.92482,49.48951],[10.01787,49.48673],[10.03352,49.52978],[10.06372,49.55129],[10.09052,49.54218],[10.12792,49.51192],[10.11027,49.49272],[10.16753,49.38589],[10.12627,49.3809],[10.14385,49.32772],[10.16061,49.27043],[10.13569,49.26189],[10.14311,49.20387],[10.25161,49.15031],[10.26279,49.12959],[10.26869,49.05202],[10.36527,49.02557],[10.45894,48.93581],[10.46208,48.83947],[10.42886,48.74973],[10.46648,48.73627],[10.49761,48.68581],[10.45007,48.66277],[10.3553,48.65068],[10.32297,48.68241],[10.26028,48.67842],[10.32542,48.60763],[10.31448,48.52323],[10.17973,48.45977],[10.12892,48.45301],[10.10938,48.47445],[10.06355,48.45381],[10.03918,48.45125],[10.04492,48.43158],[10.0152,48.40323],[9.98709,48.38565],[9.97328,48.37944],[9.97549,48.36558],[9.99071,48.3734],[10.00265,48.3632],[9.99992,48.35572],[10.06698,48.28172],[10.08111,48.2253],[10.11306,48.12632],[10.13966,48.11307],[10.14695,48.07455],[10.13763,48.01938],[10.11725,47.9755],[10.11359,47.93422],[10.10709,47.86711],[10.14174,47.80956],[10.0732,47.78686],[10.11825,47.76126],[10.14213,47.70165],[10.13262,47.67678],[10.07445,47.63472],[10.06303,47.66923],[10.00359,47.67526],[9.95808,47.64376],[9.84481,47.67533],[9.83488,47.66042],[9.74926,47.60206],[9.70817,47.60007],[9.65788,47.60599],[9.64742,47.58931],[9.61389,47.57809],[9.56602,47.53274],[9.51199,47.53246],[9.25717,47.65752],[9.18684,47.65697],[9.17591,47.65379],[9.17028,47.65474],[9.15555,47.666],[9.1494,47.66713],[9.13947,47.66367],[9.02005,47.68616],[8.94127,47.65569],[8.89825,47.64821],[8.88263,47.65327],[8.87474,47.6545],[8.87235,47.66971],[8.84949,47.68089],[8.84993,47.70233],[8.81816,47.71242],[8.80108,47.72811],[8.77231,47.71606],[8.81295,47.6959],[8.79373,47.67216],[8.7533,47.68997],[8.72575,47.6917],[8.71002,47.68829],[8.68937,47.69318],[8.67046,47.68235],[8.65783,47.68883],[8.66161,47.71454],[8.70596,47.71584],[8.70932,47.73275],[8.73033,47.75527],[8.72003,47.76273],[8.68871,47.75314],[8.67898,47.78306],[8.64981,47.79435],[8.65592,47.76948],[8.63132,47.75749],[8.61918,47.76216],[8.61351,47.78451],[8.61686,47.79705],[8.568,47.79977],[8.57611,47.79015],[8.57847,47.78102],[8.56315,47.77654],[8.48889,47.76458],[8.45742,47.74126],[8.4623,47.72909],[8.44929,47.71663],[8.41471,47.69991],[8.4273,47.68562],[8.41061,47.6743],[8.46839,47.6568],[8.52474,47.64677],[8.5269,47.66373],[8.56441,47.67261],[8.57853,47.66373],[8.60454,47.6751],[8.63333,47.65212],[8.62386,47.63922],[8.60395,47.63193],[8.61281,47.61327],[8.57951,47.59306],[8.5602,47.59867],[8.56765,47.61442],[8.53394,47.62984],[8.51208,47.61641],[8.46581,47.60137],[8.46631,47.58666],[8.48985,47.59139],[8.5,47.58062],[8.43414,47.5629],[8.39882,47.57559],[8.38525,47.56408],[8.32701,47.56893],[8.29483,47.59077],[8.2948,47.60497],[8.26293,47.60823],[8.22435,47.60446],[8.18644,47.60508],[8.16904,47.59394],[8.13615,47.58246],[8.10503,47.56795],[8.09873,47.55933],[8.08261,47.55624],[8.07095,47.56299],[8.0274,47.54931],[7.94632,47.54209],[7.90966,47.54825],[7.90676,47.5603],[7.88681,47.58765],[7.83987,47.58122],[7.79648,47.55517],[7.69208,47.53137],[7.66583,47.53403],[7.63159,47.56044],[7.63879,47.56619],[7.68607,47.57205],[7.65278,47.59418],[7.62247,47.57767],[7.60473,47.57822],[7.58771,47.59015],[7.52156,47.65161],[7.50399,47.70235],[7.52096,47.77685],[7.55712,47.84839],[7.54946,47.8792],[7.57461,47.93028],[7.61318,47.96804],[7.6119,47.9871],[7.56124,48.03836],[7.57491,48.1258],[7.59534,48.15977],[7.63305,48.19717],[7.66275,48.22473],[7.68466,48.30305],[7.76346,48.49158],[7.80046,48.5126],[7.79958,48.5878],[7.83409,48.64439],[7.91211,48.68899],[7.96723,48.75716],[8.02069,48.78879],[8.04302,48.7956],[8.08647,48.81306],[8.13644,48.89782],[8.19706,48.96021],[8.28161,48.9949],[8.29967,49.02597],[8.31243,49.05996],[8.38654,49.23497],[8.46083,49.28407],[8.48783,49.29326],[8.47577,49.3079],[8.44839,49.31693],[8.45152,49.33135],[8.46288,49.3869],[8.49407,49.40186],[8.49762,49.41583],[8.50721,49.43414],[8.49834,49.44187],[8.47977,49.44391],[8.46414,49.44151],[8.44696,49.44516],[8.43947,49.45214],[8.44407,49.46085],[8.45992,49.46498],[8.46312,49.47135],[8.4554,49.48107],[8.44184,49.49297],[8.41194,49.55852],[8.42193,49.5843],[8.44117,49.59081],[8.45482,49.59157],[8.47738,49.5874],[8.56161,49.52237],[8.61486,49.54175],[8.59165,49.59179],[8.58706,49.61156],[8.65189,49.6209],[8.69494,49.62762],[8.70105,49.59869],[8.68726,49.57096],[8.72597,49.53085],[8.78493,49.51775],[8.81467,49.53187],[8.88863,49.51091],[8.90168,49.50363],[8.90315,49.486],[8.87995,49.46561],[8.83117,49.42147],[8.80845,49.40981],[8.82075,49.39647],[8.83009,49.41316],[8.85107,49.39663],[8.90247,49.44632],[8.93863,49.48179],[8.95154,49.50562],[8.98498,49.51153],[9.03553,49.50079],[9.05731,49.532],[9.10023,49.52728],[9.11009,49.51213],[9.12424,49.51722],[9.11286,49.53337],[9.08284,49.54211],[9.06694,49.56433],[9.06954,49.57679]]],terms_url:"https://www.lgl-bw.de/",terms_text:"Datengrundlage: LGL, www.lgl-bw.de"},{id:"mar_vermelho_al",name:"Mar Vermelho AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Mar%20Vermelho&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.34201,-9.49289],[-36.3422,-9.47533],[-36.34275,-9.4029],[-36.34473,-9.4029],[-36.34537,-9.40279],[-36.34702,-9.40293],[-36.3508,-9.40291],[-36.359,-9.40307],[-36.36109,-9.403],[-36.36289,-9.40307],[-36.3659,-9.40305],[-36.36713,-9.40301],[-36.37571,-9.40307],[-36.38049,-9.40308],[-36.38663,-9.4032],[-36.38852,-9.40312],[-36.39286,-9.40325],[-36.39656,-9.40322],[-36.40309,-9.40327],[-36.41973,-9.40338],[-36.43368,-9.4034],[-36.43355,-9.41685],[-36.43344,-9.42386],[-36.43338,-9.43753],[-36.43329,-9.45012],[-36.433,-9.49359],[-36.40839,-9.4935],[-36.40442,-9.49354],[-36.40008,-9.49351],[-36.39787,-9.49342],[-36.39168,-9.49328],[-36.38757,-9.49331],[-36.38536,-9.49341],[-36.37673,-9.49331],[-36.37427,-9.49319],[-36.36707,-9.49299],[-36.36502,-9.493],[-36.36043,-9.49299],[-36.35955,-9.49295],[-36.35895,-9.49304],[-36.35703,-9.49294],[-36.35665,-9.493],[-36.3526,-9.493],[-36.34767,-9.49297],[-36.34201,-9.49289]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"MassGIS-L3-Parcels",name:"MassGIS L3 Parcels",type:"tms",template:"https://ags-proxy.openstreetmap.us/tiles/{zoom}/{x}/{y}?url=http%3A%2F%2Fgisprpxy.itd.state.ma.us%2Farcgisserver%2Frest%2Fservices%2FAGOL%2FL3Parcels_feature_service%2FMapServer%2F&transparent=true&layers=show%3A0",zoomExtent:[15,22],polygon:[[[-72.13569,42.03025],[-72.53156,42.03458],[-72.57278,42.03022],[-72.58216,42.02474],[-72.60717,42.02515],[-72.60797,42.03108],[-72.64019,42.03205],[-72.69933,42.03696],[-72.75714,42.03635],[-72.75868,42.02439],[-72.76572,42.02276],[-72.76673,42.00327],[-72.81705,41.99769],[-72.81378,42.03674],[-73.03678,42.03929],[-73.43281,42.05059],[-73.49688,42.04968],[-73.50814,42.08626],[-73.26496,42.74594],[-72.6872,42.73348],[-71.97286,42.71307],[-71.69663,42.70572],[-71.29464,42.69704],[-71.27894,42.71136],[-71.26787,42.72603],[-71.25526,42.73659],[-71.24598,42.74231],[-71.23732,42.74491],[-71.22391,42.74643],[-71.18181,42.73732],[-71.18617,42.79088],[-71.16667,42.80891],[-71.13277,42.82145],[-71.06442,42.80626],[-71.05395,42.83337],[-71.04483,42.84869],[-71.03128,42.85924],[-70.96702,42.86887],[-70.94967,42.87588],[-70.92973,42.88504],[-70.91465,42.88661],[-70.90348,42.88671],[-70.88566,42.88288],[-70.84776,42.86088],[-70.82963,42.86875],[-70.81567,42.87204],[-70.45842,42.67694],[-70.8759,42.35302],[-69.88713,42.0519],[-69.89537,41.21643],[-70.81959,41.23192],[-71.09996,41.43386],[-71.12047,41.49717],[-71.13131,41.59231],[-71.14059,41.6051],[-71.14047,41.62389],[-71.13569,41.6284],[-71.13291,41.6601],[-71.17605,41.6681],[-71.17588,41.67154],[-71.1954,41.67514],[-71.26139,41.7523],[-71.32885,41.7811],[-71.33407,41.79455],[-71.34156,41.79817],[-71.33914,41.80842],[-71.3472,41.8231],[-71.3449,41.828],[-71.3352,41.8355],[-71.3422,41.8448],[-71.33392,41.86229],[-71.34086,41.87872],[-71.33865,41.89865],[-71.38174,41.8932],[-71.38127,42.01885],[-71.49744,42.01725],[-71.52888,42.01499],[-71.79925,42.00807],[-71.80067,42.02351],[-72.0635,42.02735],[-72.13569,42.03025]]],overlay:true},{id:"geodata.md.gov-MD_SixInchImagery",name:"MD Latest 6 Inch Aerial Imagery",type:"wms",template:"https://geodata.md.gov/imap/services/Imagery/MD_SixInchImagery/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=MD_SixInchImagery&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-76.23413,37.92037],[-76.59805,38.15832],[-76.94,38.27053],[-77.03819,38.41379],[-77.23526,38.33627],[-77.31216,38.41056],[-77.26273,38.56642],[-77.043,38.71338],[-77.04987,38.7937],[-76.92627,38.8925],[-77.04094,38.9845],[-77.12162,38.92523],[-77.15012,38.95514],[-77.25243,38.97543],[-77.25929,39.02425],[-77.34581,39.05492],[-77.46185,39.07038],[-77.53738,39.13965],[-77.47421,39.22481],[-77.57275,39.30428],[-77.72347,39.32899],[-77.77702,39.46323],[-77.86148,39.51622],[-77.84088,39.60886],[-77.95624,39.59299],[-78.16635,39.69556],[-78.27003,39.62156],[-78.3387,39.64007],[-78.46641,39.52364],[-78.6628,39.54006],[-78.79875,39.60622],[-78.9814,39.4468],[-79.06723,39.47649],[-79.48505,39.19954],[-79.48557,39.72158],[-75.78836,39.72181],[-75.69099,38.46058],[-75.04924,38.45816],[-75.04984,38.40222],[-75.08151,38.32321],[-75.09773,38.30907],[-75.187,38.09755],[-75.23798,38.0224],[-75.61821,37.98967],[-75.86369,37.90953],[-76.23413,37.92037]]],terms_url:"http://imap.maryland.gov/Pages/imagery-products.aspx",terms_text:"DoIT, MD iMap, MDP",description:"Six Inch resolution aerial imagery for the State of Maryland"},{id:"geodata.md.gov-MD_ThreeInchImagery",name:"MD Three Inch Aerial Imagery",type:"wms",template:"https://geodata.md.gov/imap/services/Imagery/MD_ThreeInchImagery/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=MD_ThreeInchImagery&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[-76.46299,38.9808],[-76.46326,38.94779],[-76.49499,38.9369],[-76.51617,38.93697],[-76.54763,38.9591],[-76.54745,38.98667],[-76.51559,39.00306],[-76.4839,39.00292],[-76.46299,38.9808]],[[-76.09548,38.84133],[-76.0428,38.8409],[-76.04289,38.8298],[-76.03229,38.8297],[-76.03277,38.79667],[-76.02545,38.79664],[-76.02541,38.77462],[-76.03308,38.77472],[-76.03366,38.73073],[-76.05462,38.73094],[-76.0548,38.72005],[-76.10753,38.72043],[-76.10714,38.75338],[-76.11754,38.75346],[-76.11701,38.79731],[-76.09601,38.79715],[-76.09548,38.84133]],[[-77.23397,39.16838],[-77.25516,39.14647],[-77.25496,39.11343],[-77.18093,39.05337],[-77.14907,39.0477],[-77.12798,39.04779],[-77.10683,39.05325],[-77.10688,39.0917],[-77.11775,39.10827],[-77.16011,39.12485],[-77.15975,39.15214],[-77.17048,39.16302],[-77.21284,39.17272],[-77.23397,39.16838]]],terms_url:"http://imap.maryland.gov/Pages/imagery-products.aspx",terms_text:"DoIT, MD iMap, MDP",description:"Three Inch Resolution Imagery for the cities of Rockville, Gaithersburg and Annapolis"},{id:"geodata.md.gov-MD_ColorBasemap",name:"MD Transportation Basemap",type:"wms",template:"https://geodata.md.gov/imap/services/Transportation/MD_ColorBasemap/MapServer/WmsServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=MD_ColorBasemap&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-76.23413,37.92037],[-76.59805,38.15832],[-76.94,38.27053],[-77.03819,38.41379],[-77.23526,38.33627],[-77.31216,38.41056],[-77.26273,38.56642],[-77.043,38.71338],[-77.04987,38.7937],[-76.92627,38.8925],[-77.04094,38.9845],[-77.12162,38.92523],[-77.15012,38.95514],[-77.25243,38.97543],[-77.25929,39.02425],[-77.34581,39.05492],[-77.46185,39.07038],[-77.53738,39.13965],[-77.47421,39.22481],[-77.57275,39.30428],[-77.72347,39.32899],[-77.77702,39.46323],[-77.86148,39.51622],[-77.84088,39.60886],[-77.95624,39.59299],[-78.16635,39.69556],[-78.27003,39.62156],[-78.3387,39.64007],[-78.46641,39.52364],[-78.6628,39.54006],[-78.79875,39.60622],[-78.9814,39.4468],[-79.06723,39.47649],[-79.48505,39.19954],[-79.48557,39.72158],[-75.78836,39.72181],[-75.69099,38.46058],[-75.04924,38.45816],[-75.04984,38.40222],[-75.08151,38.32321],[-75.09773,38.30907],[-75.187,38.09755],[-75.23798,38.0224],[-75.61821,37.98967],[-75.86369,37.90953],[-76.23413,37.92037]]],terms_url:"http://imap.maryland.gov/Pages/imagery-products.aspx",terms_text:"DoIT, MD iMap, MDP",description:"Maryland State Highway Administration road features and additional Maryland focused landmarks"},{id:"MCGIS-County-NAIP-Imagery-2015",name:"Mesa County GIS NAIP 2015",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/MesaCounty_2015/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-109.06765,39.37875],[-107.37012,39.37962],[-107.36995,39.18422],[-107.49574,39.18416],[-107.49568,39.12133],[-107.62081,39.12126],[-107.62076,39.05974],[-107.68231,39.05971],[-107.68226,38.99652],[-107.81774,38.99645],[-107.81779,39.05859],[-107.86948,39.05856],[-107.86943,38.99769],[-108.05698,38.99759],[-108.05688,38.87126],[-108.18204,38.8712],[-108.18198,38.8081],[-108.37142,38.808],[-108.3711,38.43452],[-109.06685,38.43416],[-109.06765,39.37875]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"MCGIS-County-NAIP-Imagery-2017",name:"Mesa County GIS NAIP 2017",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/NAIP_2017/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-10-24T00:00:00.000Z",startDate:"2017-08-26T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-109.06765,39.37875],[-107.37012,39.37962],[-107.36995,39.18422],[-107.49574,39.18416],[-107.49568,39.12133],[-107.62081,39.12126],[-107.62076,39.05974],[-107.68231,39.05971],[-107.68226,38.99652],[-107.81774,38.99645],[-107.81779,39.05859],[-107.86948,39.05856],[-107.86943,38.99769],[-108.05698,38.99759],[-108.05688,38.87126],[-108.18204,38.8712],[-108.18198,38.8081],[-108.37142,38.808],[-108.3711,38.43452],[-109.06685,38.43416],[-109.06765,39.37875]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"MCGIS-County-Valleywide-Imagery-2018",name:"Mesa County GIS Valleywide 2018",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/City_Color_2018/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-108.93915,39.23931],[-108.86841,39.23846],[-108.86843,39.23734],[-108.81245,39.23666],[-108.81274,39.22256],[-108.79405,39.22234],[-108.79432,39.20857],[-108.70096,39.20745],[-108.70123,39.1939],[-108.60764,39.19277],[-108.60791,39.17906],[-108.58915,39.17884],[-108.58943,39.1649],[-108.53332,39.16422],[-108.53361,39.14993],[-108.51461,39.14971],[-108.51489,39.13611],[-108.44076,39.13522],[-108.44104,39.12109],[-108.42192,39.12086],[-108.42201,39.1163],[-108.3984,39.11602],[-108.39798,39.13708],[-108.32446,39.13619],[-108.32416,39.15107],[-108.30718,39.15087],[-108.3066,39.18],[-108.28866,39.17979],[-108.28807,39.20939],[-108.26868,39.20916],[-108.26957,39.16484],[-108.2864,39.16505],[-108.28699,39.13571],[-108.30312,39.13591],[-108.3038,39.10194],[-108.32335,39.10218],[-108.32328,39.10574],[-108.32914,39.10581],[-108.32943,39.09121],[-108.34736,39.09142],[-108.34764,39.07715],[-108.36637,39.07738],[-108.36666,39.06268],[-108.38569,39.06291],[-108.38599,39.04799],[-108.42216,39.04843],[-108.42245,39.03377],[-108.44051,39.03399],[-108.44137,38.99101],[-108.42193,38.99077],[-108.42252,38.96127],[-108.44162,38.9615],[-108.44133,38.97595],[-108.46034,38.97618],[-108.46006,38.99024],[-108.47877,38.99047],[-108.47848,39.00485],[-108.51515,39.0053],[-108.51519,39.00287],[-108.51825,39.00291],[-108.51821,39.00517],[-108.53414,39.00536],[-108.53397,39.0139],[-108.54342,39.01401],[-108.54336,39.01733],[-108.5455,39.01735],[-108.54548,39.01855],[-108.65864,39.01991],[-108.65778,39.06287],[-108.67867,39.06313],[-108.67837,39.07793],[-108.69699,39.07816],[-108.69671,39.09203],[-108.71557,39.09225],[-108.71529,39.10619],[-108.7388,39.10648],[-108.73853,39.12033],[-108.75744,39.12056],[-108.75686,39.14927],[-108.79422,39.14972],[-108.79393,39.16386],[-108.83224,39.16432],[-108.83196,39.17845],[-108.85061,39.17868],[-108.85033,39.19302],[-108.86938,39.19325],[-108.86906,39.20925],[-108.90237,39.20965],[-108.90208,39.22384],[-108.93946,39.22429],[-108.93915,39.23931]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"Metropole_Ruhr_RVR-DOP10",name:"Metropole Ruhr: Luftbilder (10 cm)",type:"wms",template:"https://geodaten.metropoleruhr.de/dop/dop?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=DOP&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[6.51691,51.81714],[6.52258,51.81469],[6.52281,51.81041],[6.52834,51.81053],[6.53991,51.80134],[6.5511,51.799],[6.56818,51.78992],[6.57476,51.79606],[6.58457,51.79369],[6.59102,51.8024],[6.60911,51.80019],[6.61081,51.79423],[6.63264,51.79981],[6.65946,51.7892],[6.66837,51.77738],[6.7138,51.78084],[6.70876,51.77131],[6.72131,51.76899],[6.7475,51.77035],[6.74862,51.77551],[6.75824,51.77656],[6.7698,51.76649],[6.77219,51.74596],[6.78862,51.74884],[6.79861,51.74217],[6.81927,51.74341],[6.81956,51.73741],[6.82683,51.72983],[6.8403,51.73694],[6.84995,51.73712],[6.85551,51.73636],[6.8586,51.72956],[6.9103,51.74592],[6.90861,51.75275],[6.91511,51.76144],[6.9157,51.7786],[6.93527,51.7738],[6.95606,51.77245],[6.97559,51.79936],[6.98794,51.80129],[6.99485,51.80141],[6.99497,51.79884],[7.02118,51.80014],[7.0244,51.7899],[7.03141,51.78745],[7.0316,51.78317],[7.03847,51.78414],[7.05392,51.77839],[7.06079,51.77936],[7.0609,51.77679],[7.07333,51.777],[7.07867,51.78137],[7.11433,51.78795],[7.13435,51.80542],[7.1616,51.81528],[7.16419,51.8196],[7.19177,51.82174],[7.2141,51.81694],[7.22121,51.81191],[7.23658,51.80785],[7.23668,51.80528],[7.24916,51.80461],[7.2535,51.79953],[7.26179,51.79966],[7.26485,51.79198],[7.26245,51.78252],[7.27229,51.77838],[7.26002,51.77391],[7.26012,51.77134],[7.2688,51.76118],[7.27577,51.75957],[7.27889,51.75019],[7.31079,51.74636],[7.3151,51.74214],[7.31519,51.73957],[7.31102,51.74036],[7.3125,51.73781],[7.32081,51.73707],[7.31169,51.72237],[7.29963,51.71277],[7.2985,51.70589],[7.31069,51.71207],[7.30825,51.70346],[7.32762,51.70202],[7.33057,51.69692],[7.34427,51.69969],[7.34599,51.69028],[7.33919,51.68761],[7.35589,51.68356],[7.35877,51.68017],[7.3781,51.67959],[7.39086,51.66947],[7.40617,51.6654],[7.41031,51.66545],[7.4101,51.67145],[7.43089,51.6683],[7.43892,51.67527],[7.44854,51.67625],[7.44933,51.69341],[7.44094,51.69673],[7.43792,51.7044],[7.42406,51.70593],[7.42245,51.71277],[7.43451,51.72321],[7.44825,51.72511],[7.46718,51.7365],[7.47273,51.73572],[7.4771,51.72892],[7.4826,51.72985],[7.47877,51.72037],[7.48435,51.71872],[7.48449,51.71444],[7.49119,51.72053],[7.49947,51.72063],[7.50214,51.72324],[7.51738,51.72172],[7.51788,51.70629],[7.53035,51.70473],[7.52922,51.69701],[7.53349,51.69277],[7.54458,51.6912],[7.5378,51.68768],[7.54477,51.6852],[7.5528,51.69301],[7.56651,51.69575],[7.56642,51.69832],[7.58706,51.70029],[7.59379,51.70551],[7.6048,51.7065],[7.60743,51.71082],[7.6143,51.71176],[7.61419,51.71518],[7.62663,51.71447],[7.62814,51.7102],[7.64321,51.71381],[7.6531,51.70621],[7.65428,51.71308],[7.668,51.71581],[7.66915,51.72353],[7.68832,51.72889],[7.69283,51.71608],[7.7012,51.71275],[7.71352,51.71631],[7.71481,51.71976],[7.71899,51.71809],[7.71749,51.72236],[7.72163,51.7224],[7.72555,51.73016],[7.73659,51.73028],[7.73638,51.73799],[7.75154,51.73901],[7.7699,51.72378],[7.77119,51.72722],[7.78908,51.72912],[7.79037,51.73256],[7.80282,51.73183],[7.80137,51.73439],[7.80825,51.73531],[7.81228,51.73964],[7.82058,51.73887],[7.82457,51.74491],[7.83287,51.74413],[7.83314,51.73385],[7.83739,51.72961],[7.85815,51.72724],[7.85822,51.72467],[7.86374,51.72472],[7.87187,51.7308],[7.87745,51.72828],[7.88038,51.72145],[7.88875,51.7181],[7.88912,51.70267],[7.90148,51.70536],[7.90568,51.70283],[7.91249,51.70632],[7.92768,51.7056],[7.92912,51.70305],[7.94014,51.704],[7.93746,51.70055],[7.94296,51.70146],[7.96108,51.69305],[7.97631,51.69061],[7.97779,51.68633],[7.9875,51.68385],[7.98761,51.67871],[7.99732,51.67622],[7.9974,51.67279],[7.98365,51.67096],[7.96286,51.67592],[7.95466,51.67242],[7.95366,51.65612],[7.94689,51.65092],[7.94984,51.64237],[7.94443,51.63804],[7.93477,51.6388],[7.93224,51.62935],[7.92406,51.62585],[7.92414,51.62242],[7.91195,51.61374],[7.91632,51.60349],[7.91378,51.59489],[7.87529,51.59282],[7.86837,51.59446],[7.85742,51.59179],[7.85889,51.58837],[7.82749,51.57863],[7.84327,51.55307],[7.83262,51.53925],[7.83277,51.53325],[7.84115,51.52819],[7.8345,51.51955],[7.83755,51.50758],[7.83212,51.50496],[7.83912,51.49988],[7.83923,51.4956],[7.84474,51.49479],[7.8506,51.48028],[7.83418,51.4784],[7.82198,51.47228],[7.80819,51.47471],[7.79876,51.46776],[7.78906,51.47109],[7.76169,51.46823],[7.74785,51.47237],[7.7425,51.46717],[7.73567,51.46623],[7.72864,51.47216],[7.69838,51.4744],[7.67525,51.46728],[7.65606,51.46621],[7.65347,51.46103],[7.63843,51.45914],[7.63589,51.45226],[7.62083,51.45122],[7.61407,51.44772],[7.61977,51.44092],[7.62525,51.44099],[7.62127,51.43666],[7.62825,51.43245],[7.62561,51.42899],[7.63125,51.42391],[7.61633,51.41859],[7.62183,51.4178],[7.62196,51.41352],[7.63313,51.40679],[7.61322,51.38512],[7.60485,51.39017],[7.60609,51.39447],[7.59647,51.39521],[7.58704,51.38995],[7.59,51.38313],[7.58465,51.37878],[7.58644,51.36509],[7.59234,51.35144],[7.59934,51.34638],[7.59257,51.34373],[7.59407,51.33946],[7.58186,51.33588],[7.58334,51.33247],[7.57655,51.33067],[7.57816,51.32298],[7.58373,51.31962],[7.57837,51.31612],[7.58134,51.30844],[7.58547,51.30763],[7.58305,51.29732],[7.56826,51.28942],[7.56582,51.27996],[7.55089,51.27635],[7.54977,51.26862],[7.52923,51.27008],[7.52797,51.26663],[7.51302,51.26387],[7.51049,51.25784],[7.50371,51.25604],[7.50385,51.25175],[7.49563,51.2525],[7.49438,51.24906],[7.49708,51.24995],[7.50271,51.24488],[7.50143,51.24229],[7.48262,51.23262],[7.469,51.23158],[7.46505,51.22724],[7.45129,51.23049],[7.44191,51.22522],[7.44478,51.22098],[7.43534,51.21742],[7.43816,51.21489],[7.43413,51.21312],[7.42995,51.21563],[7.42962,51.22506],[7.42408,51.22756],[7.41182,51.22653],[7.41342,51.2197],[7.39824,51.22463],[7.39521,51.23317],[7.40319,51.23928],[7.3934,51.246],[7.38793,51.24593],[7.38672,51.24162],[7.37853,51.24151],[7.37289,51.24657],[7.35526,51.2429],[7.35405,51.23859],[7.34849,51.24109],[7.339,51.23924],[7.33872,51.24695],[7.32904,51.25024],[7.3238,51.24417],[7.31284,51.24487],[7.31027,51.24054],[7.30481,51.24046],[7.29643,51.24549],[7.29764,51.24979],[7.28262,51.24957],[7.27541,51.25975],[7.2715,51.25455],[7.26734,51.25621],[7.26578,51.26133],[7.27623,51.27434],[7.26764,51.2845],[7.25531,51.28518],[7.26537,51.30847],[7.26521,51.31276],[7.25974,51.31268],[7.26511,51.31533],[7.26365,51.31788],[7.23393,51.308],[7.22973,51.31051],[7.2271,51.3079],[7.22296,51.3087],[7.22309,51.30527],[7.20682,51.30159],[7.20026,51.29463],[7.18792,51.2953],[7.18232,51.29864],[7.16869,51.29757],[7.18065,51.30633],[7.16674,51.31211],[7.16924,51.31815],[7.16503,51.32066],[7.1662,51.32582],[7.15645,51.32996],[7.15351,51.33505],[7.14807,51.33411],[7.14927,51.33842],[7.14513,51.33921],[7.15292,51.34962],[7.14882,51.34956],[7.14731,51.35296],[7.15665,51.35911],[7.15911,51.36601],[7.15189,51.37532],[7.14634,51.37695],[7.13957,51.37513],[7.13802,51.37939],[7.13262,51.37759],[7.127,51.38093],[7.12163,51.37827],[7.12153,51.38084],[7.11742,51.38078],[7.11626,51.37561],[7.11215,51.37555],[7.11205,51.37812],[7.1039,51.37627],[7.09853,51.37361],[7.10004,51.37021],[7.0919,51.36836],[7.08765,51.37172],[7.08088,51.3699],[7.07796,51.37414],[7.0552,51.36176],[7.04973,51.36167],[7.04404,51.36671],[7.03604,51.36144],[7.01944,51.36544],[7.01,51.36185],[7.00745,51.35752],[6.98689,51.35803],[6.98301,51.35282],[6.97743,51.35529],[6.97621,51.35184],[6.96545,51.34737],[6.95033,51.34882],[6.94748,51.35134],[6.9257,51.34839],[6.92422,51.35093],[6.92825,51.35272],[6.92137,51.35346],[6.92391,51.35779],[6.90565,51.36775],[6.90022,51.3668],[6.8904,51.37176],[6.87848,51.36297],[6.86745,51.36449],[6.85115,51.36162],[6.84552,51.36495],[6.84991,51.35903],[6.83385,51.35101],[6.82295,51.34995],[6.81731,51.35328],[6.81615,51.34897],[6.80939,51.34713],[6.80649,51.3505],[6.7941,51.35198],[6.79314,51.34339],[6.77673,51.34308],[6.7475,51.35281],[6.73831,51.34492],[6.72749,51.34214],[6.71287,51.33328],[6.69193,51.34144],[6.66428,51.3469],[6.65435,51.35356],[6.65789,51.36477],[6.67409,51.36938],[6.67794,51.3746],[6.67511,51.37626],[6.6684,51.37356],[6.67309,51.38908],[6.66081,51.38798],[6.65693,51.38362],[6.64602,51.38254],[6.64443,51.3868],[6.63626,51.38577],[6.63586,51.39348],[6.611,51.39726],[6.59479,51.39265],[6.57148,51.39302],[6.56618,51.38948],[6.55797,51.38931],[6.55496,51.39439],[6.54679,51.39337],[6.54505,51.40019],[6.53816,51.4009],[6.52939,51.41101],[6.52596,51.42379],[6.5149,51.42527],[6.51453,51.43213],[6.51987,51.43481],[6.52092,51.44084],[6.51119,51.4432],[6.50821,51.44743],[6.50273,51.44731],[6.50198,51.46101],[6.50709,51.46798],[6.49868,51.47123],[6.49698,51.4772],[6.49012,51.47705],[6.48714,51.48127],[6.4818,51.47859],[6.47608,51.48275],[6.47404,51.49471],[6.46699,51.49799],[6.46245,51.50561],[6.45407,51.508],[6.45497,51.51659],[6.44796,51.51901],[6.45326,51.52255],[6.44876,51.52931],[6.45562,51.52946],[6.47816,51.51966],[6.47499,51.52731],[6.48673,51.53871],[6.46262,51.55191],[6.49612,51.56806],[6.46176,51.56732],[6.42276,51.5759],[6.41912,51.56725],[6.40847,51.56101],[6.38918,51.56144],[6.37657,51.56545],[6.36951,51.56872],[6.36916,51.57471],[6.37726,51.57747],[6.37284,51.58251],[6.37372,51.59111],[6.35235,51.60349],[6.33482,51.59709],[6.32362,51.60026],[6.32067,51.60363],[6.33275,51.60905],[6.33392,51.6125],[6.30035,51.62117],[6.30143,51.62633],[6.29113,51.63725],[6.29225,51.64156],[6.29903,51.64343],[6.32563,51.63632],[6.32819,51.63981],[6.35403,51.64554],[6.35313,51.66095],[6.36553,51.66123],[6.36262,51.66374],[6.37069,51.66735],[6.38091,51.6813],[6.38062,51.68643],[6.37195,51.6931],[6.35808,51.6945],[6.35482,51.703],[6.3682,51.71016],[6.37642,51.7112],[6.38041,51.71387],[6.37731,51.7198],[6.38829,51.7209],[6.38789,51.72775],[6.40932,51.73937],[6.41055,51.74197],[6.40346,51.74524],[6.40597,51.74959],[6.40178,51.75035],[6.40287,51.75552],[6.41405,51.75319],[6.42134,51.7465],[6.42188,51.73708],[6.40877,51.72478],[6.40921,51.71708],[6.4164,51.71209],[6.44839,51.70765],[6.46246,51.70281],[6.47677,51.71855],[6.48908,51.72053],[6.48418,51.73414],[6.48942,51.7394],[6.48908,51.74539],[6.48171,51.75381],[6.53363,51.76434],[6.52478,51.77444],[6.50784,51.78094],[6.4898,51.80714],[6.48961,51.81056],[6.51162,51.81274],[6.51691,51.81714]]],terms_url:"https://www.metropoleruhr.de/regionalverband-ruhr.html",terms_text:"Datengrundlage: Regionalverband Ruhr"},{id:"miljodirektoratet-vern",name:"Miljødirektoratet Protected Areas overlay",type:"wms",template:"https://arcgisproxy.miljodirektoratet.no/arcgis/services/vern/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=naturvern_klasser_omrade,naturvern_punkt&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[-10.95725,71.60964],[-6.16765,71.62095],[-6.13756,70.30991],[-10.92717,70.29784],[-10.95725,71.60964]],[[16.81947,74.9482],[21.25771,74.94213],[21.23712,73.8918],[16.79889,73.89828],[16.81947,74.9482]],[[4.04288,79.93593],[20.65421,81.54417],[36.6503,80.40108],[26.76265,75.8129],[13.88667,75.79135],[4.04288,79.93593]],[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kart.naturbase.no",terms_text:"© Miljødirektoratet",description:"Norwegian national parks, nature reserves and other protected areas and objects from Naturbase, including Svalbard/Spitsbergen",icon:"http://www.miljodirektoratet.no/Framework/favicon-32.png",overlay:true},{id:"miljodirektoratet-friluftsomrader",name:"Miljødirektoratet Public Recreation Areas overlay",type:"wms",template:"https://arcgisproxy.miljodirektoratet.no/arcgis/services/friluftsliv_statlig_sikra/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=friluftsliv_statlig_sikra&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"http://www.miljostatus.no/tema/friluftsliv/statlig-sikra-friluftlivsomrader/",terms_text:"© Miljødirektoratet",description:"Public recreation areas with State ownership (\"friluftsområder\").",icon:"http://www.miljodirektoratet.no/Framework/favicon-32.png",overlay:true},{id:"minador_do_negrao",name:"Minador do Negrão",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Minador%20do%20Negrao&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.8196,-9.35174],[-36.82017,-9.26142],[-36.82465,-9.26133],[-36.83064,-9.26147],[-36.83673,-9.2615],[-36.84228,-9.26148],[-36.84562,-9.2616],[-36.85564,-9.2616],[-36.86214,-9.26159],[-36.8659,-9.26147],[-36.86724,-9.2615],[-36.86952,-9.26149],[-36.87127,-9.26157],[-36.87476,-9.26153],[-36.87816,-9.26163],[-36.88321,-9.2617],[-36.88565,-9.26167],[-36.88857,-9.26148],[-36.89217,-9.26151],[-36.89383,-9.26163],[-36.8974,-9.26175],[-36.91122,-9.26183],[-36.9111,-9.26651],[-36.91112,-9.28542],[-36.91121,-9.29066],[-36.91118,-9.29368],[-36.91099,-9.29929],[-36.91091,-9.30729],[-36.9109,-9.3123],[-36.91083,-9.31597],[-36.91084,-9.32013],[-36.91098,-9.32395],[-36.91099,-9.32587],[-36.91079,-9.32964],[-36.91079,-9.33523],[-36.91074,-9.33944],[-36.91092,-9.34311],[-36.91084,-9.34471],[-36.91066,-9.35229],[-36.89277,-9.35225],[-36.87735,-9.35212],[-36.86463,-9.35203],[-36.85761,-9.35194],[-36.84344,-9.35191],[-36.83115,-9.3518],[-36.8196,-9.35174]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"mml-tausta",name:"MML Background Map",type:"tms",template:"http://tiles.kartat.kapsi.fi/taustakartta/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",description:"Background map from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mml-orto",name:"MML Orthophoto",type:"tms",template:"http://tiles.kartat.kapsi.fi/ortokuva/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",best:true,description:"Ortophotos from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mml-topo",name:"MML Topographic Map",type:"tms",template:"http://tiles.kartat.kapsi.fi/peruskartta/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",description:"Topographic map from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mtbmap-no",name:"MTBmap.no",type:"tms",template:"https://mtbmap.no/tiles/osm/mtbmap/{zoom}/{x}/{y}.jpg",tileSize:512,zoomExtent:[3,14],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.mtbmap.no/",terms_text:"© MTBmap.no",description:"Norwegian mountain biking map from OSM (max zoom 14-16, varies per region)",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/no/MTBmapno.png"},{id:"MunichLatestAerialImagery",name:"Munich latest aerial imagery 60cm",type:"wms",template:"https://ogc.muenchen.de/wms/opendata_luftbild?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=bgl0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[11,22],polygon:[[[11.48878,48.053],[11.55589,48.05323],[11.55583,48.06224],[11.56915,48.06229],[11.56908,48.07128],[11.64986,48.07155],[11.64993,48.06256],[11.70326,48.06274],[11.70313,48.08074],[11.71673,48.08079],[11.71667,48.08968],[11.7299,48.08972],[11.72963,48.12566],[11.74313,48.1257],[11.74292,48.15276],[11.72943,48.15271],[11.72936,48.16152],[11.71612,48.16147],[11.71592,48.18859],[11.7027,48.18855],[11.70263,48.19752],[11.67558,48.19743],[11.67537,48.22446],[11.66176,48.22441],[11.66169,48.23355],[11.64863,48.2335],[11.64857,48.24246],[11.54064,48.2421],[11.54058,48.25093],[11.52735,48.25088],[11.52728,48.26001],[11.47335,48.25983],[11.47356,48.23291],[11.46014,48.23287],[11.46021,48.22373],[11.43336,48.22364],[11.43343,48.21439],[11.3798,48.21421],[11.37987,48.20518],[11.36607,48.20514],[11.36621,48.18741],[11.35259,48.18737],[11.35266,48.17817],[11.33946,48.17813],[11.33973,48.14216],[11.36684,48.14225],[11.36697,48.12443],[11.38083,48.12448],[11.3809,48.11558],[11.44769,48.1158],[11.44804,48.07087],[11.46186,48.07091],[11.46193,48.06193],[11.48872,48.06202],[11.48878,48.053]]],terms_url:"http://www.geodatenservice-muenchen.de/",terms_text:"Datenquelle: dl-de/by-2-0: Landeshauptstadt München – Kommunalreferat – GeodatenService – www.geodatenservice-muenchen.de",icon:"https://www.muenchen.de/media/css/images/favicon_114x114.png"},{id:"openlabs-geoportal-public-transport",name:"Municipality of Tirana - Public Transport (Open Labs GeoPortal) (overlay)",type:"tms",template:"https://geoportal.openlabs.cc/mapcache/tms/1.0.0/public-transport@GoogleMapsCompatibleExtended/{zoom}/{x}/{-y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[19.73762,41.30154],[19.88628,41.27213],[19.86877,41.38582],[19.68338,41.3732],[19.73762,41.30154]]],terms_url:"https://geoportal.openlabs.cc/",terms_text:"Data provided by the Muncipality of Tirana hosted by Open Labs",description:"Bus stops & lines provided by the Muncipality of Tirana hosted by Open Labs",overlay:true},{id:"openlabs-geoportal-tirana",name:"Municipality of Tirana (Open Labs GeoPortal)",type:"tms",template:"https://geoportal.openlabs.cc/mapcache/tms/1.0.0/tirana@GoogleMapsCompatibleExtended/{zoom}/{x}/{-y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[19.70226,41.1404],[19.77573,41.11868],[19.86431,41.12126],[20.24986,41.3495],[20.03082,41.41184],[19.92577,41.5204],[19.88869,41.50755],[19.88937,41.42265],[19.81659,41.46177],[19.7335,41.43037],[19.74174,41.37887],[19.65797,41.37475],[19.57214,41.24322],[19.61815,41.22567],[19.67171,41.22722],[19.70226,41.1404]]],terms_url:"https://geoportal.openlabs.cc",terms_text:"Data provided by the Muncipality of Tirana hosted by Open Labs",description:"Streets & Builings provided by the Muncipality of Tirana hosted by Open Labs"},{id:"NC-US",name:"NC Latest Orthoimagery",type:"wms",template:"https://services.nconemap.gov/secure/services/Imagery/Orthoimagery_Latest/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",polygon:[[[-81.6792,36.5974],[-80.25359,36.54793],[-75.8409,36.5671],[-75.4323,35.6441],[-75.50475,35.18806],[-75.70525,35.17684],[-76.14745,34.94077],[-76.53472,34.55487],[-76.69676,34.66789],[-77.27904,34.53224],[-77.68828,34.26482],[-77.9435,33.8269],[-78.21288,33.89402],[-78.5301,33.8304],[-79.6693,34.7916],[-80.8122,34.8085],[-80.84685,34.96329],[-80.95122,35.05552],[-81.06383,35.01729],[-81.07482,35.13417],[-82.3632,35.1805],[-82.9989,34.9919],[-84.3333,34.9767],[-84.27184,35.28229],[-84.09056,35.27332],[-83.91478,35.53301],[-83.55498,35.5911],[-83.2556,35.73392],[-82.98644,35.81414],[-82.92327,35.96767],[-82.67882,36.0854],[-82.60192,36.08984],[-82.536,35.96989],[-82.35472,36.14752],[-82.04436,36.14309],[-81.90428,36.33803],[-81.74224,36.37342],[-81.6792,36.5974]]],description:"Most recent true color imagery for the state of North Carolina. The imagery has a pixel resolution of 6 inches and is comprised of imagery flown in 2010, 2012, 2013, and 2014"},{id:"landsat-niger-2012_10",name:"Niger Delta Oct 2012 Landsat",type:"tms",template:"http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/niger_oct_2012_321/{zoom}/{x}/{y}.png",endDate:"2012-10-01T00:00:00.000Z",startDate:"2012-10-01T00:00:00.000Z",zoomExtent:[1,13],polygon:[[[-6.92922,13.78574],[-5.13295,13.51884],[-5.07802,13.74039],[-3.60036,13.52418],[-3.54543,13.74039],[-2.06227,13.52685],[-1.3564,16.58454],[-3.17464,16.85285],[-3.22408,16.62665],[-4.72371,16.85022],[-4.76766,16.63455],[-6.27553,16.84759],[-6.92922,13.78574]]]},{id:"geodata.state.nj.us-Infrared2015",name:"NJ 2015 Aerial Imagery (Infrared)",type:"wms",template:"https://geodata.state.nj.us/imagerywms/Infrared2015?FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&WIDTH={width}&HEIGHT={height}&LAYERS=Infrared2015&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-05-03T00:00:00.000Z",startDate:"2015-03-29T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-74.86599,40.08543],[-74.93534,40.07256],[-75.05653,40.00868],[-75.14236,39.95791],[-75.14456,39.88322],[-75.18515,39.88042],[-75.24499,39.85486],[-75.33339,39.8495],[-75.41531,39.80156],[-75.45131,39.78304],[-75.57744,39.62346],[-75.54245,39.56827],[-75.57847,39.48183],[-74.91678,38.84647],[-74.31702,39.38739],[-74.06708,39.75155],[-73.92141,40.49222],[-74.2382,40.49378],[-74.23859,40.54916],[-74.20211,40.54924],[-74.20228,40.57648],[-74.18406,40.57609],[-74.18436,40.63146],[-74.07587,40.63078],[-74.07532,40.64457],[-74.02124,40.65811],[-74.02081,40.69919],[-74.00265,40.69929],[-74.00247,40.74037],[-73.98434,40.74026],[-73.98402,40.78145],[-73.96591,40.78158],[-73.96597,40.80868],[-73.94777,40.80861],[-73.94769,40.82232],[-73.92966,40.82225],[-73.92906,40.86355],[-73.91104,40.86329],[-73.91061,40.91838],[-73.8923,40.91831],[-73.89215,40.95961],[-73.87413,40.95942],[-73.87386,40.99251],[-74.70601,41.36513],[-74.75716,41.34769],[-74.79801,41.32268],[-74.84024,41.27864],[-74.90547,41.17038],[-74.98152,41.1126],[-75.03902,41.03819],[-75.13515,40.99441],[-75.13773,40.97309],[-75.05705,40.86757],[-75.06846,40.85037],[-75.09687,40.85096],[-75.10099,40.83927],[-75.09018,40.82238],[-75.1367,40.77729],[-75.1724,40.78067],[-75.19833,40.75389],[-75.20506,40.69131],[-75.20373,40.61832],[-75.19764,40.57367],[-75.16777,40.55907],[-75.10237,40.56702],[-75.06906,40.5365],[-75.07421,40.45505],[-75.06134,40.4165],[-75.02684,40.40252],[-74.9671,40.3952],[-74.94461,40.33817],[-74.86839,40.29157],[-74.84402,40.24796],[-74.77552,40.21428],[-74.76334,40.19172],[-74.72918,40.16392],[-74.72609,40.14949],[-74.78805,40.12468],[-74.8229,40.13033],[-74.86599,40.08543]]],terms_url:"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId={E30775F2-6370-4525-8E68-C371ED29BBB3}",terms_text:"NJ Office of Information Technology (NJOIT), Office of Geographic Information Systems (OGIS)",description:"Digital orthophotography of New Jersey, Near Infrared, 1 foot resolution"},{id:"geodata.state.nj.us-Natural2015",name:"NJ 2015 Aerial Imagery (Natural Color)",type:"wms",template:"https://geodata.state.nj.us/imagerywms/Natural2015?FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&WIDTH={width}&HEIGHT={height}&LAYERS=Natural2015&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-05-03T00:00:00.000Z",startDate:"2015-03-29T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-74.86599,40.08543],[-74.93534,40.07256],[-75.05653,40.00868],[-75.14236,39.95791],[-75.14456,39.88322],[-75.18515,39.88042],[-75.24499,39.85486],[-75.33339,39.8495],[-75.41531,39.80156],[-75.45131,39.78304],[-75.57744,39.62346],[-75.54245,39.56827],[-75.57847,39.48183],[-74.91678,38.84647],[-74.31702,39.38739],[-74.06708,39.75155],[-73.92141,40.49222],[-74.2382,40.49378],[-74.23859,40.54916],[-74.20211,40.54924],[-74.20228,40.57648],[-74.18406,40.57609],[-74.18436,40.63146],[-74.07587,40.63078],[-74.07532,40.64457],[-74.02124,40.65811],[-74.02081,40.69919],[-74.00265,40.69929],[-74.00247,40.74037],[-73.98434,40.74026],[-73.98402,40.78145],[-73.96591,40.78158],[-73.96597,40.80868],[-73.94777,40.80861],[-73.94769,40.82232],[-73.92966,40.82225],[-73.92906,40.86355],[-73.91104,40.86329],[-73.91061,40.91838],[-73.8923,40.91831],[-73.89215,40.95961],[-73.87413,40.95942],[-73.87386,40.99251],[-74.70601,41.36513],[-74.75716,41.34769],[-74.79801,41.32268],[-74.84024,41.27864],[-74.90547,41.17038],[-74.98152,41.1126],[-75.03902,41.03819],[-75.13515,40.99441],[-75.13773,40.97309],[-75.05705,40.86757],[-75.06846,40.85037],[-75.09687,40.85096],[-75.10099,40.83927],[-75.09018,40.82238],[-75.1367,40.77729],[-75.1724,40.78067],[-75.19833,40.75389],[-75.20506,40.69131],[-75.20373,40.61832],[-75.19764,40.57367],[-75.16777,40.55907],[-75.10237,40.56702],[-75.06906,40.5365],[-75.07421,40.45505],[-75.06134,40.4165],[-75.02684,40.40252],[-74.9671,40.3952],[-74.94461,40.33817],[-74.86839,40.29157],[-74.84402,40.24796],[-74.77552,40.21428],[-74.76334,40.19172],[-74.72918,40.16392],[-74.72609,40.14949],[-74.78805,40.12468],[-74.8229,40.13033],[-74.86599,40.08543]]],terms_url:"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId={CDC67AB8-ADA1-4B4B-9087-67A82CB9151C}",terms_text:"NJ Office of Information Technology (NJOIT), Office of Geographic Information Systems (OGIS)",description:"Digital orthophotography of New Jersey, Natural Color, 1 foot resolution"},{id:"NLSC-EMAP5",name:"NLSC General Map with Contour line",type:"tms",template:"https://wmts.nlsc.gov.tw/wmts/EMAP5_OPENDATA/default/EPSG:3857/{zoom}/{y}/{x}",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,15],polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",description:"The emap from Taiwan National Land Surveying and Mapping Center",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"IBGE_Salvador_Streets",name:"Nomes de Ruas IBGE Salvador-BA",type:"tms",template:"https://api.mapbox.com/styles/v1/wille/cj8lp78dn62wl2rquim47qo0g/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g",zoomExtent:[0,20],polygon:[[[-38.48974,-12.81113],[-38.54485,-13.01392],[-38.47755,-13.03466],[-38.33473,-12.94685],[-38.30006,-12.90669],[-38.33954,-12.90435],[-38.35482,-12.83021],[-38.38091,-12.82184],[-38.40717,-12.86754],[-38.46537,-12.81599],[-38.48974,-12.81113]]],description:"Streets geometry and names of Salvador, Bahia. Source: Faces de Logradouro - IBGE.",overlay:true},{id:"kelkkareitit",name:"Nordic snowmobile overlay",type:"tms",template:"https://tiles.kelkkareitit.fi/kelkkareitit/{zoom}/{x}/{y}.png",zoomExtent:[3,18],polygon:[[[27.53173,60.21799],[31.35496,62.51233],[31.63513,62.90773],[30.09154,64.91889],[30.21239,65.87473],[29.13573,66.90422],[30.19041,67.67609],[28.70726,68.42748],[29.02587,68.9505],[31.04735,69.53452],[31.78344,70.44784],[28.32274,71.32192],[23.76342,71.29023],[17.1826,69.99806],[12.10691,68.01581],[9.97556,64.85828],[4.13084,61.95963],[4.57029,59.00664],[6.21826,57.95859],[8.14086,57.8506],[10.41502,58.75682],[12.63702,56.0383],[12.7716,55.25095],[14.2932,55.19769],[18.58886,56.84297],[20.69823,59.3444],[27.53173,60.21799]]],terms_url:"https://kelkkareitit.fi/",terms_text:"© Kelkkareitit.fi",description:"Kelkkareitit.fi snowmobile trails from OSM (Nordic coverage)",icon:"https://kelkkareitit.fi/img/favicon.png",overlay:true},{id:"geovekst-nib",name:"Norway Orthophoto",type:"tms",template:"https://waapi.webatlas.no/maptiles/tiles/webatlas-orto-newup/wa_grid/{zoom}/{x}/{y}.jpeg?api_key=b8e36d51-119a-423b-b156-d744d54123d5",zoomExtent:[0,21],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://www.norgeibilder.no",terms_text:"© Geovekst",best:true,description:"Most recent Norwegian orthophotos, courtesy of Geovekst and Norkart.",icon:"https://register.geonorge.no/data/organizations/_L_norgeibilder96x96.png"},{id:"npd-offshore",name:"NPD Offshore Installations overlay",type:"wms",template:"http://gis.npd.no/ogc/factmaps/2_0?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=fclFixed,pplAll,fldByStatus&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,20],polygon:[[[8.51989,57.6454],[3.25195,56.08737],[2.61185,56.59434],[1.96321,57.90482],[1.48178,58.42936],[1.98303,60.31063],[1.78802,61.35659],[-0.49061,63.88725],[1.36226,67.01603],[14.99771,74.50082],[36.99371,74.50155],[36.99989,73.68633],[32.06909,70.27429],[23.97215,70.47356],[16.25974,68.58447],[12.12888,64.81157],[5.38328,61.92862],[5.7678,58.85355],[8.51989,57.6454]]],terms_url:"http://www.npd.no/no/Kart/Faktakart/",terms_text:"© Oljedirektoratet",description:"Production platforms and oil/natural gas fields on the Norwegian continental shelf",icon:"https://register.geonorge.no/data/organizations/870917732_od_liten.png",overlay:true},{id:"nve-snoskred",name:"NVE Avalanche Danger Areas overlay",type:"wms",template:"https://gis3.nve.no/map/services/SkredSnoAktR/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Snoskred-Aktsomhetsomrader&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,13],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/flaum-og-skred/kartlegging/aktsemdkart/aktsomhetskart-for-snoskred/",terms_text:"© NVE",description:"Potential snowslide areas, computed from theoretical height model. Valid for drops higher than 20-50 meters. Dark red=trigger area.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-nettanlegg",name:"NVE Electricity Network overlay",type:"wms",template:"https://gis3.nve.no/map/services/Nettanlegg1/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Sentralnett,Regionalnett,Distribusjonsnett,Sjokabler,Master og stolper,Transformatorstasjoner&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Power lines (high voltage network) including transformers, submarine cables and pylons. Local distribution network is not included.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-vannkraft",name:"NVE Hydropower Plants overlay",type:"wms",template:"https://gis3.nve.no/map/services/Vannkraft1/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vannkraftverk,Vannvei,Dam&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Hydropower plants including waterways (tunnel, canal, pipeline) and dams",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-vindkraft",name:"NVE Wind Power Plants overlay",type:"wms",template:"https://gis3.nve.no/map/services/Vindkraft/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vindkraft_utbygd,Vindkraft_under_bygging,Vindkraftomrade_konsesjonsbehandling,Vindturbin_konsesjonsbehandling&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Wind power turbines, farms and concession areas. Red colour = concession denied.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"orthos.dhses.ny.gov_latest",name:"NYS Orthos Online",type:"wms",template:"https://orthos.dhses.ny.gov/arcgis/services/Latest/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0,1,2,3,4&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-74.91231,45.03606],[-73.47788,45.02996],[-73.33846,45.03098],[-73.31978,45.00558],[-73.32265,44.98525],[-73.34852,44.9283],[-73.36721,44.8397],[-73.34277,44.81727],[-73.34565,44.77647],[-73.37296,44.73463],[-73.37008,44.67946],[-73.39739,44.64471],[-73.39308,44.60276],[-73.39739,44.54543],[-73.34996,44.51264],[-73.34565,44.49521],[-73.37871,44.4706],[-73.30828,44.43572],[-73.30397,44.41827],[-73.33271,44.33917],[-73.30828,44.27128],[-73.30828,44.25172],[-73.38014,44.14868],[-73.40458,44.04133],[-73.3399,43.79596],[-73.28097,43.64222],[-73.2091,43.54957],[-73.21342,43.51206],[-73.24647,42.67557],[-73.45919,42.14284],[-73.47069,42.03938],[-73.48794,41.73764],[-73.49944,41.64319],[-73.47788,41.62708],[-73.43189,41.57979],[-73.42614,41.56366],[-73.42685,41.45926],[-73.43979,41.40322],[-73.44985,41.38328],[-73.43835,41.37033],[-73.42757,41.35901],[-73.41751,41.3439],[-73.41895,41.27642],[-73.43045,41.24455],[-73.46566,41.19752],[-73.52962,41.14505],[-73.55477,41.13368],[-73.61586,41.13531],[-73.62664,41.10878],[-73.62736,41.05407],[-73.63958,40.99118],[-73.61873,40.98195],[-73.59933,40.96568],[-73.59933,40.93474],[-73.63455,40.91682],[-73.68054,40.89183],[-73.69851,40.87988],[-73.68629,40.87064],[-73.66257,40.87934],[-73.63814,40.90541],[-73.59789,40.91193],[-73.57562,40.9179],[-73.52675,40.92388],[-73.50159,40.94288],[-73.4901,40.95374],[-73.41751,40.96079],[-73.38374,40.96133],[-73.33702,40.95591],[-73.30828,40.93637],[-73.27091,40.92659],[-73.2091,40.91953],[-73.18682,40.92714],[-73.16814,40.93148],[-73.16598,40.95971],[-73.16886,40.97002],[-73.12933,40.98195],[-73.10777,40.98195],[-73.06681,40.9749],[-72.8584,40.97436],[-72.71826,40.98195],[-72.65574,41.00528],[-72.64424,41.00473],[-72.62628,40.99226],[-72.54148,41.03889],[-72.4768,41.06328],[-72.45811,41.08928],[-72.41859,41.09308],[-72.36612,41.13856],[-72.36037,41.1418],[-72.32229,41.15479],[-72.29067,41.16399],[-72.21449,41.18238],[-72.20083,41.19157],[-72.04848,41.25914],[-72.02548,41.2937],[-71.93924,41.30774],[-71.92343,41.30666],[-71.90259,41.2991],[-71.90187,41.28939],[-71.99458,41.24509],[-72.10453,41.19806],[-72.18287,41.16723],[-72.18934,41.16237],[-72.25186,41.12232],[-72.30432,41.10445],[-72.31582,41.09524],[-72.27917,41.08441],[-72.2727,41.08062],[-72.26839,41.04973],[-72.21736,41.04811],[-72.19652,41.04215],[-72.18646,41.05298],[-72.17137,41.0584],[-72.14981,41.05895],[-72.15628,41.09633],[-72.15268,41.1077],[-72.14909,41.14667],[-72.134,41.14505],[-72.07076,41.10553],[-72.07435,41.05678],[-72.08657,41.03185],[-72.10957,41.0069],[-72.08729,41.01287],[-72.06213,41.02534],[-72.04561,41.03239],[-72.01902,41.03293],[-72.00895,41.04215],[-72.00177,41.05136],[-71.96368,41.07737],[-71.922,41.08874],[-71.88966,41.08766],[-71.85588,41.08062],[-71.84582,41.07466],[-71.85588,41.05298],[-71.89038,41.03727],[-71.91625,41.03022],[-71.99099,41.00365],[-72.07938,40.97273],[-72.31941,40.88205],[-72.4423,40.8402],[-72.62771,40.7869],[-72.76569,40.75043],[-72.88499,40.71286],[-72.95973,40.68671],[-73.03735,40.66],[-73.08118,40.64855],[-73.22994,40.61637],[-73.32193,40.6131],[-73.35211,40.61855],[-73.55477,40.56944],[-73.75959,40.57708],[-73.88248,40.54815],[-73.9335,40.53449],[-73.945,40.53395],[-73.94572,40.56289],[-74.08227,40.56234],[-74.08011,40.54924],[-74.12251,40.52084],[-74.15772,40.51373],[-74.18719,40.50117],[-74.22887,40.48696],[-74.26121,40.48532],[-74.2763,40.4957],[-74.27918,40.54378],[-74.26983,40.56671],[-74.25834,40.57217],[-74.22528,40.57217],[-74.226,40.58309],[-74.25115,40.59564],[-74.25259,40.62237],[-74.24324,40.64091],[-74.2339,40.64909],[-74.20228,40.654],[-74.12538,40.65673],[-74.11532,40.69107],[-74.09951,40.68998],[-74.07795,40.71068],[-74.06286,40.7183],[-74.05208,40.7439],[-74.02549,40.79288],[-73.98094,40.86901],[-73.96225,40.92551],[-73.94931,40.96459],[-73.94644,40.99877],[-73.98165,41.01612],[-74.04561,41.04323],[-74.18072,41.09524],[-74.30792,41.14938],[-74.44087,41.21537],[-74.52783,41.25914],[-74.61335,41.30234],[-74.65791,41.31098],[-74.70246,41.33581],[-74.76714,41.38975],[-74.79661,41.41023],[-74.85338,41.42263],[-74.90728,41.43179],[-74.99783,41.47111],[-75.04167,41.52708],[-75.08479,41.59323],[-75.08407,41.61848],[-75.07329,41.66467],[-75.08766,41.70278],[-75.08766,41.71351],[-75.12144,41.76177],[-75.11928,41.79232],[-75.13078,41.81696],[-75.18755,41.83838],[-75.25295,41.84962],[-75.28745,41.85497],[-75.29823,41.88227],[-75.30613,41.9304],[-75.34063,41.94003],[-75.3665,41.9566],[-75.37225,41.97744],[-75.58066,41.97957],[-75.58137,41.92399],[-75.78906,41.92666],[-75.78691,41.98278],[-79.77687,41.98118],[-79.7819,42.20994],[-79.77184,42.28017],[-79.72153,42.29824],[-79.57349,42.36731],[-79.42976,42.46599],[-79.3737,42.49991],[-79.25728,42.54546],[-79.18973,42.5624],[-79.16529,42.56981],[-79.12074,42.62483],[-79.0963,42.64598],[-79.06899,42.6967],[-79.03162,42.71043],[-78.98851,42.72311],[-78.88358,42.77693],[-78.88646,42.8149],[-78.93964,42.88655],[-78.93964,42.93603],[-79.04887,42.96969],[-79.04743,43.05167],[-79.09343,43.05272],[-79.09199,43.09262],[-79.08624,43.26556],[-79.06468,43.27602],[-78.84909,43.33041],[-78.72979,43.35237],[-78.63924,43.37013],[-78.54869,43.37953],[-78.47826,43.38789],[-77.95508,43.38476],[-77.73158,43.34714],[-77.71146,43.34034],[-77.66259,43.31159],[-77.61516,43.28387],[-77.55336,43.253],[-77.5282,43.25509],[-77.45634,43.27864],[-77.42256,43.28492],[-77.16385,43.29433],[-77.0503,43.29381],[-76.94178,43.29329],[-76.91447,43.30793],[-76.85051,43.3163],[-76.80236,43.32832],[-76.75996,43.35184],[-76.64785,43.42809],[-76.54509,43.48026],[-76.51993,43.49486],[-76.44304,43.52717],[-76.4222,43.53811],[-76.28206,43.53863],[-76.23822,43.55686],[-76.24038,43.74147],[-76.30649,43.82915],[-76.31152,43.8675],[-76.34602,43.8618],[-76.40064,43.86128],[-76.47178,43.88408],[-76.46675,43.90893],[-76.4186,43.93119],[-76.37189,43.93223],[-76.36974,43.90272],[-76.33308,43.92964],[-76.27847,43.92964],[-76.27847,43.90427],[-76.26697,43.89599],[-76.23607,43.91204],[-76.19295,43.93326],[-76.19007,43.95086],[-76.21523,43.96017],[-76.25044,43.94982],[-76.31224,43.94775],[-76.30578,43.9762],[-76.33093,44.00464],[-76.39561,44.0248],[-76.39848,44.06251],[-76.37548,44.06457],[-76.3762,44.0909],[-76.47107,44.09297],[-76.46604,44.10948],[-76.44232,44.1296],[-76.39848,44.13218],[-76.39776,44.20435],[-76.3762,44.21671],[-76.23966,44.21929],[-76.23966,44.22804],[-76.21738,44.22856],[-76.21523,44.3479],[-76.11893,44.37103],[-76.04634,44.39157],[-75.93423,44.43418],[-75.83721,44.50341],[-75.76822,44.55823],[-75.69923,44.60379],[-75.63168,44.64829],[-75.56772,44.70501],[-75.50448,44.74586],[-75.45274,44.78157],[-75.31763,44.8723],[-75.15378,44.93745],[-75.09054,44.97305],[-74.97411,45.02793],[-74.91985,45.03682],[-74.91231,45.03606]]],terms_url:"https://gis.ny.gov/gateway/orthoprogram/index.cfm",terms_text:"New York State Statewide Digital Orthoimagery Program",description:"New York State High Resolution Digital Orthoimagery, 1 foot resolution",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/ny/NYS_Orthos_Online.png"},{id:"olho_dagua_do_casado",name:"Olho d'Agua do Casado AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Olho%20Dagua%20do%20Casado&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.7822,-9.54444],[-37.7826,-9.45388],[-37.81147,-9.45412],[-37.81735,-9.45451],[-37.82057,-9.45416],[-37.87394,-9.45428],[-37.87358,-9.54475],[-37.7822,-9.54444]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"osmbe-nl",name:"OpenStreetMap (Belgian Style - Dutch)",type:"tms",template:"https://tile.openstreetmap.be/osmbe-nl/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[5.47007,49.49196],[5.44409,49.51409],[5.46213,49.53677],[5.43766,49.54766],[5.42566,49.59145],[5.40775,49.60448],[5.35207,49.62396],[5.34232,49.61192],[5.30544,49.60645],[5.3026,49.63608],[5.32535,49.6575],[5.27025,49.68827],[5.24458,49.67985],[5.16215,49.6918],[5.16164,49.71172],[5.12622,49.70442],[5.09058,49.75946],[5.06262,49.75724],[5.01261,49.77534],[4.9921,49.79533],[4.95485,49.79586],[4.94404,49.78583],[4.90589,49.78055],[4.84827,49.78972],[4.86599,49.81918],[4.84266,49.86913],[4.85659,49.86973],[4.87961,49.91078],[4.84433,49.94482],[4.78844,49.95381],[4.78535,49.97018],[4.79004,49.98569],[4.81194,49.99563],[4.81579,50.02853],[4.83599,50.04069],[4.82339,50.04664],[4.81641,50.06702],[4.83456,50.06856],[4.83709,50.09442],[4.84472,50.10023],[4.85447,50.1029],[4.866,50.09623],[4.86587,50.12038],[4.8776,50.13223],[4.89443,50.13779],[4.88043,50.1403],[4.87725,50.15205],[4.8529,50.15168],[4.83169,50.1526],[4.82334,50.15923],[4.78067,50.14092],[4.76486,50.13634],[4.75217,50.11158],[4.71293,50.09598],[4.70278,50.09336],[4.68851,50.06595],[4.70309,50.05587],[4.68731,50.01802],[4.69495,49.99662],[4.69461,49.99504],[4.63074,49.98584],[4.58965,49.98336],[4.55981,49.96757],[4.54315,49.9679],[4.52365,49.94973],[4.51156,49.94579],[4.47953,49.94584],[4.44588,49.93656],[4.40593,49.94785],[4.39149,49.94697],[4.38072,49.95088],[4.34921,49.95202],[4.3137,49.96541],[4.19616,49.9536],[4.19304,49.95746],[4.19582,49.96629],[4.13704,49.97691],[4.15996,49.99544],[4.13683,50.00786],[4.13272,50.01973],[4.16174,50.05032],[4.17458,50.04772],[4.22857,50.06873],[4.19529,50.10571],[4.19766,50.12037],[4.19566,50.13394],[4.15448,50.12716],[4.13656,50.12909],[4.12568,50.13511],[4.13677,50.15213],[4.14989,50.1647],[4.14686,50.17314],[4.15567,50.19785],[4.14799,50.21344],[4.15979,50.21579],[4.19179,50.24106],[4.21836,50.25492],[4.20676,50.27068],[4.17487,50.27492],[4.16567,50.28779],[4.155,50.27742],[4.16937,50.26848],[4.16851,50.25626],[4.13426,50.25572],[4.13228,50.26754],[4.12086,50.27276],[4.12139,50.29732],[4.10928,50.30112],[4.0977,50.31201],[4.08017,50.30809],[4.07339,50.31754],[4.03817,50.33987],[4.02738,50.35491],[3.98611,50.34137],[3.96482,50.34012],[3.96355,50.34742],[3.90223,50.3257],[3.88419,50.32554],[3.88429,50.33511],[3.85645,50.34099],[3.84244,50.35243],[3.81321,50.34251],[3.80551,50.35098],[3.74124,50.34624],[3.73556,50.32532],[3.73175,50.30705],[3.70911,50.3021],[3.68231,50.31988],[3.66397,50.34724],[3.65542,50.37075],[3.66788,50.38597],[3.67276,50.40227],[3.66777,50.42262],[3.66743,50.43635],[3.65685,50.4464],[3.66129,50.45399],[3.64419,50.4618],[3.6099,50.4935],[3.58162,50.48917],[3.56897,50.4982],[3.49868,50.48577],[3.49448,50.49918],[3.51582,50.52075],[3.4742,50.53204],[3.44739,50.50415],[3.43663,50.5083],[3.42736,50.50327],[3.37405,50.48993],[3.35949,50.50325],[3.32767,50.50732],[3.31872,50.51788],[3.30319,50.51966],[3.28718,50.52552],[3.27549,50.53872],[3.27524,50.59381],[3.25497,50.62115],[3.24349,50.64031],[3.23893,50.65864],[3.24019,50.67023],[3.26029,50.67692],[3.25131,50.69091],[3.25881,50.69312],[3.24518,50.71225],[3.23779,50.71086],[3.22148,50.70958],[3.20498,50.71072],[3.18953,50.72603],[3.19445,50.7316],[3.14457,50.78871],[3.12547,50.78553],[3.11348,50.79278],[3.10455,50.78042],[3.08585,50.77064],[3.05758,50.77987],[3.04064,50.77484],[3.03691,50.77003],[3.02927,50.76813],[3.01945,50.77263],[2.99536,50.76043],[2.96822,50.74763],[2.9557,50.75181],[2.93962,50.74441],[2.94602,50.73167],[2.9349,50.72822],[2.92939,50.70786],[2.92206,50.70224],[2.91184,50.70267],[2.91281,50.69463],[2.90742,50.69209],[2.90017,50.69202],[2.88533,50.70547],[2.87992,50.70199],[2.86855,50.70242],[2.84646,50.72043],[2.81843,50.71386],[2.78869,50.72508],[2.77811,50.74686],[2.76469,50.75397],[2.75409,50.76251],[2.75922,50.77052],[2.73745,50.77967],[2.7236,50.79079],[2.71636,50.8123],[2.6788,50.81207],[2.67057,50.81562],[2.63543,50.80987],[2.61055,50.84419],[2.59427,50.84743],[2.60628,50.86565],[2.60151,50.90993],[2.58525,50.91825],[2.62479,50.94743],[2.62148,50.95406],[2.60263,50.98638],[2.56946,51.00113],[2.55892,51.06596],[2.34072,51.31453],[3.01078,51.59839],[3.32658,51.43728],[3.37581,51.3584],[3.38739,51.33392],[3.36094,51.31523],[3.3789,51.30251],[3.36832,51.29778],[3.38177,51.28732],[3.38342,51.27485],[3.38922,51.27329],[3.41852,51.25984],[3.43471,51.24621],[3.45031,51.24219],[3.527,51.24651],[3.51433,51.28799],[3.54179,51.29123],[3.56145,51.29637],[3.57559,51.29428],[3.58905,51.30652],[3.63839,51.29078],[3.6582,51.29056],[3.69139,51.28043],[3.71763,51.27428],[3.77605,51.26777],[3.79652,51.25635],[3.79031,51.24163],[3.78934,51.22711],[3.79294,51.21546],[3.85827,51.21334],[3.88901,51.22423],[3.89467,51.21743],[3.88782,51.20283],[3.91256,51.20837],[3.91482,51.21509],[3.9281,51.22508],[3.93751,51.2174],[3.95603,51.22117],[4.01551,51.24825],[4.0551,51.24402],[4.1651,51.2938],[4.23804,51.35274],[4.21772,51.36206],[4.21546,51.37487],[4.33535,51.37775],[4.34197,51.36012],[4.38556,51.35574],[4.39906,51.35785],[4.42462,51.3668],[4.42309,51.37577],[4.38147,51.41805],[4.39426,51.44251],[4.37771,51.44595],[4.38055,51.45075],[4.4768,51.47912],[4.53739,51.48358],[4.54967,51.47364],[4.53097,51.44965],[4.53758,51.42456],[4.57427,51.43404],[4.6431,51.42478],[4.64951,51.42741],[4.66744,51.42777],[4.66465,51.44625],[4.69115,51.45283],[4.70175,51.46691],[4.72792,51.48435],[4.74476,51.48977],[4.74945,51.49905],[4.75827,51.50302],[4.7766,51.50625],[4.81666,51.49552],[4.82318,51.48441],[4.84355,51.48177],[4.83884,51.46588],[4.84529,51.45817],[4.82521,51.44674],[4.83103,51.42488],[4.88072,51.4166],[4.91431,51.45952],[4.95767,51.4548],[4.94134,51.42928],[4.93775,51.40655],[4.96007,51.42194],[4.99955,51.44324],[5.00816,51.47134],[5.01937,51.48074],[5.03235,51.48827],[5.04093,51.4876],[5.04722,51.47217],[5.08032,51.47226],[5.10643,51.43135],[5.0727,51.39365],[5.11662,51.36118],[5.13225,51.3472],[5.13581,51.31594],[5.15592,51.31278],[5.20039,51.32325],[5.24326,51.3057],[5.22742,51.26844],[5.238,51.26255],[5.26216,51.26778],[5.335,51.26474],[5.34493,51.27681],[5.41551,51.2639],[5.44065,51.28246],[5.48215,51.30064],[5.51628,51.29599],[5.55816,51.26613],[5.56283,51.22287],[5.65253,51.19899],[5.65947,51.19052],[5.71011,51.18671],[5.74598,51.19455],[5.76873,51.18843],[5.78118,51.18082],[5.78447,51.15925],[5.82594,51.16827],[5.85709,51.14477],[5.83976,51.12993],[5.81435,51.11524],[5.83555,51.10842],[5.8338,51.09577],[5.82291,51.09124],[5.8119,51.0943],[5.79816,51.09023],[5.80612,51.07955],[5.80458,51.05888],[5.77731,51.05804],[5.76027,51.03223],[5.77383,51.02859],[5.77829,51.02399],[5.76759,51.00526],[5.76846,50.9985],[5.76419,50.99502],[5.74816,50.98087],[5.72174,50.96128],[5.73469,50.95683],[5.7426,50.96113],[5.74604,50.96209],[5.75617,50.95898],[5.76011,50.95227],[5.73223,50.9221],[5.72625,50.9059],[5.70051,50.90955],[5.69711,50.8958],[5.68051,50.88068],[5.64516,50.86533],[5.64337,50.84974],[5.64049,50.84701],[5.64576,50.83961],[5.64567,50.83789],[5.65094,50.83431],[5.65568,50.82591],[5.70296,50.80821],[5.69338,50.79687],[5.70259,50.78396],[5.69204,50.75629],[5.7218,50.76538],[5.73762,50.75842],[5.73912,50.76522],[5.76476,50.7837],[5.77748,50.78344],[5.78519,50.7684],[5.7927,50.77138],[5.80759,50.75681],[5.84525,50.76609],[5.84901,50.75975],[5.88667,50.77108],[5.89689,50.75501],[5.95896,50.76308],[6.02001,50.75521],[6.04208,50.74557],[6.03953,50.7295],[6.11623,50.72364],[6.1491,50.68465],[6.16312,50.67169],[6.17755,50.65576],[6.18715,50.6505],[6.18348,50.6457],[6.18205,50.63583],[6.26822,50.62829],[6.27251,50.62033],[6.24102,50.58657],[6.22795,50.58535],[6.18304,50.55597],[6.1833,50.54646],[6.19789,50.53715],[6.22586,50.49832],[6.26954,50.50961],[6.35349,50.49244],[6.34706,50.46422],[6.37423,50.45989],[6.3825,50.43975],[6.37408,50.40637],[6.35129,50.38206],[6.40305,50.34866],[6.41162,50.32769],[6.40783,50.31893],[6.38558,50.31658],[6.36388,50.30021],[6.32792,50.3186],[6.31289,50.31636],[6.29335,50.2909],[6.29547,50.27422],[6.28111,50.26236],[6.23624,50.25692],[6.21151,50.24816],[6.1981,50.23275],[6.18166,50.23125],[6.1789,50.22147],[6.19337,50.20761],[6.19683,50.17988],[6.15231,50.16841],[6.15923,50.14002],[6.13978,50.12527],[6.10856,50.1326],[6.11273,50.16093],[6.10156,50.16551],[6.08452,50.16697],[6.0821,50.15275],[6.06344,50.14834],[6.03055,50.15829],[6.02136,50.17685],[5.96932,50.16795],[5.96515,50.12813],[5.90347,50.11172],[5.89064,50.07554],[5.86237,50.06368],[5.8749,50.04624],[5.86392,50.02594],[5.82586,50.00934],[5.82665,50.00135],[5.8448,49.99123],[5.83952,49.9756],[5.80883,49.95773],[5.78215,49.957],[5.76822,49.91307],[5.74481,49.89975],[5.78087,49.88794],[5.78897,49.87213],[5.77636,49.86265],[5.75667,49.8703],[5.76191,49.85693],[5.75803,49.84287],[5.74291,49.83555],[5.75151,49.81985],[5.75473,49.79514],[5.7909,49.79765],[5.8179,49.75977],[5.83544,49.74713],[5.82702,49.72616],[5.86996,49.72777],[5.88817,49.70952],[5.86372,49.68213],[5.91262,49.66488],[5.90382,49.65192],[5.90876,49.63876],[5.89899,49.63401],[5.89117,49.63469],[5.87663,49.60771],[5.84953,49.59399],[5.87403,49.58991],[5.8736,49.57435],[5.84053,49.55222],[5.82582,49.54931],[5.81858,49.5461],[5.79504,49.55029],[5.77149,49.55832],[5.76226,49.554],[5.76126,49.53952],[5.74792,49.53452],[5.73009,49.53954],[5.6987,49.53744],[5.66008,49.55039],[5.64371,49.54565],[5.6228,49.5283],[5.62589,49.51698],[5.61175,49.50102],[5.59116,49.51734],[5.55638,49.52373],[5.54257,49.5105],[5.47007,49.49196]]],terms_url:"https://openstreetmap.org/",terms_text:"© OpenStreetMap contributors, CC-BY-SA; Tiles courtesy of GEO-6",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"osmbe-fr",name:"OpenStreetMap (Belgian Style - French)",type:"tms",template:"https://tile.openstreetmap.be/osmbe-fr/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[5.47007,49.49196],[5.44409,49.51409],[5.46213,49.53677],[5.43766,49.54766],[5.42566,49.59145],[5.40775,49.60448],[5.35207,49.62396],[5.34232,49.61192],[5.30544,49.60645],[5.3026,49.63608],[5.32535,49.6575],[5.27025,49.68827],[5.24458,49.67985],[5.16215,49.6918],[5.16164,49.71172],[5.12622,49.70442],[5.09058,49.75946],[5.06262,49.75724],[5.01261,49.77534],[4.9921,49.79533],[4.95485,49.79586],[4.94404,49.78583],[4.90589,49.78055],[4.84827,49.78972],[4.86599,49.81918],[4.84266,49.86913],[4.85659,49.86973],[4.87961,49.91078],[4.84433,49.94482],[4.78844,49.95381],[4.78535,49.97018],[4.79004,49.98569],[4.81194,49.99563],[4.81579,50.02853],[4.83599,50.04069],[4.82339,50.04664],[4.81641,50.06702],[4.83456,50.06856],[4.83709,50.09442],[4.84472,50.10023],[4.85447,50.1029],[4.866,50.09623],[4.86587,50.12038],[4.8776,50.13223],[4.89443,50.13779],[4.88043,50.1403],[4.87725,50.15205],[4.8529,50.15168],[4.83169,50.1526],[4.82334,50.15923],[4.78067,50.14092],[4.76486,50.13634],[4.75217,50.11158],[4.71293,50.09598],[4.70278,50.09336],[4.68851,50.06595],[4.70309,50.05587],[4.68731,50.01802],[4.69495,49.99662],[4.69461,49.99504],[4.63074,49.98584],[4.58965,49.98336],[4.55981,49.96757],[4.54315,49.9679],[4.52365,49.94973],[4.51156,49.94579],[4.47953,49.94584],[4.44588,49.93656],[4.40593,49.94785],[4.39149,49.94697],[4.38072,49.95088],[4.34921,49.95202],[4.3137,49.96541],[4.19616,49.9536],[4.19304,49.95746],[4.19582,49.96629],[4.13704,49.97691],[4.15996,49.99544],[4.13683,50.00786],[4.13272,50.01973],[4.16174,50.05032],[4.17458,50.04772],[4.22857,50.06873],[4.19529,50.10571],[4.19766,50.12037],[4.19566,50.13394],[4.15448,50.12716],[4.13656,50.12909],[4.12568,50.13511],[4.13677,50.15213],[4.14989,50.1647],[4.14686,50.17314],[4.15567,50.19785],[4.14799,50.21344],[4.15979,50.21579],[4.19179,50.24106],[4.21836,50.25492],[4.20676,50.27068],[4.17487,50.27492],[4.16567,50.28779],[4.155,50.27742],[4.16937,50.26848],[4.16851,50.25626],[4.13426,50.25572],[4.13228,50.26754],[4.12086,50.27276],[4.12139,50.29732],[4.10928,50.30112],[4.0977,50.31201],[4.08017,50.30809],[4.07339,50.31754],[4.03817,50.33987],[4.02738,50.35491],[3.98611,50.34137],[3.96482,50.34012],[3.96355,50.34742],[3.90223,50.3257],[3.88419,50.32554],[3.88429,50.33511],[3.85645,50.34099],[3.84244,50.35243],[3.81321,50.34251],[3.80551,50.35098],[3.74124,50.34624],[3.73556,50.32532],[3.73175,50.30705],[3.70911,50.3021],[3.68231,50.31988],[3.66397,50.34724],[3.65542,50.37075],[3.66788,50.38597],[3.67276,50.40227],[3.66777,50.42262],[3.66743,50.43635],[3.65685,50.4464],[3.66129,50.45399],[3.64419,50.4618],[3.6099,50.4935],[3.58162,50.48917],[3.56897,50.4982],[3.49868,50.48577],[3.49448,50.49918],[3.51582,50.52075],[3.4742,50.53204],[3.44739,50.50415],[3.43663,50.5083],[3.42736,50.50327],[3.37405,50.48993],[3.35949,50.50325],[3.32767,50.50732],[3.31872,50.51788],[3.30319,50.51966],[3.28718,50.52552],[3.27549,50.53872],[3.27524,50.59381],[3.25497,50.62115],[3.24349,50.64031],[3.23893,50.65864],[3.24019,50.67023],[3.26029,50.67692],[3.25131,50.69091],[3.25881,50.69312],[3.24518,50.71225],[3.23779,50.71086],[3.22148,50.70958],[3.20498,50.71072],[3.18953,50.72603],[3.19445,50.7316],[3.14457,50.78871],[3.12547,50.78553],[3.11348,50.79278],[3.10455,50.78042],[3.08585,50.77064],[3.05758,50.77987],[3.04064,50.77484],[3.03691,50.77003],[3.02927,50.76813],[3.01945,50.77263],[2.99536,50.76043],[2.96822,50.74763],[2.9557,50.75181],[2.93962,50.74441],[2.94602,50.73167],[2.9349,50.72822],[2.92939,50.70786],[2.92206,50.70224],[2.91184,50.70267],[2.91281,50.69463],[2.90742,50.69209],[2.90017,50.69202],[2.88533,50.70547],[2.87992,50.70199],[2.86855,50.70242],[2.84646,50.72043],[2.81843,50.71386],[2.78869,50.72508],[2.77811,50.74686],[2.76469,50.75397],[2.75409,50.76251],[2.75922,50.77052],[2.73745,50.77967],[2.7236,50.79079],[2.71636,50.8123],[2.6788,50.81207],[2.67057,50.81562],[2.63543,50.80987],[2.61055,50.84419],[2.59427,50.84743],[2.60628,50.86565],[2.60151,50.90993],[2.58525,50.91825],[2.62479,50.94743],[2.62148,50.95406],[2.60263,50.98638],[2.56946,51.00113],[2.55892,51.06596],[2.34072,51.31453],[3.01078,51.59839],[3.32658,51.43728],[3.37581,51.3584],[3.38739,51.33392],[3.36094,51.31523],[3.3789,51.30251],[3.36832,51.29778],[3.38177,51.28732],[3.38342,51.27485],[3.38922,51.27329],[3.41852,51.25984],[3.43471,51.24621],[3.45031,51.24219],[3.527,51.24651],[3.51433,51.28799],[3.54179,51.29123],[3.56145,51.29637],[3.57559,51.29428],[3.58905,51.30652],[3.63839,51.29078],[3.6582,51.29056],[3.69139,51.28043],[3.71763,51.27428],[3.77605,51.26777],[3.79652,51.25635],[3.79031,51.24163],[3.78934,51.22711],[3.79294,51.21546],[3.85827,51.21334],[3.88901,51.22423],[3.89467,51.21743],[3.88782,51.20283],[3.91256,51.20837],[3.91482,51.21509],[3.9281,51.22508],[3.93751,51.2174],[3.95603,51.22117],[4.01551,51.24825],[4.0551,51.24402],[4.1651,51.2938],[4.23804,51.35274],[4.21772,51.36206],[4.21546,51.37487],[4.33535,51.37775],[4.34197,51.36012],[4.38556,51.35574],[4.39906,51.35785],[4.42462,51.3668],[4.42309,51.37577],[4.38147,51.41805],[4.39426,51.44251],[4.37771,51.44595],[4.38055,51.45075],[4.4768,51.47912],[4.53739,51.48358],[4.54967,51.47364],[4.53097,51.44965],[4.53758,51.42456],[4.57427,51.43404],[4.6431,51.42478],[4.64951,51.42741],[4.66744,51.42777],[4.66465,51.44625],[4.69115,51.45283],[4.70175,51.46691],[4.72792,51.48435],[4.74476,51.48977],[4.74945,51.49905],[4.75827,51.50302],[4.7766,51.50625],[4.81666,51.49552],[4.82318,51.48441],[4.84355,51.48177],[4.83884,51.46588],[4.84529,51.45817],[4.82521,51.44674],[4.83103,51.42488],[4.88072,51.4166],[4.91431,51.45952],[4.95767,51.4548],[4.94134,51.42928],[4.93775,51.40655],[4.96007,51.42194],[4.99955,51.44324],[5.00816,51.47134],[5.01937,51.48074],[5.03235,51.48827],[5.04093,51.4876],[5.04722,51.47217],[5.08032,51.47226],[5.10643,51.43135],[5.0727,51.39365],[5.11662,51.36118],[5.13225,51.3472],[5.13581,51.31594],[5.15592,51.31278],[5.20039,51.32325],[5.24326,51.3057],[5.22742,51.26844],[5.238,51.26255],[5.26216,51.26778],[5.335,51.26474],[5.34493,51.27681],[5.41551,51.2639],[5.44065,51.28246],[5.48215,51.30064],[5.51628,51.29599],[5.55816,51.26613],[5.56283,51.22287],[5.65253,51.19899],[5.65947,51.19052],[5.71011,51.18671],[5.74598,51.19455],[5.76873,51.18843],[5.78118,51.18082],[5.78447,51.15925],[5.82594,51.16827],[5.85709,51.14477],[5.83976,51.12993],[5.81435,51.11524],[5.83555,51.10842],[5.8338,51.09577],[5.82291,51.09124],[5.8119,51.0943],[5.79816,51.09023],[5.80612,51.07955],[5.80458,51.05888],[5.77731,51.05804],[5.76027,51.03223],[5.77383,51.02859],[5.77829,51.02399],[5.76759,51.00526],[5.76846,50.9985],[5.76419,50.99502],[5.74816,50.98087],[5.72174,50.96128],[5.73469,50.95683],[5.7426,50.96113],[5.74604,50.96209],[5.75617,50.95898],[5.76011,50.95227],[5.73223,50.9221],[5.72625,50.9059],[5.70051,50.90955],[5.69711,50.8958],[5.68051,50.88068],[5.64516,50.86533],[5.64337,50.84974],[5.64049,50.84701],[5.64576,50.83961],[5.64567,50.83789],[5.65094,50.83431],[5.65568,50.82591],[5.70296,50.80821],[5.69338,50.79687],[5.70259,50.78396],[5.69204,50.75629],[5.7218,50.76538],[5.73762,50.75842],[5.73912,50.76522],[5.76476,50.7837],[5.77748,50.78344],[5.78519,50.7684],[5.7927,50.77138],[5.80759,50.75681],[5.84525,50.76609],[5.84901,50.75975],[5.88667,50.77108],[5.89689,50.75501],[5.95896,50.76308],[6.02001,50.75521],[6.04208,50.74557],[6.03953,50.7295],[6.11623,50.72364],[6.1491,50.68465],[6.16312,50.67169],[6.17755,50.65576],[6.18715,50.6505],[6.18348,50.6457],[6.18205,50.63583],[6.26822,50.62829],[6.27251,50.62033],[6.24102,50.58657],[6.22795,50.58535],[6.18304,50.55597],[6.1833,50.54646],[6.19789,50.53715],[6.22586,50.49832],[6.26954,50.50961],[6.35349,50.49244],[6.34706,50.46422],[6.37423,50.45989],[6.3825,50.43975],[6.37408,50.40637],[6.35129,50.38206],[6.40305,50.34866],[6.41162,50.32769],[6.40783,50.31893],[6.38558,50.31658],[6.36388,50.30021],[6.32792,50.3186],[6.31289,50.31636],[6.29335,50.2909],[6.29547,50.27422],[6.28111,50.26236],[6.23624,50.25692],[6.21151,50.24816],[6.1981,50.23275],[6.18166,50.23125],[6.1789,50.22147],[6.19337,50.20761],[6.19683,50.17988],[6.15231,50.16841],[6.15923,50.14002],[6.13978,50.12527],[6.10856,50.1326],[6.11273,50.16093],[6.10156,50.16551],[6.08452,50.16697],[6.0821,50.15275],[6.06344,50.14834],[6.03055,50.15829],[6.02136,50.17685],[5.96932,50.16795],[5.96515,50.12813],[5.90347,50.11172],[5.89064,50.07554],[5.86237,50.06368],[5.8749,50.04624],[5.86392,50.02594],[5.82586,50.00934],[5.82665,50.00135],[5.8448,49.99123],[5.83952,49.9756],[5.80883,49.95773],[5.78215,49.957],[5.76822,49.91307],[5.74481,49.89975],[5.78087,49.88794],[5.78897,49.87213],[5.77636,49.86265],[5.75667,49.8703],[5.76191,49.85693],[5.75803,49.84287],[5.74291,49.83555],[5.75151,49.81985],[5.75473,49.79514],[5.7909,49.79765],[5.8179,49.75977],[5.83544,49.74713],[5.82702,49.72616],[5.86996,49.72777],[5.88817,49.70952],[5.86372,49.68213],[5.91262,49.66488],[5.90382,49.65192],[5.90876,49.63876],[5.89899,49.63401],[5.89117,49.63469],[5.87663,49.60771],[5.84953,49.59399],[5.87403,49.58991],[5.8736,49.57435],[5.84053,49.55222],[5.82582,49.54931],[5.81858,49.5461],[5.79504,49.55029],[5.77149,49.55832],[5.76226,49.554],[5.76126,49.53952],[5.74792,49.53452],[5.73009,49.53954],[5.6987,49.53744],[5.66008,49.55039],[5.64371,49.54565],[5.6228,49.5283],[5.62589,49.51698],[5.61175,49.50102],[5.59116,49.51734],[5.55638,49.52373],[5.54257,49.5105],[5.47007,49.49196]]],terms_url:"https://openstreetmap.org/",terms_text:"© OpenStreetMap contributors, CC-BY-SA; Tiles courtesy of GEO-6",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"MAPNIK",name:"OpenStreetMap (Standard)",type:"tms",template:"https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png",zoomExtent:[0,19],terms_url:"https://www.openstreetmap.org",terms_text:"© OpenStreetMap contributors, CC-BY-SA","default":true,description:"The default OpenStreetMap layer.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"osm-gps",name:"OpenStreetMap GPS traces",type:"tms",template:"https://{switch:a,b,c}.gps-tile.openstreetmap.org/lines/{zoom}/{x}/{y}.png",zoomExtent:[0,20],terms_url:"https://www.openstreetmap.org/copyright",terms_text:"© OpenStreetMap contributors",terms_html:"<span style='display: inline-block; padding: 0 8px; background-color: rgba(0,0,0,0.5);'><span style='color: #eee;'>GPS Direction:</span> <span style='font-size: 15px; padding-left: 2px; font-weight: bold;'> <span style='color: #0ee;'>&larr;</span> <span style='color: #96f;'>&darr;</span> <span style='color: #6e0;'>&uarr;</span> <span style='color: #f63;'>&rarr;</span> </span></span> © <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap contributors</a>.",description:"Public GPS traces uploaded to OpenStreetMap.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png",overlay:true},{id:"osm-hu-ortho",name:"openstreetmap.hu orthophotos",type:"tms",template:"http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/openstreetmap.hu.orthophotos/mercator/{zoom}/{x}/{y}.png",zoomExtent:[0,21],polygon:[[[18.8577,47.44553],[18.86169,47.44883],[18.86491,47.44704],[18.8609,47.44373],[18.8577,47.44553]],[[18.80614,47.59304],[18.81376,47.5974],[18.82295,47.59011],[18.81533,47.58574],[18.80614,47.59304]],[[17.66691,46.92167],[17.66369,46.93033],[17.67207,46.93178],[17.67529,46.92312],[17.66691,46.92167]],[[17.6725,46.93546],[17.67529,46.92708],[17.68409,46.92845],[17.68129,46.93683],[17.6725,46.93546]],[[17.82155,46.96075],[17.82507,46.9547],[17.83347,46.95701],[17.82995,46.96304],[17.82155,46.96075]],[[18.62796,47.19818],[18.63943,47.20324],[18.64953,47.1926],[18.63806,47.18753],[18.62796,47.19818]],[[17.51223,46.8789],[17.51406,46.88166],[17.5214,46.87939],[17.51957,46.87662],[17.51223,46.8789]],[[17.67724,46.91844],[17.68718,46.92344],[17.70594,46.90603],[17.69249,46.89926],[17.68144,46.90951],[17.68275,46.90595],[17.68198,46.90582],[17.68667,46.89926],[17.67947,46.89686],[17.67405,46.90445],[17.67131,46.90398],[17.66666,46.91662],[17.67724,46.91844]],[[18.80776,47.55615],[18.81638,47.55969],[18.81351,47.56305],[18.80473,47.55949],[18.80776,47.55615]],[[18.98706,47.46989],[18.97962,47.47042],[18.98056,47.47648],[18.988,47.47595],[18.98706,47.46989]],[[18.98356,47.41149],[19.00839,47.42511],[19.01568,47.41932],[18.9907,47.40518],[18.98356,47.41149]],[[19.02652,47.87563],[19.03163,47.87613],[19.03305,47.86957],[19.02793,47.86907],[19.02652,47.87563]],[[18.00803,46.86674],[18.01095,46.86028],[18.01323,46.86064],[18.01626,46.8536],[18.01682,46.85371],[18.01852,46.84948],[18.02021,46.84631],[18.02961,46.84829],[18.02742,46.85392],[18.03388,46.85534],[18.03056,46.86395],[18.03367,46.86456],[18.03058,46.87154],[18.00803,46.86674]],[[17.99509,46.87632],[17.98585,46.87595],[17.98535,46.88397],[17.98599,46.88412],[17.98531,46.88537],[17.95829,46.87876],[17.96077,46.87351],[17.92868,46.86631],[17.92467,46.87372],[17.93136,46.87535],[17.92995,46.87822],[17.9553,46.88415],[17.9946,46.89341],[17.99786,46.88671],[17.98771,46.88443],[17.98774,46.88411],[17.99415,46.88442],[17.99509,46.87632]],[[18.86533,47.42808],[18.87291,47.42455],[18.87701,47.42871],[18.86799,47.43238],[18.86774,47.43208],[18.86517,47.43317],[18.86477,47.4327],[18.86441,47.43285],[18.86288,47.43108],[18.86328,47.43092],[18.86288,47.43046],[18.86516,47.42947],[18.86448,47.42875],[18.86553,47.42829],[18.86533,47.42808]],[[19.16232,47.59776],[19.16893,47.59033],[19.17815,47.59512],[19.17291,47.60068],[19.16232,47.59776]],[[18.13162,47.02619],[18.14103,47.02111],[18.13923,47.01957],[18.15704,47.01044],[18.16271,47.00242],[18.16463,46.99571],[18.16639,46.9959],[18.16702,46.99363],[18.17101,46.99454],[18.1722,46.99571],[18.16977,47.00416],[18.17656,47.00709],[18.1761,47.00771],[18.17639,47.00781],[18.17057,47.01414],[18.1748,47.01815],[18.17782,47.01428],[18.18518,47.01746],[18.17933,47.0239],[18.17589,47.02268],[18.17277,47.02434],[18.17219,47.02377],[18.17159,47.02407],[18.16938,47.0221],[18.16216,47.02596],[18.16485,47.02832],[18.16245,47.02947],[18.16323,47.03025],[18.1521,47.03554],[18.15156,47.03498],[18.1503,47.03563],[18.14513,47.03112],[18.14337,47.0322],[18.1454,47.03419],[18.14441,47.03467],[18.14522,47.03539],[18.14168,47.03697],[18.13111,47.02745],[18.13226,47.0269],[18.13162,47.02619]],[[17.79852,46.81745],[17.79178,46.81585],[17.79601,46.80664],[17.7948,46.80598],[17.79693,46.80056],[17.80109,46.79993],[17.80736,46.80225],[17.79852,46.81745]],[[17.7788,46.81461],[17.78446,46.80714],[17.79083,46.80925],[17.7853,46.81683],[17.7788,46.81461]]],terms_text:"openstreetmap.hu"},{id:"OpenTopoMap",name:"OpenTopoMap",type:"tms",template:"https://{switch:a,b,c}.tile.opentopomap.org/{zoom}/{x}/{y}.png",zoomExtent:[3,17],terms_url:"https://tile.opentopomap.org/about#verwendung",terms_text:"Kartendaten: © OpenStreetMap-Mitwirkende, SRTM | Kartendarstellung: © OpenTopoMap (CC-BY-SA)",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenTopoMap.png"},{id:"lu.geoportail.opendata.ortho2010",name:"Ortho 2010 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2010/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2010-07-02T00:00:00.000Z",startDate:"2010-06-24T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"lu.geoportail.opendata.ortho2013",name:"Ortho 2013 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2013/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2013-07-20T00:00:00.000Z",startDate:"2013-07-19T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"lu.geoportail.opendata.ortho2016",name:"Ortho 2016 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2016/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2016-08-16T00:00:00.000Z",startDate:"2013-08-30T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"lu.geoportail.opendata.ortho2017",name:"Ortho 2017 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2017/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2017-06-22T00:00:00.000Z",startDate:"2017-06-14T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"ORTOFOTO_V1",name:"Orthophoto 1st cycle (1994-1999) - Latvia",type:"wms",template:"https://services.lgia.gov.lv/arcfree/services/Ortofoto_v1/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[27.66415,55.75354],[27.68475,55.93319],[28.26703,56.1908],[28.23682,56.49827],[27.82757,56.94886],[27.90997,57.37037],[27.58313,57.56387],[26.93219,57.63598],[26.5202,57.58596],[26.0368,57.87192],[25.1991,58.10487],[24.31744,57.90258],[24.31744,57.19669],[23.93567,56.9788],[23.55115,56.98479],[23.23804,57.10283],[23.14465,57.37333],[22.60632,57.60215],[22.60083,57.76953],[21.66699,57.56681],[21.40057,57.29625],[21.38409,57.0177],[21.04626,56.80026],[20.99133,56.36615],[21.0545,56.0392],[21.28796,56.05608],[21.29895,56.1908],[22.11743,56.41936],[24.44379,56.24425],[24.81183,56.3996],[25.15515,56.1694],[25.58087,56.12962],[26.53668,55.66146],[26.91296,55.66766],[27.0805,55.80991],[27.66415,55.75354]]],terms_text:"Latvijas Ģeotelpiskās informācijas aģentūras brīvais WMS serviss 1994 - 1999.gada Latvijas ortofotokarte"},{id:"ORTOS_DGRF_2004_06",name:"Ortofotos DGRF 2004-2006 (WMS)",type:"wms",template:"http://mapas.dgterritorio.pt:8888/wms/produtos?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Ortos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2006-01-01T00:00:00.000Z",startDate:"2004-01-01T00:00:00.000Z",zoomExtent:[14,19],polygon:[[[-7.31278,36.98391],[-7.44461,37.5718],[-7.1933,37.97019],[-6.97357,38.00807],[-6.90628,38.24142],[-7.06627,38.20743],[-7.27158,38.45628],[-7.20429,38.72356],[-7.0134,38.85468],[-6.91315,39.03839],[-6.97357,39.13113],[-7.17957,39.23651],[-7.28668,39.48497],[-7.44873,39.61838],[-7.34162,39.60886],[-6.99692,39.64906],[-6.81839,40.0192],[-7.01065,40.19986],[-6.85272,40.24285],[-6.76209,40.35073],[-6.77994,40.8886],[-6.88637,41.01151],[-6.79642,41.01721],[-6.63849,41.21689],[-6.4531,41.24116],[-6.29311,41.38763],[-6.15715,41.5908],[-6.31165,41.68932],[-6.51215,41.71188],[-6.49841,41.88081],[-6.56296,41.97991],[-6.80191,42.00951],[-7.20497,42.00135],[-7.22763,41.8849],[-7.36908,41.87058],[-7.72751,41.92885],[-7.92526,41.94009],[-8.07907,41.84706],[-8.1601,41.91812],[-8.01796,42.05031],[-8.19924,42.18681],[-8.39356,42.1023],[-8.66066,42.07886],[-8.88382,41.88081],[-9.17084,41.86956],[-9.04175,41.43655],[-9.01978,40.65981],[-9.15711,40.26695],[-9.81903,39.52099],[-9.74213,38.6512],[-9.12964,37.88136],[-9.27246,36.99378],[-9.09394,36.68604],[-7.80579,36.74989],[-7.31278,36.98391]]],terms_url:"http://www.dgterritorio.pt/dados_abertos/ortofotos/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"ORTOS_DGT_2014_15",name:"Ortofotos Litoral DGT 2014-2015 (WMS)",type:"wms",template:"http://ows.dgterritorio.pt/wss/service/ortos2014-2015-wms/guest?language=por&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Ortoimagens_2014-2015_Litoral&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[1,20],polygon:[[[-7.38968,37.19205],[-7.52426,37.18002],[-7.89505,36.98171],[-8.15186,37.10886],[-8.65036,37.14062],[-8.95111,37.03545],[-8.78632,37.34833],[-8.76434,37.55111],[-8.7561,38.38258],[-8.47664,38.33466],[-8.47183,38.40141],[-8.66066,38.46596],[-8.66959,38.60882],[-9.142,38.53689],[-8.81104,38.67372],[-8.79318,38.85468],[-8.95935,38.9829],[-9.18732,38.84934],[-9.2395,38.72838],[-9.37821,38.74659],[-9.38233,39.07891],[-9.29169,39.2514],[-9.31915,39.33642],[-9.17084,39.38526],[-9.06372,39.48815],[-9.02252,39.69662],[-8.78632,40.14529],[-8.86322,40.2093],[-8.72589,40.53155],[-8.64075,40.50858],[-8.62427,40.63063],[-8.53089,40.6004],[-8.535,40.71292],[-8.61466,40.89275],[-8.61878,41.10419],[-8.53089,41.16728],[-8.66959,41.21689],[-8.72315,41.41081],[-8.76984,41.65958],[-8.66547,41.73955],[-8.81104,41.72316],[-8.81104,41.85217],[-8.74649,41.9125],[-8.83576,41.93089],[-8.91815,41.84501],[-8.89343,41.70778],[-8.82065,41.50755],[-8.73139,41.16315],[-8.67508,41.069],[-8.68469,40.90729],[-8.93326,40.17573],[-8.88107,40.12219],[-9.11453,39.64694],[-9.11865,39.5623],[-9.3013,39.40543],[-9.43039,39.37571],[-9.34799,39.23864],[-9.45099,39.04799],[-9.45786,38.89317],[-9.53201,38.78835],[-9.50043,38.68551],[-9.28894,38.663],[-9.19418,38.54172],[-9.25324,38.38473],[-9.03488,38.42347],[-8.92502,38.46757],[-8.81241,38.35997],[-8.7973,38.14968],[-8.91953,37.95286],[-8.84262,37.8651],[-8.83988,37.40617],[-9.02664,37.01023],[-8.92914,36.97513],[-8.61466,37.099],[-8.15048,37.05956],[-7.8923,36.93672],[-7.48993,37.15156],[-7.39105,37.15813],[-7.38968,37.19205]]],terms_url:"http://www.dgterritorio.pt/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"OS-historic-25k-OSM_Limited",name:"OS 1:25k historic (OSM)",type:"tms",template:"https://ooc.openstreetmap.org/os1/{zoom}/{x}/{y}.jpg",zoomExtent:[6,17],polygon:[[[-6.45854,49.90441],[-6.3872,49.98411],[-6.22968,49.98962],[-6.21713,49.86801],[-6.45512,49.85918],[-6.45854,49.90441]],[[-1.44951,60.86341],[-0.71671,60.85451],[-0.73497,60.43598],[-0.69388,60.41682],[-0.72584,60.39427],[-0.73954,60.04847],[-0.92674,60.04619],[-0.93815,59.82662],[-1.45865,59.8312],[-1.44552,60.0536],[-1.46321,60.0536],[-1.46435,60.063],[-1.57165,60.06385],[-1.56936,60.179],[-1.64356,60.1807],[-1.64356,60.18922],[-1.82162,60.1895],[-1.82048,60.36155],[-1.8416,60.36973],[-1.82162,60.38328],[-1.81799,60.59343],[-1.45317,60.59343],[-1.44951,60.86341]],[[-4.90892,54.42421],[-4.2826,54.44299],[-4.25354,54.02977],[-4.87664,54.02218],[-4.90892,54.42421]],[[-5.86674,59.14446],[-5.776,59.14709],[-5.772,59.10141],[-5.86218,59.09906],[-5.86674,59.14446]],[[-1.70659,59.57036],[-1.55792,59.56935],[-1.55649,59.49657],[-1.70545,59.49758],[-1.70659,59.57036]],[[-7.68658,58.2941],[-7.53306,58.3007],[-7.52564,58.26469],[-7.67973,58.25779],[-7.68658,58.2941]],[[-4.53383,59.03599],[-4.48132,59.03716],[-4.47961,59.01866],[-4.53326,59.01807],[-4.53383,59.03599]],[[-8.67107,57.87699],[-8.46732,57.88973],[-8.44678,57.7907],[-8.65109,57.77792],[-8.67107,57.87699]],[[-5.23955,50.35306],[-5.79201,50.33849],[-5.76005,49.9317],[-4.65514,49.95815],[-4.67797,50.28601],[-4.24422,50.28017],[-4.24878,50.20425],[-3.38129,50.20425],[-3.42238,50.51882],[-3.11648,50.52463],[-3.12105,50.65796],[-2.67364,50.66195],[-2.59535,50.63943],[-2.5905,50.57284],[-2.47912,50.57335],[-2.47589,50.50667],[-2.39679,50.50564],[-2.40164,50.57233],[-1.04003,50.57182],[-1.03357,50.70593],[-0.5493,50.70388],[-0.54607,50.78866],[-0.09247,50.7856],[-0.08763,50.71819],[0.47897,50.71206],[0.48704,50.81825],[0.97615,50.80499],[0.99229,51.01263],[1.44912,51.00044],[1.47818,51.40904],[1.02296,51.42716],[1.03588,51.76409],[1.61054,51.7501],[1.64606,52.156],[1.72677,52.15402],[1.74937,52.44818],[1.78707,52.48116],[1.7591,52.52251],[1.79335,52.96027],[0.37981,52.99585],[0.38952,53.25112],[0.34786,53.25112],[0.32389,53.28219],[0.34615,53.65385],[0.12849,53.65755],[0.11658,53.66747],[0.13506,54.06557],[-0.06098,54.06591],[-0.04142,54.47094],[-0.56627,54.47718],[-0.55921,54.65651],[-1.16656,54.66235],[-1.16374,54.84261],[-1.33162,54.84391],[-1.32571,55.24708],[-1.52945,55.24871],[-1.52418,55.65401],[-1.76388,55.65401],[-1.77337,55.97191],[-2.16079,55.9683],[-2.15433,56.06214],[-2.45781,56.05853],[-2.41906,56.64172],[-2.09622,56.64172],[-2.0833,57.00213],[-1.92834,57.01268],[-1.9181,57.35909],[-1.75022,57.36257],[-1.76959,57.76086],[-3.69376,57.75742],[-3.70667,57.98064],[-3.5969,57.97721],[-3.60336,58.12073],[-3.02223,58.13096],[-3.02869,58.54108],[-2.8479,58.53097],[-2.86081,58.84305],[-2.67962,58.8415],[-2.68419,58.88517],[-2.63397,58.90522],[-2.67962,58.93351],[-2.68876,59.02292],[-2.36687,59.02292],[-2.37029,59.26529],[-2.3429,59.2822],[-2.37144,59.29969],[-2.37372,59.37071],[-2.3429,59.38582],[-2.37258,59.40035],[-2.37144,59.42591],[-3.07342,59.42301],[-3.07114,59.34336],[-3.1031,59.33114],[-3.07456,59.31367],[-3.07228,59.2326],[-3.38503,59.14842],[-3.37476,58.93528],[-3.56538,58.93233],[-3.55483,58.69759],[-5.28086,58.66677],[-5.25342,58.35141],[-5.50685,58.34379],[-5.47618,58.03236],[-5.8975,58.02124],[-5.8523,57.61718],[-6.13963,57.61372],[-6.15416,57.74232],[-6.29137,57.73801],[-6.33657,58.13988],[-6.11219,58.14669],[-6.14738,58.51063],[-6.29348,58.54162],[-6.84137,58.29773],[-7.00574,58.29293],[-7.10162,58.20644],[-7.25731,58.17931],[-7.25311,58.10049],[-7.40707,58.09056],[-7.39135,57.79114],[-7.79099,57.77332],[-7.76242,57.54442],[-7.6985,57.14532],[-7.79438,57.13045],[-7.71676,56.73686],[-7.01221,56.76544],[-6.97992,56.54539],[-7.06386,56.54539],[-7.04449,56.35626],[-6.50068,56.38129],[-6.44914,55.97936],[-6.56329,55.96915],[-6.53937,55.70301],[-6.55955,55.69073],[-6.53453,55.67617],[-6.52162,55.57044],[-5.89126,55.59234],[-5.85601,55.23207],[-5.22936,55.2516],[-5.18371,54.62541],[-3.6656,54.65184],[-3.64962,54.432],[-3.54004,54.43067],[-3.53091,54.02902],[-3.06977,54.03036],[-3.06757,53.82214],[-3.08049,53.77399],[-3.06192,53.74775],[-3.06112,53.6737],[-3.21447,53.67084],[-3.20577,53.42262],[-3.27996,53.35522],[-3.28967,53.36084],[-3.33275,53.36493],[-3.37613,53.35403],[-4.0889,53.34331],[-4.09455,53.4612],[-4.69741,53.44486],[-4.68828,53.33186],[-4.72024,53.28958],[-4.68371,53.24862],[-4.67687,53.15426],[-4.84808,53.14468],[-4.81783,52.74403],[-4.25458,52.75589],[-4.22888,52.25488],[-4.26076,52.25364],[-4.27246,52.24326],[-4.81363,52.23009],[-4.80792,52.11389],[-5.38891,52.09917],[-5.37179,51.91297],[-5.42087,51.91015],[-5.41402,51.84532],[-5.36836,51.84744],[-5.34668,51.55953],[-4.77368,51.57585],[-4.76569,51.48851],[-4.19154,51.49704],[-4.18698,51.43447],[-3.61512,51.44443],[-3.61055,51.37465],[-3.14941,51.37893],[-3.14941,51.29193],[-4.30387,51.27459],[-4.28612,51.05087],[-4.85433,51.03666],[-4.83722,50.72128],[-5.26183,50.70827],[-5.23955,50.35306]],[[-2.15027,60.17132],[-2.00302,60.16961],[-2.00131,60.0997],[-2.14855,60.10112],[-2.15027,60.17132]],[[-6.2086,59.11635],[-6.12299,59.11664],[-6.12185,59.0715],[-6.20974,59.0715],[-6.2086,59.11635]],[[-4.41596,59.0889],[-4.4212,59.07708],[-4.39719,59.07791],[-4.39134,59.08973],[-4.41596,59.0889]]]},{id:"OS-New_Popular_Edition-historic",name:"OS New Popular Edition historic",type:"tms",template:"https://ooc.openstreetmap.org/npe/{zoom}/{x}/{y}.png",zoomExtent:[6,15],polygon:[[[-3.68466,55.23744],[-3.65106,54.42892],[-3.54463,54.43072],[-3.52815,54.02593],[-3.07016,54.03137],[-3.06123,53.6717],[-3.21298,53.67048],[-3.20371,53.35568],[-4.10424,53.34297],[-4.11042,53.46005],[-4.71124,53.44799],[-4.69339,53.15171],[-4.84307,53.1476],[-4.81595,52.74378],[-4.25342,52.75541],[-4.22733,52.24378],[-4.81303,52.23117],[-4.80754,52.11452],[-5.38913,52.09892],[-5.3493,51.56085],[-4.77252,51.57622],[-4.76772,51.48652],[-4.19299,51.49806],[-4.18956,51.43518],[-3.61278,51.44502],[-3.61072,51.37307],[-3.15067,51.37864],[-3.14723,51.28984],[-4.29462,51.2718],[-4.28363,51.04744],[-4.85423,51.03406],[-4.83707,50.76556],[-5.2621,50.75427],[-5.23395,50.34984],[-5.79562,50.33319],[-5.76228,49.92913],[-4.64717,49.96094],[-4.66914,50.2753],[-4.25166,50.2832],[-4.24617,50.19361],[-3.40159,50.20679],[-3.41395,50.52041],[-3.13105,50.52391],[-3.1338,50.66078],[-2.66963,50.66252],[-2.66688,50.5719],[-1.04228,50.56929],[-1.04502,50.70429],[-0.54652,50.69994],[-0.54103,50.79031],[-0.08784,50.78424],[-0.08887,50.72211],[0.47693,50.70907],[0.48242,50.81939],[0.98024,50.8068],[0.99328,51.01333],[1.44784,51.00036],[1.47805,51.40478],[1.018,51.41634],[1.04272,51.76742],[1.6195,51.75084],[1.65246,52.15456],[1.72662,52.15245],[1.79529,52.9594],[0.60396,52.99123],[0.60327,52.97222],[0.38148,52.97883],[0.39625,53.24796],[0.31934,53.24961],[0.34269,53.65319],[0.11609,53.65726],[0.13738,54.06181],[-0.06243,54.06584],[-0.04183,54.46924],[-0.56781,54.47722],[-0.56163,54.65715],[-1.18098,54.66271],[-1.17755,54.84183],[-1.33342,54.84381],[-1.32655,55.24743],[-1.53117,55.24821],[-1.52636,55.6528],[-1.76394,55.6528],[-1.76257,55.96765],[-2.40321,55.96727],[-2.39772,55.56243],[-2.16151,55.56282],[-2.15808,55.2486],[-2.92158,55.24571],[-3.68466,55.23744]]]},{id:"OS-OpenData_Locator",name:"OS OpenData Locator",type:"tms",template:"http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png",zoomExtent:[0,22],polygon:[[[-0.88639,61.11666],[-9.24009,57.92465],[-6.61235,55.46835],[-6.1039,55.40191],[-5.61358,55.06607],[-5.40088,54.90562],[-5.29371,54.77201],[-5.11832,54.5911],[-4.92368,54.38599],[-4.94067,53.59884],[-5.44172,52.27725],[-6.03376,51.6012],[-7.54473,49.33762],[-2.59721,50.2588],[0.65674,50.64047],[1.32419,50.83256],[1.87586,51.19234],[2.05883,52.88863],[-1.61452,56.47933],[-1.21085,57.64972],[-1.69525,59.08903],[0.21543,60.43058],[-0.88639,61.11666]]],overlay:true},{id:"OS-OpenData_StreetView",name:"OS OpenData StreetView",type:"tms",template:"https://{switch:a,b,c}.os.openstreetmap.org/sv/{zoom}/{x}/{y}.png",zoomExtent:[1,18],polygon:[[[-5.82929,50.02297],[-5.82929,50.25482],[-5.37336,50.25482],[-5.37336,50.35306],[-5.1756,50.35306],[-5.1756,50.59254],[-4.99707,50.59254],[-4.99707,50.69356],[-4.79657,50.69356],[-4.79657,50.78221],[-4.69495,50.78221],[-4.69495,50.96074],[-4.60431,50.96074],[-4.60431,51.06921],[-4.37922,51.06921],[-4.37922,51.25218],[-3.90393,51.25218],[-3.90393,51.2917],[-3.71717,51.2917],[-3.71717,51.2453],[-3.14862,51.2453],[-3.14862,51.36207],[-3.74463,51.36207],[-3.74463,51.43404],[-3.82978,51.43404],[-3.82978,51.52982],[-4.08521,51.52982],[-4.08521,51.49393],[-4.37922,51.49393],[-4.37922,51.54272],[-5.14442,51.54272],[-5.14442,51.6296],[-5.73871,51.6296],[-5.73871,51.77404],[-5.50954,51.77404],[-5.50954,51.98026],[-5.1988,51.98026],[-5.1988,52.09734],[-4.88806,52.09734],[-4.88806,52.18316],[-4.49575,52.18316],[-4.49575,52.29257],[-4.30154,52.29257],[-4.30154,52.36853],[-4.18112,52.36853],[-4.18112,52.79337],[-4.44137,52.79337],[-4.44137,52.73696],[-4.85698,52.73696],[-4.85698,52.93173],[-4.7288,52.93173],[-4.7288,53.50386],[-4.15782,53.50386],[-4.15782,53.41135],[-3.31105,53.41135],[-3.31105,53.50386],[-3.23337,53.50386],[-3.23337,54.01592],[-3.39262,54.01592],[-3.39262,54.1981],[-3.55964,54.1981],[-3.55964,54.43373],[-3.7189,54.43373],[-3.7189,54.7219],[-4.30154,54.7219],[-4.30154,54.61407],[-5.04731,54.61407],[-5.04731,54.75329],[-5.22987,54.75329],[-5.22987,55.21908],[-5.65326,55.21908],[-5.65326,55.25009],[-5.89796,55.25009],[-5.89796,55.48225],[-6.59332,55.48225],[-6.59332,56.30134],[-7.17277,56.30134],[-7.17277,56.56018],[-6.81717,56.56018],[-6.81717,56.69917],[-6.53153,56.69917],[-6.53153,56.9067],[-6.81168,56.9067],[-6.81168,57.37166],[-6.8721,57.37166],[-6.8721,57.55189],[-7.09732,57.55189],[-7.09732,57.24111],[-7.17423,57.24111],[-7.17423,56.9067],[-7.37198,56.9067],[-7.37198,56.80759],[-7.5203,56.80759],[-7.5203,56.71425],[-7.83068,56.71425],[-7.83068,56.89946],[-7.64941,56.89946],[-7.64941,57.47396],[-7.83068,57.47396],[-7.83068,57.79156],[-7.47362,57.79156],[-7.47362,58.08606],[-7.18798,58.08606],[-7.18798,58.3672],[-6.80346,58.3672],[-6.80346,58.41558],[-6.63866,58.41558],[-6.63866,58.46733],[-6.51781,58.46733],[-6.51781,58.56256],[-6.05362,58.56256],[-6.05362,58.15688],[-6.14701,58.15688],[-6.14701,58.11059],[-6.27998,58.11059],[-6.27998,57.71227],[-6.15913,57.71227],[-6.15913,57.66676],[-5.93391,57.66676],[-5.93391,57.88925],[-5.80643,57.88925],[-5.80643,57.96218],[-5.61417,57.96218],[-5.61417,58.09112],[-5.49082,58.09112],[-5.49082,58.37333],[-5.31991,58.37333],[-5.31991,58.75015],[-3.572,58.75015],[-3.572,59.20918],[-3.19445,59.20918],[-3.19445,59.47592],[-2.24358,59.47592],[-2.24358,59.13887],[-2.4611,59.13887],[-2.4611,58.81859],[-2.74077,58.81859],[-2.74077,58.58047],[-2.91167,58.58047],[-2.91167,58.11575],[-3.48654,58.11575],[-3.48654,57.74039],[-1.71532,57.74039],[-1.71532,57.22256],[-1.97945,57.22256],[-1.97945,56.87607],[-2.1659,56.87607],[-2.1659,56.63332],[-2.36011,56.63332],[-2.36011,56.04775],[-1.97945,56.04775],[-1.97945,55.86509],[-1.4745,55.86509],[-1.4745,55.24999],[-1.3222,55.24999],[-1.3222,54.82217],[-1.055,54.82217],[-1.055,54.67466],[-0.66188,54.67466],[-0.66188,54.55275],[-0.32476,54.55275],[-0.32476,54.28652],[0.00928,54.28652],[0.00928,53.79385],[0.2082,53.79385],[0.2082,53.52177],[0.41635,53.52177],[0.41635,53.02989],[1.42734,53.02989],[1.42734,52.92021],[1.83339,52.92021],[1.83339,52.04249],[1.52355,52.04249],[1.52355,51.82613],[1.2697,51.82613],[1.2697,51.69675],[1.11665,51.69675],[1.11665,51.44035],[1.52355,51.44035],[1.52355,51.33318],[1.45076,51.33318],[1.45076,51.02076],[1.06999,51.02076],[1.06999,50.90084],[0.77881,50.90084],[0.77881,50.72984],[-0.7256,50.72984],[-0.7256,50.70384],[-1.00744,50.70384],[-1.00744,50.57363],[-2.36253,50.57363],[-2.36253,50.48464],[-2.49878,50.48464],[-2.49878,50.57363],[-3.40964,50.57363],[-3.40964,50.20578],[-3.69224,50.20578],[-3.69224,50.13477],[-5.00547,50.13477],[-5.00547,49.94745],[-5.28395,49.94745],[-5.28395,50.02297],[-5.82929,50.02297]],[[-6.45807,49.86736],[-6.45807,49.94999],[-6.39788,49.94999],[-6.39788,50.00538],[-6.17996,50.00538],[-6.17996,49.91686],[-6.25402,49.91686],[-6.25402,49.86736],[-6.45807,49.86736]],[[-5.83432,49.93216],[-5.83432,49.97546],[-5.76833,49.97546],[-5.76833,49.93216],[-5.83432,49.93216]],[[-1.94838,60.68857],[-1.94838,60.30588],[-1.75431,60.30588],[-1.75431,60.12844],[-1.57549,60.12844],[-1.57549,59.79792],[-1.0317,59.79792],[-1.0317,60.03545],[-0.66269,60.03545],[-0.66269,60.91039],[-1.10344,60.91039],[-1.10344,60.804],[-1.35063,60.804],[-1.35063,60.68857],[-1.94838,60.68857]],[[-2.20338,60.19686],[-2.20338,60.09294],[-1.9864,60.09294],[-1.9864,60.19686],[-2.20338,60.19686]],[[-1.75431,59.56983],[-1.75431,59.46394],[-1.53733,59.46394],[-1.53733,59.56983],[-1.75431,59.56983]],[[-4.5586,59.13705],[-4.5586,58.95691],[-4.2867,58.95691],[-4.2867,59.13705],[-4.5586,59.13705]],[[-6.27877,59.20257],[-6.27877,59.02278],[-5.66506,59.02278],[-5.66506,59.20257],[-6.27877,59.20257]],[[-8.71635,57.94406],[-8.71635,57.73059],[-8.35929,57.73059],[-8.35929,57.94406],[-8.71635,57.94406]],[[-7.6077,50.4021],[-7.6077,50.26887],[-7.39072,50.26887],[-7.39072,50.4021],[-7.6077,50.4021]],[[-7.73043,58.35799],[-7.73043,58.24831],[-7.51345,58.24831],[-7.51345,58.35799],[-7.73043,58.35799]]]},{id:"OS-Scottish_Popular-historic",name:"OS Scottish Popular historic",type:"tms",template:"https://ooc.openstreetmap.org/npescotland/{zoom}/{x}/{y}.jpg",zoomExtent:[6,15],polygon:[[[-6.37546,57.1045],[-6.12998,57.11183],[-6.12586,56.94143],[-6.26045,56.93892],[-6.26045,56.83765],[-6.24259,56.65806],[-6.3552,56.65655],[-6.37649,56.79029],[-7.02812,56.76396],[-6.99636,56.54246],[-7.04391,56.53937],[-7.03206,56.44201],[-6.98331,56.44353],[-6.97593,56.36063],[-6.45271,56.37964],[-6.44035,56.2013],[-6.19315,56.21199],[-6.18354,56.12483],[-6.36379,56.11641],[-6.36173,55.98258],[-6.48944,55.97912],[-6.47777,55.84134],[-6.55467,55.8371],[-6.53545,55.66049],[-6.45442,55.66087],[-6.44412,55.57285],[-6.19985,55.57266],[-5.96845,55.58857],[-5.98562,55.7686],[-5.90665,55.77169],[-5.88949,55.59284],[-5.80983,55.594],[-5.79335,55.41395],[-5.827,55.41395],[-5.80915,55.24247],[-5.61826,55.24873],[-5.62101,55.26713],[-5.46239,55.27026],[-5.48642,55.514],[-5.43836,55.51516],[-5.42943,55.42681],[-5.24129,55.43071],[-5.19464,54.80351],[-5.07105,54.80668],[-5.05221,54.62471],[-4.3223,54.65173],[-4.33123,54.7319],[-4.06786,54.73697],[-4.06786,54.76471],[-3.55699,54.77342],[-3.55837,54.83754],[-2.42098,54.84671],[-2.42647,55.25265],[-2.03097,55.25265],[-2.01449,55.56606],[-1.76455,55.56606],[-1.76455,55.9724],[-2.35026,55.96548],[-2.5796,56.06527],[-2.58234,56.37071],[-2.65032,56.36919],[-2.65581,56.50585],[-2.48965,56.50509],[-2.42785,56.55356],[-2.42373,56.73026],[-2.1628,56.73177],[-2.17104,56.99301],[-2.00075,56.99301],[-1.98479,57.3159],[-1.83476,57.31553],[-1.83441,57.36074],[-1.75167,57.36111],[-1.74893,57.63046],[-1.83613,57.63009],[-1.83544,57.70171],[-2.00436,57.70207],[-2.00367,57.71968],[-3.22281,57.71418],[-3.22629,57.76157],[-3.51331,57.77622],[-3.50914,57.71051],[-3.84766,57.70611],[-3.85182,57.76853],[-3.79925,57.76989],[-3.80474,57.88578],[-3.85556,57.88651],[-3.85937,57.97558],[-3.79513,57.97656],[-3.79483,58.03052],[-3.69733,58.03161],[-3.69458,58.06722],[-3.52391,58.07437],[-3.52978,58.16007],[-3.35774,58.16286],[-3.3483,58.28742],[-3.07638,58.29121],[-3.03004,58.43744],[-3.01768,58.65814],[-2.85837,58.66028],[-2.86524,58.7943],[-2.75812,58.79715],[-2.76636,58.87461],[-2.6208,58.88668],[-2.62766,58.97527],[-2.54114,58.97668],[-2.54217,59.0841],[-2.52363,59.08375],[-2.52913,59.1574],[-2.43849,59.15705],[-2.4378,59.246],[-2.36914,59.24705],[-2.3688,59.40748],[-2.52947,59.40748],[-2.52741,59.33436],[-2.70319,59.33576],[-2.70525,59.40608],[-3.12891,59.40433],[-3.12411,59.15951],[-3.40288,59.1574],[-3.39464,58.9689],[-3.4276,58.96961],[-3.42572,58.88526],[-3.45215,58.87071],[-3.51017,58.86911],[-3.50708,58.78826],[-3.38555,58.79004],[-3.3828,58.6999],[-3.4494,58.69847],[-3.45078,58.65385],[-3.50159,58.65421],[-3.5009,58.62705],[-3.72612,58.62383],[-3.72475,58.60595],[-4.6476,58.5895],[-4.65996,58.67171],[-5.10697,58.66135],[-5.09804,58.58091],[-5.23743,58.57769],[-5.22455,58.26305],[-5.4127,58.25818],[-5.39965,58.12245],[-5.53286,58.11991],[-5.52393,57.99494],[-5.55346,57.99422],[-5.54728,57.93995],[-5.85696,57.93157],[-5.83181,57.73361],[-5.86374,57.73224],[-5.85773,57.66096],[-6.19624,57.64975],[-6.20242,57.72353],[-6.41666,57.7162],[-6.42421,57.75945],[-6.4764,57.75725],[-6.46884,57.71326],[-6.53339,57.71216],[-6.52721,57.6391],[-6.692,57.63395],[-6.68102,57.54341],[-6.78195,57.53826],[-6.75311,57.31608],[-6.50592,57.32498],[-6.49768,57.28084],[-6.4812,57.27824],[-6.47159,57.19203],[-6.38644,57.19352],[-6.37546,57.1045]],[[-7.65043,56.77461],[-7.40667,56.79304],[-7.41972,56.88281],[-7.38676,56.90268],[-7.25836,56.91056],[-7.24806,57.07141],[-7.11485,57.077],[-7.16772,57.43466],[-7.0352,57.44094],[-7.05236,57.69026],[-6.86834,57.6976],[-6.87315,57.71631],[-6.70286,57.72217],[-6.71591,57.81117],[-6.53188,57.81958],[-6.53875,57.88133],[-6.22015,57.89265],[-6.24143,58.09935],[-6.12676,58.10152],[-6.17758,58.53105],[-6.46734,58.52029],[-6.4591,58.45102],[-6.63145,58.44455],[-6.6239,58.39169],[-6.79212,58.38485],[-6.78869,58.34956],[-6.90885,58.34415],[-6.89718,58.25503],[-7.20136,58.24166],[-7.14094,57.83201],[-7.37509,57.82104],[-7.36822,57.69503],[-7.6573,57.68292],[-7.67652,57.80715],[-7.79257,57.80202],[-7.77327,57.67734],[-7.70756,57.68024],[-7.69376,57.59088],[-7.75947,57.58797],[-7.74587,57.49965],[-7.51241,57.5085],[-7.47911,57.29468],[-7.52855,57.2932],[-7.51276,57.05871],[-7.61163,57.05386],[-7.59859,56.87493],[-7.66725,56.87268],[-7.65043,56.77461]],[[-1.46238,59.82831],[-1.21519,59.83107],[-1.21519,59.96194],[-1.10533,59.96056],[-1.0986,60.09498],[-0.97632,60.09346],[-0.96352,60.3476],[-0.74028,60.34484],[-0.7147,60.84722],[-1.08215,60.85901],[-1.08455,60.76944],[-1.21296,60.77011],[-1.21579,60.68079],[-1.23364,60.68113],[-1.23467,60.5909],[-1.27132,60.59191],[-1.27338,60.64581],[-1.45466,60.64648],[-1.45397,60.59224],[-1.6373,60.59292],[-1.63954,60.3507],[-1.73172,60.35095],[-1.73172,60.18067],[-1.64177,60.17931],[-1.64177,60.1448],[-1.46393,60.14344],[-1.46238,59.82831]],[[-6.21496,56.97437],[-6.22525,57.06445],[-6.29117,57.06184],[-6.29237,57.08062],[-6.62162,57.06943],[-6.61338,57.00629],[-6.46163,57.01302],[-6.4582,56.96776],[-6.21496,56.97437]],[[-2.12774,60.10855],[-2.12803,60.16207],[-2.00203,60.16224],[-2.00174,60.10872],[-2.12774,60.10855]],[[-6.68977,56.95804],[-6.69228,56.9759],[-6.65984,56.97726],[-6.65733,56.9594],[-6.68977,56.95804]],[[-7.66365,58.25846],[-7.66844,58.28502],[-7.54896,58.29098],[-7.54417,58.26442],[-7.66365,58.25846]],[[-8.65104,57.78885],[-8.66674,57.875],[-8.48272,57.88449],[-8.46702,57.79836],[-8.65104,57.78885]]]},{id:"osmie_barony",name:"OSMIE Baronies",type:"tms",template:"https://tile.openstreetmap.ie/barony/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_cps",name:"OSMIE Civil Parishes",type:"tms",template:"https://tile.openstreetmap.ie/civilparish/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_dail_ea",name:"OSMIE Dail Election Areas",type:"tms",template:"https://tile.openstreetmap.ie/dail_ea/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_eds",name:"OSMIE EDs",type:"tms",template:"https://tile.openstreetmap.ie/ed/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_local_ea",name:"OSMIE Local Election Areas",type:"tms",template:"https://tile.openstreetmap.ie/local_ea/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_tie_not_counties",name:"OSMIE T.ie Land not in Counties",type:"tms",template:"https://www.townlands.ie/tiles/not_counties/{zoom}/{x}/{y}.png",zoomExtent:[2,19],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_tds",name:"OSMIE Townlands",type:"tms",template:"https://tile.openstreetmap.ie/townland/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"al_palestina",name:"Palestina AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Palestina&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.28907,-9.71916],[-37.28904,-9.71114],[-37.28911,-9.7022],[-37.28915,-9.69175],[-37.28919,-9.68886],[-37.28927,-9.68069],[-37.28926,-9.67732],[-37.28936,-9.66999],[-37.28936,-9.66599],[-37.28931,-9.66133],[-37.28941,-9.65526],[-37.28946,-9.64556],[-37.2895,-9.63489],[-37.28954,-9.62926],[-37.2964,-9.62885],[-37.31188,-9.62897],[-37.32762,-9.62914],[-37.33181,-9.62919],[-37.34338,-9.62917],[-37.35876,-9.62923],[-37.37175,-9.6293],[-37.37839,-9.62913],[-37.38051,-9.62922],[-37.38061,-9.63143],[-37.38054,-9.63785],[-37.38043,-9.63895],[-37.38053,-9.64147],[-37.38051,-9.64876],[-37.3805,-9.6543],[-37.38043,-9.656],[-37.38024,-9.66028],[-37.38022,-9.66551],[-37.38019,-9.67054],[-37.38016,-9.67896],[-37.38013,-9.68781],[-37.38009,-9.70116],[-37.38003,-9.71053],[-37.3801,-9.71743],[-37.38005,-9.71959],[-37.37932,-9.71954],[-37.37392,-9.71956],[-37.36582,-9.71945],[-37.35849,-9.71946],[-37.35334,-9.71938],[-37.34414,-9.71937],[-37.33423,-9.71923],[-37.32933,-9.71927],[-37.3218,-9.71924],[-37.31983,-9.71927],[-37.31094,-9.7192],[-37.29589,-9.71921],[-37.28907,-9.71916]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"palmeira_dos_indios",name:"Palmeira dos Indios AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Palmeira%20dos%20Indios&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.58664,-9.46124],[-36.58665,-9.45851],[-36.58619,-9.41968],[-36.58604,-9.41452],[-36.58596,-9.40593],[-36.58585,-9.39509],[-36.58579,-9.39163],[-36.58565,-9.38983],[-36.58549,-9.38249],[-36.58529,-9.37965],[-36.58511,-9.37744],[-36.58503,-9.37059],[-36.5889,-9.37058],[-36.59064,-9.37065],[-36.59389,-9.3706],[-36.60037,-9.37073],[-36.61046,-9.37049],[-36.62288,-9.37021],[-36.63377,-9.37002],[-36.63835,-9.36986],[-36.64743,-9.36997],[-36.65141,-9.36994],[-36.65534,-9.36972],[-36.65647,-9.36974],[-36.66111,-9.37024],[-36.66276,-9.37026],[-36.66704,-9.36973],[-36.67052,-9.36966],[-36.67325,-9.36966],[-36.67602,-9.36987],[-36.67593,-9.3726],[-36.67597,-9.37679],[-36.67639,-9.38138],[-36.67654,-9.38464],[-36.67663,-9.39265],[-36.67675,-9.39829],[-36.67689,-9.40875],[-36.67707,-9.41887],[-36.67717,-9.43179],[-36.67724,-9.43395],[-36.67718,-9.43753],[-36.67728,-9.44311],[-36.6773,-9.44933],[-36.67741,-9.45528],[-36.6774,-9.45938],[-36.67735,-9.46017],[-36.67568,-9.46021],[-36.66625,-9.4603],[-36.66224,-9.4603],[-36.65736,-9.46042],[-36.6504,-9.46047],[-36.63543,-9.46065],[-36.61979,-9.46083],[-36.61433,-9.46083],[-36.61029,-9.46097],[-36.60647,-9.46097],[-36.60186,-9.46099],[-36.59426,-9.46112],[-36.58664,-9.46124]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Pangasinan_Bulacan_HiRes",name:"Pangasinán/Bulacan (Philippines HiRes)",type:"tms",template:"https://gravitystorm.dev.openstreetmap.org/imagery/philippines/{zoom}/{x}/{y}.png",zoomExtent:[12,19],polygon:[[[120.33659,15.98577],[120.44599,15.984],[120.44613,15.97446],[120.47646,15.97459],[120.59425,15.94683],[120.59806,16.09079],[120.59654,16.198],[120.36854,16.21853],[120.34758,16.04231],[120.33659,15.98577]],[[120.8268,15.3658],[121.2684,15.2602],[121.2699,14.7025],[120.695,14.8423],[120.8268,15.3658]]]},{id:"pao_de_acucar",name:"Pão de Açucar AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Pao%20de%20Acucar&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.39003,-9.78589],[-37.39019,-9.7762],[-37.38993,-9.76575],[-37.38991,-9.75256],[-37.39015,-9.74102],[-37.39003,-9.73201],[-37.39012,-9.72254],[-37.39015,-9.71289],[-37.39019,-9.70341],[-37.3902,-9.69548],[-37.40377,-9.6955],[-37.41728,-9.6956],[-37.43224,-9.69569],[-37.44319,-9.69573],[-37.44723,-9.69582],[-37.45682,-9.69585],[-37.47062,-9.69591],[-37.47373,-9.69591],[-37.47586,-9.69604],[-37.48128,-9.69605],[-37.48131,-9.6989],[-37.48122,-9.70087],[-37.48121,-9.70239],[-37.48135,-9.70545],[-37.48138,-9.71046],[-37.48134,-9.71617],[-37.4812,-9.71875],[-37.48125,-9.72035],[-37.48136,-9.72134],[-37.48134,-9.7241],[-37.4813,-9.72506],[-37.48103,-9.72732],[-37.48102,-9.73088],[-37.48127,-9.73462],[-37.48131,-9.73638],[-37.48131,-9.73893],[-37.48131,-9.74388],[-37.4813,-9.74989],[-37.48122,-9.75315],[-37.48102,-9.75855],[-37.48084,-9.7642],[-37.48085,-9.76526],[-37.48094,-9.76675],[-37.48093,-9.76881],[-37.48084,-9.7721],[-37.48087,-9.77486],[-37.48076,-9.77993],[-37.48081,-9.7863],[-37.46382,-9.78623],[-37.45353,-9.7862],[-37.43979,-9.78611],[-37.42998,-9.78607],[-37.4208,-9.786],[-37.40853,-9.78596],[-37.39545,-9.78593],[-37.39003,-9.78589]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"PCN-Italy-2006",name:"PCN 2006 - Italy",type:"wms",template:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_06.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OI.ORTOIMMAGINI.2006.33,OI.ORTOIMMAGINI.2006.32&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2006-01-01T00:00:00.000Z",startDate:"2006-01-01T00:00:00.000Z",polygon:[[[7.54795,43.73118],[8.10697,43.86701],[8.73593,44.38944],[10.18338,43.85116],[9.55016,43.13605],[10.27725,42.27515],[11.69748,42.08118],[12.90059,40.84897],[14.97466,40.20869],[16.04773,38.8953],[13.1086,38.74113],[11.77717,37.93605],[14.40624,36.74299],[15.13467,36.59364],[15.42867,37.027],[15.21993,37.43376],[15.4836,37.92936],[16.01644,37.8036],[17.21669,38.87425],[17.21669,39.40468],[16.55477,39.78775],[17.05464,40.45144],[18.32906,39.70539],[18.68773,40.0587],[18.04964,40.67064],[16.00545,41.52122],[16.38448,41.85964],[15.51837,42.1537],[14.57997,42.2461],[13.56099,43.65128],[12.57889,44.0867],[12.28795,44.62204],[12.56398,44.97092],[12.34151,45.17458],[12.41696,45.40557],[13.09252,45.62826],[13.69549,45.70806],[13.78445,45.5825],[13.9191,45.6322],[13.8235,45.7176],[13.59784,45.8072],[13.64307,45.98326],[13.52963,45.96588],[13.47474,46.00546],[13.66472,46.17392],[13.47587,46.22725],[13.42218,46.20758],[13.37671,46.29668],[13.59777,46.44137],[13.68684,46.43881],[13.7148,46.5222],[12.9151,46.60953],[12.38708,46.71529],[12.27591,46.88651],[12.17486,46.90895],[12.11675,47.01241],[12.21781,47.03996],[12.19254,47.09331],[11.74789,46.98484],[11.33355,46.99862],[11.10618,46.92966],[11.00764,46.76896],[10.72974,46.78972],[10.75753,46.82258],[10.66405,46.87614],[10.47197,46.85698],[10.38659,46.67847],[10.49375,46.62049],[10.46136,46.53164],[10.25309,46.57432],[10.23674,46.63484],[10.10307,46.61003],[10.03715,46.44479],[10.165,46.41051],[10.10506,46.3372],[10.17862,46.25626],[10.07055,46.21668],[9.95249,46.38045],[9.73086,46.35071],[9.71273,46.29266],[9.57015,46.2958],[9.46117,46.37481],[9.45936,46.50873],[9.40487,46.46621],[9.36128,46.5081],[9.28136,46.49685],[9.24503,46.23616],[8.95601,45.96503],[9.09065,45.89906],[9.0298,45.82127],[8.90992,45.8333],[8.9408,45.86682],[8.88904,45.95465],[8.78551,45.99063],[8.85617,46.0748],[8.62242,46.12112],[8.45032,46.26869],[8.42464,46.46367],[8.08814,46.26692],[8.15493,46.1834],[8.11383,46.11577],[8.02906,46.10331],[7.98881,45.99867],[7.9049,45.99945],[7.85949,45.91485],[7.56343,45.97421],[7.10685,45.85653],[7.04151,45.92435],[6.95315,45.85163],[6.80785,45.83265],[6.80785,45.71864],[6.98948,45.63869],[7.00037,45.509],[7.18019,45.40071],[7.10572,45.32924],[7.13115,45.25386],[6.85144,45.13226],[6.7697,45.16044],[6.62803,45.11175],[6.66981,45.02324],[6.74791,45.01939],[6.75518,44.89915],[7.02217,44.82519],[7.07484,44.68073],[6.95133,44.66264],[6.85507,44.53072],[6.94504,44.43112],[6.88784,44.42043],[6.89171,44.36637],[7.00764,44.23736],[7.36364,44.11882],[7.68694,44.17487],[7.72508,44.07578],[7.49355,43.86551],[7.54795,43.73118]],[[8.17134,39.14848],[8.62453,38.75119],[9.09831,39.03764],[9.03102,39.13144],[9.26585,39.18575],[9.64076,39.0227],[9.89894,40.67991],[9.50068,41.39257],[8.30317,40.91071],[8.41304,41.16139],[8.21254,41.13864],[8.07521,40.59862],[8.36154,40.35],[8.27914,39.98585],[8.38283,39.6536],[8.17134,39.14848]],[[12.51489,35.53423],[12.64054,35.5306],[12.63861,35.48641],[12.51296,35.49005],[12.51489,35.53423]],[[11.91218,36.85688],[12.08179,36.85523],[12.07958,36.70974],[11.90998,36.71139],[11.91218,36.85688]],[[12.84019,35.88131],[12.89186,35.88145],[12.89198,35.85003],[12.84031,35.84989],[12.84019,35.88131]]]},{id:"PCN-Lazio_Umbria-2008",name:"PCN 2008 - IT Lazio+Umbria",type:"wms",template:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_08.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OI.ORTOIMMAGINI.2008.33&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2008-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",polygon:[[[12.33149,41.64637],[12.41178,41.64791],[12.41499,41.54635],[12.49574,41.54789],[12.4985,41.49619],[12.57948,41.49843],[12.58062,41.42932],[12.60632,41.4288],[12.60746,41.39663],[12.8293,41.39818],[12.83159,41.34688],[12.9128,41.34843],[12.9151,41.29726],[12.99585,41.2983],[12.99791,41.19636],[13.1679,41.19808],[13.16721,41.24692],[13.41337,41.24829],[13.4152,41.19705],[13.8341,41.19808],[13.83341,41.2476],[13.91737,41.24847],[13.91668,41.39749],[14.0011,41.39784],[13.99996,41.49774],[14.08415,41.49826],[14.08346,41.65014],[14.00087,41.6498],[13.99973,41.75051],[13.83433,41.74965],[13.83364,41.80047],[13.75151,41.79978],[13.7499,41.84987],[13.41841,41.8497],[13.41681,41.95027],[13.33445,41.94959],[13.3333,42.00041],[13.25141,41.99973],[13.25003,42.05051],[13.08509,42.04966],[13.08394,42.097],[13.33399,42.09819],[13.33376,42.1472],[13.41772,42.14822],[13.41635,42.25052],[13.33399,42.24984],[13.33353,42.30094],[13.25141,42.29992],[13.25003,42.54699],[13.41795,42.54817],[13.41589,42.75065],[13.33468,42.74947],[13.33307,42.90056],[13.16836,42.89938],[13.16721,42.95079],[12.96419,42.95012],[12.96258,43.0003],[12.91877,42.9998],[12.91601,43.25078],[12.83526,43.24994],[12.83228,43.50107],[12.66321,43.4994],[12.66482,43.45112],[12.58567,43.44996],[12.58246,43.5508],[12.50171,43.5498],[12.49987,43.65131],[12.16242,43.64915],[12.16494,43.60132],[12.07891,43.5995],[12.0819,43.45196],[11.99541,43.44913],[11.99862,43.34661],[12.07891,43.34795],[12.08075,43.30189],[11.9961,43.29955],[11.99862,43.20214],[11.91237,43.19929],[11.91466,43.15212],[11.83207,43.14944],[11.8323,43.09653],[11.91099,43.09837],[11.91466,42.90191],[11.82909,42.89922],[11.83139,42.85231],[11.74582,42.84945],[11.74811,42.65236],[11.6731,42.64966],[11.67493,42.6105],[11.49485,42.59936],[11.49852,42.49593],[11.57812,42.49796],[11.58156,42.45244],[11.41226,42.44872],[11.41524,42.34656],[11.49599,42.34792],[11.49921,42.29636],[11.57835,42.29822],[11.58225,42.24628],[11.66185,42.24832],[11.66621,42.09649],[11.74536,42.09819],[11.74903,41.99666],[11.91443,41.99922],[11.91535,41.98626],[11.99403,41.98745],[11.99862,41.89685],[12.07868,41.89907],[12.08144,41.84594],[12.16311,41.84799],[12.16563,41.6964],[12.3292,41.69863],[12.33149,41.64637]]]},{id:"PCN-Italy-2012",name:"PCN 2012 - Italy",type:"wms",template:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_12.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.ORTOIMMAGINI.2012&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[7.54795,43.73118],[8.10697,43.86701],[8.73593,44.38944],[10.18338,43.85116],[9.55016,43.13605],[10.27725,42.27515],[11.69748,42.08118],[12.90059,40.84897],[14.97466,40.20869],[16.04773,38.8953],[13.1086,38.74113],[11.77717,37.93605],[14.40624,36.74299],[15.13467,36.59364],[15.42867,37.027],[15.21993,37.43376],[15.4836,37.92936],[16.01644,37.8036],[17.21669,38.87425],[17.21669,39.40468],[16.55477,39.78775],[17.05464,40.45144],[18.32906,39.70539],[18.68773,40.0587],[18.04964,40.67064],[16.00545,41.52122],[16.38448,41.85964],[15.51837,42.1537],[14.57997,42.2461],[13.56099,43.65128],[12.57889,44.0867],[12.28795,44.62204],[12.56398,44.97092],[12.34151,45.17458],[12.41696,45.40557],[13.09252,45.62826],[13.69549,45.70806],[13.78445,45.5825],[13.9191,45.6322],[13.8235,45.7176],[13.59784,45.8072],[13.64307,45.98326],[13.52963,45.96588],[13.47474,46.00546],[13.66472,46.17392],[13.47587,46.22725],[13.42218,46.20758],[13.37671,46.29668],[13.59777,46.44137],[13.68684,46.43881],[13.7148,46.5222],[12.9151,46.60953],[12.38708,46.71529],[12.27591,46.88651],[12.17486,46.90895],[12.11675,47.01241],[12.21781,47.03996],[12.19254,47.09331],[11.74789,46.98484],[11.33355,46.99862],[11.10618,46.92966],[11.00764,46.76896],[10.72974,46.78972],[10.75753,46.82258],[10.66405,46.87614],[10.47197,46.85698],[10.38659,46.67847],[10.49375,46.62049],[10.46136,46.53164],[10.25309,46.57432],[10.23674,46.63484],[10.10307,46.61003],[10.03715,46.44479],[10.165,46.41051],[10.10506,46.3372],[10.17862,46.25626],[10.07055,46.21668],[9.95249,46.38045],[9.73086,46.35071],[9.71273,46.29266],[9.57015,46.2958],[9.46117,46.37481],[9.45936,46.50873],[9.40487,46.46621],[9.36128,46.5081],[9.28136,46.49685],[9.24503,46.23616],[8.95601,45.96503],[9.09065,45.89906],[9.0298,45.82127],[8.90992,45.8333],[8.9408,45.86682],[8.88904,45.95465],[8.78551,45.99063],[8.85617,46.0748],[8.62242,46.12112],[8.45032,46.26869],[8.42464,46.46367],[8.08814,46.26692],[8.15493,46.1834],[8.11383,46.11577],[8.02906,46.10331],[7.98881,45.99867],[7.9049,45.99945],[7.85949,45.91485],[7.56343,45.97421],[7.10685,45.85653],[7.04151,45.92435],[6.95315,45.85163],[6.80785,45.83265],[6.80785,45.71864],[6.98948,45.63869],[7.00037,45.509],[7.18019,45.40071],[7.10572,45.32924],[7.13115,45.25386],[6.85144,45.13226],[6.7697,45.16044],[6.62803,45.11175],[6.66981,45.02324],[6.74791,45.01939],[6.75518,44.89915],[7.02217,44.82519],[7.07484,44.68073],[6.95133,44.66264],[6.85507,44.53072],[6.94504,44.43112],[6.88784,44.42043],[6.89171,44.36637],[7.00764,44.23736],[7.36364,44.11882],[7.68694,44.17487],[7.72508,44.07578],[7.49355,43.86551],[7.54795,43.73118]],[[8.17134,39.14848],[8.62453,38.75119],[9.09831,39.03764],[9.03102,39.13144],[9.26585,39.18575],[9.64076,39.0227],[9.89894,40.67991],[9.50068,41.39257],[8.30317,40.91071],[8.41304,41.16139],[8.21254,41.13864],[8.07521,40.59862],[8.36154,40.35],[8.27914,39.98585],[8.38283,39.6536],[8.17134,39.14848]],[[12.51489,35.53423],[12.64054,35.5306],[12.63861,35.48641],[12.51296,35.49005],[12.51489,35.53423]],[[11.91218,36.85688],[12.08179,36.85523],[12.07958,36.70974],[11.90998,36.71139],[11.91218,36.85688]],[[12.84019,35.88131],[12.89186,35.88145],[12.89198,35.85003],[12.84031,35.84989],[12.84019,35.88131]]]},{id:"Actueel_ortho25_WMS",name:"PDOK aerial imagery Beeldmateriaal.nl 25cm latest",type:"tms",template:"https://geodata.nationaalgeoregister.nl/luchtfoto/rgb/wmts?FORMAT=image/jpeg&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Actueel_ortho25&STYLE=&FORMAT=image/jpeg&tileMatrixSet=OGC:1.0:GoogleMapsCompatible&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,19],polygon:[[[3.14377,51.35984],[3.1575,51.24113],[3.33878,51.11544],[3.91281,51.05851],[4.65714,51.28067],[4.89334,51.26348],[5.17899,51.12579],[5.38498,51.13096],[5.54428,51.05678],[5.42069,50.85956],[5.46738,50.70326],[5.65689,50.61926],[6.14853,50.62143],[6.30234,50.85782],[6.29959,50.95438],[6.26389,51.01835],[6.37238,51.09259],[6.40122,51.20114],[6.37375,51.25102],[6.44516,51.31587],[6.42044,51.5496],[6.34354,51.67922],[6.79672,51.76429],[7.04666,51.91024],[7.07138,52.04559],[7.27188,52.17041],[7.30759,52.38551],[7.20596,52.53195],[7.28287,52.61458],[7.29935,52.77853],[7.44217,52.97827],[7.43393,53.28314],[7.04392,53.55159],[6.78299,53.63635],[6.23917,53.54016],[5.6871,53.51241],[5.17349,53.43885],[4.81644,53.23384],[4.65164,53.06583],[4.54178,52.48598],[4.32205,52.19568],[4.08104,52.01369],[4.02199,52.01623],[3.93684,51.96379],[3.95195,51.88079],[3.84483,51.84942],[3.62373,51.70752],[3.65532,51.66069],[3.63335,51.62746],[3.54683,51.62234],[3.39577,51.56091],[3.38203,51.51735],[3.49876,51.43267],[3.32985,51.38556],[3.14377,51.35984]]],terms_url:"https://www.nationaalgeoregister.nl/geonetwork/srv/dut/catalog.search#/search?facet.q=license%2FCC-BY&isChild=%27false%27&resultType=details&any_OR_title_OR_keyword=luchtfoto&fast=index&_content_type=json&from=1&to=20&sortBy=relevance",terms_text:"Kadaster / Beeldmateriaal.nl, CC BY 4.0",best:true,description:"Nationwide data set 25cm resolution color aerial imagery of the most recent year.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/nl/PDOK-Luchtfoto-Beeldmateriaal-25cm-latest.png"},{id:"al_piranhas",name:"Piranhas AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Piranhas&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.71918,-9.65236],[-37.71918,-9.63874],[-37.71914,-9.6321],[-37.71924,-9.62114],[-37.71929,-9.61023],[-37.71934,-9.59988],[-37.7194,-9.58891],[-37.71945,-9.57802],[-37.71944,-9.57173],[-37.71952,-9.56684],[-37.71956,-9.56225],[-37.71998,-9.56218],[-37.72258,-9.56195],[-37.72818,-9.56203],[-37.73254,-9.562],[-37.74107,-9.56206],[-37.74845,-9.56202],[-37.75926,-9.56216],[-37.76972,-9.56227],[-37.78036,-9.56244],[-37.78537,-9.56236],[-37.78907,-9.56233],[-37.79562,-9.56245],[-37.79771,-9.56237],[-37.81006,-9.56243],[-37.81061,-9.56241],[-37.81053,-9.56531],[-37.81049,-9.57629],[-37.81046,-9.58742],[-37.81038,-9.59757],[-37.81031,-9.61798],[-37.81018,-9.65197],[-37.81018,-9.6523],[-37.81024,-9.65259],[-37.80664,-9.65245],[-37.80206,-9.65253],[-37.79597,-9.65237],[-37.79179,-9.65252],[-37.78815,-9.65246],[-37.78723,-9.65242],[-37.78035,-9.65241],[-37.77865,-9.65223],[-37.77625,-9.6523],[-37.77475,-9.65219],[-37.77234,-9.65223],[-37.7696,-9.65245],[-37.76623,-9.65251],[-37.76345,-9.65246],[-37.7604,-9.6525],[-37.75102,-9.65237],[-37.75012,-9.65249],[-37.74155,-9.65248],[-37.7403,-9.65239],[-37.73785,-9.65246],[-37.73443,-9.65238],[-37.73106,-9.65243],[-37.72651,-9.65237],[-37.72195,-9.65225],[-37.71992,-9.65228],[-37.71918,-9.65236]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"PNOA-Spain-TMS",name:"PNOA Spain",type:"tms",template:"https://www.ign.es/wmts/pnoa-ma?request=GetTile&service=WMTS&VERSION=1.0.0&Layer=OI.OrthoimageCoverage&Style=default&Format=image/png&TileMatrixSet=GoogleMapsCompatible&TileMatrix={zoom}&TileRow={y}&TileCol={x}",zoomExtent:[0,20],polygon:[[[-17.88463,28.44606],[-17.89395,28.52255],[-18.02125,28.74819],[-18.02241,28.80384],[-17.9424,28.87261],[-17.89118,28.87371],[-17.89033,28.85151],[-17.76759,28.85378],[-17.76698,28.83122],[-17.74127,28.832],[-17.73949,28.76422],[-17.71398,28.76497],[-17.71293,28.73037],[-17.75744,28.69318],[-17.75708,28.67413],[-17.74579,28.67435],[-17.74573,28.61656],[-17.75197,28.58337],[-17.76225,28.5592],[-17.78331,28.54167],[-17.78316,28.49366],[-17.80861,28.4925],[-17.80601,28.4469],[-17.88463,28.44606]],[[-18.1661,27.78516],[-18.16349,27.69492],[-18.08898,27.69634],[-18.08734,27.67387],[-18.03641,27.67537],[-18.03501,27.63026],[-17.959,27.6324],[-17.86033,27.7926],[-17.86303,27.83688],[-17.8884,27.83649],[-17.88913,27.85905],[-17.99065,27.85675],[-18.03868,27.76558],[-18.11464,27.76379],[-18.11546,27.78636],[-18.1661,27.78516]],[[-17.36038,28.06398],[-17.36297,28.17572],[-17.33756,28.17637],[-17.33846,28.2213],[-17.18579,28.22388],[-17.08208,28.13518],[-17.08084,28.068],[-17.13154,28.06681],[-17.15633,28.02146],[-17.23211,28.02037],[-17.23199,27.99804],[-17.25768,27.99784],[-17.25785,28.01997],[-17.30867,28.01923],[-17.36038,28.06398]],[[-16.92782,28.32758],[-16.92866,28.37219],[-16.87767,28.37293],[-16.87807,28.39542],[-16.52143,28.42261],[-16.44571,28.49113],[-16.44625,28.53597],[-16.42059,28.53627],[-16.42092,28.55884],[-16.34433,28.55976],[-16.3446,28.58221],[-16.19125,28.58372],[-16.19162,28.60684],[-16.12793,28.60782],[-16.1278,28.59218],[-16.09951,28.5925],[-16.09934,28.51638],[-16.16481,28.51612],[-16.16475,28.49386],[-16.23858,28.44847],[-16.26535,28.44761],[-16.26586,28.403],[-16.31675,28.40176],[-16.31631,28.38019],[-16.34208,28.37951],[-16.34083,28.2893],[-16.41584,28.19761],[-16.4151,28.13113],[-16.51533,28.01648],[-16.61684,28.01532],[-16.61681,27.99305],[-16.71842,27.99192],[-16.7191,28.03714],[-16.7447,28.03679],[-16.74534,28.08181],[-16.7707,28.08161],[-16.8224,28.1259],[-16.82317,28.17087],[-16.8487,28.17075],[-16.85028,28.26079],[-16.87565,28.26055],[-16.87608,28.28322],[-16.90151,28.28277],[-16.90239,28.32793],[-16.92782,28.32758]],[[-15.85374,27.90089],[-15.8542,27.99018],[-15.82895,27.99066],[-15.82911,28.03558],[-15.7783,28.03632],[-15.75328,28.08143],[-15.72788,28.08157],[-15.72826,28.17186],[-15.49897,28.1728],[-15.49874,28.15041],[-15.44978,28.15075],[-15.45016,28.19614],[-15.39728,28.19614],[-15.39644,28.03836],[-15.37103,28.03802],[-15.37065,28.01532],[-15.34578,28.01532],[-15.34548,27.92544],[-15.3708,27.92524],[-15.37057,27.83521],[-15.39598,27.83474],[-15.421,27.78797],[-15.47181,27.78939],[-15.47188,27.76665],[-15.52277,27.76678],[-15.54771,27.72161],[-15.62361,27.72134],[-15.62415,27.74199],[-15.70075,27.74335],[-15.80167,27.81105],[-15.85374,27.90089]],[[-14.52156,28.04678],[-14.52244,28.11841],[-14.41575,28.11561],[-14.21688,28.22788],[-14.21537,28.33903],[-14.16417,28.45283],[-14.11151,28.4748],[-14.03358,28.72267],[-13.95652,28.74494],[-13.95617,28.76659],[-13.82902,28.76643],[-13.82896,28.78798],[-13.80007,28.78793],[-13.8013,28.71899],[-13.82757,28.71935],[-13.82786,28.6518],[-13.80258,28.6519],[-13.80339,28.53842],[-13.82885,28.53847],[-13.83151,28.39702],[-13.91582,28.22414],[-13.98564,28.22357],[-14.03696,28.17958],[-14.13871,28.17999],[-14.13866,28.15791],[-14.21537,28.15781],[-14.21472,28.11189],[-14.29132,28.04524],[-14.33197,28.03687],[-14.44578,28.04698],[-14.44666,28.0658],[-14.49628,28.06826],[-14.49593,28.04585],[-14.52156,28.04678]],[[-13.80066,28.84566],[-13.80093,28.82311],[-13.77569,28.82305],[-13.69729,28.88982],[-13.69729,28.91277],[-13.60725,28.9118],[-13.43886,29.00024],[-13.43746,29.13513],[-13.4117,29.13499],[-13.41056,29.22298],[-13.45928,29.25559],[-13.45974,29.2942],[-13.50913,29.29456],[-13.51006,29.31635],[-13.56354,29.31729],[-13.56406,29.27138],[-13.53892,29.2712],[-13.53897,29.25004],[-13.56613,29.25013],[-13.5666,29.203],[-13.51565,29.20223],[-13.51565,29.18206],[-13.5398,29.18278],[-13.54089,29.13753],[-13.65782,29.13685],[-13.71322,29.09351],[-13.76634,29.09345],[-13.85025,29.01659],[-13.85182,28.98343],[-13.85244,28.91486],[-13.90131,28.89245],[-13.9024,28.84698],[-13.80066,28.84566]],[[1.64799,38.99907],[1.73217,38.99936],[1.73147,39.04417],[1.64895,39.04319],[1.64816,39.12764],[1.39486,39.12657],[1.39544,39.08642],[1.22811,39.08526],[1.22911,39.0029],[1.14487,39.0018],[1.14528,38.832],[1.31136,38.83316],[1.31219,38.79065],[1.39469,38.79162],[1.39519,38.75296],[1.31128,38.75193],[1.31259,38.62388],[1.6489,38.62511],[1.64807,38.71115],[1.58456,38.71012],[1.58116,38.70054],[1.54915,38.70028],[1.51972,38.70921],[1.50355,38.72532],[1.48133,38.91551],[1.55189,38.92544],[1.56673,38.95666],[1.64874,38.95833],[1.64799,38.99907]],[[2.54507,39.41667],[2.43933,39.41611],[2.43871,39.48469],[2.43902,39.49934],[2.31223,39.49934],[2.31192,39.54179],[2.22907,39.541],[2.22835,39.62606],[2.34601,39.62709],[2.92704,39.96016],[3.14566,39.96005],[3.14608,40.00198],[3.23139,40.00198],[3.23129,39.83292],[3.14823,39.83316],[3.14844,39.79357],[3.48148,39.79318],[3.48035,39.5959],[3.31506,39.47846],[3.31462,39.37855],[3.08302,39.24994],[2.97986,39.25015],[2.97904,39.3335],[2.72874,39.33342],[2.72885,39.45814],[2.64569,39.45774],[2.64538,39.49966],[2.54528,39.49942],[2.54507,39.41667]],[[3.81204,40.04344],[3.72908,40.0438],[3.72862,39.95842],[3.81266,39.9576],[3.81228,39.91644],[3.9609,39.91598],[4.19381,39.79131],[4.31503,39.79058],[4.31599,39.83293],[4.39874,39.83204],[4.39737,39.91858],[4.3158,39.91933],[4.31619,40.0434],[4.2319,40.04436],[4.23248,40.08478],[4.14915,40.08611],[4.14906,40.12552],[4.0628,40.12722],[4.06242,40.08499],[3.81287,40.08529],[3.81204,40.04344]],[[-8.89106,41.82289],[-9.1092,42.57511],[-9.03655,42.73066],[-9.08834,42.72696],[-9.14661,42.77503],[-9.21855,42.90163],[-9.2761,42.86051],[-9.30991,42.93113],[-9.27898,42.9822],[-9.30991,43.06004],[-9.25236,43.10417],[-9.2315,43.17032],[-9.14733,43.21018],[-9.06748,43.19916],[-9.03367,43.24267],[-8.99842,43.24477],[-8.99986,43.29558],[-8.93727,43.30553],[-8.92936,43.32699],[-8.8639,43.32908],[-8.87613,43.37407],[-8.82217,43.37354],[-8.78548,43.31914],[-8.70635,43.305],[-8.60996,43.3296],[-8.55097,43.32332],[-8.52435,43.3364],[-8.52507,43.36465],[-8.45745,43.39184],[-8.36105,43.41118],[-8.36033,43.46342],[-8.33444,43.57974],[-8.27761,43.57088],[-8.06467,43.72392],[-7.99921,43.7234],[-7.9172,43.78264],[-7.85605,43.79146],[-7.83591,43.73743],[-7.66284,43.80982],[-7.31889,43.67827],[-7.19975,43.58308],[-6.24882,43.6075],[-6.12293,43.57901],[-5.85204,43.6799],[-5.60363,43.57087],[-5.28553,43.56191],[-5.17875,43.49916],[-4.90899,43.48367],[-4.61562,43.4192],[-4.18399,43.42492],[-3.80295,43.51954],[-3.74,43.48693],[-3.56128,43.54236],[-3.1083,43.38163],[-2.93857,43.46246],[-2.74524,43.47551],[-2.30462,43.31706],[-1.9854,43.3563],[-1.85528,43.39725],[-1.7698,43.39644],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[3.23049,42.37644],[3.31415,42.37604],[3.31412,42.33399],[3.39785,42.33404],[3.39739,42.29009],[3.31389,42.29084],[3.31397,42.20702],[3.14759,42.2073],[3.14759,42.12606],[3.23055,42.126],[3.24668,41.95294],[3.19452,41.85589],[3.06054,41.76474],[2.78358,41.63718],[2.26293,41.42716],[2.16492,41.29893],[1.86008,41.22322],[1.3763,41.11627],[1.17937,41.04646],[1.08585,41.04849],[0.75854,40.81956],[0.9114,40.73376],[0.87813,40.67514],[0.66502,40.53587],[0.55801,40.55022],[0.43392,40.37576],[0.26756,40.19192],[0.16415,40.06472],[0.07513,40.01447],[0.01039,39.89522],[-0.09392,39.81169],[-0.18474,39.63117],[-0.29085,39.50363],[-0.28636,39.33343],[-0.18564,39.17746],[-0.21352,39.15585],[-0.11101,38.97222],[0.00949,38.88268],[0.12189,38.87218],[0.23429,38.79864],[0.25587,38.72642],[0.09581,38.61338],[-0.0022,38.60706],[-0.05705,38.52691],[-0.27197,38.47624],[-0.37987,38.39312],[-0.38347,38.33813],[-0.45091,38.33108],[-0.50487,38.28309],[-0.48238,38.19481],[-0.42933,38.16583],[-0.45451,38.14886],[-0.584,38.17219],[-0.61367,38.11986],[-0.63705,37.96122],[-0.68111,37.94562],[-0.73237,37.88107],[-0.72158,37.78306],[-0.68831,37.734],[-0.66415,37.62315],[-0.71939,37.58784],[-0.91963,37.53758],[-1.11071,37.51641],[-1.33832,37.52867],[-1.44089,37.39037],[-1.6767,37.27652],[-1.85408,36.91229],[-2.06835,36.69291],[-2.21588,36.66192],[-2.37219,36.78018],[-2.68129,36.65911],[-2.92015,36.66756],[-3.09402,36.71263],[-3.46108,36.65488],[-3.72804,36.69291],[-4.37435,36.66333],[-4.65712,36.44042],[-4.9188,36.45313],[-5.16995,36.35135],[-5.28411,36.19702],[-5.26809,36.12418],[-5.35248,36.12247],[-5.35161,36.04014],[-5.43658,36.03889],[-5.43532,36.00344],[-5.68886,36.00365],[-5.68996,36.04053],[-5.85506,36.03856],[-5.85668,36.12421],[-5.93848,36.12215],[-5.94003,36.16556],[-5.99834,36.1645],[-6.03573,36.1781],[-6.07752,36.22241],[-6.15061,36.28646],[-6.23154,36.37701],[-6.33585,36.53106],[-6.32146,36.58163],[-6.40419,36.6235],[-6.47433,36.74897],[-6.41588,36.79939],[-6.49052,36.91738],[-6.62989,37.0194],[-6.87448,37.10838],[-7.04264,37.18507],[-7.26474,37.18435],[-7.37535,37.15354],[-7.40832,37.16822],[-7.42029,37.21183],[-7.42492,37.23505],[-7.43805,37.2452],[-7.44597,37.33261],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]],terms_text:"PNOA",best:true},{id:"poco_das_trincheiras",name:"Poço das Trincheiras AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Poco%20das%20Trincheiras&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.23942,-9.35157],[-37.23947,-9.34387],[-37.23942,-9.33792],[-37.23954,-9.33022],[-37.23973,-9.32791],[-37.23974,-9.3228],[-37.23964,-9.32085],[-37.23971,-9.31864],[-37.2398,-9.31706],[-37.23982,-9.31561],[-37.24053,-9.30933],[-37.24051,-9.30004],[-37.24008,-9.29687],[-37.23998,-9.29546],[-37.23992,-9.29319],[-37.23989,-9.28978],[-37.23995,-9.28818],[-37.24008,-9.28641],[-37.24036,-9.28212],[-37.24038,-9.27897],[-37.24051,-9.27557],[-37.24004,-9.26979],[-37.24018,-9.26721],[-37.24018,-9.26612],[-37.23995,-9.26455],[-37.23983,-9.26151],[-37.24333,-9.26136],[-37.24936,-9.26146],[-37.26445,-9.26161],[-37.28016,-9.26172],[-37.28294,-9.26171],[-37.29581,-9.26178],[-37.30685,-9.26178],[-37.31419,-9.26189],[-37.32437,-9.26192],[-37.33078,-9.26175],[-37.33057,-9.27275],[-37.33048,-9.28007],[-37.33054,-9.28117],[-37.33069,-9.28427],[-37.3307,-9.28535],[-37.33064,-9.28617],[-37.33071,-9.28717],[-37.33064,-9.28769],[-37.33062,-9.29027],[-37.33043,-9.29308],[-37.33038,-9.29655],[-37.33034,-9.30591],[-37.3304,-9.31203],[-37.33038,-9.32194],[-37.33041,-9.3342],[-37.33035,-9.34185],[-37.3303,-9.34783],[-37.33035,-9.35202],[-37.31509,-9.35194],[-37.30011,-9.3519],[-37.29531,-9.35183],[-37.28899,-9.35171],[-37.28497,-9.35182],[-37.27851,-9.35173],[-37.27431,-9.35181],[-37.27115,-9.3517],[-37.26351,-9.35168],[-37.26046,-9.35164],[-37.25402,-9.35177],[-37.24705,-9.35163],[-37.23942,-9.35157]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"e-mapa.net-buildings",name:"polska.e-mapa.net: Buildings",type:"wms",template:"http://wms02.epodgik.pl/cgi-bin/KrajowaIntegracjaEwidencjiGruntow?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"https://polska.e-mapa.net/",terms_text:"polska.e-mapa.net - Geoportal otwartych danych przestrzennych",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/polskae-mapanetBuildings.png"},{id:"debicki-buildings",name:"Powiat dębicki: Buildings",type:"wms",template:"https://debica.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,adresy,EBU,EBT,S&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[21.53768,50.01085],[21.51944,50.05423],[21.58099,50.1233],[21.48804,50.18059],[21.13725,50.14835],[21.13939,50.12721],[21.18058,50.12101],[21.14315,50.05965],[21.15356,49.92854],[21.27892,49.92554],[21.22448,49.8861],[21.22362,49.84258],[21.35177,49.8349],[21.36368,49.86838],[21.41585,49.82003],[21.47943,49.8398],[21.52679,49.88911],[21.47689,50.00135],[21.53768,50.01085]]],terms_text:"Powiat dębicki",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"lancucki-buildings",name:"Powiat łańcucki: Buildings",type:"wms",template:"https://lancut.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=EBT,budynki,adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.17224,50.10121],[22.12574,50.1079],[22.0823,50.17206],[22.13591,50.1867],[22.173,50.18117],[22.18418,50.22914],[22.235,50.24718],[22.3856,50.16031],[22.40346,50.13331],[22.45275,50.12745],[22.45275,50.10676],[22.41768,50.08997],[22.38364,50.08915],[22.38542,50.05393],[22.35315,50.05067],[22.3562,50.00627],[22.31478,49.99451],[22.32139,49.94614],[22.29979,49.92455],[22.24161,49.92847],[22.20901,49.93728],[22.22382,49.96085],[22.16683,50.00412],[22.1387,50.00251],[22.12015,50.04626],[22.17224,50.10121]]],terms_text:"Powiat łańcucki",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"lubaczowski-buildings",name:"Powiat lubaczowski: Buildings",type:"wms",template:"https://lubaczow.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=S,EBT,adresy,budynki_ewid&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[23.29224,50.09693],[23.55763,50.25704],[23.51394,50.26643],[23.522,50.29892],[23.40991,50.3083],[23.44482,50.35653],[23.38072,50.3699],[23.38829,50.4058],[23.35821,50.41105],[23.2527,50.36601],[23.19379,50.40529],[23.01962,50.2928],[22.84161,50.30574],[22.83572,50.27037],[22.82426,50.26923],[22.79651,50.20933],[22.86603,50.18949],[22.87414,50.13786],[22.93233,50.1678],[22.88954,50.11501],[22.95351,50.07178],[23.05556,50.04967],[22.99884,49.99028],[23.14951,49.97563],[23.29224,50.09693]]],terms_text:"Powiat lubaczowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"poznanski-buildings",name:"Powiat poznański: Buildings",type:"wms",template:"http://wms.podgik.poznan.pl/cgi-bin/poznan?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[16.9585,52.46312],[17.03946,52.33605],[16.84291,52.36501],[16.78596,52.46566],[16.70022,52.53819],[16.6415,52.5288],[16.44898,52.36793],[16.47775,52.2696],[16.5659,52.26813],[16.58375,52.17007],[17.08099,52.14981],[17.37124,52.34522],[17.39853,52.44037],[17.35338,52.53949],[17.13689,52.57783],[17.13126,52.6419],[17.01608,52.68366],[16.9158,52.65079],[16.85814,52.58191],[16.7367,52.57459],[16.70022,52.53824],[16.78598,52.46567],[16.9585,52.46312]]],terms_text:"PODGIK Poznań",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatpoznaskiOrthophotomap(aerialimage).png"},{id:"sropczyce-buildings",name:"Powiat ropczycko-sędziszowski: Buildings",type:"wms",template:"https://spropczyce.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[21.60041,50.21025],[21.74199,50.16538],[21.792,50.17829],[21.81459,50.15264],[21.78741,50.10859],[21.82597,50.09149],[21.82552,50.02925],[21.78666,49.97585],[21.70632,49.96022],[21.683,49.92431],[21.60062,49.91793],[21.54249,49.8862],[21.5188,49.89119],[21.45315,49.99268],[21.50364,50.0198],[21.49298,50.07161],[21.55535,50.11909],[21.50429,50.16559],[21.59816,50.17866],[21.60041,50.21025]]],terms_text:"Powiat ropczycko-sędziszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"rzeszowski-buildings",name:"Powiat rzeszowski: Buildings",type:"wms",template:"https://powiatrzeszowski.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,EBT,EBU&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.18219,50.17339],[22.09834,50.17176],[22.18016,50.09784],[22.13779,50.00695],[22.09444,50.00841],[22.02839,50.06668],[21.9354,50.06636],[21.98164,49.94977],[22.05278,50.0097],[22.1771,50.00555],[22.23319,49.96829],[22.31144,49.87008],[22.34961,49.72826],[21.99951,49.82808],[21.84961,49.95739],[21.7495,49.96981],[21.78503,50.14212],[21.93307,50.24748],[22.08291,50.26471],[21.98553,50.31545],[22.0901,50.37369],[22.19821,50.35265],[22.2536,50.2647],[22.18219,50.17339]]],terms_text:"Powiat rzeszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"rzeszowski-aerial",name:"Powiat rzeszowski: Orthophotomap (aerial image)",type:"wms",template:"https://powiatrzeszowski.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.18219,50.17339],[22.09834,50.17176],[22.18016,50.09784],[22.13779,50.00695],[22.09444,50.00841],[22.02839,50.06668],[21.9354,50.06636],[21.98164,49.94977],[22.05278,50.0097],[22.1771,50.00555],[22.23319,49.96829],[22.31144,49.87008],[22.34961,49.72826],[21.99951,49.82808],[21.84961,49.95739],[21.7495,49.96981],[21.78503,50.14212],[21.93307,50.24748],[22.08291,50.26471],[21.98553,50.31545],[22.0901,50.37369],[22.19821,50.35265],[22.2536,50.2647],[22.18219,50.17339]]],terms_text:"Powiat rzeszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"stalowowolski-buildings",name:"Powiat stalowowolski: Buildings",type:"wms",template:"https://stalowawola.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=EBT,adresy,budynki,centroidy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.017,50.35811],[22.09292,50.44916],[22.06785,50.51434],[22.09722,50.54302],[22.16347,50.52686],[22.23795,50.5503],[22.26768,50.60465],[22.22757,50.6653],[22.16235,50.66969],[22.20843,50.75403],[22.16239,50.80039],[22.0546,50.82234],[21.94394,50.77639],[21.86228,50.80439],[21.83413,50.75035],[21.87465,50.70066],[21.84046,50.65749],[21.97582,50.53164],[21.84797,50.47196],[21.88045,50.3913],[22.017,50.35811]]],terms_text:"Powiat stalowowolski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"poznan-buildings",name:"Poznań: Buildings",type:"wms",template:"http://wms2.geopoz.poznan.pl:8080/geoserver/sip/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki_ewidencyjne_sql&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"poznan-ortofotomapa2014",name:"Poznań: Orthophotomap 2014 (aerial image)",type:"wms",template:"http://wms1.geopoz.poznan.pl:6080/arcgis/services/sip/ortofotomapa_2014/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa_2014_image&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"poznan-ortofotomapa2016",name:"Poznań: Orthophotomap 2016 (aerial image)",type:"wms",template:"http://wms1.geopoz.poznan.pl:6080/arcgis/services/sip/ortofotomapy/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa_2016_image&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"PrahaIPRlatestorthophoto",name:"Praha IPR latest orthophoto",type:"wms",template:"http://giswa1.mag.mepnet.cz/arcgis/services/MAP/letecke_snimky_posledni_snimkovani_cache/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[1,20],polygon:[[[14.81232,49.93089],[14.18755,49.87687],[14.12025,50.19882],[14.74502,50.25247],[14.81232,49.93089]]]},{id:"PrahaIPRlow-vegetationorthophoto",name:"Praha IPR low-vegetation orthophoto",type:"wms",template:"http://giswa1.mag.mepnet.cz/arcgis/services/MAP/mimovegetacni_snimkovani_cache/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[1,20],polygon:[[[14.30454,49.99538],[14.31604,49.94205],[14.35,49.94508],[14.35384,49.92726],[14.42385,49.93352],[14.42009,49.95097],[14.48865,49.95709],[14.48479,49.97501],[14.55386,49.98117],[14.55012,49.99852],[14.58455,50.00159],[14.5883,49.98424],[14.69168,49.99346],[14.67634,50.06453],[14.71279,50.06777],[14.70115,50.12158],[14.6647,50.11834],[14.661,50.13543],[14.62755,50.13246],[14.61965,50.16895],[14.58543,50.16591],[14.58163,50.18344],[14.40776,50.168],[14.41156,50.15045],[14.37765,50.14744],[14.3738,50.16524],[14.33893,50.16214],[14.34278,50.14434],[14.27368,50.1382],[14.27749,50.12058],[14.2088,50.11447],[14.21289,50.09557],[14.24656,50.09857],[14.25417,50.06336],[14.21987,50.0603],[14.2237,50.04259],[14.258,50.04565],[14.26953,49.99226],[14.30454,49.99538]]]},{id:"przemysl-buildings",name:"Przemyśl: Buildings",type:"wms",template:"http://przemysl.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=adresy,budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.72268,49.76885],[22.73002,49.76787],[22.73097,49.77612],[22.72027,49.77662],[22.71787,49.78062],[22.73104,49.78553],[22.7244,49.79043],[22.73458,49.80441],[22.73167,49.81429],[22.7261,49.8165],[22.72762,49.82124],[22.74395,49.8187],[22.75952,49.80939],[22.79042,49.81462],[22.81169,49.80571],[22.79738,49.80146],[22.80384,49.79247],[22.83118,49.79664],[22.85752,49.78561],[22.84549,49.76746],[22.82485,49.77105],[22.82004,49.75674],[22.77358,49.74439],[22.73838,49.75895],[22.72205,49.74644],[22.71065,49.76288],[22.72268,49.76885]]],terms_text:"Miasto Przemyśl",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"przemysl-aerial",name:"Przemyśl: Ortophotomap (aerial image)",type:"wms",template:"http://przemysl.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[22.72268,49.76885],[22.73002,49.76787],[22.73097,49.77612],[22.72027,49.77662],[22.71787,49.78062],[22.73104,49.78553],[22.7244,49.79043],[22.73458,49.80441],[22.73167,49.81429],[22.7261,49.8165],[22.72762,49.82124],[22.74395,49.8187],[22.75952,49.80939],[22.79042,49.81462],[22.81169,49.80571],[22.79738,49.80146],[22.80384,49.79247],[22.83118,49.79664],[22.85752,49.78561],[22.84549,49.76746],[22.82485,49.77105],[22.82004,49.75674],[22.77358,49.74439],[22.73838,49.75895],[22.72205,49.74644],[22.71065,49.76288],[22.72268,49.76885]]],terms_text:"Miasto Przemyśl",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"RABA-KGZ-3000",name:"RABA-KGZ: Slovenia built-up areas",type:"tms",template:"http://wms.openstreetmap.de/tms/RABA3000/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"https://wiki.openstreetmap.org/wiki/Slovenia_Landcover_Import_-_RABA-KGZ",terms_text:"Copyright ©2015 Ministrstvo za kmetijstvo, gozdarstvo in prehrano (mkgp.gov.si). Some rights reserved.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/RABA-KGZSloveniafarmlanduse.png"},{id:"RABA-KGZ",name:"RABA-KGZ: Slovenia farmland use",type:"tms",template:"http://wms.openstreetmap.de/tms/RABA/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"https://wiki.openstreetmap.org/wiki/Slovenia_Landcover_Import_-_RABA-KGZ",terms_text:"Copyright ©2015 Ministrstvo za kmetijstvo, gozdarstvo in prehrano (mkgp.gov.si). Some rights reserved.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/RABA-KGZSloveniafarmlanduse.png"},{id:"riksantikvaren-kulturminner",name:"Riksantikvaren Heritage Sites overlay",type:"wms",template:"https://kart.ra.no/arcgis/services/Distribusjon/Kulturminner/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=3,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,22],polygon:[[[-10.95725,71.60964],[-6.16765,71.62095],[-6.13756,70.30991],[-10.92717,70.29784],[-10.95725,71.60964]],[[16.81947,74.9482],[21.25771,74.94213],[21.23712,73.8918],[16.79889,73.89828],[16.81947,74.9482]],[[4.04288,79.93593],[20.65421,81.54417],[36.6503,80.40108],[26.76265,75.8129],[13.88667,75.79135],[4.04288,79.93593]],[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.riksantikvaren.no/Veiledning/Data-og-tjenester/Karttjenester",terms_text:"© Riksantikvaren",description:"Archeological and architectural monuments/sites and cultural environments protected by law (''enkeltminner'') from the Norwegian Directorate for Cultural Heritage",icon:"https://www.riksantikvaren.no/extension/riksantikvaren/design/internetsite/images/logo_na.png",overlay:true},{id:"rio2013",name:"Rio Mosaic 2013",type:"wms",template:"http://geo.rio.rj.gov.br/ArcGIS/services/Imagens/Mosaico_2013/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[-43.17709,-22.96971],[-43.14586,-22.96959],[-43.14605,-22.92719],[-43.15625,-22.92731],[-43.15647,-22.87557],[-43.17739,-22.87494],[-43.17742,-22.88553],[-43.19804,-22.88571],[-43.19804,-22.85429],[-43.21875,-22.85444],[-43.21901,-22.83365],[-43.22937,-22.83365],[-43.22934,-22.82371],[-43.19869,-22.82353],[-43.19856,-22.83413],[-43.18826,-22.83398],[-43.18804,-22.84448],[-43.16667,-22.84442],[-43.16683,-22.83404],[-43.15638,-22.83407],[-43.15654,-22.81336],[-43.10436,-22.81306],[-43.10446,-22.80288],[-43.09387,-22.80276],[-43.0941,-22.73998],[-43.13599,-22.73992],[-43.13569,-22.75067],[-43.12573,-22.75055],[-43.12556,-22.77118],[-43.14595,-22.77109],[-43.14612,-22.76055],[-43.17771,-22.76088],[-43.17758,-22.77115],[-43.18807,-22.7713],[-43.18807,-22.78166],[-43.25067,-22.78163],[-43.25057,-22.79198],[-43.28054,-22.79282],[-43.30343,-22.79312],[-43.33353,-22.79297],[-43.33347,-22.80258],[-43.38574,-22.8024],[-43.38542,-22.81255],[-43.41691,-22.81285],[-43.41675,-22.82341],[-43.42717,-22.82335],[-43.4274,-22.83374],[-43.45844,-22.83362],[-43.45864,-22.81276],[-43.48984,-22.813],[-43.48994,-22.7965],[-43.50208,-22.79746],[-43.51543,-22.79737],[-43.52078,-22.79591],[-43.54169,-22.79603],[-43.54179,-22.80234],[-43.54653,-22.80246],[-43.54666,-22.81189],[-43.55251,-22.81279],[-43.56991,-22.81294],[-43.56998,-22.8197],[-43.57361,-22.82326],[-43.58348,-22.82329],[-43.58352,-22.83347],[-43.59391,-22.83374],[-43.59394,-22.85468],[-43.66099,-22.85459],[-43.66099,-22.85983],[-43.70852,-22.86019],[-43.70836,-22.86503],[-43.72206,-22.86488],[-43.72213,-22.86847],[-43.75015,-22.86859],[-43.75009,-22.8753],[-43.76038,-22.87527],[-43.75992,-22.8785],[-43.75976,-22.88457],[-43.76132,-22.88586],[-43.78129,-22.8858],[-43.78126,-22.89591],[-43.80213,-22.89621],[-43.80135,-22.91137],[-43.80119,-22.92758],[-43.79213,-22.92776],[-43.7922,-22.93822],[-43.78191,-22.93799],[-43.78184,-22.94869],[-43.75067,-22.94845],[-43.7506,-22.95909],[-43.72986,-22.95886],[-43.72966,-22.97984],[-43.70904,-22.97966],[-43.70891,-22.99033],[-43.69846,-22.99006],[-43.69836,-23.00065],[-43.66735,-23.00044],[-43.66726,-23.01117],[-43.63125,-23.00937],[-43.63131,-23.02079],[-43.63586,-23.02091],[-43.63602,-23.03164],[-43.67771,-23.03164],[-43.67765,-23.04233],[-43.67086,-23.0423],[-43.67109,-23.0631],[-43.64599,-23.06304],[-43.64605,-23.05276],[-43.60475,-23.05255],[-43.60452,-23.06307],[-43.58381,-23.06289],[-43.58368,-23.08404],[-43.54186,-23.08383],[-43.54195,-23.06319],[-43.52147,-23.06301],[-43.5213,-23.07352],[-43.50043,-23.07337],[-43.50043,-23.04218],[-43.45877,-23.04221],[-43.4587,-23.03194],[-43.43782,-23.03182],[-43.43776,-23.02154],[-43.3235,-23.02121],[-43.3233,-23.04212],[-43.31291,-23.04195],[-43.31275,-23.05267],[-43.30239,-23.05258],[-43.30236,-23.04227],[-43.29194,-23.04215],[-43.29197,-23.03194],[-43.27109,-23.03182],[-43.27119,-23.01093],[-43.26061,-23.01087],[-43.26067,-23.00059],[-43.25057,-23.00047],[-43.25054,-23.01126],[-43.23989,-23.01102],[-43.23986,-23.00062],[-43.21908,-23.0005],[-43.21904,-22.99021],[-43.20901,-22.99009],[-43.20862,-23.08389],[-43.18768,-23.08377],[-43.18761,-23.07334],[-43.13582,-23.07337],[-43.13589,-23.05249],[-43.17732,-23.05255],[-43.17709,-22.96971]]],terms_url:"https://pgeo3.rio.rj.gov.br/arcgis/rest/services/Imagens/Mosaico_2013_UTM/MapServer",terms_text:"Instituto Pereira Passos - Prefeitura da Cidade do Rio de Janeiro."},{id:"rio2015",name:"Rio Mosaic 2015",type:"wms",template:"https://pgeo3.rio.rj.gov.br/arcgis/services/Imagens/Mosaico_2015_UTM/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-42.30363,-22.43698],[-44.10842,-22.06579],[-44.5313,-23.7863],[-42.70469,-24.16178],[-42.30363,-22.43698]]],terms_url:"https://pgeo3.rio.rj.gov.br/arcgis/rest/services/Imagens/Mosaico_2015_UTM/MapServer",terms_text:"Instituto Pereira Passos - Prefeitura da Cidade do Rio de Janeiro."},{id:"route500",name:"Route 500",type:"tms",template:"https://{switch:a,b,c}.tile.openstreetmap.fr/route500/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"https://wiki.openstreetmap.org/wiki/FR:Servers/tile.openstreetmap.fr#Route500.E2.84.A2.C2.A9.C2.AE",terms_text:"Tiles © cquest@Openstreetmap France, data © IGN, LO/OL",description:"Routes du réseau classé (autoroutes, nationales, départementales)",overlay:true},{id:"Ruda_Slaska-aerial_image",name:"Ruda Śląska: Orthophotomap (aerial image)",type:"wms",template:"https://rudaslaska.geoportal2.pl/map/wmsorto/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[18.84294,50.32508],[18.84008,50.33091],[18.85132,50.33437],[18.86262,50.3305],[18.88693,50.333],[18.89493,50.3319],[18.90045,50.32562],[18.89713,50.31146],[18.89312,50.31149],[18.89114,50.30778],[18.8972,50.2999],[18.89073,50.29586],[18.90211,50.29204],[18.90706,50.28637],[18.90853,50.27823],[18.93583,50.27379],[18.94106,50.25859],[18.93848,50.25317],[18.95086,50.24267],[18.96531,50.24084],[18.94611,50.22907],[18.89932,50.22516],[18.90251,50.21749],[18.89075,50.21557],[18.89292,50.20913],[18.86474,50.20512],[18.85673,50.22078],[18.85258,50.22331],[18.84619,50.21761],[18.83341,50.21715],[18.83533,50.22307],[18.83051,50.23099],[18.82411,50.23055],[18.81641,50.23709],[18.81619,50.24125],[18.80635,50.24596],[18.80344,50.24293],[18.78831,50.24456],[18.79552,50.2768],[18.81681,50.27732],[18.81919,50.28794],[18.83893,50.29795],[18.83849,50.3004],[18.82699,50.30342],[18.82691,50.32073],[18.83007,50.32371],[18.84294,50.32508]]],terms_text:"Urząd Miasta Ruda Śląska"},{id:"Rzeszow-buildings",name:"Rzeszów: Buildings",type:"wms",template:"http://wms.erzeszow.pl/?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=komunikacja,budynki,adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.09538,50.08157],[22.0947,50.05584],[22.08892,50.05589],[22.08874,50.03671],[22.09505,50.03682],[22.09435,49.98723],[22.0609,49.98754],[22.0605,49.96525],[22.04757,49.96509],[22.04724,49.95792],[22.03139,49.95845],[22.0312,49.9574],[22.0014,49.95833],[22.00019,49.9375],[22.0014,49.93746],[22.00029,49.92047],[21.96799,49.92088],[21.969,49.93683],[21.95393,49.93706],[21.95441,49.94373],[21.94192,49.94378],[21.94253,49.96646],[21.93676,49.9665],[21.93776,49.97828],[21.92898,49.97858],[21.92951,49.98858],[21.91606,49.9888],[21.9165,50.01192],[21.90572,50.01195],[21.90653,50.04136],[21.87425,50.04183],[21.87546,50.06072],[21.90465,50.06083],[21.90672,50.0835],[22.09538,50.08157]]],terms_text:"Urząd Miasta Rzeszowa"},{id:"Rzeszow-aerial_image",name:"Rzeszów: Orthophotomap (aerial image)",type:"wms",template:"http://wms.erzeszow.pl/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=rastry&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[22.09538,50.08157],[22.0947,50.05584],[22.08892,50.05589],[22.08874,50.03671],[22.09505,50.03682],[22.09435,49.98723],[22.0609,49.98754],[22.0605,49.96525],[22.04757,49.96509],[22.04724,49.95792],[22.03139,49.95845],[22.0312,49.9574],[22.0014,49.95833],[22.00019,49.9375],[22.0014,49.93746],[22.00029,49.92047],[21.96799,49.92088],[21.969,49.93683],[21.95393,49.93706],[21.95441,49.94373],[21.94192,49.94378],[21.94253,49.96646],[21.93676,49.9665],[21.93776,49.97828],[21.92898,49.97858],[21.92951,49.98858],[21.91606,49.9888],[21.9165,50.01192],[21.90572,50.01195],[21.90653,50.04136],[21.87425,50.04183],[21.87546,50.06072],[21.90465,50.06083],[21.90672,50.0835],[22.09538,50.08157]]],terms_text:"Urząd Miasta Rzeszowa"},{id:"SanJuanMetroAreaUSACEOrthophotos",name:"San Juan Metro Area: 2013 USACE Orthophotos",type:"tms",template:"http://imagery-pr-usace-2013.s3-website-us-east-1.amazonaws.com/tiles/{zoom}/{x}/{y}.jpg",endDate:"2013-03-15T00:00:00.000Z",startDate:"2013-03-13T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-66.15007,18.35002],[-66.03337,18.35002],[-66.03328,18.45634],[-66.05464,18.45636],[-66.05463,18.46542],[-66.08303,18.46544],[-66.08302,18.47451],[-66.13034,18.47455],[-66.13034,18.4796],[-66.13983,18.47961],[-66.13984,18.46557],[-66.14995,18.46558],[-66.15007,18.35002]]]},{id:"santana_do_ipanema",name:"Santana do Ipanema AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Santana%20do%20Ipanema&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.20224,-9.41356],[-37.20188,-9.37768],[-37.20208,-9.37455],[-37.20192,-9.36733],[-37.20169,-9.36045],[-37.20172,-9.35501],[-37.20195,-9.35101],[-37.20191,-9.34773],[-37.20175,-9.33835],[-37.2017,-9.33505],[-37.20171,-9.33301],[-37.20142,-9.32833],[-37.20121,-9.32469],[-37.20117,-9.32351],[-37.21425,-9.32346],[-37.21537,-9.3234],[-37.22078,-9.32328],[-37.23727,-9.32313],[-37.25181,-9.32293],[-37.2656,-9.32276],[-37.2803,-9.32259],[-37.29191,-9.32245],[-37.29205,-9.33522],[-37.29304,-9.4122],[-37.28357,-9.41235],[-37.27789,-9.4125],[-37.2716,-9.41249],[-37.26506,-9.41262],[-37.26165,-9.41274],[-37.25499,-9.41276],[-37.24991,-9.41296],[-37.24616,-9.41297],[-37.24108,-9.41303],[-37.23461,-9.41321],[-37.2284,-9.41325],[-37.22165,-9.41335],[-37.21686,-9.41346],[-37.21292,-9.41343],[-37.20224,-9.41356]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Sao_miguel_dos_campos",name:"São Miguel dos Campos AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Sao_miguel_dos_campos&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.1415,-9.83171],[-36.05047,-9.83246],[-36.04959,-9.74246],[-36.14059,-9.74166],[-36.1415,-9.83171]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"GEOSN-DOP-2005",name:"Saxony historical aerial imagery 2005",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-2005/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dop_2005&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2005-01-01T00:00:00.000Z",startDate:"2005-01-01T00:00:00.000Z",polygon:[[[13.86571,50.71509],[13.86683,50.73012],[13.90116,50.73012],[13.90184,50.74446],[13.91043,50.74446],[13.91043,50.77378],[13.95266,50.77486],[13.95197,50.78897],[13.99969,50.78941],[13.999,50.79831],[14.16715,50.79762],[14.1747,50.8462],[14.32851,50.84534],[14.33503,50.87643],[14.41674,50.876],[14.41674,50.95025],[14.33263,50.95133],[14.3364,50.99802],[14.58188,50.99608],[14.57742,50.94895],[14.54068,50.95003],[14.54446,50.89831],[14.60557,50.89116],[14.60454,50.83439],[14.6605,50.83352],[14.65673,50.79578],[14.83422,50.79469],[14.84727,50.89138],[14.9204,50.88943],[14.9331,50.99478],[14.99902,50.99673],[15.00142,51.09709],[15.04159,51.09709],[15.04228,51.35317],[14.99696,51.35317],[15.00314,51.49959],[14.91593,51.50301],[14.91662,51.55043],[14.74908,51.55129],[14.75114,51.60121],[14.41056,51.59993],[14.41125,51.55129],[14.07891,51.54915],[14.07479,51.49831],[13.99446,51.50002],[13.99446,51.39817],[13.53921,51.39989],[13.53852,51.42516],[13.50041,51.42505],[13.50179,51.44945],[13.41596,51.45094],[13.41699,51.50013],[13.3315,51.50055],[13.33047,51.44966],[13.24945,51.44987],[13.25116,51.60036],[13.16773,51.60057],[13.16739,51.65023],[13.08328,51.65066],[13.08362,51.69941],[12.66202,51.70027],[12.66065,51.64832],[12.4162,51.65045],[12.41345,51.60057],[12.16146,51.60015],[12.16146,51.50109],[12.07631,51.50023],[12.07974,51.39625],[12.16008,51.39753],[12.16214,51.34995],[12.07906,51.35253],[12.07906,51.24562],[12.16214,51.24691],[12.16352,51.0958],[12.24317,51.09709],[12.2454,51.04813],[12.49688,51.04883],[12.49894,50.89966],[12.33346,50.89923],[12.32797,50.84984],[12.20712,50.8494],[12.20506,50.69829],[12.24694,50.69744],[12.24694,50.65023],[11.91529,50.64849],[11.91598,50.59839],[11.83221,50.59817],[11.83255,50.39922],[11.91495,50.39922],[11.91461,50.34886],[11.99486,50.34659],[11.99838,50.29897],[12.16506,50.29912],[12.16549,50.24904],[12.23673,50.24871],[12.24823,50.24212],[12.24772,50.14904],[12.33149,50.14893],[12.33852,50.19335],[12.33286,50.23927],[12.3538,50.23619],[12.35998,50.24926],[12.41457,50.24948],[12.41594,50.29906],[12.49851,50.29874],[12.49834,50.34948],[12.58142,50.34915],[12.58125,50.39896],[12.69489,50.39962],[12.70622,50.39426],[12.71257,50.39875],[13.0813,50.39907],[13.0813,50.4992],[13.24816,50.49898],[13.24884,50.54809],[13.33124,50.54918],[13.33056,50.59911],[13.50908,50.59759],[13.50462,50.62656],[13.5393,50.62635],[13.53827,50.65481],[13.54633,50.65547],[13.54599,50.66983],[13.5544,50.67027],[13.55457,50.68908],[13.54736,50.68887],[13.54582,50.69969],[13.63886,50.69947],[13.63955,50.71425],[13.86571,50.71509]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=3f38c3f3-03db-4a2a-b6da-2704b9a1d5f0",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-2012_2014",name:"Saxony historical aerial imagery 2012-2014",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop_2012_2014/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dop_2012_2014_rgb&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[13.86571,50.71509],[13.86683,50.73012],[13.90116,50.73012],[13.90184,50.74446],[13.91043,50.74446],[13.91043,50.77378],[13.95266,50.77486],[13.95197,50.78897],[13.99969,50.78941],[13.999,50.79831],[14.16715,50.79762],[14.1747,50.8462],[14.32851,50.84534],[14.33503,50.87643],[14.41674,50.876],[14.41674,50.95025],[14.33263,50.95133],[14.3364,50.99802],[14.58188,50.99608],[14.57742,50.94895],[14.54068,50.95003],[14.54446,50.89831],[14.60557,50.89116],[14.60454,50.83439],[14.6605,50.83352],[14.65673,50.79578],[14.83422,50.79469],[14.84727,50.89138],[14.9204,50.88943],[14.9331,50.99478],[14.99902,50.99673],[15.00142,51.09709],[15.04159,51.09709],[15.04228,51.35317],[14.99696,51.35317],[15.00314,51.49959],[14.91593,51.50301],[14.91662,51.55043],[14.74908,51.55129],[14.75114,51.60121],[14.41056,51.59993],[14.41125,51.55129],[14.07891,51.54915],[14.07479,51.49831],[13.99446,51.50002],[13.99446,51.39817],[13.53921,51.39989],[13.53852,51.42516],[13.50041,51.42505],[13.50179,51.44945],[13.41596,51.45094],[13.41699,51.50013],[13.3315,51.50055],[13.33047,51.44966],[13.24945,51.44987],[13.25116,51.60036],[13.16773,51.60057],[13.16739,51.65023],[13.08328,51.65066],[13.08362,51.69941],[12.66202,51.70027],[12.66065,51.64832],[12.4162,51.65045],[12.41345,51.60057],[12.16146,51.60015],[12.16146,51.50109],[12.07631,51.50023],[12.07974,51.39625],[12.16008,51.39753],[12.16214,51.34995],[12.07906,51.35253],[12.07906,51.24562],[12.16214,51.24691],[12.16352,51.0958],[12.24317,51.09709],[12.2454,51.04813],[12.49688,51.04883],[12.49894,50.89966],[12.33346,50.89923],[12.32797,50.84984],[12.20712,50.8494],[12.20506,50.69829],[12.24694,50.69744],[12.24694,50.65023],[11.91529,50.64849],[11.91598,50.59839],[11.83221,50.59817],[11.83255,50.39922],[11.91495,50.39922],[11.91461,50.34886],[11.99486,50.34659],[11.99838,50.29897],[12.16506,50.29912],[12.16549,50.24904],[12.23673,50.24871],[12.24823,50.24212],[12.24772,50.14904],[12.33149,50.14893],[12.33852,50.19335],[12.33286,50.23927],[12.3538,50.23619],[12.35998,50.24926],[12.41457,50.24948],[12.41594,50.29906],[12.49851,50.29874],[12.49834,50.34948],[12.58142,50.34915],[12.58125,50.39896],[12.69489,50.39962],[12.70622,50.39426],[12.71257,50.39875],[13.0813,50.39907],[13.0813,50.4992],[13.24816,50.49898],[13.24884,50.54809],[13.33124,50.54918],[13.33056,50.59911],[13.50908,50.59759],[13.50462,50.62656],[13.5393,50.62635],[13.53827,50.65481],[13.54633,50.65547],[13.54599,50.66983],[13.5544,50.67027],[13.55457,50.68908],[13.54736,50.68887],[13.54582,50.69969],[13.63886,50.69947],[13.63955,50.71425],[13.86571,50.71509]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=8c276e3c-88af-462f-8128-6900bc7dd4f8",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-RGB",name:"Saxony latest aerial imagery",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-rgb/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dop_020&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=cd01c334-7e32-482f-bd43-af286707178a",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-CIR",name:"Saxony latest aerial imagery infrared",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-cir/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dop_020_cir&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=ba87bbed-4cb5-4539-a9f5-f863de752f52",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DTK",name:"Saxony topographic map",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dtk-pg-color/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dtk_pg_color&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=d6d24c6d-94ea-447d-8a0c-40afdedeb5c6",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-WebAtlas",name:"Saxony WebAtlasSN",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_webatlas-sn/guest?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vegetation,Siedlung,Gewaesser,Verkehr,Administrative_Einheiten,Beschriftung&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=475a9197-620f-4dcb-b8aa-7f71b626443f",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"Geodatastyrelsen_Denmark",name:"SDFE aerial imagery",type:"tms",template:"https://osmtools.septima.dk/mapproxy/tiles/1.0.0/kortforsyningen_ortoforaar/EPSG3857/{zoom}/{x}/{y}.jpeg",zoomExtent:[0,21],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_url:"https://download.kortforsyningen.dk/content/vilkaar-og-betingelser",terms_text:"Geodatastyrelsen og Danske Kommuner",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_Cadastral_Parcels_INSPIRE_View",name:"SDFE Cadastral Parcels INSPIRE View",type:"wms",template:"https://kortforsyningen.kms.dk/cp_inspire?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=CP.CadastralParcel&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_DTK_Kort25",name:"SDFE DTK Kort25",type:"wms",template:"https://kortforsyningen.kms.dk/topo25?FORMAT=image/png&VERSION=1.1.1&login=OpenStreetMapDK2015&password=Gall4Peters&SERVICE=WMS&REQUEST=GetMap&Layers=topo25_klassisk&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_Skaermkort",name:"SDFE Skærmkort",type:"wms",template:"https://kortforsyningen.kms.dk/topo_skaermkort?FORMAT=image/png&VERSION=1.1.1&login=OpenStreetMapDK2015&password=Gall4Peters&SERVICE=WMS&REQUEST=GetMap&Layers=dtk_skaermkort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"SDFE_Overflade_Skyggekort_40cm",name:"SDFE Surface Shadow Map (40 cm)",type:"wms",template:"https://kortforsyningen.kms.dk/dhm?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=dhm_overflade_skyggekort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"SDFE_Terraen_Skyggekort_40cm",name:"SDFE Terrain Shadow Map (40 cm)",type:"wms",template:"https://kortforsyningen.kms.dk/dhm?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=dhm_terraen_skyggekort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Sicily-ATA2007",name:"Sicily - Italy",type:"wms",template:"http://map.sitr.regione.sicilia.it/ArcGIS/services/WGS84_F33/Ortofoto_ATA20072008_f33/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&STYLES=default&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[15.71165,38.25894],[15.23718,38.81938],[14.27124,38.55246],[13.15063,38.75408],[11.96411,37.97451],[12.52441,37.54022],[11.87897,36.79609],[12.49695,35.47409],[12.68921,35.46962],[14.57336,36.66401],[15.29709,36.62875],[15.39854,37.42171],[15.71165,38.25894]]]},{id:"Siemianowice_Slaskie-buildings",name:"Siemianowice Śląskie: Buildings",type:"wms",template:"https://siemianowice.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,drogi,adresy,ulice&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[19.03103,50.33933],[19.0316,50.35413],[19.0656,50.35373],[19.06529,50.34219],[19.06118,50.33749],[19.06069,50.31967],[19.05603,50.31975],[19.05562,50.30155],[19.06432,50.3015],[19.06366,50.27175],[19.04379,50.27179],[19.04375,50.27478],[19.0213,50.27505],[19.02156,50.28398],[19.01027,50.28856],[18.98791,50.28871],[18.98822,50.3022],[18.98143,50.30226],[18.98213,50.33977],[19.03103,50.33933]]],terms_text:"Urząd Miasta Siemianowice Śląskie"},{id:"Siemianowice_Slaskie-aerial_image",name:"Siemianowice Śląskie: Orthophotomap (aerial image)",type:"wms",template:"https://siemianowice.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[19.03103,50.33933],[19.0316,50.35413],[19.0656,50.35373],[19.06529,50.34219],[19.06118,50.33749],[19.06069,50.31967],[19.05603,50.31975],[19.05562,50.30155],[19.06432,50.3015],[19.06366,50.27175],[19.04379,50.27179],[19.04375,50.27478],[19.0213,50.27505],[19.02156,50.28398],[19.01027,50.28856],[18.98791,50.28871],[18.98822,50.3022],[18.98143,50.30226],[18.98213,50.33977],[19.03103,50.33933]]],terms_text:"Urząd Miasta Siemianowice Śląskie"},{id:"sc2012",name:"SIG Santa Catarina OrtoRGB 2012",type:"wms",template:"http://sigsc.sc.gov.br/sigserver/SIGSC/wms?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OrtoRGB-Landsat-2012&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[-48.62488,-26.91624],[-48.62416,-26.83409],[-48.56163,-26.83412],[-48.56165,-26.74919],[-48.62675,-26.74918],[-48.62715,-26.73276],[-48.64126,-26.733],[-48.64174,-26.70912],[-48.62414,-26.70913],[-48.62418,-26.50079],[-48.57099,-26.50077],[-48.57155,-26.47415],[-48.55418,-26.47381],[-48.5545,-26.45736],[-48.56155,-26.45747],[-48.56161,-26.41746],[-48.4991,-26.41747],[-48.49909,-26.25081],[-48.43664,-26.25079],[-48.43661,-26.20752],[-48.4601,-26.20751],[-48.46195,-26.1242],[-48.56161,-26.12419],[-48.56163,-25.95753],[-48.62411,-25.95753],[-48.62411,-25.94507],[-48.68838,-25.94607],[-48.6884,-25.95752],[-49.25089,-25.95752],[-49.2509,-25.9992],[-49.31339,-25.9992],[-49.31338,-26.0825],[-49.37591,-26.0825],[-49.37591,-26.12419],[-49.50093,-26.12418],[-49.50092,-26.16586],[-49.68661,-26.16585],[-49.68661,-26.12417],[-49.74907,-26.08246],[-49.74908,-26.04084],[-49.8116,-26.04085],[-49.81159,-25.99918],[-49.93657,-25.99915],[-49.93661,-25.98244],[-50.00091,-25.98288],[-50.00094,-25.99915],[-50.31338,-25.99916],[-50.31342,-26.04083],[-50.37411,-26.04084],[-50.3741,-25.9992],[-50.49914,-25.99918],[-50.49911,-25.98414],[-50.62593,-25.98452],[-50.62595,-26.04084],[-50.6884,-26.04161],[-50.68845,-26.12416],[-50.75094,-26.12414],[-50.75095,-26.20752],[-51.12595,-26.20747],[-51.12595,-26.24913],[-51.18848,-26.24918],[-51.31344,-26.33245],[-51.31347,-26.62414],[-51.4366,-26.62415],[-51.43659,-26.56476],[-51.62409,-26.5641],[-51.62411,-26.5408],[-51.99907,-26.5408],[-52.06158,-26.49911],[-52.06158,-26.45747],[-52.12408,-26.45749],[-52.12406,-26.41579],[-52.37407,-26.4158],[-52.37409,-26.39133],[-52.56156,-26.3894],[-52.56158,-26.37415],[-52.62408,-26.37417],[-52.62409,-26.33247],[-53.12408,-26.33247],[-53.1241,-26.31707],[-53.1618,-26.3165],[-53.16136,-26.29082],[-53.18656,-26.29083],[-53.24907,-26.24911],[-53.24906,-26.23919],[-53.31159,-26.23824],[-53.3741,-26.22882],[-53.43845,-26.22777],[-53.43843,-26.24914],[-53.5616,-26.24916],[-53.56159,-26.23983],[-53.65501,-26.23814],[-53.65623,-26.29263],[-53.67011,-26.31684],[-53.68846,-26.33242],[-53.70322,-26.3741],[-53.70929,-26.38449],[-53.7098,-26.39568],[-53.70619,-26.40722],[-53.70721,-26.45927],[-53.71438,-26.46168],[-53.71476,-26.48118],[-53.73047,-26.49913],[-53.73146,-26.54081],[-53.75096,-26.5408],[-53.75095,-26.62417],[-53.7602,-26.62414],[-53.76125,-26.6675],[-53.75098,-26.66751],[-53.75096,-26.74298],[-53.72737,-26.7434],[-53.72133,-26.74905],[-53.72141,-26.75093],[-53.74571,-26.75943],[-53.74612,-26.77704],[-53.71948,-26.77755],[-53.72084,-26.83416],[-53.70047,-26.83414],[-53.70277,-26.93108],[-53.71168,-26.93091],[-53.71224,-26.95557],[-53.751,-26.95479],[-53.75092,-26.99915],[-53.76467,-26.99915],[-53.8037,-27.03751],[-53.80454,-27.07258],[-53.80809,-27.07249],[-53.80862,-27.09613],[-53.8269,-27.09577],[-53.82762,-27.12414],[-53.84644,-27.12413],[-53.84765,-27.17014],[-53.83506,-27.18932],[-53.83536,-27.20054],[-53.68847,-27.20284],[-53.68849,-27.22789],[-53.43654,-27.23246],[-53.43655,-27.16751],[-53.37598,-27.16751],[-53.37601,-27.23352],[-53.24905,-27.23564],[-53.24905,-27.20922],[-53.06344,-27.20918],[-53.06345,-27.2334],[-52.81348,-27.23685],[-52.81346,-27.27653],[-52.75096,-27.27732],[-52.75096,-27.29249],[-52.4385,-27.29252],[-52.43848,-27.32689],[-52.37603,-27.32753],[-52.37599,-27.3342],[-52.25098,-27.33418],[-52.25099,-27.34669],[-52.18655,-27.34728],[-52.18657,-27.33419],[-52.12598,-27.3342],[-52.12599,-27.36413],[-52.02979,-27.36489],[-52.03036,-27.42442],[-51.97534,-27.42479],[-51.97603,-27.50088],[-51.93845,-27.50085],[-51.93845,-27.54252],[-51.68846,-27.54247],[-51.68847,-27.55742],[-51.59903,-27.5579],[-51.59923,-27.59481],[-51.56351,-27.59498],[-51.56348,-27.62586],[-51.50088,-27.62586],[-51.50095,-27.66754],[-51.43937,-27.6675],[-51.43954,-27.70932],[-51.37597,-27.7095],[-51.37601,-27.75089],[-51.31349,-27.7509],[-51.31346,-27.79253],[-51.18847,-27.79251],[-51.18848,-27.87586],[-51.12598,-27.87586],[-51.12597,-27.91752],[-51.06348,-27.9175],[-51.06347,-27.95919],[-51.00095,-28.00086],[-50.9385,-28.00086],[-50.93849,-28.16755],[-50.81346,-28.16752],[-50.81345,-28.29253],[-50.75096,-28.29251],[-50.68845,-28.33418],[-50.68849,-28.41754],[-50.626,-28.41752],[-50.56352,-28.44094],[-50.43848,-28.44051],[-50.43847,-28.45917],[-50.37597,-28.45921],[-50.37598,-28.47554],[-50.18844,-28.47454],[-50.18849,-28.51143],[-50.12398,-28.51104],[-50.12402,-28.50086],[-49.87597,-28.50085],[-49.87601,-28.5142],[-49.81347,-28.51369],[-49.81347,-28.58255],[-49.83003,-28.58251],[-49.82951,-28.62597],[-49.8759,-28.66572],[-50.001,-28.74915],[-50.001,-29.04083],[-50.03319,-29.04081],[-50.03219,-29.14711],[-50.12602,-29.14774],[-50.12598,-29.16579],[-50.13613,-29.16581],[-50.1885,-29.19623],[-50.1885,-29.31905],[-50.1422,-29.31873],[-50.14208,-29.33422],[-50.126,-29.33418],[-50.12599,-29.36238],[-49.99906,-29.36153],[-49.99904,-29.24031],[-49.93848,-29.23986],[-49.93851,-29.25087],[-49.87601,-29.25087],[-49.876,-29.30098],[-49.82262,-29.30052],[-49.82227,-29.33419],[-49.81347,-29.33422],[-49.81354,-29.3411],[-49.68654,-29.33991],[-49.68651,-29.29255],[-49.62399,-29.29252],[-49.62398,-29.25085],[-49.56149,-29.25083],[-49.56145,-29.16749],[-49.49901,-29.16746],[-49.49902,-29.08419],[-49.4365,-29.08418],[-49.43651,-29.04251],[-49.37405,-29.04248],[-49.37402,-28.9592],[-49.31153,-28.95917],[-49.31152,-28.91749],[-49.24898,-28.9175],[-49.24897,-28.87582],[-49.18655,-28.87585],[-49.18653,-28.83414],[-49.12402,-28.83418],[-49.12401,-28.7925],[-49.06149,-28.79247],[-49.06146,-28.75084],[-48.99903,-28.75085],[-48.99903,-28.70919],[-48.93658,-28.70918],[-48.93658,-28.66752],[-48.87405,-28.66751],[-48.87404,-28.62585],[-48.74912,-28.62585],[-48.74912,-28.54254],[-48.68656,-28.54253],[-48.68658,-28.33417],[-48.62408,-28.33416],[-48.62406,-28.08418],[-48.5616,-28.08418],[-48.56159,-27.95919],[-48.49905,-27.95916],[-48.49904,-27.91581],[-48.56157,-27.9158],[-48.5616,-27.87584],[-48.49902,-27.87586],[-48.49902,-27.83422],[-48.43657,-27.83418],[-48.43661,-27.62583],[-48.37406,-27.62585],[-48.37405,-27.50086],[-48.31157,-27.50086],[-48.31153,-27.24913],[-48.43657,-27.24913],[-48.43654,-27.20916],[-48.37402,-27.2092],[-48.37405,-27.1658],[-48.43656,-27.1658],[-48.43656,-27.12415],[-48.49906,-27.12413],[-48.49907,-27.08667],[-48.50022,-27.08666],[-48.50031,-27.08247],[-48.5616,-27.08248],[-48.56159,-27.04252],[-48.49906,-27.04252],[-48.49906,-26.99913],[-48.56156,-26.99913],[-48.56157,-26.91579],[-48.62488,-26.91624]]],terms_url:"http://sigsc.sds.sc.gov.br/download/termo_sigsc.pdf",terms_text:"Sistema de Informações Geográficas - Governo de Santa Catarina"},{id:"SIGIP-2012",name:"SIGIP - Orthophoto 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/sigip2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.71057,46.54396],[6.72968,46.54408],[6.72995,46.52605],[6.71085,46.52596],[6.71113,46.50796],[6.6922,46.50788],[6.6923,46.49883],[6.63531,46.49847],[6.63488,46.52547],[6.65381,46.52558],[6.65361,46.54358],[6.69163,46.54384],[6.69155,46.55284],[6.71047,46.55293],[6.71057,46.54396]]],terms_url:"https://www.sigip.ch/",terms_text:"SIGIP"},{id:"Slovakia-Historic-Maps",name:"Slovakia Historic Maps",type:"tms",template:"http://tms.freemap.sk/historicke/{zoom}/{x}/{y}.png",zoomExtent:[0,12],polygon:[[[16.81969,47.49272],[16.81969,49.50303],[22.83883,49.50303],[22.83883,47.49272],[16.81969,47.49272]]],icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"skoterleder",name:"Snowmobile map Sweden",type:"tms",template:"https://tiles.skoterleder.org/tiles/{zoom}/{x}/{y}.png",zoomExtent:[5,14],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[23.87328,65.21069],[30.14647,65.19226],[30.19042,67.62596],[29.43236,69.62651],[27.93822,70.14037],[20.73119,69.2756],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://skoterleder.org/",terms_text:"© Skoterleder.org",description:"Snowmobile trails",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Sweden_road_sign_D9.svg/200px-Sweden_road_sign_D9.svg.png"},{id:"Soskut_Pusztazamor_Tarnok_Diosd_orto_2017",name:"Sóskút, Pusztazámor, Tárnok, Diósd ortophoto 2017",type:"tms",template:"http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/Soskut-Tarnok-Pusztazamor-Diosd/mercator/{zoom}/{x}/{y}.png",endDate:"2017-03-01T00:00:00.000Z",startDate:"2017-03-01T00:00:00.000Z",zoomExtent:[11,20],polygon:[[[18.79273,47.37079],[18.79194,47.37048],[18.79139,47.37063],[18.79011,47.37176],[18.78916,47.37345],[18.78722,47.37566],[18.78603,47.37765],[18.78498,47.37905],[18.7837,47.38032],[18.78267,47.38195],[18.7814,47.38368],[18.77934,47.38713],[18.77666,47.3894],[18.76472,47.3967],[18.7617,47.39966],[18.75631,47.40328],[18.75837,47.40653],[18.7588,47.40776],[18.762,47.41217],[18.76304,47.41315],[18.76593,47.41471],[18.77041,47.41766],[18.77247,47.41809],[18.77248,47.4203],[18.8086,47.44041],[18.81742,47.43539],[18.82092,47.43572],[18.82804,47.43755],[18.83021,47.43526],[18.83585,47.43754],[18.84049,47.43346],[18.84765,47.43572],[18.851,47.43281],[18.869,47.43961],[18.87361,47.43597],[18.87499,47.43342],[18.87386,47.43248],[18.87604,47.42797],[18.8605,47.423],[18.86621,47.41798],[18.87243,47.41086],[18.8663,47.40773],[18.86964,47.40471],[18.86777,47.40207],[18.86509,47.40052],[18.87081,47.39838],[18.86772,47.39699],[18.86992,47.39655],[18.87649,47.39478],[18.87749,47.39495],[18.87867,47.39462],[18.88358,47.38996],[18.88291,47.38967],[18.88539,47.3853],[18.87748,47.38339],[18.88181,47.37605],[18.87914,47.37393],[18.88638,47.36923],[18.88206,47.36773],[18.87973,47.36641],[18.8747,47.36252],[18.87282,47.36137],[18.87028,47.36063],[18.86688,47.35853],[18.86234,47.35637],[18.85567,47.35199],[18.84874,47.34728],[18.83192,47.33841],[18.82497,47.34258],[18.8162,47.34925],[18.81079,47.35357],[18.80823,47.356],[18.80645,47.35854],[18.80708,47.35902],[18.80635,47.36021],[18.80465,47.36175],[18.80381,47.36335],[18.80055,47.36545],[18.79988,47.36617],[18.79416,47.36975],[18.79273,47.37079]],[[18.91871,47.40938],[18.91826,47.40998],[18.92067,47.41156],[18.9251,47.41372],[18.93473,47.41917],[18.94063,47.42241],[18.94982,47.41938],[18.95155,47.4175],[18.9569,47.41923],[18.9577,47.41878],[18.95755,47.41435],[18.96211,47.40507],[18.96266,47.40118],[18.96316,47.39903],[18.95446,47.39673],[18.95276,47.39526],[18.95202,47.39362],[18.95119,47.39356],[18.94692,47.39799],[18.94411,47.39845],[18.94161,47.39869],[18.93735,47.39633],[18.93617,47.39683],[18.93122,47.4],[18.9312,47.40023],[18.92924,47.40205],[18.92561,47.40605],[18.92466,47.40635],[18.92293,47.40926],[18.91871,47.40938]]],terms_url:"http://fototerkep.hu",terms_text:"Fototerkep.hu",best:true,description:"5 cm resolution bald image of 4 settlement"},{id:"South_Africa-CD_NGI-Aerial",name:"South Africa CD:NGI Aerial",type:"tms",template:"http://{switch:a,b,c}.aerial.openstreetmap.org.za/ngi-aerial/{zoom}/{x}/{y}.jpg",zoomExtent:[1,22],polygon:[[[17.83968,-32.79834],[17.88935,-32.69728],[18.00364,-32.69822],[18.09917,-32.74853],[18.28987,-32.55266],[18.29302,-32.04871],[18.10545,-31.6455],[17.85293,-31.3444],[17.548,-30.90217],[17.40445,-30.63747],[17.24937,-30.39917],[16.9937,-29.65436],[16.7988,-29.19437],[16.54941,-28.84159],[16.44987,-28.69188],[16.4491,-28.55158],[16.60026,-28.48257],[16.75141,-28.4487],[16.74622,-28.2459],[16.88551,-28.04729],[16.99295,-28.0244],[17.05297,-28.02571],[17.10076,-28.03388],[17.20115,-28.09305],[17.20263,-28.23284],[17.24746,-28.23382],[17.2508,-28.19889],[17.35119,-28.19759],[17.35156,-28.24427],[17.40158,-28.24524],[17.41491,-28.34898],[17.40083,-28.548],[17.4527,-28.54897],[17.45121,-28.64951],[17.49836,-28.68721],[17.60282,-28.683],[17.64997,-28.69679],[17.65259,-28.73815],[17.80139,-28.73815],[17.99943,-28.75606],[18.00027,-28.79562],[18.15745,-28.87181],[18.50638,-28.87181],[18.61536,-28.82959],[18.90875,-28.82775],[19.1047,-28.94885],[19.19691,-28.93785],[19.24301,-28.85162],[19.23149,-28.80296],[19.25873,-28.70099],[19.44315,-28.69732],[19.55003,-28.49583],[19.69673,-28.49399],[19.69882,-28.44794],[19.85076,-28.44333],[19.84971,-28.40278],[19.99536,-28.39909],[19.98937,-24.74979],[20.29167,-24.91923],[20.47246,-25.15017],[20.65324,-25.45294],[20.73326,-25.6802],[20.8281,-25.89635],[20.84292,-26.21585],[20.65028,-26.48409],[20.65324,-26.82049],[21.08891,-26.84693],[21.67277,-26.839],[21.7765,-26.66963],[21.97211,-26.64314],[22.28034,-26.32747],[22.57078,-26.1334],[22.77528,-25.67752],[23.00052,-25.27619],[23.46583,-25.27351],[23.88372,-25.59737],[24.2364,-25.6134],[24.60391,-25.78966],[25.1107,-25.73894],[25.50784,-25.68554],[25.64418,-25.48238],[25.84193,-24.78054],[25.84664,-24.75385],[26.39285,-24.63329],[26.47391,-24.56533],[26.509,-24.48424],[26.58619,-24.40758],[26.73006,-24.30145],[26.85674,-24.24995],[26.85744,-24.10269],[26.92155,-23.8991],[26.93183,-23.84619],[26.97148,-23.69943],[27.00061,-23.63676],[27.0578,-23.60526],[27.13605,-23.52034],[27.33396,-23.39738],[27.51441,-23.35939],[27.59581,-23.20855],[27.80986,-23.0995],[27.88285,-23.06205],[27.93829,-22.94965],[28.04076,-22.82551],[28.20568,-22.65529],[28.33972,-22.56394],[28.49061,-22.5607],[28.61088,-22.54002],[28.82818,-22.45502],[28.92853,-22.42323],[28.95941,-22.30901],[29.01626,-22.20834],[29.23241,-22.16935],[29.35312,-22.18429],[29.6549,-22.11864],[29.77771,-22.1362],[29.9293,-22.18494],[30.11668,-22.28303],[30.25634,-22.29148],[30.30336,-22.33952],[30.50618,-22.30576],[30.83743,-22.28498],[31.00586,-22.30771],[31.18342,-22.32329],[31.29306,-22.36746],[31.56806,-23.19034],[31.55683,-23.44308],[31.69311,-23.61752],[31.71197,-23.74114],[31.77747,-23.88006],[31.88863,-23.94811],[31.91444,-24.17467],[31.99483,-24.30409],[32.01667,-24.4406],[32.00773,-24.65366],[32.01964,-24.91407],[32.03552,-25.08498],[32.01964,-25.38214],[31.99285,-25.44938],[31.99979,-25.51657],[32.00575,-25.6079],[32.00575,-25.66248],[31.93627,-25.84037],[31.98094,-25.95465],[31.86878,-26.00373],[31.41621,-25.72777],[31.32291,-25.74386],[31.25046,-25.82965],[31.1393,-25.91627],[31.11647,-25.99124],[30.96561,-26.26658],[30.89217,-26.32797],[30.85346,-26.40356],[30.82269,-26.44888],[30.80226,-26.52407],[30.80384,-26.80821],[30.90209,-26.78075],[30.91003,-26.84895],[30.98249,-26.90826],[30.97653,-27.00292],[31.00344,-27.04416],[31.15433,-27.19804],[31.50156,-27.31112],[31.97002,-27.31112],[31.97002,-27.12047],[31.97697,-27.05066],[32.00025,-26.79839],[32.10698,-26.79846],[32.31145,-26.84795],[32.89999,-26.85161],[32.88609,-26.9817],[32.70943,-27.47854],[32.62407,-27.77751],[32.5814,-28.07479],[32.53872,-28.2288],[32.42756,-28.50216],[32.36404,-28.59457],[32.07026,-28.84698],[31.98788,-28.90695],[31.77648,-28.96949],[31.46385,-29.28593],[31.35963,-29.38543],[31.16808,-29.63074],[31.06486,-29.78935],[31.05345,-29.84705],[31.06699,-29.86403],[31.04555,-29.9502],[30.95186,-30.00339],[30.86518,-30.10241],[30.72447,-30.3925],[30.35563,-30.93089],[30.09724,-31.24583],[29.86731,-31.43043],[29.74094,-31.50147],[29.48131,-31.69787],[28.89432,-32.28989],[28.54971,-32.58946],[28.14365,-32.83207],[28.07487,-32.94169],[27.84509,-33.08287],[27.3758,-33.38607],[26.88054,-33.6459],[26.59169,-33.74808],[26.45273,-33.79358],[26.20675,-33.75489],[26.00779,-33.7224],[25.80555,-33.75243],[25.75111,-33.80065],[25.65291,-33.85436],[25.65291,-33.94698],[25.71958,-34.00401],[25.72028,-34.05112],[25.55089,-34.06315],[25.35046,-34.05026],[25.28106,-34.00203],[25.04763,-33.99946],[24.95472,-34.00436],[24.94966,-34.10104],[24.87704,-34.15065],[24.87629,-34.20053],[24.85326,-34.21896],[24.76453,-34.20179],[24.50014,-34.20033],[24.34867,-34.11638],[24.19888,-34.1019],[23.99634,-34.05144],[23.80175,-34.05243],[23.74936,-34.01119],[23.49735,-34.00901],[23.41552,-34.04346],[23.41543,-34.11404],[22.90009,-34.0993],[22.84124,-34.05479],[22.64703,-34.05026],[22.64598,-34.00728],[22.57002,-34.00641],[22.50505,-34.06459],[22.252,-34.06459],[22.22213,-34.10147],[22.16212,-34.1057],[22.17124,-34.15218],[22.15769,-34.21809],[22.00156,-34.21722],[21.9497,-34.322],[21.86115,-34.40071],[21.56147,-34.40201],[21.5468,-34.36612],[21.50174,-34.36699],[21.5007,-34.40201],[21.41949,-34.44652],[21.19787,-34.44782],[21.09882,-34.39913],[21.00337,-34.37539],[20.89319,-34.39971],[20.89766,-34.4854],[20.74468,-34.48281],[20.5042,-34.48626],[20.25272,-34.70148],[20.08035,-34.83619],[19.99233,-34.83791],[19.89907,-34.82758],[19.89383,-34.7936],[19.5973,-34.79618],[19.39297,-34.64202],[19.28771,-34.64048],[19.28614,-34.59866],[19.34744,-34.52445],[19.32853,-34.45344],[19.098,-34.44998],[19.07256,-34.38024],[19.00235,-34.35256],[18.95206,-34.39494],[18.7975,-34.39364],[18.79842,-34.10164],[18.50175,-34.10153],[18.49995,-34.36169],[18.44773,-34.362],[18.44799,-34.35227],[18.39744,-34.3514],[18.39717,-34.3023],[18.35657,-34.30056],[18.34793,-34.20204],[18.29721,-34.19503],[18.29511,-33.99371],[18.33745,-33.99141],[18.34766,-33.84924],[18.34793,-33.78155],[18.41247,-33.74488],[18.36155,-33.65016],[18.2992,-33.58559],[18.21668,-33.44887],[18.13899,-33.39741],[17.94735,-33.16026],[17.88552,-33.05757],[17.84859,-32.96685],[17.83968,-32.85073],[17.83968,-32.79834]]],best:true},{id:"South-Tyrol-Orthofoto2011",name:"South Tyrol Orthofoto 2011",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2011_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0"},{id:"South-Tyrol-Orthofoto2011-20cm",name:"South Tyrol Orthofoto 2011 (highres)",type:"wms",template:"https://geoservices.buergernetz.bz.it/geoserver/ows?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=P_BZ_OF_2011_EPSG3857,P_BZ_OF_2011_20cm_EPSG3857&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0",description:"Orthophoto of South Tyrol from 2011 with up to 20cm resolution (larger valleys)"},{id:"South-Tyrol-Orthofoto2014",name:"South Tyrol Orthofoto 2014",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2014_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[11.71495,46.51227],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.61936,46.43957],[11.62508,46.43957],[11.62508,46.44797],[11.63349,46.44587],[11.63769,46.45846],[11.64399,46.45846],[11.6608,46.44587],[11.66711,46.44587],[11.66711,46.47525],[11.69442,46.47735],[11.69652,46.48575],[11.70913,46.49624],[11.70913,46.50254],[11.71333,46.50254],[11.71495,46.51227]],[[11.61435,46.41535],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20644,46.4156],[11.20485,46.3997],[11.17754,46.3997],[11.17543,46.3871],[11.16703,46.38081],[11.16703,46.36821],[11.16283,46.36821],[11.16283,46.29895],[11.12501,46.29895],[11.12291,46.25488],[11.13131,46.25278],[11.12711,46.24858],[11.16283,46.24858],[11.16283,46.215],[11.24898,46.2129],[11.25108,46.2234],[11.2889,46.2234],[11.2889,46.24019],[11.3015,46.25278],[11.30991,46.25278],[11.31201,46.24858],[11.33722,46.25068],[11.34143,46.26747],[11.34563,46.26747],[11.34773,46.25698],[11.35613,46.24858],[11.41707,46.25278],[11.41917,46.32414],[11.49271,46.32204],[11.48851,46.33044],[11.49901,46.32834],[11.50111,46.34723],[11.52423,46.34723],[11.53894,46.34513],[11.53894,46.32834],[11.55995,46.32414],[11.58306,46.34932],[11.58306,46.37241],[11.60407,46.37241],[11.60617,46.38291],[11.61458,46.38291],[11.62508,46.3934],[11.62508,46.41229],[11.61435,46.41535]],[[11.20663,46.41745],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.96285,46.47718],[10.96952,46.45217],[10.98423,46.45217],[10.98843,46.44587],[10.99894,46.44587],[11.01154,46.42068],[11.04096,46.42068],[11.08088,46.43537],[11.08298,46.47525],[11.15232,46.47525],[11.18804,46.48365],[11.19014,46.47525],[11.20695,46.47315],[11.20485,46.44587],[11.19855,46.44167],[11.19435,46.42698],[11.19014,46.42698],[11.19014,46.42068],[11.20695,46.42068],[11.20663,46.41745]],[[10.47433,46.55501],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.46952,46.62628],[10.47785,46.61797],[10.47785,46.59069],[10.47365,46.59069],[10.47155,46.5676],[10.46314,46.55501],[10.47433,46.55501]],[[10.46925,46.62643],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43626,46.79843],[10.43373,46.81106],[10.42532,46.80686],[10.42532,46.79847],[10.42112,46.79847],[10.41692,46.78587],[10.41692,46.75229],[10.3938,46.7376],[10.3896,46.72081],[10.3854,46.72081],[10.3791,46.69353],[10.3791,46.66834],[10.3833,46.66414],[10.3812,46.64735],[10.3896,46.64525],[10.3938,46.63056],[10.42532,46.62846],[10.44843,46.63476],[10.46925,46.62643]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog/",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0"},{id:"South-Tyrol-Orthofoto-2014-2015",name:"South Tyrol Orthofoto 2014/2015",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2014_2015_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",endDate:"2015-11-01T00:00:00.000Z",startDate:"2014-07-01T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 4.0",best:true},{id:"South-Tyrol-Topomap",name:"South Tyrol Topomap",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_BASEMAP_TOPO&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",zoomExtent:[0,20],polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano",description:"Topographical basemap of South Tyrol"},{id:"SPW2009",name:"SPW(allonie) 2009-2010 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2009_2010/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2010-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2012",name:"SPW(allonie) 2012-2013 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2012_2013/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2015",name:"SPW(allonie) 2015 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2015/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2016",name:"SPW(allonie) 2016 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2016/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW_ORTHO_LAST",name:"SPW(allonie) most recent aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_LAST/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW_PICC",name:"SPW(allonie) PICC numerical imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/TOPOGRAPHIE/PICC_VDIFF/MapServer/WmsServer?SERVICE=WMS&VERSION=1.1.1&FORMAT=image/png8&TRANSPARENT=FALSE&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&LAYERS=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",projection:"EPSG:3857",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPWrelief2014",name:"SPW(allonie) shaded relief",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/RELIEF/WALLONIE_MNT_2013_2014_HILLSHADE/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"ssb-sentrum",name:"SSB City Centres overlay",type:"wms",template:"https://ogc.ssb.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_193&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.ssb.no/arealsentrum/",terms_text:"© SSB",description:"Downtown areas with significant commercial and service activities.",icon:"http://www.fosterhjemsforening.no/wp-content/uploads/2015/06/SSB_logo1.png",overlay:true},{id:"ssb-tettsteder",name:"SSB Urban Areas overlay",type:"wms",template:"https://ogc.ssb.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_198&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.ssb.no/beftett",terms_text:"© SSB",description:"Human settlements of at least 200 people with less than 200 meters between households",icon:"http://www.fosterhjemsforening.no/wp-content/uploads/2015/06/SSB_logo1.png",overlay:true},{id:"Bern-bern2016-tms",name:"Stadt Bern 10cm (2016)",type:"tms",template:"https://mapproxy.osm.ch/tiles/bern2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[7.29431,46.92376],[7.29827,46.92747],[7.30616,46.93095],[7.30433,46.93623],[7.30686,46.94037],[7.32464,46.94328],[7.32845,46.94641],[7.34141,46.94608],[7.34385,46.94737],[7.34346,46.94879],[7.35136,46.94855],[7.35056,46.95021],[7.35309,46.95193],[7.3582,46.95118],[7.3685,46.95662],[7.37151,46.96073],[7.37503,46.95983],[7.37851,46.96147],[7.38062,46.96547],[7.38321,46.9663],[7.3938,46.96693],[7.40005,46.96918],[7.40829,46.96869],[7.42817,46.9738],[7.43271,46.97269],[7.43536,46.96843],[7.43785,46.96843],[7.44125,46.97679],[7.44569,46.97479],[7.44838,46.97564],[7.4477,46.97901],[7.44405,46.97807],[7.44127,46.97982],[7.45067,46.99015],[7.45221,46.98968],[7.45465,46.97782],[7.46804,46.97583],[7.47079,46.97],[7.47019,46.96741],[7.47816,46.97118],[7.48452,46.97016],[7.48613,46.9679],[7.48579,46.96468],[7.47847,46.9629],[7.48029,46.96068],[7.47893,46.95878],[7.47978,46.9566],[7.47701,46.95446],[7.48405,46.94999],[7.48339,46.9452],[7.49556,46.93962],[7.49351,46.93766],[7.4908,46.93876],[7.4895,46.93687],[7.47667,46.93695],[7.47811,46.93625],[7.4747,46.93392],[7.47535,46.93299],[7.4691,46.92924],[7.47077,46.9255],[7.45857,46.93484],[7.44764,46.93043],[7.43542,46.93497],[7.4338,46.93312],[7.43764,46.93074],[7.41469,46.93682],[7.41384,46.93157],[7.40708,46.93038],[7.40806,46.92563],[7.40213,46.9242],[7.40148,46.92119],[7.38757,46.93045],[7.38231,46.92728],[7.38002,46.92989],[7.38087,46.93241],[7.37487,46.93143],[7.37489,46.93271],[7.36807,46.93239],[7.36831,46.93043],[7.36041,46.92859],[7.36056,46.9272],[7.33878,46.92454],[7.33937,46.91967],[7.32746,46.91903],[7.32692,46.9236],[7.32437,46.92519],[7.30823,46.92229],[7.29431,46.92376]]],terms_text:"Orthophoto 2016, Vermessungsamt Stadt Bern",best:true},{id:"Bern-2012",name:"Stadt Bern 10cm/25cm (2012)",type:"tms",template:"https://mapproxy.osm.ch/tiles/bern2012/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,19],polygon:[[[7.3807,47.00952],[7.38073,47.02301],[7.43853,47.02303],[7.43865,47.01408],[7.45174,47.014],[7.45172,47.00503],[7.54111,47.005],[7.54111,46.99873],[7.54378,46.99871],[7.54375,46.98696],[7.55682,46.987],[7.55685,46.96003],[7.51744,46.96001],[7.51744,46.95108],[7.53051,46.95106],[7.53051,46.92407],[7.51741,46.92405],[7.51738,46.91505],[7.53042,46.91507],[7.53048,46.9061],[7.54358,46.90602],[7.54358,46.87905],[7.55659,46.87903],[7.55662,46.8611],[7.54349,46.86104],[7.5434,46.85212],[7.49095,46.85212],[7.49107,46.87907],[7.47794,46.87909],[7.47797,46.89707],[7.45168,46.89713],[7.45171,46.88808],[7.43855,46.88814],[7.43858,46.87015],[7.41233,46.87015],[7.41236,46.87907],[7.39917,46.87911],[7.3992,46.86108],[7.38613,46.86114],[7.3861,46.85218],[7.373,46.85216],[7.37303,46.86112],[7.34677,46.8611],[7.3468,46.88808],[7.25488,46.88796],[7.25485,46.90596],[7.24172,46.90592],[7.24169,46.91497],[7.22856,46.91493],[7.22833,46.96887],[7.24146,46.96891],[7.24149,46.98688],[7.26769,46.98694],[7.26777,46.99593],[7.28078,46.99595],[7.2809,47.0094],[7.3807,47.00952]]],terms_text:"Orthophoto 2012, Vermessungsamt Stadt Bern"},{id:"Uster-2008",name:"Stadt Uster Orthophoto 2008 10cm",type:"tms",template:"https://mapproxy.osm.ch/tiles/uster/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2008-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[8.68,47.32],[8.74,47.32],[8.74,47.365],[8.68,47.365],[8.68,47.32]]],terms_text:"Stadt Uster Vermessung Orthophoto 2008"},{id:"Zuerich-zh_luftbild2011-tms",name:"Stadt Zürich Luftbild 2011",type:"tms",template:"https://mapproxy.osm.ch/tiles/zh_luftbild2011/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[8.44624,47.44143],[8.63178,47.43968],[8.62895,47.31377],[8.44381,47.31555],[8.44624,47.44143]]],terms_text:"Stadt Zürich Luftbild 2011"},{id:"Zuerich-city_map",name:"Stadtplan Zürich",type:"tms",template:"https://mapproxy.osm.ch/tiles/zh_stadtplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[0,21],polygon:[[[8.56681,47.34713],[8.56665,47.34706],[8.56563,47.34684],[8.56575,47.34666],[8.56509,47.34645],[8.54207,47.33502],[8.54073,47.33376],[8.5403,47.33396],[8.54019,47.33372],[8.54042,47.33358],[8.5388,47.33208],[8.53642,47.33076],[8.53622,47.33018],[8.53345,47.32992],[8.5318,47.3295],[8.53145,47.32846],[8.53102,47.32789],[8.52974,47.32777],[8.52969,47.32687],[8.52899,47.32698],[8.52813,47.32685],[8.52802,47.32635],[8.52755,47.32639],[8.52762,47.32616],[8.52579,47.32619],[8.52563,47.32575],[8.52426,47.32608],[8.5242,47.32486],[8.52372,47.32416],[8.52304,47.32433],[8.52193,47.32436],[8.52194,47.32394],[8.51932,47.32401],[8.51868,47.32386],[8.51768,47.3232],[8.51642,47.32308],[8.5156,47.32315],[8.51472,47.32272],[8.51295,47.3229],[8.51162,47.32222],[8.50957,47.32202],[8.5095,47.32165],[8.50788,47.32203],[8.50735,47.32173],[8.50529,47.32144],[8.50476,47.32121],[8.5043,47.32074],[8.50317,47.32022],[8.50241,47.32053],[8.50227,47.32082],[8.50152,47.32129],[8.50102,47.32198],[8.50095,47.32259],[8.5006,47.32278],[8.50078,47.3237],[8.50066,47.32451],[8.50098,47.32595],[8.5015,47.3265],[8.50159,47.32732],[8.50188,47.32765],[8.50132,47.32883],[8.5014,47.32903],[8.50069,47.32979],[8.50087,47.33053],[8.50063,47.3311],[8.50112,47.33183],[8.50075,47.33202],[8.50078,47.33224],[8.50106,47.3326],[8.50191,47.33303],[8.5022,47.33364],[8.50177,47.33412],[8.50152,47.33504],[8.50199,47.33666],[8.50161,47.33728],[8.49877,47.33968],[8.49808,47.34169],[8.49702,47.34247],[8.49709,47.34326],[8.49798,47.34365],[8.4981,47.34387],[8.49817,47.34453],[8.49773,47.34521],[8.49636,47.34648],[8.4951,47.34691],[8.49467,47.3476],[8.49285,47.34828],[8.49206,47.3495],[8.49145,47.34964],[8.49128,47.34983],[8.49089,47.35067],[8.49,47.35056],[8.48813,47.352],[8.48691,47.35203],[8.4868,47.3522],[8.48728,47.35311],[8.4871,47.3534],[8.48501,47.35469],[8.48463,47.35536],[8.48463,47.3567],[8.48426,47.35737],[8.48321,47.35814],[8.48272,47.35907],[8.48205,47.35954],[8.47879,47.36078],[8.47698,47.36029],[8.47365,47.36081],[8.47275,47.36079],[8.47169,47.36132],[8.47053,47.36166],[8.46951,47.36438],[8.4664,47.36574],[8.46583,47.3661],[8.46545,47.36664],[8.46485,47.36681],[8.46427,47.36728],[8.46418,47.36838],[8.4649,47.36897],[8.46482,47.36911],[8.46938,47.37136],[8.47042,47.3726],[8.47022,47.37395],[8.46868,47.37382],[8.46761,47.37357],[8.46544,47.37444],[8.46288,47.37603],[8.45995,47.3775],[8.45638,47.37801],[8.45116,47.37817],[8.45047,47.37836],[8.44847,47.37967],[8.44801,47.38025],[8.45174,47.38062],[8.45371,47.38027],[8.45614,47.38072],[8.45669,47.38094],[8.45673,47.38244],[8.45745,47.38222],[8.45843,47.38231],[8.45841,47.38263],[8.45745,47.38325],[8.45767,47.3834],[8.45756,47.38371],[8.45807,47.38388],[8.46004,47.38594],[8.46088,47.38704],[8.46121,47.38795],[8.46104,47.38803],[8.46381,47.39053],[8.46518,47.39132],[8.46556,47.39113],[8.46618,47.39113],[8.46727,47.39065],[8.46697,47.39131],[8.46739,47.3929],[8.4671,47.39334],[8.46607,47.39378],[8.4651,47.39453],[8.46484,47.39481],[8.46488,47.39508],[8.46535,47.39492],[8.46854,47.39461],[8.47018,47.39401],[8.47066,47.39439],[8.47191,47.39388],[8.47208,47.39408],[8.47152,47.3943],[8.47151,47.3949],[8.4721,47.39517],[8.47301,47.39506],[8.47349,47.396],[8.46516,47.39829],[8.46568,47.39922],[8.46759,47.39873],[8.46806,47.39957],[8.46615,47.40006],[8.4677,47.403],[8.4699,47.40298],[8.47551,47.40381],[8.47815,47.40387],[8.47819,47.40508],[8.47738,47.40517],[8.47705,47.40619],[8.47729,47.40914],[8.47703,47.40935],[8.47543,47.40971],[8.47583,47.41077],[8.47605,47.41072],[8.47628,47.41102],[8.47665,47.41097],[8.47725,47.41194],[8.47488,47.41241],[8.47394,47.41222],[8.47303,47.41146],[8.47268,47.41058],[8.47101,47.41094],[8.47113,47.41137],[8.47085,47.41167],[8.47044,47.41159],[8.47031,47.41253],[8.46876,47.41225],[8.46801,47.41334],[8.46863,47.41363],[8.46857,47.41408],[8.46955,47.41484],[8.47007,47.41557],[8.46913,47.41649],[8.46913,47.41693],[8.46962,47.41752],[8.47158,47.41763],[8.4772,47.41974],[8.47688,47.42016],[8.47783,47.42212],[8.47895,47.42172],[8.47937,47.42113],[8.47972,47.42141],[8.48131,47.42134],[8.48171,47.423],[8.48294,47.42266],[8.48292,47.42222],[8.48609,47.42155],[8.48658,47.42164],[8.48683,47.42186],[8.48796,47.42201],[8.48851,47.42271],[8.49019,47.42234],[8.491,47.4239],[8.49006,47.42435],[8.49007,47.42532],[8.49027,47.42536],[8.49017,47.42578],[8.48552,47.42712],[8.48481,47.42784],[8.48466,47.42873],[8.48437,47.42896],[8.48445,47.42979],[8.48579,47.43103],[8.49562,47.43281],[8.50027,47.43442],[8.50207,47.43467],[8.50364,47.43402],[8.50997,47.43213],[8.51155,47.43116],[8.51274,47.43085],[8.516,47.43174],[8.51628,47.43175],[8.51681,47.43133],[8.51872,47.4319],[8.51979,47.43167],[8.52463,47.43126],[8.52549,47.43316],[8.5303,47.43207],[8.53063,47.43266],[8.533,47.43228],[8.53374,47.43251],[8.53467,47.432],[8.53521,47.43188],[8.53606,47.43187],[8.5374,47.4314],[8.53964,47.43126],[8.5401,47.4311],[8.54033,47.43186],[8.54363,47.43143],[8.54284,47.43289],[8.54311,47.43288],[8.54451,47.4325],[8.54459,47.43262],[8.54607,47.43207],[8.54858,47.43142],[8.55009,47.43128],[8.55098,47.43102],[8.55199,47.43104],[8.55535,47.43066],[8.5561,47.42803],[8.55684,47.42624],[8.55783,47.42554],[8.55697,47.4249],[8.55736,47.42472],[8.5569,47.42424],[8.55723,47.4241],[8.55419,47.4208],[8.56082,47.41817],[8.56129,47.41829],[8.56235,47.41632],[8.56282,47.41643],[8.56323,47.41565],[8.56622,47.41632],[8.56692,47.41629],[8.56735,47.41649],[8.5678,47.41684],[8.56875,47.41855],[8.56903,47.41871],[8.5696,47.41868],[8.56944,47.41926],[8.57223,47.41893],[8.57367,47.42004],[8.57378,47.4178],[8.57342,47.41711],[8.57386,47.41438],[8.57384,47.41324],[8.57331,47.41257],[8.5726,47.41207],[8.573,47.41144],[8.58806,47.40797],[8.58894,47.40756],[8.59312,47.40704],[8.59728,47.40631],[8.59722,47.406],[8.59608,47.40612],[8.59378,47.40222],[8.59622,47.40154],[8.5948,47.39918],[8.59725,47.39851],[8.59644,47.39715],[8.59637,47.39663],[8.59623,47.39646],[8.59453,47.39712],[8.59392,47.39647],[8.59335,47.39614],[8.59208,47.39691],[8.59172,47.39681],[8.59148,47.397],[8.58828,47.3958],[8.58905,47.39501],[8.58995,47.39478],[8.58818,47.39351],[8.58752,47.39321],[8.58747,47.39297],[8.58619,47.3928],[8.58442,47.39195],[8.58369,47.39008],[8.58305,47.38905],[8.58316,47.38831],[8.58437,47.38834],[8.58432,47.38894],[8.58492,47.39011],[8.58528,47.3904],[8.58696,47.39017],[8.5869,47.38977],[8.58765,47.38905],[8.58698,47.38793],[8.59181,47.38638],[8.59307,47.38565],[8.59299,47.38523],[8.59354,47.38522],[8.59274,47.38417],[8.59082,47.38476],[8.59013,47.38381],[8.58966,47.384],[8.58956,47.38373],[8.59217,47.38311],[8.59151,47.38244],[8.59384,47.38081],[8.59407,47.38061],[8.59406,47.38029],[8.59556,47.3796],[8.59574,47.37927],[8.59721,47.37849],[8.59674,47.37782],[8.59702,47.37716],[8.5976,47.37661],[8.59705,47.37589],[8.59778,47.37557],[8.59828,47.3751],[8.59855,47.37473],[8.59813,47.37447],[8.6002,47.37331],[8.60053,47.3734],[8.60096,47.37312],[8.60194,47.37198],[8.60192,47.37171],[8.60324,47.37131],[8.60607,47.36871],[8.60745,47.36816],[8.60812,47.36761],[8.61067,47.3673],[8.612,47.36684],[8.61308,47.36776],[8.61344,47.36779],[8.61366,47.36802],[8.61549,47.3677],[8.61645,47.36841],[8.61665,47.36828],[8.61764,47.36681],[8.61709,47.36626],[8.61682,47.36535],[8.61565,47.36466],[8.61495,47.36458],[8.61557,47.36342],[8.61566,47.36273],[8.61482,47.36263],[8.6147,47.36151],[8.61929,47.36121],[8.61996,47.36104],[8.62174,47.36007],[8.62257,47.35983],[8.62187,47.35946],[8.62133,47.35746],[8.62351,47.35592],[8.62352,47.35561],[8.62544,47.35466],[8.62416,47.35397],[8.62245,47.35364],[8.62209,47.35334],[8.61989,47.35367],[8.61976,47.35385],[8.61844,47.35382],[8.61839,47.35425],[8.61708,47.35414],[8.61569,47.35442],[8.6152,47.3541],[8.61386,47.35402],[8.61255,47.35437],[8.61156,47.35394],[8.61107,47.35352],[8.61042,47.35337],[8.60946,47.35352],[8.60776,47.35333],[8.60607,47.35363],[8.60506,47.35359],[8.6038,47.353],[8.60305,47.35219],[8.6032,47.35207],[8.60294,47.35175],[8.603,47.35076],[8.60262,47.35073],[8.6016,47.35073],[8.60104,47.35105],[8.60026,47.35112],[8.5996,47.35145],[8.59859,47.35145],[8.59824,47.35165],[8.59689,47.3514],[8.59666,47.35161],[8.59596,47.35169],[8.59564,47.3519],[8.59494,47.35161],[8.59454,47.35175],[8.5939,47.35161],[8.5935,47.35211],[8.59229,47.3523],[8.59189,47.35278],[8.59118,47.35321],[8.59047,47.35271],[8.59014,47.35286],[8.58846,47.35289],[8.58797,47.35307],[8.58748,47.35267],[8.5863,47.35288],[8.58591,47.35231],[8.5853,47.35201],[8.58462,47.35141],[8.58417,47.35129],[8.58438,47.35116],[8.58398,47.35085],[8.58348,47.35104],[8.58335,47.35087],[8.58221,47.35101],[8.58246,47.35062],[8.57851,47.34873],[8.57827,47.34888],[8.57786,47.34865],[8.57686,47.34878],[8.57688,47.34859],[8.57625,47.34839],[8.57308,47.34751],[8.573,47.34765],[8.57214,47.34744],[8.57163,47.34728],[8.5717,47.34712],[8.57029,47.34672],[8.56968,47.3476],[8.56741,47.34674],[8.56681,47.34713]]],terms_text:"Stadt Zürich Open Government Data"},{id:"stamen-terrain-background",name:"Stamen Terrain",type:"tms",template:"https://stamen-tiles-{switch:a,b,c,d}.a.ssl.fastly.net/terrain-background/{zoom}/{x}/{y}.jpg",zoomExtent:[4,18],terms_url:"http://maps.stamen.com/#terrain",terms_text:"Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL",icon:"https://stamen.com/wp-content/uploads/2016/07/stamen_compass_rose_small-01.png"},{id:"stockholm-orto",name:"Stockholm Orthophoto",type:"wms",template:"http://openmap.stockholm.se/bios/wms/app/baggis/web/WMS_STHLM_ORTOFOTO_2015?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=p_1002820&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,21],polygon:[[[17.8755,59.2625],[17.94411,59.27307],[18.09551,59.22603],[18.19582,59.22786],[18.20297,59.24886],[18.12538,59.30779],[18.1786,59.32566],[18.09876,59.3721],[18.04264,59.37816],[18.00796,59.34334],[17.93655,59.37641],[17.97483,59.40246],[17.90882,59.4417],[17.8854,59.43792],[17.88918,59.41382],[17.84077,59.38568],[17.81708,59.40054],[17.77725,59.39984],[17.75622,59.3916],[17.79899,59.36204],[17.94993,59.31121],[17.85622,59.28412],[17.8755,59.2625]]],terms_url:"http://dataportalen.stockholm.se/dataportalen/",terms_text:"© Stockholm municipality, CC0",best:true,description:"Orthophotos from the municipality of Stockholm 2015, CC0 license",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Stockholm_vapen_bra.svg/196px-Stockholm_vapen_bra.svg.png"},{id:"Surrey-Air_Survey",name:"Surrey Air Survey",type:"tms",template:"https://{switch:a,b,c}.surrey.aerial.openstreetmap.org.uk/layer/gb_surrey_aerial/{zoom}/{x}/{y}.png",endDate:"2009-01-01T00:00:00.000Z",startDate:"2007-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[-0.75248,51.08219],[-0.75952,51.08563],[-0.80143,51.14579],[-0.83989,51.14407],[-0.83577,51.18024],[-0.85295,51.20113],[-0.85227,51.20962],[-0.84952,51.2179],[-0.82669,51.24037],[-0.8121,51.24692],[-0.77365,51.24596],[-0.75442,51.23811],[-0.75408,51.23392],[-0.74464,51.23338],[-0.74307,51.28472],[-0.7515,51.30695],[-0.76644,51.3121],[-0.78206,51.32702],[-0.78154,51.33881],[-0.73743,51.37205],[-0.71923,51.37697],[-0.67958,51.3848],[-0.68078,51.39015],[-0.65314,51.39176],[-0.63014,51.39058],[-0.62911,51.39701],[-0.62344,51.39776],[-0.61314,51.42956],[-0.60025,51.44591],[-0.58671,51.44454],[-0.57624,51.4532],[-0.56268,51.45235],[-0.54774,51.447],[-0.53727,51.44486],[-0.5371,51.45267],[-0.54396,51.45459],[-0.54053,51.46989],[-0.53092,51.47609],[-0.50912,51.47448],[-0.5086,51.46957],[-0.49006,51.46828],[-0.45264,51.46069],[-0.44869,51.44293],[-0.44148,51.44186],[-0.44183,51.43694],[-0.41127,51.43801],[-0.40149,51.42795],[-0.38071,51.42624],[-0.38054,51.41617],[-0.34913,51.41382],[-0.3275,51.40375],[-0.30398,51.39904],[-0.30192,51.37547],[-0.30948,51.36969],[-0.31119,51.35297],[-0.29557,51.35415],[-0.29231,51.36733],[-0.2851,51.36808],[-0.27875,51.37719],[-0.26553,51.38372],[-0.24115,51.3848],[-0.21231,51.36283],[-0.21077,51.34986],[-0.19086,51.35029],[-0.15429,51.33388],[-0.14966,51.30577],[-0.10743,51.29665],[-0.08872,51.30996],[-0.08786,51.32208],[-0.0652,51.32154],[-0.06417,51.32648],[-0.05198,51.32637],[-0.05284,51.33463],[-0.03308,51.34309],[0.00192,51.33763],[0.01188,51.3282],[0.01393,51.29944],[0.02029,51.29944],[0.02406,51.30727],[0.03316,51.30867],[0.04552,51.30545],[0.05239,51.28774],[0.06166,51.25778],[0.06406,51.24155],[0.04621,51.21263],[0.04071,51.21091],[0.04483,51.19898],[0.04947,51.19973],[0.05582,51.19446],[0.06114,51.17907],[0.06234,51.15421],[0.05771,51.14171],[0.02046,51.13654],[-0.0446,51.13364],[-0.1567,51.13525],[-0.15721,51.129],[-0.22879,51.11834],[-0.24733,51.11834],[-0.25008,51.12114],[-0.29935,51.1137],[-0.32218,51.11198],[-0.32235,51.10584],[-0.3596,51.10196],[-0.35891,51.11133],[-0.38638,51.11176],[-0.3869,51.10625],[-0.4281,51.09472],[-0.48568,51.09516],[-0.48713,51.08723],[-0.52974,51.08654],[-0.53023,51.07899],[-0.61046,51.07655],[-0.60997,51.08067],[-0.6578,51.07922],[-0.65828,51.07434],[-0.68365,51.07075],[-0.6998,51.07083],[-0.72966,51.07449],[-0.75248,51.08219]]]},{id:"Swietochlowice-2008",name:"Świętochłowice: Orthophotomap 2008 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2008&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2008-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Swietochlowice-2009",name:"Świętochłowice: Orthophotomap 2009 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2009&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2009-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Swietochlowice-2012",name:"Świętochłowice: Orthophotomap 2012 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2012&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Szeged_2011",name:"Szeged orthophoto 2011",type:"tms",template:"http://e.tile.openstreetmap.hu/szeged-2011-10cm/{zoom}/{x}/{y}.png",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[10,22],polygon:[[[20.14599,46.22811],[20.13323,46.22904],[20.12584,46.22987],[20.12233,46.23099],[20.12085,46.23175],[20.11897,46.23351],[20.11312,46.24136],[20.11203,46.2433],[20.11157,46.245],[20.11119,46.24709],[20.11129,46.24877],[20.11159,46.25097],[20.11222,46.2528],[20.11299,46.25427],[20.11354,46.25535],[20.11477,46.2568],[20.13523,46.27685],[20.13664,46.27751],[20.13789,46.27803],[20.13939,46.27835],[20.14088,46.27846],[20.16115,46.27816],[20.16211,46.27816],[20.16359,46.2777],[20.16618,46.27615],[20.16878,46.27386],[20.16961,46.27144],[20.16959,46.27045],[20.17009,46.27044],[20.17399,46.26433],[20.17662,46.25829],[20.1948,46.25492],[20.18587,46.24481],[20.18466,46.24531],[20.17804,46.23831],[20.17818,46.23771],[20.17953,46.2371],[20.17257,46.23002],[20.16983,46.23504],[20.16877,46.23629],[20.16703,46.23785],[20.16594,46.23873],[20.16544,46.239],[20.16548,46.239],[20.16352,46.24014],[20.16021,46.2412],[20.15927,46.24153],[20.15927,46.24158],[20.15835,46.24185],[20.15495,46.24229],[20.15108,46.23515],[20.14938,46.23246],[20.14599,46.22811]]],terms_url:"http://www.geo.u-szeged.hu",terms_text:"SZTE TFGT - University of Szeged",best:true,description:"Inner part of Szeged"},{id:"TW_NLSC_WMS_EMAP6",name:"Taiwan e-Map Open Data",type:"tms",template:"https://wmts.nlsc.gov.tw/wmts/EMAP6_OPENDATA/default/GoogleMapsCompatible/{zoom}/{y}/{x}",zoomExtent:[0,15],polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TW_NLSC_WMS_LANDSECT",name:"Taiwan Land-Section Data",type:"wms",template:"https://wms.nlsc.gov.tw/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LANDSECT&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TW_NLSC_WMS_Village",name:"Taiwan Village Boundaries",type:"wms",template:"https://wms.nlsc.gov.tw/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Village&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TEClines",name:"TEC bus lines",type:"wms",template:"https://geodata.tec-wl.be/arcgis/services/Lignes/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[5.40236,49.50688],[5.81984,49.54253],[6.1714,49.62089],[5.85829,49.68846],[5.7704,49.85343],[5.894,50.11832],[6.15492,50.13593],[6.39662,50.36775],[6.28126,50.46576],[6.11372,50.7933],[5.72646,50.77941],[5.70998,50.85229],[5.61385,50.80024],[5.46278,50.79677],[5.21284,50.70119],[4.94917,50.80371],[4.75966,50.80718],[4.72121,50.88869],[4.60585,50.77941],[4.48775,50.85749],[4.36964,50.85056],[4.15266,50.72728],[3.59236,50.76725],[3.29848,50.76377],[3.04579,50.80024],[2.86177,50.72728],[2.89748,50.68553],[3.0815,50.76725],[3.19685,50.68031],[3.28749,50.52691],[3.67201,50.47625],[3.68574,50.31692],[3.99062,50.27305],[4.14992,50.17465],[4.24055,50.08661],[4.15266,49.99842],[4.18562,49.96486],[4.55366,49.94542],[4.69923,50.03372],[4.81184,50.0919],[4.84206,50.01607],[4.86677,49.90475],[4.85854,49.80382],[5.08925,49.7648],[5.34743,49.60843],[5.40236,49.50688]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/TECbusstops.png",overlay:true},{id:"TECstops",name:"TEC bus stops",type:"wms",template:"https://geodata.tec-wl.be/arcgis/services/Poteaux/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[5.40236,49.50688],[5.81984,49.54253],[6.1714,49.62089],[5.85829,49.68846],[5.7704,49.85343],[5.894,50.11832],[6.15492,50.13593],[6.39662,50.36775],[6.28126,50.46576],[6.11372,50.7933],[5.72646,50.77941],[5.70998,50.85229],[5.61385,50.80024],[5.46278,50.79677],[5.21284,50.70119],[4.94917,50.80371],[4.75966,50.80718],[4.72121,50.88869],[4.60585,50.77941],[4.48775,50.85749],[4.36964,50.85056],[4.15266,50.72728],[3.59236,50.76725],[3.29848,50.76377],[3.04579,50.80024],[2.86177,50.72728],[2.89748,50.68553],[3.0815,50.76725],[3.19685,50.68031],[3.28749,50.52691],[3.67201,50.47625],[3.68574,50.31692],[3.99062,50.27305],[4.14992,50.17465],[4.24055,50.08661],[4.15266,49.99842],[4.18562,49.96486],[4.55366,49.94542],[4.69923,50.03372],[4.81184,50.0919],[4.84206,50.01607],[4.86677,49.90475],[4.85854,49.80382],[5.08925,49.7648],[5.34743,49.60843],[5.40236,49.50688]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/TECbusstops.png",overlay:true},{id:"teotonio_vilela",name:"Teotonio Vilela AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Teotonio%20Vilela&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.31164,-9.95468],[-36.31158,-9.94382],[-36.31145,-9.93197],[-36.31127,-9.92436],[-36.31123,-9.91848],[-36.31119,-9.91637],[-36.31141,-9.91324],[-36.3111,-9.90922],[-36.31108,-9.90318],[-36.31099,-9.89379],[-36.31089,-9.8842],[-36.31078,-9.87412],[-36.31068,-9.86457],[-36.3318,-9.86432],[-36.34001,-9.86437],[-36.3478,-9.86425],[-36.35917,-9.8642],[-36.37047,-9.86404],[-36.38448,-9.86386],[-36.40164,-9.86364],[-36.40221,-9.9225],[-36.40249,-9.93177],[-36.40259,-9.94183],[-36.40248,-9.94804],[-36.40266,-9.9537],[-36.3855,-9.95384],[-36.38283,-9.95392],[-36.37096,-9.95399],[-36.36232,-9.95423],[-36.34747,-9.95422],[-36.33287,-9.95446],[-36.3291,-9.95456],[-36.32089,-9.95459],[-36.31164,-9.95468]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"tnris.org",name:"Texas Orthophoto",type:"tms",template:"https://txgi.tnris.org/login/path/ecology-fiona-poem-romeo/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=texas&STYLE=&FORMAT=image/png&tileMatrixSet=0to20&tileMatrix=0to20:{zoom}&tileRow={y}&tileCol={x}",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-99.99854,34.56018],[-95.55655,33.99257],[-93.89679,33.61039],[-93.98468,32.04103],[-93.41614,31.02505],[-93.74531,29.57268],[-96.50492,28.23159],[-97.36942,26.95467],[-97.04867,25.8053],[-99.07342,26.32559],[-100.76599,29.02532],[-102.33154,29.84339],[-103.13355,28.88112],[-104.28879,29.28831],[-104.72698,29.94816],[-104.72697,30.23535],[-106.5345,31.78457],[-106.75767,31.78457],[-106.75766,32.04386],[-106.61848,32.04385],[-103.11949,32.04376],[-103.09544,36.50046],[-103.05798,36.54269],[-100.00042,36.54222],[-99.99854,34.56018]]],terms_url:"https://tnris.org/maps-and-data/online-mapping-services",terms_text:"Texas Natural Resources Information System"},{id:"US-TIGER-Roads-2017",name:"TIGER Roads 2017",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmapus/cj8dftc3q1ecn2tnx9qhwyj0c/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcHVzIiwiYSI6ImNpcnF4Ym43dDBoOXZmYW04bWhlNWdrY2EifQ.4SFexuTUuKkZeerO3dgtmw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.1572,68.722],[-164.8554,67.0255],[-168.0022,66.0018],[-169.0087,66.0015],[-169.0075,64.9988],[-172.5143,63.8767],[-173.8197,59.7401],[-178.0001,52.2446],[-177.9993,51.2554],[-171.4689,51.8215],[-162.4025,53.9567],[-159.0076,55.0025],[-158.0191,55.0028],[-151.9963,55.9992],[-151.5003,57.9988],[-151.5013,58.992],[-138.516,58.9953],[-138.515,57.9986],[-133.9948,54.0032],[-130.0044,54.0043],[-130.0071,57.0001],[-131.9759,56.9995],[-135.123,59.7566],[-138.0072,59.9918],[-139.1716,60.4127],[-140.9874,61.0119],[-140.9684,69.9535],[-156.1769,71.5633],[-160.4136,70.7398],[-163.0218,69.9707],[-164.9717,68.9947],[-167.1572,68.722]],[[-68.2,17.8],[-64.32,17.38],[-64.64,18.36],[-65.33,18.57],[-67.9,18.67],[-68.2,17.8]],[[146.2,15.4],[145.7,15.6],[144.2,13.2],[144.8,12.9],[146.2,15.4]],[[179.99,52.2],[172,53.5],[172,52.5],[179.99,51],[179.99,52.2]]],description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/TIGER2017RoadsOverlay.png",overlay:true},{id:"US-TIGER-Roads-2018",name:"TIGER Roads 2018",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmapus/cjo1wbulo3ub82ro1c9onlzmh/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcHVzIiwiYSI6ImNpcnF4Ym43dDBoOXZmYW04bWhlNWdrY2EifQ.4SFexuTUuKkZeerO3dgtmw",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.1572,68.722],[-164.8554,67.0255],[-168.0022,66.0018],[-169.0087,66.0015],[-169.0075,64.9988],[-172.5143,63.8767],[-173.8197,59.7401],[-178.0001,52.2446],[-177.9993,51.2554],[-171.4689,51.8215],[-162.4025,53.9567],[-159.0076,55.0025],[-158.0191,55.0028],[-151.9963,55.9992],[-151.5003,57.9988],[-151.5013,58.992],[-138.516,58.9953],[-138.515,57.9986],[-133.9948,54.0032],[-130.0044,54.0043],[-130.0071,57.0001],[-131.9759,56.9995],[-135.123,59.7566],[-138.0072,59.9918],[-139.1716,60.4127],[-140.9874,61.0119],[-140.9684,69.9535],[-156.1769,71.5633],[-160.4136,70.7398],[-163.0218,69.9707],[-164.9717,68.9947],[-167.1572,68.722]],[[-68.2,17.8],[-64.32,17.38],[-64.64,18.36],[-65.33,18.57],[-67.9,18.67],[-68.2,17.8]],[[146.2,15.4],[145.7,15.6],[144.2,13.2],[144.8,12.9],[146.2,15.4]],[[179.99,52.2],[172,53.5],[172,52.5],[179.99,51],[179.99,52.2]]],description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/TIGER2017RoadsOverlay.png",overlay:true},{id:"tirol.gv.at-contourlines",name:"Tiris: contour lines",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Hoehenschichtlinien_20m&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[15,22],polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif",overlay:true},{id:"tirol.gv.at-DGM",name:"Tiris: DGM (Terrain model)",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Schummerung_Gelaendemodell&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"tirol.gv.at-DOM",name:"Tiris: DOM (Surface model)",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Schummerung_Oberflaechenmodell&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"tirol.gv.at-orthofoto",name:"Tiris: orthophoto",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/orthofoto/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Aktuell_RGB&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"tirol.gv.at-orthofoto-cir",name:"Tiris: orthophoto infrared",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/orthofoto/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Aktuell_CIR&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"lu.geoportail.opendata.topo",name:"Topographical Map geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/topo/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png",endDate:"2010-07-20T00:00:00.000Z",startDate:"2013-07-19T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/cartes-topographiques-services-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"Torokbalint-orthophoto-2013",name:"Törökbálint orthophoto 2013",type:"wms",template:"https://terkep.torokbalint.hu/mapproxy/service?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ORTO_2013_5CM_2013SZEPT_TAKARASSAL_512_512&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true",projection:"EPSG:3857",endDate:"2013-09-01T00:00:00.000Z",startDate:"2013-09-01T00:00:00.000Z",polygon:[[[18.91731,47.40854],[18.91691,47.40849],[18.91606,47.40885],[18.91565,47.40905],[18.91458,47.40938],[18.91385,47.4097],[18.91376,47.40976],[18.91314,47.41038],[18.9122,47.41098],[18.91041,47.41175],[18.90932,47.41258],[18.90841,47.41317],[18.90676,47.41443],[18.90481,47.41568],[18.90362,47.41597],[18.90317,47.41616],[18.90062,47.41742],[18.90042,47.41755],[18.89968,47.41797],[18.89888,47.41818],[18.89814,47.41835],[18.89752,47.41855],[18.89666,47.41901],[18.8958,47.41954],[18.89421,47.4205],[18.89055,47.42209],[18.88743,47.42332],[18.88554,47.42424],[18.88436,47.42476],[18.88189,47.42553],[18.88085,47.42598],[18.8801,47.42629],[18.87956,47.42649],[18.87741,47.42738],[18.87602,47.42789],[18.87508,47.42836],[18.87281,47.42934],[18.87164,47.42968],[18.8714,47.43001],[18.87259,47.4323],[18.87273,47.43278],[18.87274,47.43324],[18.87244,47.43482],[18.87206,47.43526],[18.86891,47.43712],[18.86561,47.4375],[18.86466,47.43774],[18.86404,47.43809],[18.86378,47.43791],[18.8634,47.43784],[18.863,47.43798],[18.85195,47.44715],[18.85217,47.44847],[18.8593,47.45387],[18.85839,47.45512],[18.85777,47.45568],[18.85718,47.456],[18.8572,47.45636],[18.86015,47.45839],[18.86194,47.4595],[18.86099,47.46071],[18.85979,47.46201],[18.85929,47.46236],[18.85859,47.46272],[18.85713,47.46333],[18.85634,47.4636],[18.85628,47.46403],[18.85719,47.46528],[18.85663,47.46551],[18.85653,47.4658],[18.85693,47.46656],[18.85836,47.46953],[18.85826,47.4698],[18.85827,47.46991],[18.85838,47.47019],[18.85844,47.47027],[18.85852,47.47033],[18.85862,47.47036],[18.85873,47.47038],[18.8589,47.47036],[18.86146,47.46973],[18.86277,47.46929],[18.86617,47.46785],[18.86794,47.46656],[18.86997,47.46524],[18.8708,47.46457],[18.87268,47.46333],[18.87536,47.46113],[18.87687,47.45927],[18.88943,47.45987],[18.89024,47.45988],[18.90371,47.45534],[18.90427,47.4552],[18.90493,47.45506],[18.90542,47.4551],[18.90567,47.45505],[18.90629,47.45477],[18.90648,47.45453],[18.9066,47.45447],[18.90678,47.45439],[18.90811,47.45399],[18.90837,47.45395],[18.9089,47.45384],[18.90954,47.4537],[18.91326,47.45317],[18.91353,47.4532],[18.91372,47.45317],[18.91386,47.45307],[18.91431,47.45294],[18.91598,47.453],[18.91807,47.45317],[18.91846,47.453],[18.91903,47.45161],[18.92173,47.4508],[18.92246,47.45069],[18.92418,47.45025],[18.92756,47.44989],[18.92972,47.44951],[18.93221,47.44922],[18.93347,47.44932],[18.93921,47.44935],[18.94229,47.44903],[18.94549,47.4489],[18.94826,47.4487],[18.95003,47.44824],[18.9547,47.44722],[18.95749,47.44692],[18.95802,47.44715],[18.95844,47.44708],[18.95877,47.44666],[18.96145,47.4393],[18.96368,47.4358],[18.96598,47.43288],[18.96899,47.4297],[18.9701,47.42704],[18.97009,47.42679],[18.96695,47.4246],[18.95735,47.41842],[18.95676,47.4184],[18.95606,47.41813],[18.95385,47.41739],[18.95144,47.41665],[18.95131,47.41664],[18.9327,47.41703],[18.93257,47.41696],[18.93201,47.41674],[18.93149,47.4164],[18.93114,47.41612],[18.92123,47.41091],[18.91957,47.40987],[18.91927,47.40961],[18.91731,47.40854]]],terms_url:"http://www.torokbalint.hu",terms_text:"Törökbálint",description:"5 cm resolution bald image"},{id:"Torokbalint-orthophoto-2015",name:"Törökbálint orthophoto 2015",type:"wms",template:"https://terkep.torokbalint.hu/mapproxy/service?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=TBORTO_2015_20160218&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[18.91731,47.40854],[18.91691,47.40849],[18.91606,47.40885],[18.91565,47.40905],[18.91458,47.40938],[18.91385,47.4097],[18.91376,47.40976],[18.91314,47.41038],[18.9122,47.41098],[18.91041,47.41175],[18.90932,47.41258],[18.90841,47.41317],[18.90676,47.41443],[18.90481,47.41568],[18.90362,47.41597],[18.90317,47.41616],[18.90062,47.41742],[18.90042,47.41755],[18.89968,47.41797],[18.89888,47.41818],[18.89814,47.41835],[18.89752,47.41855],[18.89666,47.41901],[18.8958,47.41954],[18.89421,47.4205],[18.89055,47.42209],[18.88743,47.42332],[18.88554,47.42424],[18.88436,47.42476],[18.88189,47.42553],[18.88085,47.42598],[18.8801,47.42629],[18.87956,47.42649],[18.87741,47.42738],[18.87602,47.42789],[18.87508,47.42836],[18.87281,47.42934],[18.87164,47.42968],[18.8714,47.43001],[18.87259,47.4323],[18.87273,47.43278],[18.87274,47.43324],[18.87244,47.43482],[18.87206,47.43526],[18.86891,47.43712],[18.86561,47.4375],[18.86466,47.43774],[18.86404,47.43809],[18.86378,47.43791],[18.8634,47.43784],[18.863,47.43798],[18.85195,47.44715],[18.85217,47.44847],[18.8593,47.45387],[18.85839,47.45512],[18.85777,47.45568],[18.85718,47.456],[18.8572,47.45636],[18.86015,47.45839],[18.86194,47.4595],[18.86099,47.46071],[18.85979,47.46201],[18.85929,47.46236],[18.85859,47.46272],[18.85713,47.46333],[18.85634,47.4636],[18.85628,47.46403],[18.85719,47.46528],[18.85663,47.46551],[18.85653,47.4658],[18.85693,47.46656],[18.85836,47.46953],[18.85826,47.4698],[18.85827,47.46991],[18.85838,47.47019],[18.85844,47.47027],[18.85852,47.47033],[18.85862,47.47036],[18.85873,47.47038],[18.8589,47.47036],[18.86146,47.46973],[18.86277,47.46929],[18.86617,47.46785],[18.86794,47.46656],[18.86997,47.46524],[18.8708,47.46457],[18.87268,47.46333],[18.87536,47.46113],[18.87687,47.45927],[18.88943,47.45987],[18.89024,47.45988],[18.90371,47.45534],[18.90427,47.4552],[18.90493,47.45506],[18.90542,47.4551],[18.90567,47.45505],[18.90629,47.45477],[18.90648,47.45453],[18.9066,47.45447],[18.90678,47.45439],[18.90811,47.45399],[18.90837,47.45395],[18.9089,47.45384],[18.90954,47.4537],[18.91326,47.45317],[18.91353,47.4532],[18.91372,47.45317],[18.91386,47.45307],[18.91431,47.45294],[18.91598,47.453],[18.91807,47.45317],[18.91846,47.453],[18.91903,47.45161],[18.92173,47.4508],[18.92246,47.45069],[18.92418,47.45025],[18.92756,47.44989],[18.92972,47.44951],[18.93221,47.44922],[18.93347,47.44932],[18.93921,47.44935],[18.94229,47.44903],[18.94549,47.4489],[18.94826,47.4487],[18.95003,47.44824],[18.9547,47.44722],[18.95749,47.44692],[18.95802,47.44715],[18.95844,47.44708],[18.95877,47.44666],[18.96145,47.4393],[18.96368,47.4358],[18.96598,47.43288],[18.96899,47.4297],[18.9701,47.42704],[18.97009,47.42679],[18.96695,47.4246],[18.95735,47.41842],[18.95676,47.4184],[18.95606,47.41813],[18.95385,47.41739],[18.95144,47.41665],[18.95131,47.41664],[18.9327,47.41703],[18.93257,47.41696],[18.93201,47.41674],[18.93149,47.4164],[18.93114,47.41612],[18.92123,47.41091],[18.91957,47.40987],[18.91927,47.40961],[18.91731,47.40854]]],terms_url:"http://www.torokbalint.hu/",terms_text:"Törökbálint",best:true,description:"5 cm resolution bald image"},{id:"Toulouse-Orthophotoplan-2007",name:"Toulouse - Orthophotoplan 2007",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2007&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2007-01-01T00:00:00.000Z",startDate:"2007-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.192,43.63288],[1.20154,43.63297],[1.20111,43.65549],[1.2228,43.6557],[1.22262,43.66534],[1.22753,43.66538],[1.22754,43.66564],[1.23376,43.66569],[1.23376,43.66502],[1.23512,43.66503],[1.23509,43.66707],[1.24436,43.66716],[1.24416,43.67439],[1.2494,43.67443],[1.2494,43.67466],[1.25557,43.67472],[1.25557,43.67445],[1.25695,43.67447],[1.25688,43.67853],[1.28749,43.67883],[1.28708,43.70132],[1.30882,43.70146],[1.30865,43.71277],[1.33033,43.71295],[1.33002,43.73052],[1.33671,43.73058],[1.33673,43.73122],[1.37343,43.73105],[1.37358,43.72458],[1.46045,43.72529],[1.46078,43.7028],[1.48249,43.70295],[1.48298,43.66921],[1.50468,43.66936],[1.50484,43.65812],[1.52655,43.65827],[1.52669,43.64703],[1.54837,43.64716],[1.54854,43.63594],[1.57022,43.63608],[1.57051,43.61358],[1.54882,43.61343],[1.5491,43.59095],[1.57077,43.59107],[1.57094,43.57983],[1.57937,43.57989],[1.57948,43.57377],[1.58091,43.57378],[1.58109,43.55738],[1.57123,43.55731],[1.57165,43.52355],[1.39848,43.52226],[1.39865,43.51101],[1.3121,43.51025],[1.3119,43.52152],[1.29026,43.52131],[1.28986,43.54382],[1.31152,43.54401],[1.31133,43.55526],[1.30369,43.55519],[1.30361,43.55951],[1.29554,43.55943],[1.29554,43.55955],[1.28956,43.55945],[1.28929,43.57754],[1.26757,43.57736],[1.2674,43.58861],[1.25355,43.5885],[1.25338,43.59563],[1.2518,43.59563],[1.2518,43.59494],[1.23504,43.59478],[1.23504,43.5946],[1.22396,43.5946],[1.22394,43.59947],[1.21397,43.5993],[1.21388,43.60464],[1.20206,43.60448],[1.20195,43.61048],[1.19243,43.61037],[1.192,43.63288]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2011",name:"Toulouse - Orthophotoplan 2011",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2011&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2013",name:"Toulouse - Orthophotoplan 2013",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2013&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2015",name:"Toulouse - Orthophotoplan 2015",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2015&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2017",name:"Toulouse - Orthophotoplan 2017",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole",best:true},{id:"Tours-Orthophoto-2008_2010",name:"Tours - Orthophotos 2008-2010",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/tours/{zoom}/{x}/{y}",endDate:"2011-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[0.54575,47.46526],[0.54585,47.46082],[0.53922,47.4607],[0.53935,47.45624],[0.5328,47.4561],[0.5329,47.45157],[0.52619,47.4514],[0.52659,47.44249],[0.50009,47.44207],[0.50024,47.43758],[0.4936,47.43743],[0.4937,47.43293],[0.46061,47.43246],[0.46072,47.42798],[0.4541,47.42781],[0.45493,47.40539],[0.46154,47.40545],[0.46191,47.39649],[0.46843,47.3966],[0.46913,47.37864],[0.47571,47.37876],[0.47621,47.3652],[0.48283,47.36535],[0.48296,47.36083],[0.47635,47.36074],[0.47665,47.35173],[0.47005,47.35162],[0.4702,47.34713],[0.46375,47.34701],[0.45714,47.34241],[0.45729,47.33791],[0.45067,47.33781],[0.45084,47.33331],[0.44422,47.3332],[0.44438,47.32871],[0.43114,47.3285],[0.43163,47.315],[0.43824,47.31511],[0.43838,47.31062],[0.47145,47.31114],[0.47131,47.31566],[0.47789,47.31575],[0.47807,47.31128],[0.48468,47.31136],[0.48486,47.30687],[0.49144,47.30698],[0.49174,47.29797],[0.48516,47.29787],[0.48543,47.28887],[0.47885,47.28877],[0.47916,47.27978],[0.48578,47.2799],[0.48591,47.27539],[0.49254,47.2755],[0.49267,47.27101],[0.4993,47.27111],[0.49943,47.26661],[0.51927,47.26692],[0.51942,47.26242],[0.52602,47.26252],[0.52587,47.26702],[0.5457,47.26734],[0.54555,47.27183],[0.55877,47.27204],[0.55863,47.27652],[0.56523,47.27663],[0.56508,47.28112],[0.57168,47.28123],[0.57152,47.28572],[0.57814,47.28583],[0.57799,47.29033],[0.5846,47.29043],[0.58431,47.29942],[0.5975,47.29961],[0.59766,47.29514],[0.65716,47.296],[0.6573,47.29151],[0.6705,47.29172],[0.67035,47.29621],[0.68362,47.29637],[0.68343,47.30089],[0.69006,47.30096],[0.68992,47.30547],[0.7362,47.30612],[0.73608,47.31061],[0.7559,47.31089],[0.75577,47.31539],[0.76238,47.31547],[0.76223,47.31999],[0.77549,47.32015],[0.77497,47.33882],[0.77458,47.35163],[0.76804,47.35159],[0.76759,47.36053],[0.77424,47.36062],[0.77335,47.39213],[0.76674,47.39202],[0.76644,47.40108],[0.77306,47.40111],[0.77289,47.41013],[0.76618,47.41002],[0.76603,47.4145],[0.75276,47.4143],[0.75298,47.40981],[0.74624,47.4097],[0.74594,47.42322],[0.73923,47.42315],[0.73887,47.43661],[0.73233,47.43652],[0.73219,47.44106],[0.7255,47.44098],[0.72542,47.44535],[0.73188,47.44548],[0.73185,47.45011],[0.73845,47.45023],[0.73831,47.45463],[0.74494,47.45474],[0.74432,47.4772],[0.73107,47.47697],[0.7309,47.48154],[0.71762,47.48126],[0.71779,47.47684],[0.69777,47.4765],[0.69805,47.47198],[0.69145,47.47189],[0.69173,47.46302],[0.6851,47.46293],[0.68494,47.46735],[0.67826,47.46733],[0.67798,47.47622],[0.67141,47.47616],[0.67104,47.4882],[0.65773,47.48797],[0.65782,47.48504],[0.65119,47.48483],[0.65147,47.47586],[0.64482,47.47572],[0.64493,47.47126],[0.6118,47.47075],[0.61188,47.46631],[0.60528,47.46612],[0.60542,47.46166],[0.59888,47.46155],[0.59902,47.45709],[0.57249,47.45669],[0.57218,47.46565],[0.54575,47.46526]]],terms_url:"https://wiki.openstreetmap.org/wiki/Tours/Orthophoto",terms_text:"Orthophoto Tour(s) Plus 2008"},{id:"Tours-Orthophoto-2013",name:"Tours - Orthophotos 2013",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/tours_2013/{zoom}/{x}/{y}",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[0.77512,47.32983],[0.77427,47.35617],[0.77053,47.35611],[0.77024,47.36512],[0.77398,47.36517],[0.7728,47.40148],[0.7904,47.40147],[0.78988,47.4103],[0.79117,47.41047],[0.79108,47.41942],[0.79392,47.41942],[0.79319,47.43733],[0.79834,47.43742],[0.79808,47.45544],[0.80044,47.45541],[0.80138,47.46426],[0.80074,47.46899],[0.79396,47.47331],[0.78405,47.47323],[0.78387,47.47871],[0.77606,47.47859],[0.77585,47.48204],[0.77066,47.48219],[0.77044,47.4859],[0.76096,47.49092],[0.75718,47.49092],[0.73753,47.50336],[0.7259,47.50588],[0.71113,47.50576],[0.70418,47.50408],[0.69109,47.50038],[0.69045,47.49718],[0.67757,47.49683],[0.67757,47.49353],[0.66427,47.49301],[0.6635,47.48953],[0.65088,47.48958],[0.65133,47.48032],[0.64734,47.4803],[0.64747,47.47852],[0.64474,47.47846],[0.64479,47.47575],[0.64238,47.47578],[0.64225,47.47302],[0.63835,47.47294],[0.63792,47.47131],[0.60513,47.47079],[0.60513,47.46632],[0.59852,47.46603],[0.59878,47.46156],[0.592,47.46156],[0.59226,47.45976],[0.58084,47.45971],[0.58007,47.46145],[0.57234,47.46139],[0.57222,47.46512],[0.55874,47.46489],[0.5466,47.46052],[0.53269,47.45355],[0.52677,47.45315],[0.52677,47.45152],[0.52231,47.45123],[0.52256,47.44804],[0.51977,47.44776],[0.52007,47.44247],[0.4975,47.4416],[0.49716,47.44049],[0.49355,47.44015],[0.49355,47.43573],[0.47943,47.43575],[0.46171,47.42819],[0.45643,47.42088],[0.45489,47.41229],[0.45506,47.40218],[0.46149,47.40193],[0.46167,47.39641],[0.46879,47.39602],[0.47016,47.35173],[0.45677,47.3515],[0.45729,47.34254],[0.43085,47.34196],[0.43196,47.30602],[0.47154,47.3067],[0.47257,47.28004],[0.48527,47.28004],[0.48578,47.27084],[0.49935,47.27107],[0.49917,47.26245],[0.55273,47.26304],[0.55222,47.27201],[0.56561,47.27224],[0.56526,47.28156],[0.59118,47.28156],[0.59067,47.29099],[0.66912,47.29169],[0.6832,47.29564],[0.6832,47.30077],[0.69658,47.30123],[0.69641,47.3024],[0.71006,47.30245],[0.72293,47.30589],[0.72285,47.31043],[0.74165,47.31084],[0.75426,47.31392],[0.7625,47.31815],[0.76207,47.32013],[0.76619,47.32009],[0.76956,47.32207],[0.77233,47.32508],[0.77336,47.3267],[0.77512,47.32983]]],terms_url:"https://wiki.openstreetmap.org/wiki/Tours/Orthophoto",terms_text:"Orthophoto Tour(s)plus 2013"},{id:"trafikverket-baninfo",name:"Trafikverket Railway Network",type:"wms",template:"https://geo-baninfo.trafikverket.se/mapservice/wms.axd/BanInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Spar_Huvud_och_sidospar&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[7,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish railway network, including sidings",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat",name:"Trafikverket Road Network",type:"wms",template:"https://geo-netinfo.trafikverket.se/mapservice/wms.axd/NetInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vagtrafiknat,Funkvagklass,Farjeled&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB road network",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat-extra",name:"Trafikverket Road Network extra",type:"wms",template:"https://geo-netinfo.trafikverket.se/mapservice/wms.axd/NetInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vagnummer,Vaghinder,Rastplats,Rastficka,Hallplats,Farthinder,BroTunnel,ATK_Matplats&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB extra details: Highway reference, traffic calming, rest area, bus stop, bridge, tunnel, speed camera",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat-navn",name:"Trafikverket Street Names",type:"tms",template:"https://mapproxy.openstreetmap.se/tiles/1.0.0/nvdb_names/EPSG3857/{zoom}/{x}/{y}.png",zoomExtent:[15,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB street names",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"US_Forest_Service_roads_overlay",name:"U.S. Forest Roads Overlay",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/glassman/cjf4qjmps0tgv2qpahj977mvz/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1IjoiZ2xhc3NtYW4iLCJhIjoiRjk3dWdwYyJ9.Tg_fMJWxygeKBgVTrZHmGA",zoomExtent:[0,20],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.15715,68.72197],[-164.8554,67.02551],[-168.0022,66.00175],[-169.00874,66.00155],[-169.00754,64.99877],[-172.51433,63.87673],[-173.8197,59.74014],[-162.50181,58.00058],[-160.0159,58.00124],[-160.01497,57.00003],[-160.50548,56.9999],[-165.80926,54.82485],[-178.0001,52.24465],[-177.9993,51.25543],[-171.46891,51.82153],[-162.40251,53.95666],[-159.00757,55.0025],[-158.01907,55.00278],[-151.99632,55.99919],[-151.50034,57.99879],[-151.50129,58.99198],[-138.516,58.99532],[-138.51505,57.99864],[-133.99482,54.00317],[-130.00444,54.00434],[-130.00708,57.00005],[-131.97588,56.99952],[-135.12299,59.7566],[-138.00718,59.9918],[-139.17159,60.41272],[-140.9874,61.01186],[-140.9684,69.95351],[-156.17689,71.56333],[-160.41363,70.73977],[-163.02183,69.97074],[-164.9717,68.99469],[-167.15715,68.72197]]],description:"Highway: Green casing = unclassified. Brown casing = track. Surface: gravel = light brown fill, Asphalt = black, paved = gray, ground =white, concrete = blue, grass = green. Seasonal = white bars",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USForestService-overlay.png",overlay:true},{id:"US_Forest_Service_roads",name:"U.S. Forest Service roads",type:"tms",template:"https://osm.cycle.travel/forest/{zoom}/{x}/{y}.png",zoomExtent:[0,19],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.15715,68.72197],[-164.8554,67.02551],[-168.0022,66.00175],[-169.00874,66.00155],[-169.00754,64.99877],[-172.51433,63.87673],[-173.8197,59.74014],[-162.50181,58.00058],[-160.0159,58.00124],[-160.01497,57.00003],[-160.50548,56.9999],[-165.80926,54.82485],[-178.0001,52.24465],[-177.9993,51.25543],[-171.46891,51.82153],[-162.40251,53.95666],[-159.00757,55.0025],[-158.01907,55.00278],[-151.99632,55.99919],[-151.50034,57.99879],[-151.50129,58.99198],[-138.516,58.99532],[-138.51505,57.99864],[-133.99482,54.00317],[-130.00444,54.00434],[-130.00708,57.00005],[-131.97588,56.99952],[-135.12299,59.7566],[-138.00718,59.9918],[-139.17159,60.41272],[-140.9874,61.01186],[-140.9684,69.95351],[-156.17689,71.56333],[-160.41363,70.73977],[-163.02183,69.97074],[-164.9717,68.99469],[-167.15715,68.72197]]]},{id:"Zuerich-zh_uebersichtsplan-tms",name:"Übersichtsplan Zürich",type:"tms",template:"https://mapproxy.osm.ch/tiles/zh_uebersichtsplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[0,21],polygon:[[[8.45788,47.44582],[8.57392,47.44477],[8.57362,47.43124],[8.60266,47.43096],[8.60231,47.41746],[8.6318,47.41716],[8.6295,47.33628],[8.57162,47.33679],[8.57152,47.32292],[8.54236,47.3236],[8.54212,47.31013],[8.48418,47.31062],[8.48478,47.33762],[8.45582,47.33787],[8.45609,47.35135],[8.42713,47.35161],[8.42864,47.43259],[8.45745,47.43231],[8.45788,47.44582]]],terms_text:"Stadt Zürich Open Government Data"},{id:"UkraineKyiv2014DZK",name:"Ukraine - Kyiv 2014 (DZK)",type:"tms",template:"http://map.land.gov.ua/map/ortho_kiev/{zoom}/{x}/{-y}.jpg",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[30.30752,50.57184],[30.33155,50.57402],[30.37687,50.57925],[30.42288,50.58143],[30.4318,50.58579],[30.44416,50.58797],[30.45515,50.58754],[30.46545,50.58449],[30.46819,50.57751],[30.49085,50.57489],[30.51351,50.57489],[30.52519,50.57402],[30.55608,50.55221],[30.58424,50.53869],[30.5966,50.53781],[30.60896,50.5365],[30.64329,50.5352],[30.65496,50.53563],[30.65496,50.54305],[30.66045,50.54916],[30.66801,50.55439],[30.67762,50.55876],[30.68792,50.56137],[30.70783,50.55614],[30.71127,50.56356],[30.71127,50.57838],[30.72157,50.58231],[30.71882,50.58972],[30.72981,50.59103],[30.74011,50.58841],[30.76208,50.58536],[30.77306,50.58274],[30.78336,50.57795],[30.80259,50.57141],[30.81014,50.56617],[30.82182,50.55439],[30.82525,50.53956],[30.81701,50.53432],[30.79504,50.52909],[30.78474,50.52559],[30.76276,50.51992],[30.76208,50.5125],[30.75315,50.50769],[30.74354,50.50376],[30.73805,50.49721],[30.74629,50.49197],[30.75521,50.48847],[30.74835,50.48236],[30.75178,50.47537],[30.75315,50.46794],[30.74835,50.46138],[30.75178,50.45439],[30.78886,50.43646],[30.7971,50.43165],[30.80328,50.41765],[30.8225,50.40846],[30.82044,50.40102],[30.82319,50.39358],[30.81289,50.39095],[30.80122,50.39139],[30.78954,50.39314],[30.77787,50.3927],[30.77856,50.3857],[30.77169,50.38001],[30.76208,50.37519],[30.75109,50.37256],[30.73873,50.37256],[30.72775,50.37475],[30.71813,50.37957],[30.71539,50.36512],[30.71127,50.35855],[30.70577,50.35241],[30.69753,50.34716],[30.68586,50.34453],[30.65084,50.34058],[30.63848,50.34014],[30.62681,50.33795],[30.62887,50.3305],[30.64947,50.29279],[30.66663,50.28314],[30.67144,50.27656],[30.6632,50.27085],[30.65153,50.26997],[30.64535,50.27612],[30.63368,50.27787],[30.62132,50.27656],[30.61857,50.2691],[30.62956,50.25637],[30.6378,50.25154],[30.64535,50.23792],[30.64398,50.2309],[30.63917,50.22387],[30.62956,50.21992],[30.6069,50.2164],[30.59591,50.2186],[30.59042,50.23353],[30.5863,50.241],[30.57531,50.25505],[30.56501,50.25944],[30.5657,50.2669],[30.56432,50.29718],[30.56638,50.30463],[30.5657,50.31209],[30.55677,50.31691],[30.54441,50.31735],[30.52587,50.32699],[30.51489,50.3305],[30.50253,50.33182],[30.48055,50.33664],[30.47163,50.34146],[30.46957,50.34935],[30.47025,50.35679],[30.46201,50.36205],[30.4524,50.35679],[30.44004,50.35548],[30.43661,50.36512],[30.43111,50.37212],[30.43661,50.37826],[30.43455,50.3857],[30.40914,50.39883],[30.39678,50.40014],[30.3906,50.40671],[30.37069,50.41546],[30.36314,50.42159],[30.3597,50.42902],[30.3597,50.43646],[30.35696,50.44389],[30.3446,50.44477],[30.32056,50.44258],[30.29585,50.44477],[30.28349,50.44477],[30.27799,50.43864],[30.27525,50.43165],[30.26563,50.42771],[30.25396,50.42902],[30.24572,50.42377],[30.23542,50.42771],[30.2416,50.43427],[30.2416,50.44214],[30.23679,50.4487],[30.23885,50.45613],[30.24297,50.46313],[30.24915,50.46968],[30.25671,50.47493],[30.26083,50.48192],[30.26563,50.48847],[30.26907,50.49983],[30.26151,50.50595],[30.26357,50.51381],[30.26975,50.51992],[30.28898,50.52821],[30.29722,50.53345],[30.30271,50.54],[30.30203,50.54741],[30.30477,50.55483],[30.32743,50.55221],[30.33086,50.55919],[30.32262,50.56486],[30.31233,50.56835],[30.30752,50.57184]]],description:"Works only from within Ukraine or with an Ukrainian proxy server."},{id:"Ukraine-orto10000-2012",name:"Ukraine - Orthophotomaps 2012",type:"tms",template:"http://212.26.144.110/tile2/orto_10000/{zoom}/{x}/{-y}.jpg",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[23.6193,51.65491],[24.09803,51.64047],[24.39723,51.89353],[25.19178,51.95913],[26.12263,51.92224],[26.49829,51.80933],[27.09005,51.77026],[27.62861,51.62603],[28.02422,51.59093],[28.28021,51.68172],[28.37662,51.5806],[28.82542,51.5682],[29.19111,51.64253],[29.41718,51.4399],[29.67316,51.51238],[29.82276,51.47512],[30.21837,51.50824],[30.54417,51.30709],[30.63726,51.38599],[30.51425,51.63634],[30.983,52.09005],[31.2822,52.07984],[31.48832,52.13497],[32.11,52.05531],[32.31279,52.11864],[32.43912,52.32434],[32.93114,52.28368],[33.29683,52.39337],[33.75561,52.35277],[34.35734,51.78055],[34.14457,51.76409],[34.05813,51.67965],[34.22103,51.47098],[34.25095,51.30085],[34.7197,51.19056],[35.11199,51.21139],[35.1818,51.08626],[35.38792,51.03402],[35.40787,50.62878],[35.62063,50.38563],[36.06944,50.4513],[36.21571,50.41106],[36.31212,50.28802],[36.4717,50.32624],[36.59138,50.2519],[37.46571,50.45977],[37.735,50.11353],[38.05747,49.9384],[38.19377,49.95765],[38.19045,50.07514],[38.35002,50.08154],[38.41651,49.98972],[38.73899,49.97476],[39.00827,49.83344],[39.14457,49.89987],[39.27755,49.78195],[39.54018,49.74544],[39.79949,49.58406],[40.18845,49.6013],[40.0588,49.50424],[40.20508,49.24666],[39.93247,49.06185],[39.71638,49.01608],[40.08872,48.85448],[39.79617,48.78443],[39.69311,48.65283],[39.86266,48.5693],[39.99231,48.31348],[39.83274,47.92287],[39.74297,47.83144],[39.57675,47.81135],[38.86532,47.85153],[38.77555,47.68618],[38.38327,47.60106],[38.30348,47.52704],[38.30016,47.23891],[38.13393,47.05577],[37.5455,47.05124],[37.31279,46.87654],[37.20973,46.92651],[36.96039,46.83107],[36.7443,46.61685],[36.72436,46.7719],[36.4451,46.72407],[36.10601,46.4728],[36.20574,46.66022],[35.92316,46.64424],[35.43114,46.39948],[35.10202,45.97138],[35.0455,45.75145],[35.47436,45.33],[35.86,45.53297],[35.9963,45.43274],[36.11598,45.51899],[36.66452,45.4514],[36.65454,45.34168],[36.50494,45.31363],[36.47502,45.24111],[36.48832,45.04884],[35.81013,44.98539],[35.5076,45.11222],[35.42782,44.93364],[35.12196,44.76394],[34.67649,44.75686],[33.985,44.37078],[33.68912,44.38504],[33.38327,44.50608],[33.35002,44.589],[33.55282,44.93128],[33.42981,45.1263],[33.19377,45.14271],[32.83141,45.33935],[32.60534,45.30896],[32.44577,45.3557],[32.50893,45.47005],[32.87795,45.68181],[33.57941,45.90665],[33.58938,46.02681],[33.25694,46.07065],[33.02422,45.97138],[31.61133,46.19506],[31.27555,46.61457],[30.87662,46.56887],[30.43446,45.98756],[29.69643,45.55159],[29.79284,45.46306],[29.73965,45.15913],[29.47369,45.41407],[29.18114,45.38373],[28.74896,45.22004],[28.56611,45.23409],[28.29018,45.33],[28.23367,45.49103],[28.31678,45.56789],[28.483,45.54228],[28.47303,45.73753],[28.95175,46.03143],[29.02489,46.18125],[28.9318,46.49569],[29.18779,46.57116],[29.59337,46.45448],[29.81944,46.46593],[29.95574,46.68759],[29.8959,46.8197],[29.56013,46.96963],[29.54683,47.29982],[29.14789,47.50234],[29.23101,47.77562],[29.17117,47.934],[28.86864,47.99411],[28.63593,48.16513],[28.44311,48.06525],[28.36332,48.17178],[28.25694,48.15404],[27.735,48.43494],[27.55547,48.45258],[26.92383,48.34884],[26.36532,48.17178],[26.1193,47.97408],[25.3846,47.91618],[24.91585,47.70408],[24.52024,47.94291],[24.18446,47.90058],[23.58274,48.00523],[23.43646,47.96963],[23.15388,48.10522],[23.07077,47.98743],[22.858,47.9585],[22.76824,48.09856],[22.58539,48.103],[22.51558,48.2161],[22.11332,48.4217],[22.49896,49.06621],[22.58872,49.11193],[22.87795,49.04006],[22.7217,49.18151],[22.71837,49.64652],[23.24364,50.105],[24.04484,50.49785],[24.05813,50.68779],[23.9451,50.81399],[24.10135,50.85388],[23.62928,51.29462],[23.6193,51.65491]]],description:"Works only from within Ukraine or with an Ukrainian proxy server."},{id:"uniao_dos_palmares",name:"União dos Palmares AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Uniao%20dos%20Palmares&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-35.97725,-9.20752],[-35.9772,-9.19398],[-35.97694,-9.19053],[-35.97678,-9.18607],[-35.97702,-9.18208],[-35.97704,-9.17968],[-35.97682,-9.17734],[-35.97664,-9.17517],[-35.97701,-9.17518],[-35.97696,-9.1707],[-35.97674,-9.17066],[-35.97661,-9.16645],[-35.97618,-9.16222],[-35.9761,-9.16026],[-35.97661,-9.16026],[-35.97672,-9.14608],[-35.97654,-9.14122],[-35.97666,-9.1332],[-35.97653,-9.12184],[-35.97648,-9.11748],[-35.98618,-9.11755],[-35.98947,-9.11733],[-36.00561,-9.11733],[-36.01859,-9.11736],[-36.04601,-9.11722],[-36.06734,-9.11698],[-36.06756,-9.16134],[-36.06771,-9.16405],[-36.06745,-9.16408],[-36.06756,-9.16657],[-36.06777,-9.16654],[-36.06798,-9.20701],[-36.0498,-9.20711],[-36.04671,-9.20698],[-36.02941,-9.20709],[-36.01355,-9.20718],[-35.99318,-9.20733],[-35.97725,-9.20752]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"URBIS2009",name:"URBIS 2009 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2009&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2009-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2012",name:"URBIS 2012 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2012&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2014",name:"URBIS 2014 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2014&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[4.4001,50.76373],[4.43093,50.77254],[4.43586,50.77237],[4.46549,50.78373],[4.48189,50.78835],[4.48269,50.79849],[4.46363,50.80686],[4.46407,50.81546],[4.48204,50.81699],[4.48103,50.82343],[4.47465,50.83505],[4.47403,50.84587],[4.46712,50.85447],[4.45257,50.85797],[4.45017,50.86151],[4.42968,50.86764],[4.43423,50.87384],[4.44147,50.87513],[4.44381,50.88004],[4.43534,50.88977],[4.43968,50.89475],[4.43287,50.90363],[4.42096,50.90917],[4.42023,50.91387],[4.38315,50.91381],[4.37879,50.90637],[4.37334,50.90289],[4.36241,50.906],[4.34824,50.90611],[4.33955,50.90685],[4.32771,50.90515],[4.31471,50.89842],[4.30413,50.89498],[4.2871,50.89192],[4.28725,50.88532],[4.29293,50.88265],[4.27948,50.8736],[4.27347,50.86822],[4.27364,50.85871],[4.27688,50.85575],[4.27644,50.84376],[4.26664,50.8405],[4.25488,50.83992],[4.24755,50.83453],[4.24799,50.82866],[4.24357,50.82599],[4.24376,50.81356],[4.25233,50.81268],[4.25649,50.80711],[4.27025,50.8073],[4.27222,50.80537],[4.28414,50.80241],[4.28885,50.80434],[4.29544,50.8043],[4.30046,50.79506],[4.31076,50.79299],[4.31444,50.78372],[4.32628,50.77221],[4.34194,50.76891],[4.34474,50.77029],[4.37535,50.76577],[4.3755,50.76381],[4.4001,50.76373]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2015",name:"URBIS 2015 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2015&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2016",name:"UrbIS-Ortho 2016",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2016&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2017",name:"UrbIS-Ortho 2017",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2017&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2018",name:"UrbIS-Ortho 2018",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2018&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbisAdmFR",name:"UrbisAdm FR",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=urbisFR&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbisAdmNL",name:"UrbisAdm NL",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=urbisNL&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBISfr2013",name:"URBISfr numerical imagery (2013)",type:"wms",template:"https://gis.irisnet.be/arcgis/rest/services/basemap/urbisFR/MapServer/export?f=image&format=png8&transparent=False&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBISnl2013",name:"URBISnl numerical imagery (2013)",type:"wms",template:"https://gis.irisnet.be/arcgis/rest/services/basemap/urbisNL/MapServer/export?f=image&format=png8&transparent=False&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"USGS-Imagery",name:"USGS Imagery",type:"tms",template:"https://ags-proxy.openstreetmap.us/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fbasemap.nationalmap.gov%2Farcgis%2Frest%2Fservices%2FUSGSImageryOnly%2FMapServer",zoomExtent:[12,20],polygon:[[[-123.25493,48.7529],[-123.25493,48.55923],[-123.19222,48.55923],[-123.19222,48.43484],[-122.94196,48.43484],[-122.94196,48.37208],[-122.88062,48.37208],[-122.88062,48.30948],[-122.81676,48.30948],[-122.81676,48.19046],[-123.00411,48.19046],[-123.00411,48.12759],[-123.05842,48.12759],[-123.05842,48.19051],[-123.25411,48.19051],[-123.25411,48.1275],[-123.37066,48.1275],[-123.37066,48.19084],[-124.05826,48.19084],[-124.05826,48.25344],[-124.18152,48.25344],[-124.18152,48.31647],[-124.43191,48.31647],[-124.43191,48.37826],[-124.55646,48.37826],[-124.55646,48.44083],[-124.75551,48.44083],[-124.75551,48.1915],[-124.81853,48.1915],[-124.81853,48.12284],[-124.7553,48.12284],[-124.7553,47.55353],[-124.38121,47.55353],[-124.38121,47.12187],[-124.19289,47.12187],[-124.19289,43.75694],[-124.44434,43.75694],[-124.44434,43.14256],[-124.63989,43.14256],[-124.63989,42.61945],[-124.44385,42.61945],[-124.44385,39.80807],[-123.88157,39.80807],[-123.88157,39.11028],[-123.75805,39.11028],[-123.75805,38.49688],[-123.27028,38.49688],[-123.27028,37.93319],[-122.81481,37.93319],[-122.81481,37.80196],[-122.56643,37.80196],[-122.56643,36.93196],[-121.8784,36.93196],[-121.8784,36.68976],[-122.00347,36.68976],[-122.00347,36.43411],[-121.94142,36.43411],[-121.94142,35.92976],[-121.5041,35.92976],[-121.5041,35.81003],[-121.37903,35.81003],[-121.37903,35.42392],[-120.94265,35.42392],[-120.94265,35.18497],[-120.8172,35.18497],[-120.8172,35.12199],[-120.69184,35.12199],[-120.69184,34.49668],[-120.50459,34.49668],[-120.50459,34.43397],[-120.00788,34.43397],[-120.00788,34.36826],[-119.52835,34.36826],[-119.52835,34.05764],[-119.0061,34.05764],[-119.0061,33.99753],[-118.50463,33.99753],[-118.50463,33.86946],[-118.44132,33.86946],[-118.44132,33.68653],[-118.06691,33.68653],[-118.06691,33.30638],[-117.503,33.30638],[-117.503,33.05003],[-117.31882,33.05003],[-117.31882,32.62059],[-117.1917,32.62059],[-117.1917,32.49746],[-116.7465,32.49746],[-116.7465,32.56092],[-115.99701,32.56092],[-115.99701,32.62649],[-114.88081,32.62649],[-114.88081,32.43408],[-114.62945,32.43408],[-114.62945,32.37316],[-114.44474,32.37316],[-114.44474,32.30754],[-114.25576,32.30754],[-114.25576,32.24446],[-114.06803,32.24446],[-114.06803,32.18291],[-113.81665,32.18291],[-113.81665,32.12076],[-113.63074,32.12076],[-113.63074,32.05651],[-113.44175,32.05651],[-113.44175,31.99844],[-113.2546,31.99844],[-113.2546,31.93254],[-113.06807,31.93254],[-113.06807,31.87181],[-112.81611,31.87181],[-112.81611,31.81042],[-112.63088,31.81042],[-112.63088,31.74647],[-112.44189,31.74647],[-112.44189,31.6856],[-112.25719,31.6856],[-112.25719,31.62104],[-112.00338,31.62104],[-112.00338,31.55958],[-111.81562,31.55958],[-111.81562,31.49702],[-111.62786,31.49702],[-111.62786,31.43399],[-111.4419,31.43399],[-111.4419,31.37339],[-111.25597,31.37339],[-111.25597,31.31132],[-108.18458,31.31132],[-108.18458,31.74595],[-106.50651,31.74595],[-106.50651,31.68423],[-106.37973,31.68423],[-106.37973,31.62175],[-106.31743,31.62175],[-106.31743,31.49682],[-106.25518,31.49682],[-106.25518,31.43449],[-106.19247,31.43449],[-106.19247,31.37213],[-106.00392,31.37213],[-106.00392,31.30933],[-105.94166,31.30933],[-105.94166,31.24575],[-105.87982,31.24575],[-105.87982,31.18362],[-105.81623,31.18362],[-105.81623,31.12072],[-105.69212,31.12072],[-105.69212,31.05848],[-105.63029,31.05848],[-105.63029,30.93283],[-105.50444,30.93283],[-105.50444,30.87159],[-105.4413,30.87159],[-105.4413,30.80846],[-105.37815,30.80846],[-105.37815,30.74718],[-105.19047,30.74718],[-105.19047,30.68432],[-105.12862,30.68432],[-105.12862,30.61997],[-105.00365,30.61997],[-105.00365,30.55891],[-104.9418,30.55891],[-104.9418,30.49632],[-104.8782,30.49632],[-104.8782,30.30983],[-104.81553,30.30983],[-104.81553,30.24783],[-104.75361,30.24783],[-104.75361,29.93539],[-104.69095,29.93539],[-104.69095,29.80902],[-104.62913,29.80902],[-104.62913,29.68436],[-104.56599,29.68436],[-104.56599,29.62235],[-104.50372,29.62235],[-104.50372,29.55954],[-104.44101,29.55954],[-104.44101,29.49748],[-104.25376,29.49748],[-104.25376,29.37167],[-104.1292,29.37167],[-104.1292,29.30916],[-104.06887,29.30916],[-104.06887,29.24673],[-103.81873,29.24673],[-103.81873,29.18431],[-103.75574,29.18431],[-103.75574,29.12232],[-103.56675,29.12232],[-103.56675,29.05981],[-103.50498,29.05981],[-103.50498,28.99675],[-103.31658,28.99675],[-103.31658,28.93469],[-103.05976,28.93469],[-103.05976,29.0593],[-102.99797,29.0593],[-102.99797,29.12129],[-102.93314,29.12129],[-102.93314,29.18486],[-102.8096,29.18486],[-102.8096,29.25262],[-102.87013,29.25262],[-102.87013,29.3081],[-102.80967,29.3081],[-102.80967,29.37155],[-102.74757,29.37155],[-102.74757,29.55819],[-102.68455,29.55819],[-102.68455,29.68477],[-102.49678,29.68477],[-102.49678,29.74577],[-102.30866,29.74577],[-102.30866,29.80866],[-102.19093,29.80866],[-102.19093,29.74601],[-101.50499,29.74601],[-101.50499,29.68468],[-101.38058,29.68468],[-101.38058,29.55945],[-101.31751,29.55945],[-101.31751,29.49589],[-101.19101,29.49589],[-101.19101,29.43261],[-101.0675,29.43261],[-101.0675,29.30881],[-100.94189,29.30881],[-100.94189,29.24562],[-100.81673,29.24562],[-100.81673,29.11904],[-100.75227,29.11904],[-100.75227,29.05782],[-100.69254,29.05782],[-100.69254,28.87204],[-100.62902,28.87204],[-100.62902,28.80954],[-100.56799,28.80954],[-100.56799,28.62255],[-100.50404,28.62255],[-100.50404,28.55838],[-100.44218,28.55838],[-100.44218,28.49683],[-100.37943,28.49683],[-100.37943,28.30929],[-100.31719,28.30929],[-100.31719,28.18357],[-100.25448,28.18357],[-100.25448,28.12139],[-100.12823,28.12139],[-100.12823,28.05921],[-100.06595,28.05921],[-100.06595,27.99661],[-100.00239,27.99661],[-100.00239,27.93322],[-99.94265,27.93322],[-99.94265,27.74547],[-99.81685,27.74547],[-99.81685,27.68343],[-99.75413,27.68343],[-99.75413,27.62215],[-99.62916,27.62215],[-99.62916,27.5589],[-99.56728,27.5589],[-99.56728,27.43538],[-99.50418,27.43538],[-99.50418,27.3774],[-99.56718,27.3774],[-99.56718,27.24637],[-99.50498,27.24637],[-99.50498,26.99656],[-99.44274,26.99656],[-99.44274,26.8728],[-99.38006,26.8728],[-99.38006,26.80682],[-99.31907,26.80682],[-99.31907,26.74736],[-99.25375,26.74736],[-99.25375,26.62101],[-99.19106,26.62101],[-99.19106,26.49567],[-99.13006,26.49567],[-99.13006,26.37138],[-99.00295,26.37138],[-99.00295,26.30938],[-98.81657,26.30938],[-98.81657,26.24578],[-98.69201,26.24578],[-98.69201,26.18371],[-98.44409,26.18371],[-98.44409,26.12172],[-98.38232,26.12172],[-98.38232,26.05965],[-98.25327,26.05965],[-98.25327,25.99869],[-98.01091,25.99869],[-98.01091,25.99323],[-97.69323,25.99323],[-97.69323,25.93341],[-97.63139,25.93341],[-97.63139,25.86959],[-97.50468,25.86959],[-97.50468,25.80735],[-97.30834,25.80735],[-97.30834,25.87312],[-97.24563,25.87312],[-97.24563,25.93537],[-97.11389,25.93537],[-97.11389,27.68092],[-97.0571,27.68092],[-97.0571,27.81082],[-95.58108,27.81082],[-95.58108,28.74688],[-94.27104,28.74688],[-94.27104,29.55941],[-92.50299,29.55941],[-92.50299,29.49748],[-91.87762,29.49748],[-91.87762,29.3727],[-91.37842,29.3727],[-91.37842,29.24683],[-91.3154,29.24683],[-91.3154,29.18443],[-91.12947,29.18443],[-91.12947,29.12326],[-91.00526,29.12326],[-91.00526,28.99684],[-89.45002,28.99684],[-89.45002,28.86774],[-88.81043,28.86774],[-88.81043,30.18419],[-85.87915,30.18419],[-85.87915,29.5455],[-84.83681,29.5455],[-84.83681,29.62252],[-84.74828,29.62252],[-84.74828,29.68362],[-84.68589,29.68362],[-84.68589,29.74684],[-83.6297,29.74684],[-83.6297,29.43244],[-83.31749,29.43244],[-83.31749,29.05794],[-82.87966,29.05794],[-82.87966,27.74535],[-82.81828,27.74535],[-82.81828,26.92909],[-82.37968,26.92909],[-82.37968,26.36942],[-81.87771,26.36942],[-81.87771,25.80597],[-81.50369,25.80597],[-81.50369,25.74748],[-81.44055,25.74748],[-81.44055,25.68515],[-81.31559,25.68515],[-81.31559,25.5601],[-81.25385,25.5601],[-81.25385,25.43424],[-81.1902,25.43424],[-81.1902,25.12343],[-81.12881,25.12343],[-81.12881,25.06194],[-81.06492,25.06194],[-81.06492,24.81578],[-81.62895,24.81578],[-81.62895,24.75384],[-81.69072,24.75384],[-81.69072,24.68994],[-81.81732,24.68994],[-81.81732,24.62792],[-82.191,24.62792],[-82.191,24.49629],[-81.62166,24.49629],[-81.62166,24.55948],[-81.37201,24.55948],[-81.37201,24.62207],[-81.05933,24.62207],[-81.05933,24.68483],[-80.93471,24.68483],[-80.93471,24.74748],[-80.74711,24.74748],[-80.74711,24.81006],[-80.36299,24.81006],[-80.36299,25.11759],[-80.12234,25.11759],[-80.12234,25.74724],[-80.05885,25.74724],[-80.05885,26.37083],[-79.99584,26.37083],[-79.99584,26.9398],[-80.05873,26.9398],[-80.05873,27.12775],[-80.12263,27.12775],[-80.12263,27.25343],[-80.1847,27.25343],[-80.1847,27.37812],[-80.24617,27.37812],[-80.24617,27.56587],[-80.30948,27.56587],[-80.30948,27.75303],[-80.37215,27.75303],[-80.37215,27.87745],[-80.43515,27.87745],[-80.43515,28.00334],[-80.49661,28.00334],[-80.49661,28.12773],[-80.55872,28.12773],[-80.55872,28.37235],[-80.49663,28.37235],[-80.49663,29.51603],[-81.12136,29.51603],[-81.12136,31.6847],[-80.60187,31.6847],[-80.60187,32.24753],[-79.4921,32.24753],[-79.4921,32.99703],[-79.11165,32.99703],[-79.11165,33.37295],[-78.61536,33.37295],[-78.61536,33.80976],[-77.9317,33.80976],[-77.9317,33.87182],[-77.86923,33.87182],[-77.86923,34.05525],[-77.68264,34.05525],[-77.68264,34.29746],[-77.24535,34.29746],[-77.24535,34.55986],[-76.49733,34.55986],[-76.49733,34.6228],[-76.43376,34.6228],[-76.43376,34.68493],[-76.37321,34.68493],[-76.37321,34.74677],[-76.30594,34.74677],[-76.30594,34.80855],[-76.2468,34.80855],[-76.2468,34.87284],[-76.18259,34.87284],[-76.18259,34.93353],[-76.12081,34.93353],[-76.12081,34.99524],[-75.9979,34.99524],[-75.9979,35.05782],[-75.87034,35.05782],[-75.87034,35.12191],[-75.74622,35.12191],[-75.74622,35.18189],[-75.49297,35.18189],[-75.49297,35.3083],[-75.43257,35.3083],[-75.43257,35.75425],[-75.49699,35.75425],[-75.49699,37.81056],[-75.3083,37.81056],[-75.3083,37.87201],[-75.2456,37.87201],[-75.2456,37.99548],[-75.18288,37.99548],[-75.18288,38.05851],[-75.11848,38.05851],[-75.11848,38.24691],[-75.05921,38.24691],[-75.05921,38.37043],[-74.99481,38.37043],[-74.99481,38.87184],[-74.48783,38.87184],[-74.48783,39.30894],[-74.17663,39.30894],[-74.17663,39.62247],[-74.0567,39.62247],[-74.0567,39.93318],[-73.9959,39.93318],[-73.9959,40.18549],[-73.93416,40.18549],[-73.93416,40.49595],[-73.8723,40.49595],[-73.8723,40.55271],[-71.80745,40.55271],[-71.80745,41.3088],[-70.88251,41.3088],[-70.88251,41.18498],[-70.74619,41.18498],[-70.74619,41.30919],[-70.43376,41.30919],[-70.43376,41.49639],[-69.93343,41.49639],[-69.93343,41.62308],[-69.86986,41.62308],[-69.86986,41.87769],[-69.93579,41.87769],[-69.93579,42.00323],[-69.99758,42.00323],[-69.99758,42.06502],[-70.06061,42.06502],[-70.06061,42.12943],[-70.55729,42.12943],[-70.55729,43.24871],[-70.49741,43.24871],[-70.49741,43.30922],[-70.37042,43.30922],[-70.37042,43.37196],[-70.30857,43.37196],[-70.30857,43.49699],[-70.18392,43.49699],[-70.18392,43.62235],[-70.05758,43.62235],[-70.05758,43.68502],[-69.74552,43.68502],[-69.74552,43.74766],[-69.24728,43.74766],[-69.24728,43.8107],[-69.05607,43.8107],[-69.05607,43.87172],[-68.99505,43.87172],[-68.99505,43.9982],[-68.49637,43.9982],[-68.49637,44.05974],[-68.3081,44.05974],[-68.3081,44.12214],[-68.18518,44.12214],[-68.18518,44.30814],[-67.9956,44.30814],[-67.9956,44.37275],[-67.8103,44.37275],[-67.8103,44.43518],[-67.49653,44.43518],[-67.49653,44.49688],[-67.37102,44.49688],[-67.37102,44.56006],[-67.18488,44.56006],[-67.18488,44.62133],[-67.12212,44.62133],[-67.12212,44.68679],[-67.05936,44.68679],[-67.05936,44.74737],[-66.93111,44.74737],[-66.93111,44.94066],[-66.99468,44.94066],[-66.99468,45.00245],[-67.05958,45.00245],[-67.05958,45.12734],[-67.1202,45.12734],[-67.1202,45.19101],[-67.24698,45.19101],[-67.24698,45.25344],[-67.31775,45.25344],[-67.31775,45.18984],[-67.37075,45.18984],[-67.37075,45.2534],[-67.43269,45.2534],[-67.43269,45.30834],[-67.37086,45.30834],[-67.37086,45.4397],[-67.43056,45.4397],[-67.43056,45.49501],[-67.37099,45.49501],[-67.37099,45.62645],[-67.6215,45.62645],[-67.6215,45.68961],[-67.68383,45.68961],[-67.68383,45.75326],[-67.74621,45.75326],[-67.74621,47.12682],[-67.87001,47.12682],[-67.87001,47.19003],[-67.93238,47.19003],[-67.93238,47.25397],[-67.99594,47.25397],[-67.99594,47.31497],[-68.12067,47.31497],[-68.12067,47.37808],[-68.44232,47.37808],[-68.44232,47.31661],[-68.63143,47.31661],[-68.63143,47.25447],[-68.9978,47.25447],[-68.9978,47.43989],[-69.06072,47.43989],[-69.06072,47.50476],[-69.25381,47.50476],[-69.25381,47.43981],[-69.31793,47.43981],[-69.31793,47.3786],[-69.44385,47.3786],[-69.44385,47.31563],[-69.50382,47.31563],[-69.50382,47.25258],[-69.56678,47.25258],[-69.56678,47.19109],[-69.63035,47.19109],[-69.63035,47.1287],[-69.69331,47.1287],[-69.69331,47.06543],[-69.75571,47.06543],[-69.75571,47.00428],[-69.81804,47.00428],[-69.81804,46.94153],[-69.8804,46.94153],[-69.8804,46.87925],[-69.94217,46.87925],[-69.94217,46.81774],[-70.00631,46.81774],[-70.00631,46.69203],[-70.07043,46.69203],[-70.07043,46.44259],[-70.19459,46.44259],[-70.19459,46.37859],[-70.2562,46.37859],[-70.2562,46.31526],[-70.32037,46.31526],[-70.32037,46.06512],[-70.3815,46.06512],[-70.3815,45.93552],[-70.32016,45.93552],[-70.32016,45.87948],[-70.44931,45.87948],[-70.44931,45.75387],[-70.507,45.75387],[-70.507,45.69169],[-70.63166,45.69169],[-70.63166,45.62916],[-70.75755,45.62916],[-70.75755,45.44147],[-70.88099,45.44147],[-70.88099,45.37806],[-71.13328,45.37806],[-71.13328,45.31515],[-71.38303,45.31515],[-71.38303,45.25342],[-71.50764,45.25342],[-71.50764,45.06557],[-73.94189,45.06557],[-73.94189,45.00312],[-74.74697,45.00312],[-74.74697,45.0649],[-74.8801,45.0649],[-74.8801,45.0029],[-75.06625,45.0029],[-75.06625,44.94152],[-75.25394,44.94152],[-75.25394,44.8776],[-75.37896,44.8776],[-75.37896,44.81535],[-75.44313,44.81535],[-75.44313,44.75361],[-75.56666,44.75361],[-75.56666,44.69099],[-75.62902,44.69099],[-75.62902,44.6285],[-75.75405,44.6285],[-75.75405,44.56638],[-75.81731,44.56638],[-75.81731,44.50289],[-75.87995,44.50289],[-75.87995,44.37849],[-76.13003,44.37849],[-76.13003,44.31592],[-76.1927,44.31592],[-76.1927,44.25344],[-76.31826,44.25344],[-76.31826,44.19167],[-76.3793,44.19167],[-76.3793,44.06537],[-76.44276,44.06537],[-76.44276,43.99638],[-76.31703,43.99638],[-76.31703,43.94146],[-76.50766,43.94146],[-76.50766,43.87233],[-76.383,43.87233],[-76.383,43.80919],[-76.25341,43.80919],[-76.25341,43.56652],[-76.50648,43.56652],[-76.50648,43.50339],[-76.63312,43.50339],[-76.63312,43.44323],[-76.69511,43.44323],[-76.69511,43.37869],[-76.81778,43.37869],[-76.81778,43.31807],[-77.682,43.31807],[-77.682,43.37894],[-78.05659,43.37894],[-78.05659,43.43969],[-78.43897,43.43969],[-78.43897,43.37944],[-78.88034,43.37944],[-78.88034,43.31497],[-79.12989,43.31497],[-79.12989,43.24293],[-79.06696,43.24293],[-79.06696,43.12999],[-79.12989,43.12999],[-79.12989,43.05773],[-79.07126,43.05773],[-79.07126,42.92949],[-78.94326,42.92949],[-78.94326,42.75422],[-79.06944,42.75422],[-79.06944,42.69416],[-79.13344,42.69416],[-79.13344,42.6297],[-79.19475,42.6297],[-79.19475,42.56635],[-79.37868,42.56635],[-79.37868,42.50334],[-79.4443,42.50334],[-79.4443,42.44106],[-79.56799,42.44106],[-79.56799,42.37753],[-79.69062,42.37753],[-79.69062,42.31711],[-79.81646,42.31711],[-79.81646,42.25345],[-80.00524,42.25345],[-80.00524,42.19092],[-80.19168,42.19092],[-80.19168,42.12726],[-80.3168,42.12726],[-80.3168,42.06699],[-80.50632,42.06699],[-80.50632,42.00343],[-80.69305,42.00343],[-80.69305,41.94151],[-80.94404,41.94151],[-80.94404,41.87812],[-81.19427,41.87812],[-81.19427,41.81665],[-81.31901,41.81665],[-81.31901,41.75455],[-81.44184,41.75455],[-81.44184,41.69096],[-81.50535,41.69096],[-81.50535,41.63016],[-82.74701,41.63016],[-82.74701,41.75369],[-82.88391,41.75369],[-82.88391,41.56561],[-82.99572,41.56561],[-82.99572,41.62704],[-83.12578,41.62704],[-83.12578,41.68784],[-83.24747,41.68784],[-83.24747,41.75369],[-83.37373,41.75369],[-83.37373,41.80928],[-83.3106,41.80928],[-83.3106,41.87161],[-83.24747,41.87161],[-83.24747,41.93614],[-83.18434,41.93614],[-83.18434,41.99609],[-83.12077,41.99609],[-83.12077,42.24648],[-83.05892,42.24648],[-83.05892,42.30896],[-82.86853,42.30896],[-82.86853,42.37177],[-82.80722,42.37177],[-82.80722,42.55855],[-82.75537,42.55855],[-82.75537,42.49549],[-82.5599,42.49549],[-82.5599,42.55855],[-82.49678,42.55855],[-82.49678,42.68336],[-82.43289,42.68336],[-82.43289,42.93422],[-82.37006,42.93422],[-82.37006,43.06481],[-82.43289,43.06481],[-82.43289,43.19176],[-82.49475,43.19176],[-82.49475,43.50346],[-82.55713,43.50346],[-82.55713,43.81609],[-82.61979,43.81609],[-82.61979,43.94221],[-82.68395,43.94221],[-82.68395,44.00226],[-82.74653,44.00226],[-82.74653,44.06705],[-82.87087,44.06705],[-82.87087,44.12919],[-83.00852,44.12919],[-83.00852,44.06648],[-83.13361,44.06648],[-83.13361,44.00539],[-83.24145,44.00539],[-83.24145,44.9962],[-83.18061,44.9962],[-83.18061,45.0673],[-83.24552,45.0673],[-83.24552,45.12874],[-83.30659,45.12874],[-83.30659,45.25515],[-83.37061,45.25515],[-83.37061,45.31659],[-83.43256,45.31659],[-83.43256,45.37921],[-83.61784,45.37921],[-83.61784,45.44197],[-83.80843,45.44197],[-83.80843,45.50362],[-84.05507,45.50362],[-84.05507,45.56479],[-84.12352,45.56479],[-84.12352,45.62878],[-84.18075,45.62878],[-84.18075,45.69147],[-84.31116,45.69147],[-84.31116,45.93371],[-83.821,45.93371],[-83.821,45.87251],[-83.49681,45.87251],[-83.49681,45.93371],[-83.43381,45.93371],[-83.43381,46.00169],[-83.49627,46.00169],[-83.49627,46.06682],[-83.56,46.06682],[-83.56,46.12616],[-83.99546,46.12616],[-83.99546,46.19317],[-84.05918,46.19317],[-84.05918,46.3815],[-84.11526,46.3815],[-84.11526,46.49536],[-84.05918,46.49536],[-84.05918,46.56827],[-84.25795,46.56827],[-84.25795,46.50512],[-84.30719,46.50512],[-84.30719,46.56827],[-84.44154,46.56827],[-84.44154,46.50453],[-84.99657,46.50453],[-84.99657,46.68429],[-84.92982,46.68429],[-84.92982,46.81808],[-85.31659,46.81808],[-85.31659,46.75358],[-87.55626,46.75358],[-87.55626,47.44074],[-87.68254,47.44074],[-87.68254,47.50356],[-88.25607,47.50356],[-88.25607,47.44337],[-88.44174,47.44337],[-88.44174,47.37899],[-88.50683,47.37899],[-88.50683,47.31539],[-88.63128,47.31539],[-88.63128,47.25398],[-88.75696,47.25398],[-88.75696,47.19347],[-88.88383,47.19347],[-88.88383,47.12847],[-88.94342,47.12847],[-88.94342,47.06621],[-89.07087,47.06621],[-89.07087,47.00268],[-89.25656,47.00268],[-89.25656,46.94108],[-90.36777,46.94108],[-90.36777,47.68448],[-90.307,47.68448],[-90.307,47.74602],[-89.99486,47.74602],[-89.99486,47.80827],[-89.80486,47.80827],[-89.80486,47.87006],[-89.67977,47.87006],[-89.67977,47.93396],[-89.49338,47.93396],[-89.49338,47.9958],[-89.42847,47.9958],[-89.42847,48.06564],[-89.99327,48.06564],[-89.99327,48.1283],[-90.74559,48.1283],[-90.74559,48.18931],[-90.80873,48.18931],[-90.80873,48.25221],[-91.06776,48.25221],[-91.06776,48.19167],[-91.19462,48.19167],[-91.19462,48.1279],[-91.68142,48.1279],[-91.68142,48.2526],[-91.93219,48.2526],[-91.93219,48.31425],[-91.99297,48.31425],[-91.99297,48.37808],[-92.31894,48.37808],[-92.31894,48.25291],[-92.37322,48.25291],[-92.37322,48.31534],[-92.43223,48.31534],[-92.43223,48.44114],[-92.49772,48.44114],[-92.49772,48.50178],[-92.56794,48.50178],[-92.56794,48.43958],[-92.62105,48.43958],[-92.62105,48.56508],[-92.80868,48.56508],[-92.80868,48.62869],[-92.80868,48.62674],[-92.93318,48.62674],[-92.93318,48.69221],[-93.00517,48.69221],[-93.00517,48.6283],[-93.12259,48.6283],[-93.12259,48.69221],[-93.31908,48.69221],[-93.31908,48.62674],[-93.50495,48.62674],[-93.50495,48.56352],[-93.74746,48.56352],[-93.74746,48.62674],[-93.81355,48.62674],[-93.81355,48.68988],[-94.24531,48.68988],[-94.24531,48.75543],[-94.61832,48.75543],[-94.61832,48.94104],[-94.6809,48.94104],[-94.6809,49.00297],[-94.74415,49.00297],[-94.74415,49.25361],[-94.80841,49.25361],[-94.80841,49.37841],[-95.11924,49.37841],[-95.11924,49.44253],[-95.19343,49.44253],[-95.19343,49.00353],[-96.87069,49.00353],[-96.87069,49.06561],[-99.00493,49.06561],[-99.00493,49.00507],[-109.36993,49.00507],[-109.36993,49.06682],[-109.50587,49.06682],[-109.50587,49.00507],[-114.183,49.00507],[-114.183,49.06873],[-114.75787,49.06873],[-114.75787,49.00507],[-115.43373,49.00507],[-115.43373,49.06714],[-116.50627,49.06714],[-116.50627,49.00507],[-117.30895,49.00507],[-117.30895,49.06598],[-119.88295,49.06598],[-119.88295,49.00507],[-120.12086,49.00507],[-120.12086,49.06784],[-121.44516,49.06784],[-121.44516,49.00507],[-121.93118,49.00507],[-121.93118,49.06561],[-122.81748,49.06561],[-122.81748,49.00291],[-122.87952,49.00291],[-122.87952,48.9347],[-122.81746,48.9347],[-122.81746,48.8102],[-122.75389,48.8102],[-122.75389,48.75338],[-122.87129,48.75338],[-122.87129,48.81539],[-123.00554,48.81539],[-123.00554,48.75295],[-123.12969,48.75295],[-123.12969,48.69022],[-123.18382,48.69022],[-123.18382,48.7529],[-123.25493,48.7529]],[[-122.93417,37.75215],[-122.93475,37.6842],[-123.0679,37.6849],[-123.06737,37.74753],[-123.12926,37.74785],[-123.12869,37.81569],[-123.05907,37.81532],[-123.05959,37.75281],[-122.93417,37.75215]],[[-71.62995,41.25409],[-71.49665,41.25414],[-71.49656,41.12297],[-71.62986,41.12291],[-71.62995,41.25409]],[[-70.31843,41.37752],[-70.31834,41.24482],[-70.19066,41.24487],[-70.19062,41.1886],[-69.9336,41.1887],[-69.93373,41.37919],[-69.99507,41.37917],[-69.99511,41.44316],[-70.07078,41.44313],[-70.0707,41.31449],[-70.24617,41.31443],[-70.24621,41.37755],[-70.31843,41.37752]],[[-68.94034,43.94041],[-68.68569,43.9405],[-68.68565,43.87218],[-68.74654,43.87216],[-68.7465,43.81025],[-68.80908,43.81023],[-68.80903,43.74673],[-68.87731,43.7467],[-68.87735,43.81178],[-68.94025,43.81176],[-68.94034,43.94041]],[[-123.12915,49.06451],[-122.99542,49.06451],[-122.99542,48.93432],[-123.12915,48.93432],[-123.12915,49.06451]],[[-82.94071,24.75359],[-82.87194,24.75359],[-82.87194,24.69057],[-82.74462,24.69057],[-82.74462,24.62146],[-82.8088,24.62146],[-82.8088,24.55949],[-82.94071,24.55949],[-82.94071,24.75359]]],description:"Public domain aerial imagery, mostly NAIP",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USGSTopographicMaps.png"},{id:"USGS-Scanned_Topographic",name:"USGS Topographic Maps",type:"tms",template:"https://caltopo.s3.amazonaws.com/topo/{zoom}/{x}/{y}.png",zoomExtent:[0,16],polygon:[[[-55.99594,52.00107],[-112.02896,52.00107],[-112.03995,56.01308],[-120.00494,56.00592],[-120.01712,60.01202],[-132.00197,60.00239],[-132.01208,63.00193],[-133.96883,63.0005],[-133.9724,63.99225],[-141.04429,63.98726],[-141.06879,69.92046],[-156.24893,71.51583],[-160.44571,70.83527],[-167.08145,68.42906],[-164.08218,67.03914],[-169.01504,65.68269],[-166.57608,64.50778],[-161.82999,64.05006],[-165.08194,63.2603],[-168.02628,59.78623],[-162.53311,59.73089],[-162.35733,58.55905],[-157.83096,58.31753],[-158.00674,57.52404],[-168.22403,53.51022],[-166.55411,53.14277],[-158.77579,54.88541],[-158.6824,55.74964],[-156.55106,56.00848],[-156.15555,56.77466],[-154.70535,56.14337],[-152.07413,57.37035],[-151.62918,58.22653],[-152.00821,58.98056],[-145.9877,60.24741],[-140.38467,59.48634],[-136.53946,57.8061],[-133.79288,54.83483],[-133.33145,53.14277],[-131.46378,51.69838],[-128.52493,51.74602],[-129.79385,50.90159],[-124.56436,47.49786],[-124.03702,45.48627],[-124.6962,42.90428],[-124.49844,40.34146],[-122.80655,37.53929],[-119.99405,33.37085],[-117.24747,32.5412],[-111.13907,31.1977],[-106.70059,31.23529],[-103.20694,28.64618],[-101.84463,29.8158],[-99.20792,26.28744],[-96.79092,25.75432],[-96.92276,27.96911],[-93.47305,29.68226],[-88.94669,28.87732],[-88.6171,30.17736],[-86.2001,30.36713],[-84.96963,29.43379],[-84.09073,30.06333],[-82.97012,28.95426],[-82.97012,27.26824],[-81.25626,25.07956],[-82.09122,24.56105],[-80.06973,24.76073],[-79.85001,27.11188],[-81.27823,30.70777],[-78.99307,33.20554],[-75.03799,35.5983],[-75.85098,37.24252],[-73.74161,40.4586],[-69.89639,41.60224],[-70.68741,43.17629],[-66.93008,44.69516],[-66.53458,43.08007],[-64.20547,43.35229],[-59.50333,45.73221],[-59.51431,46.24762],[-60.0032,46.25901],[-59.99222,47.24506],[-59.00894,47.2376],[-58.99796,47.50267],[-56.51504,47.50267],[-56.52603,46.7477],[-53.99918,46.7477],[-53.9772,46.48358],[-52.49405,46.46354],[-52.50504,48.75361],[-52.99667,48.75451],[-53.01315,49.99551],[-55.00168,50.0061],[-55.03738,53.74721],[-56.00418,53.73421],[-55.99594,52.00107]],[[-59.50127,43.74954],[-60.5024,43.74954],[-60.5024,44],[-59.9984,44],[-59.9984,44.2494],[-59.50127,44.2494],[-59.50127,43.74954]],[[-155.95024,20.49523],[-157.32675,20.49153],[-157.32903,21.23181],[-155.95251,21.23549],[-155.95024,20.49523]],[[-157.64488,21.24845],[-158.28534,21.24674],[-158.2869,21.74996],[-157.64643,21.75167],[-157.64488,21.24845]],[[-156.12602,20.3247],[-154.74617,20.32841],[-154.74174,18.87578],[-156.1216,18.87203],[-156.12602,20.3247]],[[-159.29077,22.24504],[-159.2893,21.76857],[-160.28917,21.76591],[-160.29064,22.24239],[-159.29077,22.24504]]],terms_url:"https://caltopo.com",terms_text:"© Caltopo",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USGSTopographicMaps.png"},{id:"USSR-Latvia",name:"USSR - Latvia",type:"wms",template:"http://www.gisnet.lv/cgi-bin/topo?FORMAT=image/jpeg&VERSION=1.1.1&service=WMS&REQUEST=GetMap&LAYERS=DTO,DTC,DIVDPTC,PD,VS,DS,PS,M&SRS={proj}&WIDTH={width}&height={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[26.63086,57.56889],[25.16968,58.04882],[22.54395,57.76866],[21.54419,57.53352],[21.01685,56.81892],[21.01685,56.03523],[22.03857,56.38958],[24.71924,56.33481],[26.75171,55.66519],[28.19092,56.13943],[27.78442,57.40946],[26.63086,57.56889]]]},{id:"sjcgis.org-General_Basemap_WM",name:"Vector Streetmap for San Juan County WA",type:"tms",template:"https://sjcgis.org/arcgis/rest/services/Basemaps/General_Basemap_WM/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[0,19],polygon:[[[-123.27402,48.69297],[-123.00773,48.76726],[-123.00762,48.83158],[-122.7835,48.75842],[-122.6934,48.65852],[-122.76745,48.60361],[-122.74484,48.38708],[-123.24822,48.28353],[-123.11452,48.42261],[-123.21904,48.54857],[-123.27402,48.69297]]],best:true,description:"Public domain street and address data from the San Juan County, WA. Updated at least quarterly."},{id:"Vercors-Orthophotos-1999",name:"Vercors (Réserve naturelle des Hauts-Plateaux du Vercors) - Orthophoto - 1999 - 1 m",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/PNRVercors-RHP-1999/{zoom}/{x}/{y}",endDate:"1999-01-01T00:00:00.000Z",startDate:"1999-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[5.43565,44.99918],[5.43193,44.9229],[5.43624,44.92284],[5.43472,44.89001],[5.43303,44.88995],[5.43065,44.85026],[5.43387,44.85014],[5.43285,44.82638],[5.43548,44.82626],[5.43497,44.8139],[5.44106,44.81372],[5.43717,44.74098],[5.4546,44.74044],[5.45282,44.70425],[5.5211,44.70245],[5.5233,44.73858],[5.58904,44.73684],[5.59298,44.81263],[5.5879,44.81299],[5.58977,44.84947],[5.58823,44.84938],[5.58972,44.87351],[5.53863,44.87503],[5.53947,44.88686],[5.52834,44.88733],[5.53002,44.92012],[5.53319,44.92012],[5.53761,44.99624],[5.43565,44.99918]]],terms_text:"Parc Naturel du Vercors"},{id:"vicosa_al",name:"Viçosa AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Vicosa&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.198,-9.42067],[-36.19777,-9.41789],[-36.1978,-9.41528],[-36.19801,-9.41074],[-36.19789,-9.40857],[-36.19793,-9.40637],[-36.19797,-9.40561],[-36.19793,-9.40405],[-36.19799,-9.40312],[-36.19827,-9.40028],[-36.19829,-9.39496],[-36.19789,-9.39169],[-36.19844,-9.38932],[-36.19837,-9.3862],[-36.19794,-9.38167],[-36.19801,-9.37972],[-36.19834,-9.37867],[-36.19832,-9.37698],[-36.19817,-9.37586],[-36.19852,-9.37139],[-36.19822,-9.36239],[-36.19862,-9.35319],[-36.19849,-9.35097],[-36.19857,-9.34852],[-36.1988,-9.34668],[-36.1986,-9.34349],[-36.19877,-9.34084],[-36.19895,-9.33301],[-36.19877,-9.33039],[-36.28958,-9.33114],[-36.28938,-9.33319],[-36.2895,-9.33538],[-36.28925,-9.34124],[-36.28945,-9.34291],[-36.28928,-9.34521],[-36.28897,-9.37311],[-36.28915,-9.37481],[-36.28892,-9.37708],[-36.2889,-9.38541],[-36.28872,-9.38633],[-36.28872,-9.39343],[-36.28887,-9.39558],[-36.28877,-9.40129],[-36.28862,-9.40652],[-36.28872,-9.40715],[-36.28877,-9.42133],[-36.198,-9.42067]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"wien.gv.at-labels",name:"Vienna: Beschriftungen (annotations)",type:"tms",template:"https://maps.wien.gv.at/wmts/beschriftung/normal/google3857/{zoom}/{y}/{x}.png",zoomExtent:[12,19],polygon:[[[16.54475,48.17286],[16.54103,48.17657],[16.54978,48.17675],[16.54665,48.17162],[16.55629,48.16171],[16.55567,48.16446],[16.56161,48.16037],[16.57306,48.16319],[16.57603,48.13522],[16.54301,48.14333],[16.51377,48.15893],[16.4777,48.15744],[16.45536,48.13951],[16.43313,48.13788],[16.43701,48.11994],[16.42291,48.12306],[16.4083,48.11791],[16.40511,48.12198],[16.3246,48.13779],[16.31181,48.11945],[16.29806,48.12896],[16.2711,48.13385],[16.23607,48.13001],[16.2189,48.12377],[16.2181,48.12807],[16.23861,48.13205],[16.23843,48.13716],[16.22081,48.13555],[16.20986,48.14762],[16.22321,48.15318],[16.19798,48.15454],[16.19619,48.16396],[16.18183,48.17112],[16.19981,48.18616],[16.20739,48.20235],[16.20194,48.20479],[16.20962,48.20963],[16.1976,48.21479],[16.19778,48.22288],[16.18517,48.2232],[16.19911,48.22858],[16.19251,48.23671],[16.20677,48.26483],[16.24105,48.24837],[16.24154,48.23832],[16.25662,48.23988],[16.27043,48.25193],[16.26406,48.25492],[16.28556,48.25832],[16.29412,48.26395],[16.28617,48.2667],[16.28901,48.27051],[16.32741,48.27721],[16.34813,48.29048],[16.35351,48.28369],[16.3706,48.2817],[16.36714,48.28685],[16.37787,48.28832],[16.37557,48.29592],[16.37982,48.30201],[16.38536,48.30146],[16.38043,48.31507],[16.39518,48.32257],[16.39412,48.31926],[16.40287,48.31676],[16.41682,48.32253],[16.43803,48.31628],[16.44041,48.29192],[16.47547,48.27501],[16.48123,48.27343],[16.4835,48.27971],[16.48132,48.29351],[16.49645,48.29249],[16.51491,48.28554],[16.5067,48.2736],[16.51285,48.26784],[16.53263,48.2621],[16.54697,48.263],[16.53941,48.24284],[16.55274,48.239],[16.53627,48.20044],[16.54184,48.18206],[16.53631,48.17755],[16.54475,48.17286]]],terms_url:"https://data.wien.gv.at",terms_text:"Stadt Wien",icon:"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif",overlay:true},{id:"wien.gv.at-gp",name:"Vienna: Mehrzweckkarte (general purpose)",type:"tms",template:"https://maps.wien.gv.at/wmts/fmzk/pastell/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[10,19],polygon:[[[16.54475,48.17286],[16.54103,48.17657],[16.54978,48.17675],[16.54665,48.17162],[16.55629,48.16171],[16.55567,48.16446],[16.56161,48.16037],[16.57306,48.16319],[16.57603,48.13522],[16.54301,48.14333],[16.51377,48.15893],[16.4777,48.15744],[16.45536,48.13951],[16.43313,48.13788],[16.43701,48.11994],[16.42291,48.12306],[16.4083,48.11791],[16.40511,48.12198],[16.3246,48.13779],[16.31181,48.11945],[16.29806,48.12896],[16.2711,48.13385],[16.23607,48.13001],[16.2189,48.12377],[16.2181,48.12807],[16.23861,48.13205],[16.23843,48.13716],[16.22081,48.13555],[16.20986,48.14762],[16.22321,48.15318],[16.19798,48.15454],[16.19619,48.16396],[16.18183,48.17112],[16.19981,48.18616],[16.20739,48.20235],[16.20194,48.20479],[16.20962,48.20963],[16.1976,48.21479],[16.19778,48.22288],[16.18517,48.2232],[16.19911,48.22858],[16.19251,48.23671],[16.20677,48.26483],[16.24105,48.24837],[16.24154,48.23832],[16.25662,48.23988],[16.27043,48.25193],[16.26406,48.25492],[16.28556,48.25832],[16.29412,48.26395],[16.28617,48.2667],[16.28901,48.27051],[16.32741,48.27721],[16.34813,48.29048],[16.35351,48.28369],[16.3706,48.2817],[16.36714,48.28685],[16.37787,48.28832],[16.37557,48.29592],[16.37982,48.30201],[16.38536,48.30146],[16.38043,48.31507],[16.39518,48.32257],[16.39412,48.31926],[16.40287,48.31676],[16.41682,48.32253],[16.43803,48.31628],[16.44041,48.29192],[16.47547,48.27501],[16.48123,48.27343],[16.4835,48.27971],[16.48132,48.29351],[16.49645,48.29249],[16.51491,48.28554],[16.5067,48.2736],[16.51285,48.26784],[16.53263,48.2621],[16.54697,48.263],[16.53941,48.24284],[16.55274,48.239],[16.53627,48.20044],[16.54184,48.18206],[16.53631,48.17755],[16.54475,48.17286]]],terms_url:"https://data.wien.gv.at",terms_text:"Stadt Wien",icon:"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{id:"wien.gv.at-aerial_image",name:"Vienna: Orthofoto (aerial image)",type:"tms",template:"https://maps.wien.gv.at/wmts/lb/farbe/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[10,19],polygon:[[[16.14995,48.10832],[16.14989,48.33315],[16.61873,48.33296],[16.61749,48.10813],[16.46644,48.10819],[16.46644,48.10744],[16.18104,48.10756],[16.18104,48.10831],[16.14995,48.10832]]],terms_url:"https://data.wien.gv.at",terms_text:"Stadt Wien",icon:"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{id:"Ville_de_Nyon-HD-2010",name:"Ville de Nyon - Orthophoto 2010 HD 5cm/pi",type:"tms",template:"http://osmdata.asitvd.ch/tiles/nyon2010/{zoom}/{x}/{y}.png",endDate:"2010-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.24859,46.38252],[6.24848,46.38715],[6.24378,46.38944],[6.24182,46.39109],[6.2414,46.39159],[6.23919,46.39222],[6.23973,46.39373],[6.2379,46.3946],[6.23713,46.39698],[6.23071,46.40107],[6.22789,46.39903],[6.22326,46.40219],[6.22066,46.40189],[6.21582,46.40462],[6.21393,46.40698],[6.20989,46.40563],[6.20928,46.40528],[6.20985,46.40434],[6.20501,46.40332],[6.20527,46.40104],[6.20906,46.40131],[6.20951,46.4013],[6.2149,46.4008],[6.21154,46.39808],[6.21057,46.3968],[6.20954,46.39449],[6.21229,46.39243],[6.21374,46.39168],[6.21639,46.39079],[6.21296,46.38736],[6.21532,46.38514],[6.21403,46.38424],[6.2126,46.38232],[6.21211,46.38102],[6.21212,46.37992],[6.21231,46.37901],[6.21318,46.37697],[6.21454,46.37494],[6.21359,46.37463],[6.21365,46.37276],[6.22133,46.3699],[6.22752,46.36555],[6.22752,46.36541],[6.23738,46.37356],[6.24404,46.37842],[6.24859,46.38252]]],terms_url:"http://www.nyon.ch/fr/officiel/services-offices/informatique-et-population-776-3911",terms_text:"Ville de Nyon"},{id:"VGIN-BuildingFootprints_WM",name:"Virginia Building Footprints",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FVA_Base_layers%2FVA_Building_Footprints%2FMapServer&transparent=true&layers=show%3A20",endDate:"2018-06-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=bcd049dfcdc342a7a08ec81644eeb339",terms_text:"Virginia Geographic Information Network (VGIN)",description:"Virginia Building Footprint Map Service",overlay:true},{id:"VGIN-Imagery_WM",name:"Virginia Imagery Service - Most Recent",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FMostRecentImagery%2FMostRecentImagery_WGS%2FMapServer&transparent=true&layers=show%3A0",endDate:"2018-08-01T00:00:00.000Z",startDate:"2013-04-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=36386a7e7dae4032a33cb0b83a1711f1",terms_text:"Virginia Geographic Information Network (VGIN)",description:"The most recently available VBMP orthoimagery for all of Virginia."},{id:"VGIN-PropertyLines_WM",name:"Virginia Property Lines",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=http%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FVA_Base_layers%2FVA_Parcels%2FMapServer&transparent=true",endDate:"2018-06-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=f1dccaf1f42e40cbba791feae2e23690",terms_text:"Virginia Geographic Information Network (VGIN)",description:"A statewide Parcel service showing property ownership outlines where available",overlay:true},{id:"vogis.cnv.at-DGM",name:"VoGIS: DGM (Terrain model)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_hoehen_und_gelaende_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=schummerung_50cm_terrain&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[9.96805,47.54631],[9.96809,47.54627],[9.97125,47.54425],[9.96484,47.53803],[9.9684,47.52802],[9.96526,47.52089],[9.99569,47.50278],[9.98736,47.49847],[10.00076,47.48211],[10.02301,47.48411],[10.03743,47.48918],[10.04477,47.48762],[10.05413,47.47589],[10.05347,47.46686],[10.06468,47.46364],[10.06999,47.45595],[10.08057,47.45536],[10.08857,47.46029],[10.09164,47.45893],[10.09385,47.44046],[10.10559,47.42872],[10.09374,47.41688],[10.07418,47.41472],[10.06914,47.41018],[10.08624,47.39952],[10.08284,47.39381],[10.09984,47.35476],[10.11934,47.37561],[10.14169,47.36718],[10.16587,47.36887],[10.16958,47.3713],[10.1694,47.38583],[10.1813,47.38725],[10.18185,47.39243],[10.19508,47.38935],[10.19988,47.38334],[10.21259,47.38039],[10.22705,47.38889],[10.23619,47.38192],[10.23168,47.37897],[10.23716,47.37357],[10.21699,47.35436],[10.2171,47.34988],[10.20424,47.33675],[10.20742,47.33232],[10.19951,47.32646],[10.21113,47.31898],[10.21597,47.31106],[10.21236,47.31122],[10.19913,47.29754],[10.18964,47.29394],[10.17961,47.29603],[10.17208,47.27908],[10.17404,47.27025],[10.17834,47.27011],[10.17449,47.2637],[10.21884,47.25533],[10.22343,47.24983],[10.21087,47.2478],[10.19776,47.23666],[10.20791,47.2328],[10.21428,47.21684],[10.21269,47.20432],[10.19963,47.19539],[10.19951,47.18525],[10.21151,47.17124],[10.2092,47.16537],[10.20851,47.15948],[10.21321,47.1577],[10.2222,47.15323],[10.22166,47.14925],[10.21481,47.14352],[10.20333,47.14215],[10.20887,47.13164],[10.18629,47.12886],[10.18652,47.11946],[10.17288,47.12033],[10.16299,47.11361],[10.15766,47.11426],[10.15442,47.10578],[10.13243,47.08122],[10.13459,47.06392],[10.15085,47.06184],[10.15693,47.04883],[10.14418,47.03355],[10.12326,47.02209],[10.13284,47.01204],[10.15447,47.00545],[10.15961,46.99882],[10.15442,46.99299],[10.16001,46.984],[10.14463,46.98301],[10.13492,46.96584],[10.13501,46.95483],[10.12684,46.9435],[10.09772,46.92676],[10.09954,46.91712],[10.10921,46.90834],[10.10908,46.89431],[10.12497,46.88014],[10.14147,46.87468],[10.13967,46.86217],[10.14506,46.8511],[10.13941,46.84738],[10.12309,46.84848],[10.11912,46.84417],[10.10518,46.8409],[10.09195,46.85143],[10.09265,46.85818],[10.08712,46.86128],[10.05488,46.8617],[10.0509,46.86442],[10.05192,46.87405],[10.03891,46.88611],[10.03221,46.88802],[10.01782,46.90161],[10.00494,46.89889],[9.98243,46.9062],[9.97793,46.91603],[9.96657,46.91222],[9.95907,46.91602],[9.94612,46.91235],[9.93758,46.91324],[9.92153,46.91882],[9.91231,46.92606],[9.90632,46.9253],[9.89449,46.93164],[9.87613,46.93463],[9.88071,46.94011],[9.87657,46.94071],[9.87488,46.95039],[9.87872,46.95707],[9.87073,46.96321],[9.88482,46.98546],[9.8923,46.99036],[9.88878,47.00072],[9.8707,47.00965],[9.87115,47.01306],[9.88035,47.01722],[9.87779,47.02055],[9.85974,47.02321],[9.85273,47.01641],[9.83612,47.01253],[9.82353,47.01986],[9.80756,47.02356],[9.78491,47.03849],[9.74808,47.03692],[9.74185,47.04268],[9.71821,47.04337],[9.70701,47.04805],[9.7076,47.05381],[9.69756,47.05239],[9.68392,47.05765],[9.68184,47.0621],[9.67743,47.06141],[9.65821,47.05818],[9.64506,47.05978],[9.64158,47.05598],[9.63654,47.0517],[9.62633,47.05133],[9.60705,47.06077],[9.6134,47.0695],[9.61153,47.0794],[9.61869,47.07817],[9.62339,47.08258],[9.63346,47.08344],[9.63564,47.09553],[9.62858,47.10756],[9.62083,47.11032],[9.63503,47.12813],[9.62467,47.13265],[9.62258,47.14135],[9.62587,47.1459],[9.62059,47.15164],[9.6089,47.14775],[9.59679,47.16294],[9.57946,47.17116],[9.56456,47.17029],[9.57302,47.1756],[9.57259,47.19079],[9.58032,47.19578],[9.58477,47.20532],[9.5687,47.21968],[9.55851,47.22416],[9.55176,47.22377],[9.56679,47.24288],[9.53073,47.27058],[9.54619,47.28005],[9.55634,47.29829],[9.58805,47.3173],[9.59966,47.3455],[9.61073,47.35571],[9.62446,47.36615],[9.65876,47.36946],[9.67255,47.38021],[9.67311,47.39194],[9.65162,47.40463],[9.64551,47.4312],[9.64512,47.4378],[9.65799,47.44779],[9.65898,47.4522],[9.62234,47.45747],[9.60904,47.47054],[9.60292,47.46198],[9.59514,47.46331],[9.58217,47.48276],[9.5622,47.49592],[9.55057,47.53718],[9.5827,47.53592],[9.60465,47.52952],[9.73478,47.53396],[9.73517,47.54661],[9.74164,47.55499],[9.7471,47.55569],[9.74337,47.55867],[9.75207,47.56747],[9.74806,47.57052],[9.75632,47.57262],[9.75633,47.57963],[9.76197,47.58096],[9.76553,47.58912],[9.76933,47.58739],[9.77697,47.59544],[9.79151,47.59352],[9.79999,47.59611],[9.81414,47.58807],[9.82381,47.5871],[9.82728,47.57997],[9.82079,47.57076],[9.82562,47.55922],[9.8171,47.55333],[9.81579,47.54767],[9.85023,47.54164],[9.85839,47.53388],[9.87451,47.52854],[9.87804,47.53876],[9.87515,47.54343],[9.88125,47.54814],[9.8891,47.54399],[9.89935,47.54475],[9.90666,47.54217],[9.91358,47.53255],[9.92189,47.52964],[9.93352,47.53265],[9.94108,47.53822],[9.9637,47.53472],[9.95883,47.54313],[9.96318,47.54229],[9.96805,47.54631]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-DOM",name:"VoGIS: DOM (Surface model)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_hoehen_und_gelaende_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=schummerung_50cm_surface&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[9.96805,47.54631],[9.96809,47.54627],[9.97125,47.54425],[9.96484,47.53803],[9.9684,47.52802],[9.96526,47.52089],[9.99569,47.50278],[9.98736,47.49847],[10.00076,47.48211],[10.02301,47.48411],[10.03743,47.48918],[10.04477,47.48762],[10.05413,47.47589],[10.05347,47.46686],[10.06468,47.46364],[10.06999,47.45595],[10.08057,47.45536],[10.08857,47.46029],[10.09164,47.45893],[10.09385,47.44046],[10.10559,47.42872],[10.09374,47.41688],[10.07418,47.41472],[10.06914,47.41018],[10.08624,47.39952],[10.08284,47.39381],[10.09984,47.35476],[10.11934,47.37561],[10.14169,47.36718],[10.16587,47.36887],[10.16958,47.3713],[10.1694,47.38583],[10.1813,47.38725],[10.18185,47.39243],[10.19508,47.38935],[10.19988,47.38334],[10.21259,47.38039],[10.22705,47.38889],[10.23619,47.38192],[10.23168,47.37897],[10.23716,47.37357],[10.21699,47.35436],[10.2171,47.34988],[10.20424,47.33675],[10.20742,47.33232],[10.19951,47.32646],[10.21113,47.31898],[10.21597,47.31106],[10.21236,47.31122],[10.19913,47.29754],[10.18964,47.29394],[10.17961,47.29603],[10.17208,47.27908],[10.17404,47.27025],[10.17834,47.27011],[10.17449,47.2637],[10.21884,47.25533],[10.22343,47.24983],[10.21087,47.2478],[10.19776,47.23666],[10.20791,47.2328],[10.21428,47.21684],[10.21269,47.20432],[10.19963,47.19539],[10.19951,47.18525],[10.21151,47.17124],[10.2092,47.16537],[10.20851,47.15948],[10.21321,47.1577],[10.2222,47.15323],[10.22166,47.14925],[10.21481,47.14352],[10.20333,47.14215],[10.20887,47.13164],[10.18629,47.12886],[10.18652,47.11946],[10.17288,47.12033],[10.16299,47.11361],[10.15766,47.11426],[10.15442,47.10578],[10.13243,47.08122],[10.13459,47.06392],[10.15085,47.06184],[10.15693,47.04883],[10.14418,47.03355],[10.12326,47.02209],[10.13284,47.01204],[10.15447,47.00545],[10.15961,46.99882],[10.15442,46.99299],[10.16001,46.984],[10.14463,46.98301],[10.13492,46.96584],[10.13501,46.95483],[10.12684,46.9435],[10.09772,46.92676],[10.09954,46.91712],[10.10921,46.90834],[10.10908,46.89431],[10.12497,46.88014],[10.14147,46.87468],[10.13967,46.86217],[10.14506,46.8511],[10.13941,46.84738],[10.12309,46.84848],[10.11912,46.84417],[10.10518,46.8409],[10.09195,46.85143],[10.09265,46.85818],[10.08712,46.86128],[10.05488,46.8617],[10.0509,46.86442],[10.05192,46.87405],[10.03891,46.88611],[10.03221,46.88802],[10.01782,46.90161],[10.00494,46.89889],[9.98243,46.9062],[9.97793,46.91603],[9.96657,46.91222],[9.95907,46.91602],[9.94612,46.91235],[9.93758,46.91324],[9.92153,46.91882],[9.91231,46.92606],[9.90632,46.9253],[9.89449,46.93164],[9.87613,46.93463],[9.88071,46.94011],[9.87657,46.94071],[9.87488,46.95039],[9.87872,46.95707],[9.87073,46.96321],[9.88482,46.98546],[9.8923,46.99036],[9.88878,47.00072],[9.8707,47.00965],[9.87115,47.01306],[9.88035,47.01722],[9.87779,47.02055],[9.85974,47.02321],[9.85273,47.01641],[9.83612,47.01253],[9.82353,47.01986],[9.80756,47.02356],[9.78491,47.03849],[9.74808,47.03692],[9.74185,47.04268],[9.71821,47.04337],[9.70701,47.04805],[9.7076,47.05381],[9.69756,47.05239],[9.68392,47.05765],[9.68184,47.0621],[9.67743,47.06141],[9.65821,47.05818],[9.64506,47.05978],[9.64158,47.05598],[9.63654,47.0517],[9.62633,47.05133],[9.60705,47.06077],[9.6134,47.0695],[9.61153,47.0794],[9.61869,47.07817],[9.62339,47.08258],[9.63346,47.08344],[9.63564,47.09553],[9.62858,47.10756],[9.62083,47.11032],[9.63503,47.12813],[9.62467,47.13265],[9.62258,47.14135],[9.62587,47.1459],[9.62059,47.15164],[9.6089,47.14775],[9.59679,47.16294],[9.57946,47.17116],[9.56456,47.17029],[9.57302,47.1756],[9.57259,47.19079],[9.58032,47.19578],[9.58477,47.20532],[9.5687,47.21968],[9.55851,47.22416],[9.55176,47.22377],[9.56679,47.24288],[9.53073,47.27058],[9.54619,47.28005],[9.55634,47.29829],[9.58805,47.3173],[9.59966,47.3455],[9.61073,47.35571],[9.62446,47.36615],[9.65876,47.36946],[9.67255,47.38021],[9.67311,47.39194],[9.65162,47.40463],[9.64551,47.4312],[9.64512,47.4378],[9.65799,47.44779],[9.65898,47.4522],[9.62234,47.45747],[9.60904,47.47054],[9.60292,47.46198],[9.59514,47.46331],[9.58217,47.48276],[9.5622,47.49592],[9.55057,47.53718],[9.5827,47.53592],[9.60465,47.52952],[9.73478,47.53396],[9.73517,47.54661],[9.74164,47.55499],[9.7471,47.55569],[9.74337,47.55867],[9.75207,47.56747],[9.74806,47.57052],[9.75632,47.57262],[9.75633,47.57963],[9.76197,47.58096],[9.76553,47.58912],[9.76933,47.58739],[9.77697,47.59544],[9.79151,47.59352],[9.79999,47.59611],[9.81414,47.58807],[9.82381,47.5871],[9.82728,47.57997],[9.82079,47.57076],[9.82562,47.55922],[9.8171,47.55333],[9.81579,47.54767],[9.85023,47.54164],[9.85839,47.53388],[9.87451,47.52854],[9.87804,47.53876],[9.87515,47.54343],[9.88125,47.54814],[9.8891,47.54399],[9.89935,47.54475],[9.90666,47.54217],[9.91358,47.53255],[9.92189,47.52964],[9.93352,47.53265],[9.94108,47.53822],[9.9637,47.53472],[9.95883,47.54313],[9.96318,47.54229],[9.96805,47.54631]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-ef2012_12cm",name:"VoGIS: Echtfarbenbild 2012 (12cm)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ef2012_12cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[9.54367,47.48479],[9.61451,47.45058],[9.61359,47.38272],[9.44246,47.24798],[9.44614,47.096],[9.42866,47.08911],[9.42498,47.01513],[9.85281,47.00196],[9.85741,46.89896],[9.9669,46.88952],[10.04511,46.8499],[10.15828,46.83353],[10.1592,46.89204],[10.14718,46.89248],[10.15115,46.94331],[10.16317,46.94287],[10.1647,46.96238],[10.17852,46.96681],[10.17576,47.10351],[10.22912,47.10226],[10.22084,47.24361],[10.26133,47.41261],[10.12423,47.40576],[10.09387,47.47795],[10.00462,47.50717],[9.98622,47.56121],[9.84361,47.56245],[9.84085,47.60714],[9.53999,47.60652],[9.54367,47.48479]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-ef2015_10cm",name:"VoGIS: Echtfarbenbild 2015 (10cm)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ef2015_10cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[9.54367,47.48479],[9.61451,47.45058],[9.61359,47.38272],[9.44246,47.24798],[9.44614,47.096],[9.42866,47.08911],[9.42498,47.01513],[9.85281,47.00196],[9.85741,46.89896],[9.9669,46.88952],[10.04511,46.8499],[10.15828,46.83353],[10.1592,46.89204],[10.14718,46.89248],[10.15115,46.94331],[10.16317,46.94287],[10.1647,46.96238],[10.17852,46.96681],[10.17576,47.10351],[10.22912,47.10226],[10.22084,47.24361],[10.26133,47.41261],[10.12423,47.40576],[10.09387,47.47795],[10.00462,47.50717],[9.98622,47.56121],[9.84361,47.56245],[9.84085,47.60714],[9.53999,47.60652],[9.54367,47.48479]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-wi2015_20cm",name:"VoGIS: Echtfarbenbild Winter 2015 (20cm)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=wi2015_20cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[10.17039,46.82979],[10.17108,46.93644],[10.18413,46.94113],[10.1855,47.10157],[10.23906,47.10437],[10.24283,47.15611],[10.25691,47.18704],[10.24558,47.27597],[10.25313,47.32347],[10.26893,47.32626],[10.26446,47.41102],[10.13194,47.4087],[10.13434,47.46107],[10.11752,47.46153],[10.11889,47.47337],[10.08731,47.47429],[10.08491,47.50724],[10.06843,47.507],[10.0674,47.5215],[10.02345,47.52428],[10.00079,47.57943],[9.84904,47.57757],[9.85042,47.61462],[9.72751,47.61277],[9.7203,47.59089],[9.70347,47.58915],[9.70313,47.54491],[9.68219,47.54491],[9.68047,47.55348],[9.56391,47.54931],[9.56202,47.53958],[9.55172,47.53958],[9.55172,47.53402],[9.52168,47.53471],[9.52701,47.30497],[9.50503,47.30264],[9.50091,47.23368],[9.52357,47.23228],[9.52426,47.16557],[9.54486,47.16405],[9.54383,47.15448],[9.57232,47.15401],[9.57026,47.12809],[9.59018,47.12867],[9.59189,47.10029],[9.57232,47.10017],[9.57713,47.02861],[9.72407,47.03048],[9.72304,47.01749],[9.77454,47.01562],[9.77626,47.00555],[9.79274,47.00391],[9.7948,46.99127],[9.83874,46.99314],[9.84012,46.90349],[9.89024,46.90725],[9.88543,46.88707],[9.95925,46.89141],[9.962,46.87675],[10.0001,46.87862],[9.99667,46.85715],[10.01864,46.85656],[10.02345,46.83073],[10.17039,46.82979]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"wroclaw-orto2015",name:"Wrocław: Orthophotomap 2015 (aerial image)",type:"wms",template:"http://gis1.um.wroc.pl/arcgis/services/ogc/OGC_ortofoto_2015/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[17.14217,51.12846],[17.15659,51.1499],[17.15933,51.16056],[17.15899,51.17886],[17.14371,51.18155],[17.13024,51.18128],[17.12466,51.17396],[17.11436,51.17746],[17.0778,51.17746],[17.07642,51.1766],[17.07548,51.16825],[17.06698,51.16745],[17.04698,51.17493],[17.03376,51.17729],[17.02741,51.17729],[17.02733,51.18246],[17.02252,51.18816],[17.01299,51.18816],[17.0093,51.18499],[17.00312,51.18504],[17.00261,51.20016],[16.99162,51.20559],[16.97008,51.20763],[16.96424,51.20989],[16.95394,51.20968],[16.94656,51.20586],[16.9233,51.2001],[16.90811,51.21043],[16.89927,51.21027],[16.89292,51.2071],[16.88322,51.2071],[16.88073,51.20489],[16.88047,51.19666],[16.88322,51.19048],[16.87403,51.18719],[16.87026,51.18203],[16.85455,51.18031],[16.8421,51.18488],[16.82434,51.18467],[16.82056,51.17875],[16.82099,51.16373],[16.82502,51.15647],[16.80915,51.15194],[16.80657,51.14613],[16.80648,51.1366],[16.80769,51.13595],[16.81687,51.13601],[16.8161,51.13337],[16.81636,51.12459],[16.82932,51.12329],[16.83266,51.11834],[16.82923,51.11386],[16.82923,51.10993],[16.83215,51.10869],[16.84949,51.10826],[16.85661,51.09899],[16.87901,51.09252],[16.88862,51.09258],[16.89197,51.09667],[16.92107,51.09662],[16.9209,51.09263],[16.91661,51.0812],[16.91686,51.07942],[16.93514,51.07948],[16.93849,51.0736],[16.95248,51.06686],[16.95068,51.05806],[16.95454,51.05369],[16.96188,51.0473],[16.96879,51.04568],[16.98072,51.04584],[16.98424,51.05197],[16.99969,51.04668],[17.00776,51.04422],[17.01973,51.04169],[17.03286,51.0419],[17.03415,51.04673],[17.04509,51.04339],[17.06363,51.04339],[17.07037,51.05286],[17.08363,51.04428],[17.095,51.04368],[17.10633,51.04376],[17.10835,51.04684],[17.10822,51.05377],[17.10226,51.05868],[17.11136,51.0716],[17.12341,51.07179],[17.12299,51.07856],[17.15088,51.07861],[17.17277,51.09344],[17.17277,51.09956],[17.17697,51.10303],[17.17676,51.1092],[17.16363,51.1203],[17.14217,51.12846]]],terms_text:"Urząd Miasta Wrocław",icon:"https://i.imgur.com/PRqROXB.png"},{id:"Zabrze-2011",name:"Zabrze: Orthophotomap 2011 (aerial image)",type:"wms",template:"http://siot.um.zabrze.pl/arcgis/services/UMZ_Ortofoto_2011/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.74396,50.2753],[18.75586,50.27523],[18.75578,50.27633],[18.74516,50.28105],[18.74609,50.28886],[18.75084,50.28948],[18.74832,50.2957],[18.73379,50.29618],[18.73208,50.31571],[18.73613,50.31646],[18.73882,50.32763],[18.73725,50.33016],[18.73121,50.33169],[18.73054,50.3344],[18.73422,50.3371],[18.73428,50.34097],[18.73866,50.34308],[18.75419,50.34182],[18.75982,50.34624],[18.75438,50.34744],[18.75119,50.34979],[18.74603,50.36876],[18.75705,50.3692],[18.7639,50.36754],[18.77263,50.37628],[18.78436,50.37077],[18.78713,50.37295],[18.79821,50.37048],[18.80466,50.37561],[18.80165,50.37718],[18.80164,50.38222],[18.80509,50.38317],[18.81527,50.38167],[18.81446,50.37515],[18.82183,50.36883],[18.81737,50.36802],[18.82104,50.35843],[18.8159,50.35336],[18.81687,50.35076],[18.82294,50.35156],[18.83281,50.34962],[18.83474,50.3443],[18.84615,50.34448],[18.86293,50.32852],[18.8607,50.32776],[18.85088,50.33191],[18.84578,50.32923],[18.84891,50.32352],[18.83179,50.32028],[18.83192,50.30483],[18.84451,50.30286],[18.84429,50.29627],[18.82282,50.28615],[18.82845,50.28482],[18.82745,50.27972],[18.82322,50.27994],[18.8214,50.27414],[18.81392,50.27309],[18.79981,50.27351],[18.7987,50.2613],[18.7923,50.24641],[18.78261,50.24583],[18.76416,50.25145],[18.75396,50.25669],[18.75004,50.26402],[18.73991,50.26738],[18.73421,50.27084],[18.74396,50.2753]]],terms_text:"Urząd Miasta Zabrza"}];
23660
23661   var presets = {aerialway:{fields:["aerialway"],geometry:["point","vertex","line"],tags:{aerialway:"*"},terms:["ski lift","funifor","funitel"],searchable:false,name:"Aerialway"},aeroway:{icon:"maki-airport",fields:["aeroway"],geometry:["point","vertex","line","area"],tags:{aeroway:"*"},searchable:false,name:"Aeroway"},amenity:{fields:["amenity"],geometry:["point","vertex","area"],tags:{amenity:"*"},searchable:false,name:"Amenity"},circular:{geometry:["vertex","line"],fields:["name"],tags:{junction:"circular"},name:"Traffic Circle",searchable:false},embankment:{geometry:["line"],tags:{embankment:"yes"},name:"Embankment",matchScore:0.2,searchable:false},highway:{fields:["name","highway"],geometry:["point","vertex","line","area"],tags:{highway:"*"},searchable:false,name:"Highway"},place:{fields:["name","place"],geometry:["point","vertex","area"],tags:{place:"*"},searchable:false,name:"Place"},power:{geometry:["point","vertex","line","area"],tags:{power:"*"},fields:["power"],searchable:false,name:"Power"},railway:{fields:["railway"],geometry:["point","vertex","line","area"],tags:{railway:"*"},searchable:false,name:"Railway"},roundabout:{geometry:["vertex","line"],fields:["name"],tags:{junction:"roundabout"},name:"Roundabout",searchable:false},seamark:{icon:"maki-harbor",fields:["seamark/type"],geometry:["point","vertex","line","area"],tags:{"seamark:type":"*"},searchable:false,name:"Seamark"},waterway:{fields:["name","waterway"],geometry:["point","vertex","line","area"],tags:{waterway:"*"},searchable:false,name:"Waterway"},address:{fields:["address"],geometry:["point","vertex","area"],tags:{"addr:*":"*"},addTags:{},removeTags:{},reference:{key:"addr"},name:"Address",matchScore:0.15},"advertising/billboard":{fields:["direction","lit"],geometry:["point","vertex","line"],tags:{advertising:"billboard"},name:"Billboard"},"advertising/column":{icon:"temaki-storage_tank",fields:["lit"],geometry:["point","area"],tags:{advertising:"column"},name:"Advertising Column"},"aerialway/station":{icon:"maki-aerialway",geometry:["point","vertex","area"],fields:["aerialway/access","aerialway/summer/access","elevation","building_area"],tags:{aerialway:"station"},name:"Aerialway Station",searchable:false},"aerialway/cable_car":{geometry:["line"],terms:["tramway","ropeway"],fields:["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/heating"],tags:{aerialway:"cable_car"},name:"Cable Car"},"aerialway/chair_lift":{geometry:["line"],fields:["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],tags:{aerialway:"chair_lift"},name:"Chair Lift"},"aerialway/drag_lift":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration"],tags:{aerialway:"drag_lift"},name:"Drag Lift"},"aerialway/gondola":{geometry:["line"],fields:["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],tags:{aerialway:"gondola"},name:"Gondola"},"aerialway/goods":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration"],tags:{aerialway:"goods"},name:"Goods Aerialway"},"aerialway/magic_carpet":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration","aerialway/heating"],tags:{aerialway:"magic_carpet"},name:"Magic Carpet Lift"},"aerialway/mixed_lift":{geometry:["line"],fields:["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],tags:{aerialway:"mixed_lift"},name:"Mixed Lift"},"aerialway/platter":{geometry:["line"],terms:["button lift","poma lift"],fields:["name","aerialway/capacity","aerialway/duration"],tags:{aerialway:"platter"},name:"Platter Lift"},"aerialway/pylon":{geometry:["point","vertex"],fields:["ref"],tags:{aerialway:"pylon"},name:"Aerialway Pylon"},"aerialway/rope_tow":{geometry:["line"],terms:["handle tow","bugel lift"],fields:["name","aerialway/capacity","aerialway/duration"],tags:{aerialway:"rope_tow"},name:"Rope Tow Lift"},"aerialway/t-bar":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration"],terms:["tbar"],tags:{aerialway:"t-bar"},name:"T-bar Lift"},"aeroway/aerodrome":{icon:"maki-airport",geometry:["point","area"],fields:["name","iata","icao","operator","internet_access","internet_access/fee","internet_access/ssid"],terms:["aerodrome","aeroway","airplane","airport","jet","plane"],tags:{aeroway:"aerodrome"},matchScore:0.9,name:"Airport"},"aeroway/apron":{icon:"maki-airport",geometry:["area"],terms:["ramp"],fields:["ref","surface"],tags:{aeroway:"apron"},name:"Apron"},"aeroway/gate":{icon:"maki-airport",geometry:["point"],fields:["ref_aeroway_gate"],tags:{aeroway:"gate"},name:"Airport Gate"},"aeroway/hangar":{geometry:["area"],fields:["name","building_area"],tags:{aeroway:"hangar"},name:"Hangar"},"aeroway/helipad":{icon:"maki-heliport",geometry:["point","area"],fields:["ref"],terms:["helicopter","helipad","heliport"],tags:{aeroway:"helipad"},name:"Helipad"},"aeroway/runway":{icon:"fas-plane-departure",geometry:["line","area"],terms:["landing strip"],fields:["ref_runway","surface","length","width"],tags:{aeroway:"runway"},name:"Runway"},"aeroway/taxiway":{geometry:["line"],fields:["ref_taxiway","surface"],tags:{aeroway:"taxiway"},name:"Taxiway"},"aeroway/terminal":{icon:"maki-airport",geometry:["point","area"],terms:["airport","aerodrome"],fields:["name","operator","building_area"],tags:{aeroway:"terminal"},name:"Airport Terminal"},"allotments/plot":{geometry:["area"],fields:["name","ref"],tags:{allotments:"plot"},reference:{key:"allotments",value:"plot"},name:"Community Garden Plot"},"amenity/bus_station":{icon:"maki-bus",fields:["name","building_area","operator","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{amenity:"bus_station"},name:"Bus Station / Terminal",searchable:false},"amenity/coworking_space":{icon:"maki-commercial",fields:["name","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{amenity:"coworking_space"},name:"Coworking Space",searchable:false},"amenity/ferry_terminal":{icon:"maki-ferry",fields:["name","network","operator","address","building_area"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"ferry_terminal"},name:"Ferry Station / Terminal",searchable:false},"amenity/nursing_home":{icon:"maki-wheelchair",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],geometry:["point","area"],tags:{amenity:"nursing_home"},reference:{key:"social_facility",value:"nursing_home"},name:"Nursing Home",searchable:false},"amenity/recycling":{icon:"maki-recycling",fields:["recycling_type","recycling_accepts","collection_times"],geometry:["point","area"],terms:["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling"},name:"Recycling",searchable:false},"amenity/register_office":{icon:"maki-town-hall",fields:["name","address","building_area","opening_hours","operator"],geometry:["point","area"],tags:{amenity:"register_office"},reference:{key:"government",value:"register_office"},name:"Register Office",searchable:false},"amenity/scrapyard":{icon:"maki-car",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{amenity:"scrapyard"},reference:{key:"industrial",value:"scrap_yard"},name:"Scrap Yard",searchable:false},"amenity/swimming_pool":{icon:"maki-swimming",geometry:["point","vertex","area"],tags:{amenity:"swimming_pool"},reference:{key:"leisure",value:"swimming_pool"},name:"Swimming Pool",searchable:false},"amenity/animal_boarding":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours","animal_boarding"],geometry:["point","area"],terms:["boarding","cat","cattery","dog","horse","kennel","kitten","pet","pet boarding","pet care","pet hotel","puppy","reptile"],tags:{amenity:"animal_boarding"},name:"Animal Boarding Facility"},"amenity/animal_breeding":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours","animal_breeding"],geometry:["point","area"],terms:["breeding","bull","cat","cow","dog","horse","husbandry","kitten","livestock","pet breeding","puppy","reptile"],tags:{amenity:"animal_breeding"},name:"Animal Breeding Facility"},"amenity/animal_shelter":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours","animal_shelter"],geometry:["point","area"],terms:["adoption","aspca","cat","dog","horse","kitten","pet care","pet rescue","puppy","raptor","reptile","rescue","spca"],tags:{amenity:"animal_shelter"},name:"Animal Shelter"},"amenity/arts_centre":{icon:"maki-theatre",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],terms:[],tags:{amenity:"arts_centre"},name:"Arts Center"},"amenity/atm":{icon:"maki-bank",fields:["operator","network","cash_in","currency_multi","drive_through"],geometry:["point","vertex"],terms:["money","cash","machine"],tags:{amenity:"atm"},name:"ATM"},"amenity/bank":{icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],terms:["credit union","check","deposit","fund","investment","repository","reserve","safe","savings","stock","treasury","trust","vault"],tags:{amenity:"bank"},name:"Bank"},"amenity/bar":{icon:"maki-bar",fields:["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],geometry:["point","area"],terms:["dive","beer","bier","booze"],tags:{amenity:"bar"},name:"Bar"},"amenity/bbq":{icon:"maki-bbq",fields:["covered","fuel","access_simple"],geometry:["point"],terms:["bbq","grill"],tags:{amenity:"bbq"},name:"Barbecue/Grill"},"amenity/bench":{icon:"temaki-bench",fields:["backrest","material","seats","colour"],geometry:["point","vertex","line"],terms:["seat"],tags:{amenity:"bench"},name:"Bench"},"amenity/bicycle_parking":{icon:"maki-bicycle",fields:["bicycle_parking","capacity","operator","covered","access_simple"],geometry:["point","vertex","area"],terms:["bike"],tags:{amenity:"bicycle_parking"},name:"Bicycle Parking"},"amenity/bicycle_rental":{icon:"maki-bicycle",fields:["capacity","network","operator","payment_multi"],geometry:["point","vertex","area"],terms:["bike"],tags:{amenity:"bicycle_rental"},name:"Bicycle Rental"},"amenity/bicycle_repair_station":{icon:"maki-bicycle",fields:["operator","brand","opening_hours","fee","service/bicycle"],geometry:["point","vertex"],terms:["bike","repair","chain","pump"],tags:{amenity:"bicycle_repair_station"},name:"Bicycle Repair Tool Stand"},"amenity/biergarten":{icon:"maki-beer",fields:["name","address","building","opening_hours","smoking","outdoor_seating","brewery"],geometry:["point","area"],tags:{amenity:"biergarten"},terms:["beer","bier","booze"],name:"Biergarten"},"amenity/boat_rental":{fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"boat_rental"},name:"Boat Rental"},"amenity/bureau_de_change":{icon:"maki-bank",fields:["name","currency_multi","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["bureau de change","money changer"],tags:{amenity:"bureau_de_change"},name:"Currency Exchange"},"amenity/cafe":{icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],terms:["bistro","coffee","tea"],tags:{amenity:"cafe"},name:"Cafe"},"amenity/car_pooling":{icon:"maki-car",fields:["name","operator","capacity"],geometry:["point","area"],tags:{amenity:"car_pooling"},name:"Car Pooling"},"amenity/car_rental":{icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental"},name:"Car Rental"},"amenity/car_sharing":{icon:"maki-car",fields:["name","operator","capacity","payment_multi"],geometry:["point","area"],tags:{amenity:"car_sharing"},name:"Car Sharing"},"amenity/car_wash":{icon:"maki-car",fields:["address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"car_wash"},name:"Car Wash"},"amenity/casino":{icon:"maki-casino",fields:["name","operator","address","building_area","opening_hours","payment_multi","smoking"],geometry:["point","area"],terms:["gambling","roulette","craps","poker","blackjack"],tags:{amenity:"casino"},name:"Casino"},"amenity/charging_station":{icon:"fas-charging-station",fields:["operator","capacity"],geometry:["point"],tags:{amenity:"charging_station"},terms:["EV","Electric Vehicle","Supercharger"],name:"Charging Station"},"amenity/childcare":{icon:"maki-school",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["daycare","orphanage","playgroup"],tags:{amenity:"childcare"},name:"Nursery/Childcare"},"amenity/cinema":{icon:"maki-cinema",fields:["name","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["drive-in","film","flick","movie","theater","picture","show","screen"],tags:{amenity:"cinema"},name:"Cinema"},"amenity/clinic":{icon:"maki-doctor",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],terms:["medical","urgentcare"],tags:{amenity:"clinic"},addTags:{amenity:"clinic",healthcare:"clinic"},removeTags:{amenity:"clinic",healthcare:"clinic"},reference:{key:"amenity",value:"clinic"},name:"Clinic"},"amenity/clinic/abortion":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],terms:[],tags:{amenity:"clinic",healthcare:"clinic","healthcare:speciality":"abortion"},reference:{key:"amenity",value:"clinic"},name:"Abortion Clinic"},"amenity/clinic/fertility":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],terms:["egg","fertility","reproductive","sperm","ovulation"],tags:{amenity:"clinic",healthcare:"clinic","healthcare:speciality":"fertility"},reference:{key:"amenity",value:"clinic"},name:"Fertility Clinic"},"amenity/clock":{icon:"temaki-clock",fields:["name","support","display","visibility","date","faces"],geometry:["point","vertex"],tags:{amenity:"clock"},name:"Clock"},"amenity/college":{icon:"maki-college",fields:["name","operator","address","internet_access","internet_access/ssid"],geometry:["point","area"],terms:["university"],tags:{amenity:"college"},name:"College Grounds"},"amenity/community_centre":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:["event","hall"],tags:{amenity:"community_centre"},name:"Community Center"},"amenity/compressed_air":{icon:"maki-car",geometry:["point","area"],tags:{amenity:"compressed_air"},name:"Compressed Air"},"amenity/courthouse":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],geometry:["point","area"],tags:{amenity:"courthouse"},name:"Courthouse"},"amenity/crematorium":{icon:"maki-cemetery",fields:["name","website","phone","opening_hours","wheelchair"],geometry:["area","point"],tags:{amenity:"crematorium"},terms:["cemetery","funeral"],name:"Crematorium"},"amenity/dentist":{icon:"maki-dentist",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],terms:["tooth","teeth"],tags:{amenity:"dentist"},addTags:{amenity:"dentist",healthcare:"dentist"},removeTags:{amenity:"dentist",healthcare:"dentist"},reference:{key:"amenity",value:"dentist"},name:"Dentist"},"amenity/dive_centre":{icon:"maki-swimming",fields:["name","operator","address","building_area","opening_hours","payment_multi","scuba_diving"],geometry:["point","area"],terms:["diving","scuba"],tags:{amenity:"dive_centre"},name:"Dive Center"},"amenity/doctors":{icon:"maki-doctor",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],terms:["medic*","physician"],tags:{amenity:"doctors"},addTags:{amenity:"doctors",healthcare:"doctor"},removeTags:{amenity:"doctors",healthcare:"doctor"},reference:{key:"amenity",value:"doctors"},name:"Doctor"},"amenity/dojo":{icon:"maki-pitch",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],terms:["martial arts","dojang"],tags:{amenity:"dojo"},name:"Dojo / Martial Arts Academy"},"amenity/drinking_water":{icon:"maki-drinking-water",geometry:["point"],tags:{amenity:"drinking_water"},terms:["fountain","potable"],name:"Drinking Water"},"amenity/driving_school":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"driving_school"},name:"Driving School"},"amenity/embassy":{icon:"maki-embassy",fields:["name","country","address","building_area"],geometry:["point","area"],tags:{amenity:"embassy"},name:"Embassy"},"amenity/fast_food":{icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food"},terms:["restaurant","takeaway"],name:"Fast Food"},"amenity/fast_food/burger":{icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],terms:["breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"burger"},reference:{key:"cuisine",value:"burger"},name:"Burger Fast Food"},"amenity/fast_food/chicken":{icon:"fas-drumstick-bite",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],terms:["breakfast","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"chicken"},reference:{key:"cuisine",value:"chicken"},name:"Chicken Fast Food"},"amenity/fast_food/fish_and_chips":{icon:"fas-fish",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],terms:["breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table","french fries"],tags:{amenity:"fast_food",cuisine:"fish_and_chips"},reference:{key:"cuisine",value:"fish_and_chips"},name:"Fish & Chips Fast Food"},"amenity/fast_food/kebab":{icon:"maki-restaurant",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"kebab"},reference:{key:"cuisine",value:"kebab"},name:"Kebab Fast Food"},"amenity/fast_food/pizza":{icon:"maki-restaurant-pizza",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],terms:["dine","dining","dinner","drive-in","eat","lunch","table","deep dish","thin crust","slice"],tags:{amenity:"fast_food",cuisine:"pizza"},reference:{key:"cuisine",value:"pizza"},name:"Pizza Fast Food"},"amenity/fast_food/sandwich":{icon:"maki-restaurant",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],terms:["breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"sandwich"},reference:{key:"cuisine",value:"sandwich"},name:"Sandwich Fast Food"},"amenity/fire_station":{icon:"maki-fire-station",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:[],tags:{amenity:"fire_station"},name:"Fire Station"},"amenity/food_court":{icon:"maki-restaurant",fields:["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],geometry:["point","area"],terms:["fast food","restaurant","food"],tags:{amenity:"food_court"},name:"Food Court"},"amenity/fountain":{icon:"temaki-fountain",fields:["name"],geometry:["point","area"],tags:{amenity:"fountain"},name:"Fountain"},"amenity/fuel":{icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],terms:["petrol","fuel","gasoline","propane","diesel","lng","cng","biodiesel"],tags:{amenity:"fuel"},name:"Gas Station"},"amenity/grave_yard":{icon:"maki-cemetery",fields:["religion","denomination"],geometry:["point","area"],tags:{amenity:"grave_yard"},name:"Graveyard"},"amenity/grit_bin":{fields:["access_simple"],geometry:["point","vertex"],tags:{amenity:"grit_bin"},terms:["salt","sand"],name:"Grit Bin"},"amenity/hospital":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","address","emergency"],geometry:["point","area"],terms:["clinic","doctor","emergency room","health","infirmary","institution","sanatorium","sanitarium","sick","surgery","ward"],tags:{amenity:"hospital"},addTags:{amenity:"hospital",healthcare:"hospital"},removeTags:{amenity:"hospital",healthcare:"hospital"},reference:{key:"amenity",value:"hospital"},name:"Hospital Grounds"},"amenity/hunting_stand":{icon:"temaki-binoculars",fields:["access_simple"],geometry:["point","vertex","area"],terms:["game","gun","lookout","rifle","shoot*","wild","watch"],tags:{amenity:"hunting_stand"},name:"Hunting Stand"},"amenity/ice_cream":{icon:"maki-ice-cream",fields:["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],geometry:["point","area"],terms:["gelato","sorbet","sherbet","frozen","yogurt"],tags:{amenity:"ice_cream"},name:"Ice Cream Shop"},"amenity/internet_cafe":{icon:"temaki-antenna",fields:["name","operator","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],geometry:["point","area"],terms:["cybercafe","taxiphone","teleboutique","coffee","cafe","net","lanhouse"],tags:{amenity:"internet_cafe"},name:"Internet Cafe"},"amenity/kindergarten":{icon:"maki-school",fields:["name","operator","address"],geometry:["point","area"],terms:["kindergarden","pre-school"],tags:{amenity:"kindergarten"},name:"Preschool/Kindergarten Grounds"},"amenity/language_school":{icon:"maki-school",fields:["name","operator","address","building_area","opening_hours","language_multi"],geometry:["point","area"],terms:["esl"],tags:{amenity:"language_school"},name:"Language School"},"amenity/library":{icon:"maki-library",fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],geometry:["point","area"],terms:["book"],tags:{amenity:"library"},name:"Library"},"amenity/love_hotel":{icon:"maki-heart",fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{amenity:"love_hotel"},name:"Love Hotel"},"amenity/marketplace":{icon:"maki-shop",fields:["name","operator","address","building","opening_hours"],geometry:["point","area"],tags:{amenity:"marketplace"},name:"Marketplace"},"amenity/monastery":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area"],geometry:["point","area"],terms:["abbey","basilica","bethel","cathedral","chancel","chantry","chapel","church","fold","house of God","house of prayer","house of worship","minster","mission","monastery","mosque","oratory","parish","sacellum","sanctuary","shrine","synagogue","tabernacle","temple"],tags:{amenity:"monastery"},name:"Monastery Grounds"},"amenity/money_transfer":{icon:"maki-bank",fields:["name","brand","address","building_area","opening_hours","currency_multi"],geometry:["point","area"],terms:["money order","check","bill","currency","finance","wire transfer","cable","person to person","cash to cash","exchange"],tags:{amenity:"money_transfer"},name:"Money Transfer Station"},"amenity/motorcycle_parking":{icon:"fas-motorcycle",fields:["capacity","operator","covered","access_simple"],geometry:["point","vertex","area"],tags:{amenity:"motorcycle_parking"},name:"Motorcycle Parking"},"amenity/music_school":{icon:"maki-school",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["school of music"],tags:{amenity:"music_school"},name:"Music School"},"amenity/nightclub":{icon:"maki-bar",fields:["name","operator","address","building_area","opening_hours","smoking"],geometry:["point","area"],tags:{amenity:"nightclub"},terms:["disco*","night club","dancing","dance club"],name:"Nightclub"},"amenity/parking_entrance":{icon:"maki-entrance-alt1",fields:["access_simple","ref"],geometry:["vertex"],tags:{amenity:"parking_entrance"},name:"Parking Garage Entrance/Exit"},"amenity/parking_space":{fields:["capacity"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"parking_space"},matchScore:0.95,name:"Parking Space"},"amenity/parking":{icon:"maki-car",fields:["name","operator","parking","capacity","fee","access_simple","supervised","park_ride","surface","maxstay"],geometry:["point","vertex","area"],tags:{amenity:"parking"},terms:["automobile parking","car lot","car parking","rv parking","truck parking","vehicle parking"],name:"Parking Lot"},"amenity/parking/multi-storey":{icon:"maki-car",fields:["name","operator","building","levels","height","address","capacity","fee","access_simple"],geometry:["area"],tags:{amenity:"parking",parking:"multi-storey"},addTags:{building:"parking",amenity:"parking",parking:"multi-storey"},removeTags:{building:"parking",amenity:"parking",parking:"multi-storey"},reference:{key:"parking",value:"multi-storey"},terms:["car","indoor parking","multistorey car park","parkade","parking building","parking deck","parking garage","parking ramp","parking structure"],name:"Multilevel Parking Garage"},"amenity/payment_centre":{icon:"maki-bank",fields:["name","brand","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["check","tax pay","bill pay","currency","finance","cash","money"],tags:{amenity:"payment_centre"},name:"Payment Center"},"amenity/payment_terminal":{icon:"maki-bank",fields:["name","brand","address","opening_hours","payment_multi"],geometry:["point"],terms:["interactive kiosk","ekiosk","atm","bill pay","tax pay","phone pay","finance","cash","money transfer","card"],tags:{amenity:"payment_terminal"},name:"Payment Terminal"},"amenity/pharmacy":{icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy"},addTags:{amenity:"pharmacy",healthcare:"pharmacy"},removeTags:{amenity:"pharmacy",healthcare:"pharmacy"},reference:{key:"amenity",value:"pharmacy"},terms:["apothecary","drug*","med*","prescription"],name:"Pharmacy"},"amenity/place_of_worship":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area","service_times"],geometry:["point","area"],terms:["abbey","basilica","bethel","cathedral","chancel","chantry","chapel","church","fold","house of God","house of prayer","house of worship","minster","mission","mosque","oratory","parish","sacellum","sanctuary","shrine","synagogue","tabernacle","temple"],tags:{amenity:"place_of_worship"},name:"Place of Worship"},"amenity/place_of_worship/buddhist":{icon:"maki-religious-buddhist",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["stupa","vihara","monastery","temple","pagoda","zendo","dojo"],tags:{amenity:"place_of_worship",religion:"buddhist"},reference:{key:"amenity",value:"place_of_worship"},name:"Buddhist Temple"},"amenity/place_of_worship/christian":{icon:"maki-religious-christian",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["christian","abbey","basilica","bethel","cathedral","chancel","chantry","chapel","fold","house of God","house of prayer","house of worship","minster","mission","oratory","parish","sacellum","sanctuary","shrine","tabernacle","temple"],tags:{amenity:"place_of_worship",religion:"christian"},reference:{key:"amenity",value:"place_of_worship"},name:"Church"},"amenity/place_of_worship/hindu":{icon:"temaki-hinduism",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["kovil","devasthana","mandir","kshetram","alayam","shrine","temple"],tags:{amenity:"place_of_worship",religion:"hindu"},reference:{key:"amenity",value:"place_of_worship"},name:"Hindu Temple"},"amenity/place_of_worship/jewish":{icon:"maki-religious-jewish",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["jewish"],tags:{amenity:"place_of_worship",religion:"jewish"},reference:{key:"amenity",value:"place_of_worship"},name:"Synagogue"},"amenity/place_of_worship/muslim":{icon:"maki-religious-muslim",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["muslim"],tags:{amenity:"place_of_worship",religion:"muslim"},reference:{key:"amenity",value:"place_of_worship"},name:"Mosque"},"amenity/place_of_worship/shinto":{icon:"temaki-shinto",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["kami","torii"],tags:{amenity:"place_of_worship",religion:"shinto"},reference:{key:"amenity",value:"place_of_worship"},name:"Shinto Shrine"},"amenity/place_of_worship/sikh":{icon:"temaki-sikhism",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["gurudwara","temple"],tags:{amenity:"place_of_worship",religion:"sikh"},reference:{key:"amenity",value:"place_of_worship"},name:"Sikh Temple"},"amenity/place_of_worship/taoist":{icon:"temaki-taoism",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["daoist","monastery","temple"],tags:{amenity:"place_of_worship",religion:"taoist"},reference:{key:"amenity",value:"place_of_worship"},name:"Taoist Temple"},"amenity/planetarium":{icon:"maki-museum",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["museum","astronomy","observatory"],tags:{amenity:"planetarium"},name:"Planetarium"},"amenity/police":{icon:"maki-police",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["badge","constable","constabulary","cop","detective","fed","law","enforcement","officer","patrol"],tags:{amenity:"police"},name:"Police"},"amenity/post_box":{icon:"maki-post",fields:["operator","collection_times","drive_through","ref"],geometry:["point","vertex"],tags:{amenity:"post_box"},terms:["letter","post"],name:"Mailbox"},"amenity/post_office":{icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["letter","mail"],tags:{amenity:"post_office"},name:"Post Office"},"amenity/prison":{icon:"maki-prison",fields:["name","operator","address"],geometry:["point","area"],terms:["cell","jail"],tags:{amenity:"prison"},name:"Prison Grounds"},"amenity/pub":{icon:"maki-beer",fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],geometry:["point","area"],tags:{amenity:"pub"},terms:["alcohol","drink","dive","beer","bier","booze"],name:"Pub"},"amenity/public_bath":{icon:"maki-water",fields:["name","bath/type","bath/open_air","bath/sand_bath","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"public_bath"},terms:["onsen","foot bath","hot springs"],name:"Public Bath"},"amenity/public_bookcase":{icon:"maki-library",fields:["name","operator","capacity","website"],geometry:["point","area"],terms:["library","bookcrossing"],tags:{amenity:"public_bookcase"},name:"Public Bookcase"},"amenity/ranger_station":{icon:"maki-ranger-station",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["visitor center","visitor centre","permit center","permit centre","backcountry office","warden office","warden center"],tags:{amenity:"ranger_station"},name:"Ranger Station"},"amenity/recycling_centre":{icon:"maki-recycling",fields:["name","operator","address","building","opening_hours","recycling_accepts"],geometry:["point","area"],terms:["bottle","can","dump","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling",recycling_type:"centre"},reference:{key:"recycling_type",value:"*"},name:"Recycling Center"},"amenity/recycling_container":{icon:"maki-recycling",fields:["recycling_accepts","collection_times"],geometry:["point","area"],terms:["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling",recycling_type:"container"},reference:{key:"amenity",value:"recycling"},name:"Recycling Container"},"amenity/restaurant":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","coffee","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant"},name:"Restaurant"},"amenity/restaurant/american":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","coffee","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"american"},reference:{key:"cuisine",value:"american"},name:"American Restaurant"},"amenity/restaurant/asian":{icon:"maki-restaurant-noodle",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"asian"},reference:{key:"cuisine",value:"asian"},name:"Asian Restaurant"},"amenity/restaurant/chinese":{icon:"maki-restaurant-noodle",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"chinese"},reference:{key:"cuisine",value:"chinese"},name:"Chinese Restaurant"},"amenity/restaurant/french":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"french"},reference:{key:"cuisine",value:"french"},name:"French Restaurant"},"amenity/restaurant/german":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"german"},reference:{key:"cuisine",value:"german"},name:"German Restaurant"},"amenity/restaurant/greek":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","gyros","pitas","olives"],tags:{amenity:"restaurant",cuisine:"greek"},reference:{key:"cuisine",value:"greek"},name:"Greek Restaurant"},"amenity/restaurant/indian":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","curry"],tags:{amenity:"restaurant",cuisine:"indian"},reference:{key:"cuisine",value:"indian"},name:"Indian Restaurant"},"amenity/restaurant/italian":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","pasta","pizza"],tags:{amenity:"restaurant",cuisine:"italian"},reference:{key:"cuisine",value:"italian"},name:"Italian Restaurant"},"amenity/restaurant/japanese":{icon:"maki-restaurant-noodle",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"japanese"},reference:{key:"cuisine",value:"japanese"},name:"Japanese Restaurant"},"amenity/restaurant/mexican":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","tacos","burritos","enchiladas","fajitas","nachos","tortillas","salsa","tamales","quesadillas"],tags:{amenity:"restaurant",cuisine:"mexican"},reference:{key:"cuisine",value:"mexican"},name:"Mexican Restaurant"},"amenity/restaurant/noodle":{icon:"maki-restaurant-noodle",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","ramen noodles","soup","soba noodles","cellophane noodles","rice noodles"],tags:{amenity:"restaurant",cuisine:"noodle"},reference:{key:"cuisine",value:"noodle"},name:"Noodle Restaurant"},"amenity/restaurant/pizza":{icon:"maki-restaurant-pizza",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","dine","dining","dinner","drive-in","eat","lunch","table","deep dish","thin crust","slice"],tags:{amenity:"restaurant",cuisine:"pizza"},reference:{key:"cuisine",value:"pizza"},name:"Pizza Restaurant"},"amenity/restaurant/seafood":{icon:"maki-restaurant-seafood",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table","fish","shellfish","molluscs","crustaceans","clams","oysters","lobsters","crab","shrimp","squid","octopus"],tags:{amenity:"restaurant",cuisine:"seafood"},reference:{key:"cuisine",value:"seafood"},name:"Seafood Restaurant"},"amenity/restaurant/steakhouse":{icon:"maki-slaughterhouse",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","steak house","chop house","beef"],tags:{amenity:"restaurant",cuisine:"steak_house"},reference:{key:"cuisine",value:"steak_house"},name:"Steakhouse"},"amenity/restaurant/sushi":{icon:"fas-fish",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"sushi"},reference:{key:"cuisine",value:"sushi"},name:"Sushi Restaurant"},"amenity/restaurant/thai":{icon:"maki-restaurant-noodle",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"thai"},reference:{key:"cuisine",value:"thai"},name:"Thai Restaurant"},"amenity/restaurant/turkish":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"turkish"},reference:{key:"cuisine",value:"turkish"},name:"Turkish Restaurant"},"amenity/restaurant/vietnamese":{icon:"maki-restaurant-noodle",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"vietnamese"},reference:{key:"cuisine",value:"vietnamese"},name:"Vietnamese Restaurant"},"amenity/sanitary_dump_station":{icon:"temaki-storage_tank",fields:["operator","access_simple","fee","water_point"],geometry:["point","vertex","area"],terms:["Motor Home","Camper","Sanitary","Dump Station","Elsan","CDP","CTDP","Chemical Toilet"],tags:{amenity:"sanitary_dump_station"},name:"RV Toilet Disposal"},"amenity/school":{icon:"maki-school",fields:["name","operator","address","religion","denomination"],geometry:["point","area"],terms:["academy","elementary school","middle school","high school"],tags:{amenity:"school"},name:"School Grounds"},"amenity/shelter":{icon:"maki-shelter",fields:["name","shelter_type","building_area","bench","bin"],geometry:["point","vertex","area"],terms:["lean-to","gazebo","picnic"],tags:{amenity:"shelter"},name:"Shelter"},"amenity/shelter/gazebo":{icon:"maki-shelter",fields:["name","building_area","bench","lit"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"gazebo"},name:"Gazebo"},"amenity/shelter/lean_to":{icon:"maki-shelter",fields:["name","operator","building_area"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"lean_to"},name:"Lean-To"},"amenity/shelter/picnic_shelter":{icon:"maki-shelter",fields:["name","shelter_type","building_area","lit","bin"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"picnic_shelter"},reference:{key:"shelter_type",value:"picnic_shelter"},terms:["pavilion"],name:"Picnic Shelter"},"amenity/shelter/public_transport":{icon:"maki-shelter",fields:["name","shelter_type","building_area","bench","lit"],geometry:["point","area"],terms:["bus stop","metro stop","waiting"],tags:{amenity:"shelter",shelter_type:"public_transport"},reference:{key:"shelter_type",value:"public_transport"},name:"Transit Shelter"},"amenity/shower":{icon:"temaki-shower",fields:["operator","opening_hours","fee","supervised","building_area","access_simple"],geometry:["point","vertex","area"],terms:["rain closet"],tags:{amenity:"shower"},name:"Shower"},"amenity/smoking_area":{icon:"fas-smoking",fields:["name","shelter","bin","bench","opening_hours"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"smoking_area"},name:"Smoking Area"},"amenity/social_facility":{icon:"temaki-social_facility",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],geometry:["point","area"],terms:[],tags:{amenity:"social_facility"},name:"Social Facility"},"amenity/social_facility/food_bank":{icon:"temaki-social_facility",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours"],geometry:["point","area"],terms:[],tags:{amenity:"social_facility",social_facility:"food_bank"},reference:{key:"social_facility",value:"food_bank"},name:"Food Bank"},"amenity/social_facility/group_home":{icon:"maki-wheelchair",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],geometry:["point","area"],terms:["old","senior","living","care home","assisted living"],tags:{amenity:"social_facility",social_facility:"group_home","social_facility:for":"senior"},reference:{key:"social_facility",value:"group_home"},name:"Elderly Group Home"},"amenity/social_facility/homeless_shelter":{icon:"temaki-social_facility",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],terms:["houseless","unhoused","displaced"],tags:{amenity:"social_facility",social_facility:"shelter","social_facility:for":"homeless"},reference:{key:"social_facility",value:"shelter"},name:"Homeless Shelter"},"amenity/social_facility/nursing_home":{icon:"maki-wheelchair",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],geometry:["point","area"],terms:["elderly","living","nursing","old","senior","assisted living"],tags:{amenity:"social_facility",social_facility:"nursing_home","social_facility:for":"senior"},reference:{key:"social_facility",value:"nursing_home"},name:"Nursing Home"},"amenity/studio":{icon:"maki-karaoke",fields:["name","studio","address","building_area"],geometry:["point","area"],terms:["recording","radio","television"],tags:{amenity:"studio"},name:"Studio"},"amenity/taxi":{icon:"fas-taxi",fields:["name","operator","capacity"],geometry:["point","vertex","area"],terms:["cab"],tags:{amenity:"taxi"},name:"Taxi Stand"},"amenity/telephone":{icon:"maki-telephone",fields:["operator","phone","fee","payment_multi","covered","indoor","booth"],geometry:["point","vertex"],tags:{amenity:"telephone"},terms:["phone"],name:"Telephone"},"amenity/theatre":{icon:"maki-theatre",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:["theatre","performance","play","musical"],tags:{amenity:"theatre"},name:"Theater"},"amenity/theatre/type/amphi":{icon:"maki-theatre",fields:["name","operator","address","lit"],geometry:["point","area"],terms:["open air","outdoor","greek","ampi"],tags:{amenity:"theatre","theatre:type":"amphi"},name:"Amphitheatre"},"amenity/toilets":{icon:"maki-toilet",fields:["toilets/disposal","operator","building_area","access_simple","gender","fee","diaper"],geometry:["point","vertex","area"],terms:["bathroom","restroom","outhouse","privy","head","lavatory","latrine","water closet","WC","W.C."],tags:{amenity:"toilets"},name:"Toilets"},"amenity/townhall":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:["village","city","government","courthouse","municipal"],tags:{amenity:"townhall"},name:"Town Hall"},"amenity/university":{icon:"maki-college",fields:["name","operator","address","internet_access","internet_access/ssid"],geometry:["point","area"],terms:["college"],tags:{amenity:"university"},name:"University Grounds"},"amenity/vehicle_inspection":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["car inspection"],tags:{amenity:"vehicle_inspection"},name:"Vehicle Inspection"},"amenity/vending_machine":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:[],tags:{amenity:"vending_machine"},name:"Vending Machine"},"amenity/vending_machine/news_papers":{icon:"temaki-vending_machine",fields:["vending","operator","fee","payment_multi","currency_multi"],geometry:["point"],terms:["newspaper"],tags:{amenity:"vending_machine",vending:"news_papers"},reference:{key:"vending",value:"newspapers"},name:"Newspaper Vending Machine",searchable:false},"amenity/vending_machine/cigarettes":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["cigarette"],tags:{amenity:"vending_machine",vending:"cigarettes"},reference:{key:"vending",value:"cigarettes"},name:"Cigarette Vending Machine"},"amenity/vending_machine/coffee":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["coffee"],tags:{amenity:"vending_machine",vending:"coffee"},reference:{key:"vending",value:"coffee"},name:"Coffee Vending Machine"},"amenity/vending_machine/condoms":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["condom"],tags:{amenity:"vending_machine",vending:"condoms"},reference:{key:"vending",value:"condoms"},name:"Condom Vending Machine"},"amenity/vending_machine/drinks":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["drink","soda","beverage","juice","pop"],tags:{amenity:"vending_machine",vending:"drinks"},reference:{key:"vending",value:"drinks"},name:"Drink Vending Machine"},"amenity/vending_machine/electronics":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["cable","charger","earbud","headphone","phone","tablet"],tags:{amenity:"vending_machine",vending:"electronics"},reference:{key:"vending",value:"electronics"},name:"Electronics Vending Machine"},"amenity/vending_machine/elongated_coin":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["coin","crush","elongated","flatten","penny","souvenir"],tags:{amenity:"vending_machine",vending:"elongated_coin"},reference:{key:"vending",value:"elongated_coin"},name:"Flat Coin Vending Machine"},"amenity/vending_machine/excrement_bags":{icon:"temaki-vending_machine",fields:["vending","operator","fee","payment_multi","currency_multi"],geometry:["point"],terms:["excrement bags","poop","dog","animal"],tags:{amenity:"vending_machine",vending:"excrement_bags"},reference:{key:"vending",value:"excrement_bags"},name:"Excrement Bag Vending Machine"},"amenity/vending_machine/feminine_hygiene":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["condom","tampon","pad","woman","women","menstrual hygiene products","personal care"],tags:{amenity:"vending_machine",vending:"feminine_hygiene"},reference:{key:"vending",value:"feminine_hygiene"},name:"Feminine Hygiene Vending Machine"},"amenity/vending_machine/food":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["food"],tags:{amenity:"vending_machine",vending:"food"},reference:{key:"vending",value:"food"},name:"Food Vending Machine"},"amenity/vending_machine/fuel":{icon:"maki-fuel",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["petrol","fuel","gasoline","propane","diesel","lng","cng","biodiesel"],tags:{amenity:"vending_machine",vending:"fuel"},reference:{key:"vending",value:"fuel"},name:"Gas Pump"},"amenity/vending_machine/ice_cream":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["chocolate","ice cream","frozen","popsicle","vanilla"],tags:{amenity:"vending_machine",vending:"ice_cream"},reference:{key:"vending",value:"ice_cream"},name:"Ice Cream Vending Machine"},"amenity/vending_machine/newspapers":{icon:"temaki-vending_machine",fields:["vending","operator","fee","payment_multi","currency_multi"],geometry:["point"],terms:["newspaper"],tags:{amenity:"vending_machine",vending:"newspapers"},reference:{key:"vending",value:"newspapers"},name:"Newspaper Vending Machine"},"amenity/vending_machine/parcel_pickup_dropoff":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["mail","parcel","pickup"],tags:{amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},name:"Parcel Pickup/Dropoff Locker"},"amenity/vending_machine/parcel_pickup":{icon:"temaki-vending_machine",fields:["vending","operator"],geometry:["point"],terms:["amazon","locker","mail","parcel","pickup"],tags:{amenity:"vending_machine",vending:"parcel_pickup"},reference:{key:"vending",value:"parcel_pickup"},name:"Parcel Pickup Locker"},"amenity/vending_machine/parking_tickets":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["parking","ticket"],tags:{amenity:"vending_machine",vending:"parking_tickets"},reference:{key:"vending",value:"parking_tickets"},matchScore:0.94,name:"Parking Ticket Vending Machine"},"amenity/vending_machine/public_transport_tickets":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["bus","train","ferry","rail","ticket","transportation"],tags:{amenity:"vending_machine",vending:"public_transport_tickets"},reference:{key:"vending",value:"public_transport_tickets"},name:"Transit Ticket Vending Machine"},"amenity/vending_machine/stamps":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["mail","postage","stamp"],tags:{amenity:"vending_machine",vending:"stamps"},reference:{key:"vending",value:"stamps"},name:"Postage Vending Machine"},"amenity/vending_machine/sweets":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["candy","gum","chip","pretzel","cookie","cracker"],tags:{amenity:"vending_machine",vending:"sweets"},reference:{key:"vending",value:"sweets"},name:"Snack Vending Machine"},"amenity/veterinary":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["pet clinic","veterinarian","animal hospital","pet doctor"],tags:{amenity:"veterinary"},name:"Veterinary"},"amenity/waste_basket":{icon:"maki-waste-basket",fields:["collection_times"],geometry:["point","vertex"],tags:{amenity:"waste_basket"},terms:["bin","garbage","rubbish","litter","trash"],name:"Waste Basket"},"amenity/waste_disposal":{icon:"maki-waste-basket",fields:["collection_times"],geometry:["point","vertex","area"],tags:{amenity:"waste_disposal"},terms:["garbage","rubbish","litter","trash"],name:"Garbage Dumpster"},"amenity/waste_transfer_station":{icon:"maki-waste-basket",fields:["name","operator","address","opening_hours"],geometry:["point","area"],terms:["dump","garbage","recycling","rubbish","scrap","trash"],tags:{amenity:"waste_transfer_station"},name:"Waste Transfer Station"},"amenity/waste/dog_excrement":{icon:"maki-waste-basket",fields:["collection_times"],geometry:["point","vertex","area"],tags:{amenity:"waste_basket",waste:"dog_excrement"},reference:{key:"waste",value:"dog_excrement"},terms:["bin","garbage","rubbish","litter","trash","poo","dog"],name:"Dog Excrement Bin"},"amenity/water_point":{icon:"maki-drinking-water",geometry:["area","vertex","point"],tags:{amenity:"water_point"},name:"RV Drinking Water"},"amenity/watering_place":{icon:"maki-drinking-water",geometry:["area","vertex","point"],tags:{amenity:"watering_place"},name:"Animal Watering Place"},area:{fields:["name"],geometry:["area"],tags:{area:"yes"},name:"Area",matchScore:0.1},"area/highway":{fields:["name","area/highway"],geometry:["area"],tags:{"area:highway":"*"},name:"Road Surface"},"attraction/amusement_ride":{icon:"maki-amusement-park",fields:["name","operator","opening_hours"],geometry:["point","area"],terms:["theme park","carnival ride"],tags:{attraction:"amusement_ride"},name:"Amusement Ride"},"attraction/animal":{icon:"maki-zoo",fields:["name","operator"],geometry:["point","area"],terms:["zoo","theme park","animal park","lion","tiger","bear"],tags:{attraction:"animal"},name:"Animal"},"attraction/big_wheel":{icon:"maki-amusement-park",fields:["name","operator","height","opening_hours"],geometry:["point"],terms:["ferris wheel","theme park","amusement ride"],tags:{attraction:"big_wheel"},name:"Big Wheel"},"attraction/bumper_car":{icon:"maki-car",fields:["name","operator","opening_hours"],geometry:["point","area"],terms:["theme park","dodgem cars","autoscooter"],tags:{attraction:"bumper_car"},name:"Bumper Car"},"attraction/bungee_jumping":{icon:"maki-pitch",fields:["name","operator","height","opening_hours"],geometry:["point","area"],terms:["theme park","bungy jumping","jumping platform"],tags:{attraction:"bungee_jumping"},name:"Bungee Jumping"},"attraction/carousel":{icon:"maki-horse-riding",fields:["name","operator","opening_hours"],geometry:["point","area"],terms:["theme park","roundabout","merry-go-round","galloper","jumper","horseabout","flying horses"],tags:{attraction:"carousel"},name:"Carousel"},"attraction/dark_ride":{icon:"maki-rail-metro",fields:["name","operator","opening_hours"],geometry:["point","line","area"],terms:["theme park","ghost train"],tags:{attraction:"dark_ride"},name:"Dark Ride"},"attraction/drop_tower":{icon:"temaki-tower",fields:["name","operator","height","opening_hours"],geometry:["point","area"],terms:["theme park","amusement ride","gondola","tower","big drop"],tags:{attraction:"drop_tower"},name:"Drop Tower"},"attraction/maze":{icon:"maki-amusement-park",fields:["name","operator"],geometry:["point","area"],terms:["theme park","amusement ride","labyrinth"],tags:{attraction:"maze"},name:"Maze"},"attraction/pirate_ship":{icon:"maki-danger",fields:["name","operator","opening_hours"],geometry:["point"],terms:["theme park","carnival ride","amusement ride"],tags:{attraction:"pirate_ship"},name:"Pirate Ship"},"attraction/river_rafting":{icon:"maki-ferry",fields:["name","operator","opening_hours"],geometry:["point","line"],terms:["theme park","aquatic park","water park","rafting simulator","river rafting ride","river rapids ride"],tags:{attraction:"river_rafting"},name:"River Rafting"},"attraction/roller_coaster":{icon:"maki-amusement-park",fields:["name","operator","opening_hours"],geometry:["point","area"],terms:["theme park","amusement ride"],tags:{attraction:"roller_coaster"},name:"Roller Coaster"},"attraction/summer_toboggan":{fields:["name","operator","opening_hours"],geometry:["line"],terms:["alpine slide","mountain coaster"],tags:{attraction:"summer_toboggan"},name:"Summer Toboggan"},"attraction/train":{icon:"maki-rail",fields:["name","operator","fee","opening_hours"],geometry:["point","line"],terms:["theme park","rackless train","road train","Tschu-Tschu train","dotto train","park train"],tags:{attraction:"train"},name:"Tourist Train"},"attraction/water_slide":{icon:"maki-swimming",fields:["name","operator","opening_hours"],geometry:["line","area"],terms:["theme park","aquatic park","water park","flumes","water chutes","hydroslides"],tags:{attraction:"water_slide"},name:"Water Slide"},barrier:{icon:"maki-roadblock",geometry:["point","vertex","line","area"],tags:{barrier:"*"},fields:["barrier"],name:"Barrier",matchScore:0.4},"barrier/entrance":{icon:"maki-entrance-alt1",geometry:["vertex"],tags:{barrier:"entrance"},name:"Entrance",searchable:false},"barrier/block":{icon:"maki-roadblock",fields:["access"],geometry:["point","vertex"],tags:{barrier:"block"},name:"Block"},"barrier/bollard":{icon:"maki-roadblock",fields:["access"],geometry:["point","vertex","line"],tags:{barrier:"bollard"},name:"Bollard"},"barrier/border_control":{icon:"maki-roadblock",fields:["access","building_area"],geometry:["vertex","area"],tags:{barrier:"border_control"},name:"Border Control"},"barrier/cattle_grid":{icon:"maki-barrier",geometry:["vertex"],tags:{barrier:"cattle_grid"},name:"Cattle Grid"},"barrier/city_wall":{icon:"maki-barrier",fields:["height"],geometry:["line","area"],tags:{barrier:"city_wall"},name:"City Wall"},"barrier/cycle_barrier":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],tags:{barrier:"cycle_barrier"},name:"Cycle Barrier"},"barrier/ditch":{icon:"maki-roadblock",geometry:["line","area"],tags:{barrier:"ditch"},name:"Trench",matchScore:0.25},"barrier/fence":{icon:"maki-fence",fields:["fence_type","height"],geometry:["line"],tags:{barrier:"fence"},name:"Fence",matchScore:0.25},"barrier/fence/railing":{icon:"maki-barrier",geometry:["line"],tags:{barrier:"fence",fence_type:"railing"},fields:["height"],name:"Railing",terms:["railing","handrail","guard rail"],matchScore:0.5},"barrier/gate":{icon:"maki-barrier",fields:["access"],geometry:["vertex","line"],tags:{barrier:"gate"},name:"Gate"},"barrier/guard_rail":{icon:"maki-barrier",geometry:["line"],tags:{barrier:"guard_rail"},name:"Guard Rail",terms:["guardrail","traffic barrier","crash barrier","median barrier","roadside barrier","Armco barrier"],matchScore:0.75},"barrier/hedge":{fields:["height"],geometry:["line","area"],tags:{barrier:"hedge"},name:"Hedge",matchScore:0.25},"barrier/kerb":{fields:["kerb","tactile_paving"],geometry:["vertex","line"],tags:{barrier:"kerb"},name:"Curb"},"barrier/kerb/flush":{icon:"maki-wheelchair",fields:["kerb","tactile_paving"],geometry:["vertex","line"],tags:{barrier:"kerb",kerb:"flush"},reference:{key:"kerb",value:"flush"},terms:["even curb","level curb","tactile curb"],name:"Flush Curb"},"barrier/kerb/lowered":{icon:"maki-wheelchair",fields:["kerb","tactile_paving"],geometry:["vertex","line"],tags:{barrier:"kerb",kerb:"lowered"},reference:{key:"kerb",value:"lowered"},terms:["curb cut","curb ramp","kerb ramp","dropped kerb","pram ramp"],name:"Lowered Curb"},"barrier/kissing_gate":{icon:"maki-barrier",fields:["access"],geometry:["vertex"],tags:{barrier:"kissing_gate"},name:"Kissing Gate"},"barrier/lift_gate":{icon:"maki-roadblock",fields:["access"],geometry:["vertex","line"],tags:{barrier:"lift_gate"},name:"Lift Gate"},"barrier/retaining_wall":{fields:["height"],geometry:["line","area"],tags:{barrier:"retaining_wall"},name:"Retaining Wall"},"barrier/stile":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],tags:{barrier:"stile"},name:"Stile"},"barrier/toll_booth":{icon:"maki-roadblock",fields:["access","building_area"],geometry:["vertex","area"],tags:{barrier:"toll_booth"},name:"Toll Booth"},"barrier/wall":{icon:"maki-barrier",fields:["wall","height"],geometry:["line","area"],tags:{barrier:"wall"},name:"Wall",matchScore:0.25},"boundary/administrative":{name:"Administrative Boundary",geometry:["line"],tags:{boundary:"administrative"},fields:["name","admin_level"]},"bridge/support":{icon:"fas-archway",fields:["bridge/support"],geometry:["point","vertex","area"],tags:{"bridge:support":"*"},name:"Bridge Support"},"bridge/support/pier":{icon:"fas-archway",fields:["bridge/support"],geometry:["point","vertex","area"],tags:{"bridge:support":"pier"},name:"Bridge Pier"},building:{icon:"maki-home",fields:["name","building","levels","height","address"],geometry:["point","area"],tags:{building:"*"},matchScore:0.6,terms:[],name:"Building"},"building/bunker":{fields:["name","address","levels","height"],geometry:["area"],tags:{building:"bunker"},matchScore:0.5,name:"Bunker",searchable:false},"building/entrance":{icon:"maki-entrance-alt1",geometry:["vertex"],tags:{building:"entrance"},name:"Entrance/Exit",searchable:false},"building/train_station":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["point","vertex","area"],tags:{building:"train_station"},matchScore:0.5,name:"Train Station",searchable:false},"building/apartments":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"apartments"},matchScore:0.5,name:"Apartments"},"building/barn":{icon:"maki-farm",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"barn"},matchScore:0.5,name:"Barn"},"building/boathouse":{icon:"maki-harbor",fields:["name","levels","height","address"],geometry:["area"],tags:{building:"boathouse"},matchScore:0.5,terms:[],name:"Boathouse"},"building/bungalow":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"bungalow"},terms:["home","detached"],matchScore:0.5,name:"Bungalow"},"building/cabin":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"cabin"},matchScore:0.5,name:"Cabin"},"building/carport":{icon:"fas-warehouse",fields:["height","capacity"],geometry:["area"],tags:{building:"carport"},matchScore:0.5,terms:["covered parking space","garage","car","porch"],name:"Carport"},"building/cathedral":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"cathedral"},matchScore:0.5,name:"Cathedral Building"},"building/chapel":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"chapel"},matchScore:0.5,name:"Chapel Building"},"building/church":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"church"},matchScore:0.5,name:"Church Building"},"building/civic":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"civic"},matchScore:0.5,name:"Civic Building"},"building/college":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["university"],tags:{building:"college"},matchScore:0.5,name:"College Building"},"building/commercial":{icon:"maki-suitcase",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"commercial"},matchScore:0.5,name:"Commercial Building"},"building/construction":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"construction"},matchScore:0.5,name:"Building Under Construction"},"building/detached":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"detached"},terms:["home","single","family","residence","dwelling"],matchScore:0.5,name:"Detached House"},"building/dormitory":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"dormitory"},matchScore:0.5,name:"Dormitory"},"building/farm_auxiliary":{icon:"maki-farm",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"farm_auxiliary"},matchScore:0.5,name:"Farm Building"},"building/farm":{icon:"maki-farm",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"farm"},matchScore:0.5,name:"Farm House"},"building/garage":{icon:"fas-warehouse",fields:["name","capacity"],geometry:["area"],tags:{building:"garage"},matchScore:0.5,name:"Garage"},"building/garages":{icon:"fas-warehouse",fields:["name","capacity"],geometry:["area"],tags:{building:"garages"},matchScore:0.5,name:"Garages"},"building/grandstand":{icon:"maki-building",fields:["name","height"],geometry:["area"],tags:{building:"grandstand"},terms:["tribune","stand","stands","bleachers"],matchScore:0.5,name:"Grandstand"},"building/greenhouse":{icon:"maki-garden-center",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"greenhouse"},matchScore:0.5,name:"Greenhouse"},"building/hospital":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"hospital"},matchScore:0.5,name:"Hospital Building"},"building/hotel":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"hotel"},matchScore:0.5,name:"Hotel Building"},"building/house":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"house"},terms:["home","family","residence","dwelling"],matchScore:0.5,name:"House"},"building/hut":{icon:"maki-home",geometry:["area"],fields:["name"],tags:{building:"hut"},matchScore:0.5,name:"Hut"},"building/industrial":{icon:"maki-industry",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"industrial"},matchScore:0.5,name:"Industrial Building"},"building/kindergarten":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["kindergarden","pre-school"],tags:{building:"kindergarten"},matchScore:0.5,name:"Preschool/Kindergarten Building"},"building/mosque":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"mosque"},matchScore:0.5,name:"Mosque Building"},"building/pavilion":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],terms:["sports"],tags:{building:"pavilion"},matchScore:0.5,name:"Pavilion Building"},"building/public":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"public"},matchScore:0.5,name:"Public Building"},"building/residential":{icon:"maki-residential-community",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"residential"},matchScore:0.5,name:"Residential Building"},"building/retail":{icon:"maki-commercial",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"retail"},matchScore:0.5,name:"Retail Building"},"building/roof":{icon:"maki-shelter",fields:["name","address","layer"],geometry:["area"],tags:{building:"roof"},matchScore:0.5,name:"Roof"},"building/ruins":{icon:"temaki-ruins",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"ruins"},matchScore:0.5,name:"Building Ruins"},"building/school":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["academy","elementary school","middle school","high school"],tags:{building:"school"},matchScore:0.5,name:"School Building"},"building/semidetached_house":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"semidetached_house"},terms:["home","double","duplex","twin","family","residence","dwelling"],matchScore:0.5,name:"Semi-Detached House"},"building/service":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"service"},matchScore:0.5,name:"Service Building"},"building/shed":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"shed"},matchScore:0.5,name:"Shed"},"building/stable":{icon:"maki-horse-riding",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"stable"},matchScore:0.5,name:"Stable"},"building/stadium":{icon:"maki-stadium",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"stadium"},matchScore:0.5,name:"Stadium Building"},"building/static_caravan":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"static_caravan"},matchScore:0.5,name:"Static Mobile Home"},"building/temple":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"temple"},matchScore:0.5,name:"Temple Building"},"building/terrace":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"terrace"},terms:["home","terrace","brownstone","family","residence","dwelling"],matchScore:0.5,name:"Row Houses"},"building/transportation":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"transportation"},matchScore:0.5,name:"Transportation Building"},"building/university":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["college"],tags:{building:"university"},matchScore:0.5,name:"University Building"},"building/warehouse":{icon:"maki-warehouse",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"warehouse"},matchScore:0.5,name:"Warehouse"},"camp_site/camp_pitch":{icon:"maki-campsite",fields:["name","ref"],geometry:["point","area"],terms:["tent","rv"],tags:{camp_site:"camp_pitch"},name:"Camp Pitch"},club:{icon:"maki-heart",fields:["name","club","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{club:"*"},terms:["social"],name:"Club"},craft:{icon:"temaki-tools",fields:["name","craft","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"*"},terms:[],name:"Craft"},"craft/jeweler":{icon:"maki-marker-stroked",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"jeweler"},reference:{key:"shop",value:"jewelry"},name:"Jeweler",searchable:false},"craft/locksmith":{icon:"maki-marker-stroked",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"locksmith"},reference:{key:"shop",value:"locksmith"},name:"Locksmith",searchable:false},"craft/optician":{icon:"maki-marker-stroked",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"optician"},reference:{key:"shop",value:"optician"},name:"Optician",searchable:false},"craft/tailor":{icon:"maki-clothing-store",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["clothes","suit"],tags:{craft:"tailor"},reference:{key:"shop",value:"tailor"},name:"Tailor",searchable:false},"craft/basket_maker":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"basket_maker"},name:"Basket Maker"},"craft/beekeeper":{icon:"maki-farm",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"beekeeper"},name:"Beekeeper"},"craft/blacksmith":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"blacksmith"},name:"Blacksmith"},"craft/boatbuilder":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"boatbuilder"},matchScore:0.4,name:"Boat Builder"},"craft/bookbinder":{icon:"maki-library",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["book repair"],tags:{craft:"bookbinder"},name:"Bookbinder"},"craft/brewery":{icon:"temaki-storage_tank",fields:["name","operator","address","building_area","opening_hours","product"],geometry:["point","area"],terms:["alcohol","beer","beverage","bier","booze","cider"],tags:{craft:"brewery"},name:"Brewery"},"craft/carpenter":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["woodworker"],tags:{craft:"carpenter"},name:"Carpenter"},"craft/carpet_layer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"carpet_layer"},name:"Carpet Layer"},"craft/caterer":{icon:"maki-restaurant",fields:["name","cuisine","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"caterer"},name:"Caterer"},"craft/chimney_sweeper":{icon:"temaki-chimney",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"chimney_sweeper"},name:"Chimney Sweeper"},"craft/clockmaker":{icon:"temaki-clock",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"clockmaker"},name:"Clockmaker"},"craft/confectionery":{icon:"maki-confectionary",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["sweet","candy"],tags:{craft:"confectionery"},name:"Candy Maker"},"craft/distillery":{icon:"temaki-storage_tank",fields:["name","operator","address","building_area","opening_hours","product"],geometry:["point","area"],terms:["alcohol","beverage","bourbon","booze","brandy","gin","hooch","liquor","mezcal","moonshine","rum","scotch","spirits","still","tequila","vodka","whiskey","whisky"],tags:{craft:"distillery"},name:"Distillery"},"craft/dressmaker":{icon:"maki-clothing-store",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["seamstress"],tags:{craft:"dressmaker"},name:"Dressmaker"},"craft/electrician":{icon:"temaki-power",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["power","wire"],tags:{craft:"electrician"},name:"Electrician"},"craft/electronics_repair":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"electronics_repair"},name:"Electronics Repair Shop"},"craft/gardener":{icon:"maki-garden-center",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["landscaper","grounds keeper"],tags:{craft:"gardener"},name:"Gardener"},"craft/glaziery":{icon:"temaki-window",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["glass","stained-glass","window"],tags:{craft:"glaziery"},name:"Glaziery"},"craft/handicraft":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"handicraft"},name:"Handicraft"},"craft/hvac":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["heat*","vent*","air conditioning"],tags:{craft:"hvac"},name:"HVAC"},"craft/insulator":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"insulation"},name:"Insulator"},"craft/key_cutter":{icon:"fas-key",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"key_cutter"},name:"Key Cutter"},"craft/metal_construction":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"metal_construction"},name:"Metal Construction"},"craft/painter":{icon:"fas-paint-roller",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"painter"},name:"Painter"},"craft/photographer":{icon:"maki-attraction",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"photographer"},name:"Photographer"},"craft/photographic_laboratory":{icon:"maki-attraction",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["film"],tags:{craft:"photographic_laboratory"},name:"Photographic Laboratory"},"craft/plasterer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"plasterer"},name:"Plasterer"},"craft/plumber":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["pipe"],tags:{craft:"plumber"},name:"Plumber"},"craft/pottery":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["ceramic"],tags:{craft:"pottery"},name:"Pottery"},"craft/rigger":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"rigger"},name:"Rigger"},"craft/roofer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"roofer"},name:"Roofer"},"craft/saddler":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"saddler"},name:"Saddler"},"craft/sailmaker":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"sailmaker"},name:"Sailmaker"},"craft/sawmill":{icon:"maki-logging",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["lumber"],tags:{craft:"sawmill"},name:"Sawmill"},"craft/scaffolder":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"scaffolder"},name:"Scaffolder"},"craft/sculptor":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"sculptor"},name:"Sculptor"},"craft/shoemaker":{icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["cobbler"],tags:{craft:"shoemaker"},name:"Shoemaker"},"craft/stonemason":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["masonry"],tags:{craft:"stonemason"},name:"Stonemason"},"craft/tiler":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"tiler"},name:"Tiler"},"craft/tinsmith":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"tinsmith"},name:"Tinsmith"},"craft/upholsterer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"upholsterer"},name:"Upholsterer"},"craft/watchmaker":{icon:"maki-watch",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"watchmaker"},name:"Watchmaker"},"craft/window_construction":{icon:"temaki-window",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["glass"],tags:{craft:"window_construction"},name:"Window Construction"},"craft/winery":{icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"winery"},name:"Winery"},"emergency/designated":{fields:[],geometry:["line"],tags:{emergency:"designated"},terms:[],name:"Emergency Access Designated",searchable:false,matchScore:0.01},"emergency/destination":{fields:[],geometry:["line"],tags:{emergency:"destination"},terms:[],name:"Emergency Access Destination",searchable:false,matchScore:0.01},"emergency/no":{fields:[],geometry:["line"],tags:{emergency:"no"},terms:[],name:"Emergency Access No",searchable:false,matchScore:0.01},"emergency/official":{fields:[],geometry:["line"],tags:{emergency:"official"},terms:[],name:"Emergency Access Official",searchable:false,matchScore:0.01},"emergency/private":{fields:[],geometry:["line"],tags:{emergency:"private"},terms:[],name:"Emergency Access Private",searchable:false,matchScore:0.01},"emergency/yes":{fields:[],geometry:["line"],tags:{emergency:"yes"},terms:[],name:"Emergency Access Yes",searchable:false,matchScore:0.01},"emergency/ambulance_station":{icon:"fas-ambulance",fields:["name","operator","building_area","address"],geometry:["point","area"],terms:["EMS","EMT","rescue"],tags:{emergency:"ambulance_station"},name:"Ambulance Station"},"emergency/defibrillator":{icon:"maki-defibrillator",fields:["indoor","ref","operator"],geometry:["point","vertex"],terms:["AED"],tags:{emergency:"defibrillator"},name:"Defibrillator"},"emergency/fire_alarm":{icon:"fas-bell",fields:["indoor","ref","operator"],geometry:["point","vertex"],tags:{emergency:"fire_alarm_box"},name:"Fire Alarm Call Box"},"emergency/fire_extinguisher":{icon:"fas-fire-extinguisher",fields:["indoor","ref","operator"],geometry:["point","vertex"],tags:{emergency:"fire_extinguisher"},name:"Fire Extinguisher"},"emergency/fire_hydrant":{icon:"temaki-fire_hydrant",fields:["fire_hydrant/type","fire_hydrant/position","ref","operator"],geometry:["point","vertex"],terms:["fire plug"],tags:{emergency:"fire_hydrant"},name:"Fire Hydrant"},"emergency/first_aid_kit":{icon:"fas-medkit",fields:["indoor","ref","operator"],geometry:["point","vertex"],terms:["bandage","first aid","med","med kit","medic*","medkit"],tags:{emergency:"first_aid_kit"},name:"First Aid Kit"},"emergency/life_ring":{icon:"fas-life-ring",fields:["ref","operator"],geometry:["point","vertex"],terms:["life buoy","kisby ring","kisbie ring","perry buoy"],tags:{emergency:"life_ring"},name:"Life Ring"},"emergency/lifeguard":{icon:"fas-life-ring",fields:["ref","operator","building_area","opening_hours"],geometry:["point","area"],terms:["CPR","rescue"],tags:{emergency:"lifeguard"},name:"Lifeguard"},"emergency/phone":{icon:"maki-emergency-phone",fields:["ref","operator","covered","indoor","booth"],geometry:["point","vertex"],tags:{emergency:"phone"},name:"Emergency Phone"},"emergency/siren":{icon:"fas-volume-up",fields:["siren/purpose","siren/type","ref","operator"],geometry:["point","vertex"],terms:["air raid","loud","noise","storm","tornado","warning"],tags:{emergency:"siren"},name:"Siren"},"emergency/water_tank":{icon:"maki-water",fields:["name","ref","operator"],geometry:["point","vertex"],terms:["water tank","cistern","reservoir"],tags:{emergency:"water_tank"},name:"Emergency Water Tank"},entrance:{icon:"maki-entrance-alt1",geometry:["vertex"],terms:["entrance","exit","door"],tags:{entrance:"*"},fields:["entrance","access_simple","address"],name:"Entrance/Exit"},ford:{geometry:["vertex"],tags:{ford:"yes"},name:"Ford"},"golf/bunker":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"bunker",natural:"sand"},terms:["hazard","bunker"],reference:{key:"golf",value:"bunker"},name:"Sand Trap"},"golf/fairway":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"fairway",landuse:"grass"},reference:{key:"golf",value:"fairway"},name:"Fairway"},"golf/green":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"green",landuse:"grass",leisure:"pitch",sport:"golf"},reference:{key:"golf",value:"green"},name:"Putting Green"},"golf/hole":{icon:"maki-golf",fields:["name","ref_golf_hole","par","handicap"],geometry:["line"],tags:{golf:"hole"},name:"Golf Hole"},"golf/lateral_water_hazard_area":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"lateral_water_hazard",natural:"water"},reference:{key:"golf",value:"lateral_water_hazard"},name:"Lateral Water Hazard"},"golf/lateral_water_hazard_line":{icon:"maki-golf",fields:["name"],geometry:["line"],tags:{golf:"lateral_water_hazard"},name:"Lateral Water Hazard"},"golf/rough":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"rough",landuse:"grass"},reference:{key:"golf",value:"rough"},name:"Rough"},"golf/tee":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"tee",landuse:"grass"},terms:["teeing ground"],reference:{key:"golf",value:"tee"},name:"Tee Box"},"golf/water_hazard_area":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"water_hazard",natural:"water"},reference:{key:"golf",value:"water_hazard"},name:"Water Hazard"},"golf/water_hazard_line":{icon:"maki-golf",fields:["name"],geometry:["line"],tags:{golf:"water_hazard"},name:"Water Hazard"},healthcare:{icon:"maki-hospital",fields:["name","healthcare","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],tags:{healthcare:"*"},terms:["clinic","doctor","disease","health","institution","sick","surgery","wellness"],name:"Healthcare Facility"},"healthcare/alternative":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["acupuncture","anthroposophical","applied kinesiology","aromatherapy","ayurveda","herbalism","homeopathy","hydrotherapy","hypnosis","naturopathy","osteopathy","reflexology","reiki","shiatsu","traditional","tuina","unani"],tags:{healthcare:"alternative"},name:"Alternative Medicine"},"healthcare/alternative/chiropractic":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["back","pain","spine"],tags:{healthcare:"alternative","healthcare:speciality":"chiropractic"},name:"Chiropractor"},"healthcare/audiologist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["ear","hearing","sound"],tags:{healthcare:"audiologist"},name:"Audiologist"},"healthcare/birthing_center":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["baby","childbirth","delivery","labour","labor","pregnancy"],tags:{healthcare:"birthing_center"},name:"Birthing Center"},"healthcare/blood_donation":{icon:"maki-blood-bank",fields:["name","operator","healthcare/speciality","blood_components","address","building_area","opening_hours"],geometry:["point","area"],terms:["blood bank","blood donation","blood transfusion","apheresis","plasmapheresis","plateletpheresis","stem cell donation"],tags:{healthcare:"blood_donation"},name:"Blood Donor Center"},"healthcare/hospice":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["terminal","illness"],tags:{healthcare:"hospice"},name:"Hospice"},"healthcare/laboratory":{icon:"maki-hospital",fields:["name","operator","website","ref","address","opening_hours"],geometry:["point","area"],terms:["medical_laboratory","medical_lab","blood_check"],tags:{healthcare:"laboratory"},name:"Medical Laboratory"},"healthcare/midwife":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["baby","childbirth","delivery","labour","labor","pregnancy"],tags:{healthcare:"midwife"},name:"Midwife"},"healthcare/occupational_therapist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["therapist","therapy"],tags:{healthcare:"occupational_therapist"},name:"Occupational Therapist"},"healthcare/optometrist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["eye","glasses","lasik","lenses","vision"],tags:{healthcare:"optometrist"},name:"Optometrist"},"healthcare/physiotherapist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["physical","therapist","therapy"],tags:{healthcare:"physiotherapist"},name:"Physiotherapist"},"healthcare/podiatrist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["foot","feet","nails"],tags:{healthcare:"podiatrist"},name:"Podiatrist"},"healthcare/psychotherapist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["anxiety","counselor","depression","mental health","mind","suicide","therapist","therapy"],tags:{healthcare:"psychotherapist"},name:"Psychotherapist"},"healthcare/rehabilitation":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["rehab","therapist","therapy"],tags:{healthcare:"rehabilitation"},name:"Rehabilitation Facility"},"healthcare/speech_therapist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["speech","therapist","therapy","voice"],tags:{healthcare:"speech_therapist"},name:"Speech Therapist"},"highway/bus_stop":{icon:"maki-bus",fields:["name","network","operator","bench","shelter"],geometry:["point","vertex"],tags:{highway:"bus_stop"},name:"Bus Stop / Platform",searchable:false},"highway/bridleway":{fields:["name","surface","width","structure","access"],icon:"iD-highway-bridleway",geometry:["line"],tags:{highway:"bridleway"},terms:["bridleway","equestrian","horse","trail"],name:"Bridle Path"},"highway/bus_guideway":{icon:"iD-highway-bus-guideway",fields:["name","operator","oneway"],geometry:["line"],tags:{highway:"bus_guideway"},addTags:{highway:"bus_guideway",access:"no",bus:"designated"},removeTags:{highway:"bus_guideway",access:"no",bus:"designated"},terms:[],name:"Bus Guideway"},"highway/corridor":{icon:"iD-highway-footway",fields:["name","width","level","access_simple"],geometry:["line"],tags:{highway:"corridor"},terms:["gallery","hall","hallway","indoor","passage","passageway"],name:"Indoor Corridor"},"highway/crossing/zebra-raised":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"zebra",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)",searchable:false},"highway/crossing/zebra":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"zebra"},reference:{key:"highway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk",searchable:false},"highway/crossing/marked-raised":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"marked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)"},"highway/crossing/marked":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"marked"},reference:{key:"highway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk"},"highway/crossing/unmarked-raised":{fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],addTags:{highway:"crossing",crossing:"unmarked",traffic_calming:"table"},removeTags:{highway:"crossing",crossing:"unmarked",traffic_calming:"table"},tags:{highway:"crossing",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Unmarked Crossing (Raised)"},"highway/crossing/unmarked":{fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],addTags:{highway:"crossing",crossing:"unmarked"},removeTags:{highway:"crossing",crossing:"unmarked"},tags:{highway:"crossing"},reference:{key:"highway",value:"crossing"},terms:[],name:"Unmarked Crossing"},"highway/cycleway":{icon:"iD-highway-cycleway",fields:["name","oneway","surface","lit","width","structure","access"],geometry:["line"],tags:{highway:"cycleway"},terms:["bike"],name:"Cycle Path"},"highway/elevator":{icon:"temaki-elevator",fields:["access_simple","opening_hours","maxweight","ref"],geometry:["vertex"],tags:{highway:"elevator"},terms:["lift"],name:"Elevator"},"highway/footway":{icon:"iD-highway-footway",fields:["name","surface","lit","width","structure","access"],geometry:["line"],terms:["hike","hiking","trackway","trail","walk"],tags:{highway:"footway"},name:"Foot Path"},"highway/footway/zebra-raised":{icon:"iD-highway-footway",fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"zebra",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)",searchable:false},"highway/footway/zebra":{icon:"iD-highway-footway",fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"zebra"},reference:{key:"footway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk",searchable:false},"highway/footway/conveying":{icon:"iD-highway-footway",fields:["name","conveying","access_simple","lit","width"],geometry:["line"],terms:["moving sidewalk","autwalk","skywalk","travolator","travelator","travellator","conveyor"],tags:{highway:"footway",conveying:"*"},name:"Moving Walkway"},"highway/footway/marked-raised":{icon:"iD-highway-footway",fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"marked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)"},"highway/footway/marked":{icon:"iD-highway-footway",fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"marked"},reference:{key:"footway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk"},"highway/footway/sidewalk":{icon:"iD-highway-footway",fields:["surface","lit","width","structure","access"],geometry:["line"],tags:{highway:"footway",footway:"sidewalk"},reference:{key:"footway",value:"sidewalk"},terms:["pavement","sidepath"],name:"Sidewalk"},"highway/footway/unmarked-raised":{fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],addTags:{highway:"footway",footway:"crossing",crossing:"unmarked",traffic_calming:"table"},removeTags:{highway:"footway",footway:"crossing",crossing:"unmarked",traffic_calming:"table"},tags:{highway:"footway",footway:"crossing",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Unmarked Crossing (Raised)"},"highway/footway/unmarked":{fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],addTags:{highway:"footway",footway:"crossing",crossing:"unmarked"},removeTags:{highway:"footway",footway:"crossing",crossing:"unmarked"},tags:{highway:"footway",footway:"crossing"},reference:{key:"footway",value:"crossing"},terms:[],name:"Unmarked Crossing"},"highway/give_way":{icon:"temaki-yield",fields:["direction_vertex"],geometry:["vertex"],tags:{highway:"give_way"},terms:["give way","yield","sign"],name:"Yield Sign"},"highway/living_street":{icon:"iD-highway-living-street",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","access","cycleway"],geometry:["line"],tags:{highway:"living_street"},name:"Living Street"},"highway/milestone":{icon:"temaki-milestone",geometry:["point","vertex"],fields:["distance","direction_vertex"],tags:{highway:"milestone"},terms:["milestone","marker"],name:"Highway Milestone"},"highway/mini_roundabout":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"mini_roundabout"},fields:["direction_clock"],name:"Mini-Roundabout"},"highway/motorway_junction":{icon:"temaki-junction",fields:["ref_highway_junction","name"],geometry:["vertex"],tags:{highway:"motorway_junction"},terms:["exit"],name:"Motorway Junction / Exit"},"highway/motorway_link":{icon:"iD-highway-motorway-link",fields:["name","ref_road_number","oneway","maxspeed","maxspeed/advisory","lanes","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"motorway_link"},addTags:{highway:"motorway_link",oneway:"yes"},removeTags:{highway:"motorway_link",oneway:"yes"},terms:["exit","ramp","road","street","on ramp","off ramp"],name:"Motorway Link"},"highway/motorway":{icon:"iD-highway-motorway",fields:["name","ref_road_number","oneway_yes","maxspeed","lanes","surface","structure","maxheight","toll","access"],geometry:["line"],tags:{highway:"motorway"},terms:["autobahn","expressway","freeway","highway","interstate","parkway","road","street","thruway","turnpike"],name:"Motorway"},"highway/passing_place":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"passing_place"},terms:["turnout, pullout"],name:"Passing Place"},"highway/path":{icon:"iD-highway-path",fields:["name","surface","width","structure","access","incline","sac_scale","trail_visibility","mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale","ref"],geometry:["line"],terms:["hike","hiking","trackway","trail","walk"],tags:{highway:"path"},name:"Path"},"highway/pedestrian_area":{icon:"temaki-pedestrian",fields:["name","surface","lit","width","structure","access"],geometry:["area"],tags:{highway:"pedestrian",area:"yes"},terms:["center","centre","plaza","quad","square","walkway"],name:"Pedestrian Area"},"highway/pedestrian_line":{icon:"iD-highway-footway",fields:["name","surface","lit","width","oneway","structure","access"],geometry:["line"],tags:{highway:"pedestrian"},terms:["center","centre","plaza","quad","square","walkway"],name:"Pedestrian Street"},"highway/primary_link":{icon:"iD-highway-primary-link",fields:["name","oneway","maxspeed","maxspeed/advisory","lanes","surface","maxheight","ref_road_number","cycleway","structure","access"],geometry:["line"],tags:{highway:"primary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Primary Link"},"highway/primary":{icon:"iD-highway-primary",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"primary"},terms:["road","street"],name:"Primary Road"},"highway/raceway":{icon:"iD-highway-unclassified",fields:["name","oneway","surface","sport_racing_motor","lit","width","lanes","structure"],geometry:["point","line","area"],tags:{highway:"raceway"},addTags:{highway:"raceway",sport:"motor"},terms:["auto*","formula one","kart","motocross","nascar","race*","track"],name:"Racetrack (Motorsport)"},"highway/residential":{icon:"iD-highway-residential",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],geometry:["line"],tags:{highway:"residential"},terms:["road","street"],name:"Residential Road"},"highway/rest_area":{icon:"maki-car",fields:["name"],geometry:["point","vertex","area"],tags:{highway:"rest_area"},terms:["rest stop"],name:"Rest Area"},"highway/road":{icon:"iD-highway-road",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"road"},terms:["road","street"],name:"Unknown Road"},"highway/secondary_link":{icon:"iD-highway-secondary-link",fields:["name","oneway","maxspeed","maxspeed/advisory","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"secondary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Secondary Link"},"highway/secondary":{icon:"iD-highway-secondary",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"secondary"},terms:["road","street"],name:"Secondary Road"},"highway/service":{icon:"iD-highway-service",fields:["name","service","oneway","maxspeed","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"service"},terms:["road","street"],name:"Service Road"},"highway/service/alley":{icon:"iD-highway-service",fields:["name","oneway","maxspeed","structure","access","surface","maxheight"],geometry:["line"],tags:{highway:"service",service:"alley"},reference:{key:"service",value:"alley"},name:"Alley"},"highway/service/drive-through":{icon:"iD-highway-service",fields:["name","oneway","covered","maxheight","maxspeed","structure","access","surface"],geometry:["line"],tags:{highway:"service",service:"drive-through"},reference:{key:"service",value:"drive-through"},name:"Drive-Through"},"highway/service/driveway":{icon:"iD-highway-service",fields:["name","oneway","maxspeed","structure","access","surface","maxheight"],geometry:["line"],tags:{highway:"service",service:"driveway"},reference:{key:"service",value:"driveway"},name:"Driveway"},"highway/service/emergency_access":{icon:"iD-highway-service",fields:["name","oneway","maxspeed","structure","access","surface","maxheight"],geometry:["line"],tags:{highway:"service",service:"emergency_access"},reference:{key:"service",value:"emergency_access"},name:"Emergency Access"},"highway/service/parking_aisle":{icon:"iD-highway-service",fields:["name","oneway","maxspeed","structure","access","surface","maxheight"],geometry:["line"],tags:{highway:"service",service:"parking_aisle"},reference:{key:"service",value:"parking_aisle"},name:"Parking Aisle"},"highway/services":{icon:"maki-car",fields:["name"],geometry:["point","vertex","area"],tags:{highway:"services"},terms:["services","travel plaza","service station"],name:"Service Area"},"highway/speed_camera":{icon:"maki-attraction",geometry:["point","vertex"],fields:["direction","ref","maxspeed"],tags:{highway:"speed_camera"},terms:[],name:"Speed Camera"},"highway/steps":{icon:"iD-highway-steps",fields:["surface","lit","width","incline_steps","handrail","step_count"],geometry:["line"],tags:{highway:"steps"},terms:["stairs","staircase"],name:"Steps"},"highway/steps/conveying":{icon:"maki-entrance",fields:["name","incline_steps","conveying","access_simple","lit","width","handrail","step_count"],geometry:["line"],terms:["moving staircase","moving stairway","people mover"],tags:{highway:"steps",conveying:"*"},name:"Escalator"},"highway/stop":{icon:"temaki-stop",fields:["stop","direction_vertex"],geometry:["vertex"],tags:{highway:"stop"},terms:["stop","halt","sign"],name:"Stop Sign"},"highway/street_lamp":{icon:"temaki-bulb",geometry:["point","vertex"],tags:{highway:"street_lamp"},fields:["lamp_type","direction","ref"],terms:["streetlight","street light","lamp","light","gaslight"],name:"Street Lamp"},"highway/tertiary_link":{icon:"iD-highway-tertiary-link",fields:["name","oneway","maxspeed","maxspeed/advisory","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"tertiary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Tertiary Link"},"highway/tertiary":{icon:"iD-highway-tertiary",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"tertiary"},terms:["road","street"],name:"Tertiary Road"},"highway/track":{icon:"iD-highway-track",fields:["name","tracktype","surface","width","structure","access","incline","smoothness","mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale"],geometry:["line"],tags:{highway:"track"},terms:["woods road","forest road","logging road","fire road","farm road","agricultural road","ranch road","carriage road","primitive","unmaintained","rut","offroad","4wd","4x4","four wheel drive","atv","quad","jeep","double track","two track"],name:"Unmaintained Track Road"},"highway/traffic_mirror":{geometry:["point","vertex"],fields:["direction"],tags:{highway:"traffic_mirror"},terms:["blind spot","convex","corner","curved","roadside","round","safety","sphere","visibility"],name:"Traffic Mirror"},"highway/traffic_signals":{icon:"temaki-traffic_signals",geometry:["vertex"],tags:{highway:"traffic_signals"},fields:["traffic_signals","traffic_signals/direction"],terms:["light","stoplight","traffic light"],name:"Traffic Signals"},"highway/trunk_link":{icon:"iD-highway-trunk-link",fields:["name","ref_road_number","oneway","maxspeed","maxspeed/advisory","lanes","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"trunk_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Trunk Link"},"highway/trunk":{icon:"iD-highway-trunk",fields:["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","toll","access"],geometry:["line"],tags:{highway:"trunk"},terms:["road","street"],name:"Trunk Road"},"highway/turning_circle":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"turning_circle"},terms:["cul-de-sac"],name:"Turning Circle"},"highway/turning_loop":{icon:"maki-circle",geometry:["vertex"],tags:{highway:"turning_loop"},terms:["cul-de-sac"],name:"Turning Loop (Island)"},"highway/unclassified":{icon:"iD-highway-unclassified",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],geometry:["line"],tags:{highway:"unclassified"},terms:["road","street"],name:"Minor/Unclassified Road"},historic:{icon:"temaki-ruins",fields:["historic","inscription"],geometry:["point","vertex","area"],tags:{historic:"*"},name:"Historic Site"},"historic/archaeological_site":{icon:"temaki-ruins",fields:["name","site_type","historic/civilization","inscription"],geometry:["point","vertex","area"],tags:{historic:"archaeological_site"},name:"Archaeological Site"},"historic/boundary_stone":{icon:"temaki-milestone",fields:["name","inscription"],geometry:["point","vertex"],tags:{historic:"boundary_stone"},name:"Boundary Stone"},"historic/castle":{icon:"maki-castle",fields:["name","castle_type","building_area","historic/civilization"],geometry:["point","area"],tags:{historic:"castle"},name:"Castle"},"historic/memorial":{icon:"maki-monument",fields:["name","memorial","inscription"],geometry:["point","vertex","area"],terms:["dedicatory","epitaph","remember","remembrance","memory","monument","stolperstein"],tags:{historic:"memorial"},name:"Memorial"},"historic/monument":{icon:"maki-monument",fields:["name","inscription"],geometry:["point","vertex","area"],tags:{historic:"monument"},name:"Monument"},"historic/ruins":{icon:"temaki-ruins",fields:["name","historic/civilization","inscription"],geometry:["point","vertex","area"],tags:{historic:"ruins"},name:"Ruins"},"historic/tomb":{icon:"maki-cemetery",fields:["name","tomb","building_area","inscription"],geometry:["point","area"],tags:{historic:"tomb"},name:"Tomb"},"historic/wayside_cross":{icon:"maki-religious-christian",fields:["name","inscription"],geometry:["point","vertex","area"],tags:{historic:"wayside_cross"},name:"Wayside Cross"},"historic/wayside_shrine":{icon:"maki-landmark",fields:["name","religion","denomination","inscription"],geometry:["point","vertex","area"],tags:{historic:"wayside_shrine"},name:"Wayside Shrine"},"historic/wreck":{icon:"temaki-ruins",fields:["name","access_simple","seamark/wreck/category","historic/wreck/date_sunk","historic/wreck/visible_at_low_tide","historic/wreck/visible_at_high_tide"],geometry:["point","area"],tags:{historic:"wreck"},addTags:{historic:"wreck","seamark:type":"wreck"},removeTags:{historic:"wreck","seamark:type":"wreck"},terms:["hull","mast","maritime","remains","ship","boat"],name:"Shipwreck"},"internet_access/wlan":{icon:"fas-wifi",geometry:["point","area"],fields:["internet_access/fee","internet_access/ssid"],terms:["wi-fi","wifi","hotspot"],tags:{internet_access:"wlan"},name:"Wi-Fi Hotspot"},junction:{icon:"temaki-junction",fields:["name"],geometry:["vertex","area"],tags:{junction:"yes"},name:"Junction"},landuse:{fields:["name","landuse"],geometry:["area"],tags:{landuse:"*"},matchScore:0.9,name:"Land Use"},"landuse/farm":{icon:"maki-farm",fields:["name","operator","crop"],geometry:["point","area"],tags:{landuse:"farm"},terms:[],name:"Farmland",searchable:false},"landuse/allotments":{icon:"maki-garden-center",geometry:["area"],fields:["name"],tags:{landuse:"allotments"},terms:["allotment","garden"],name:"Community Garden"},"landuse/aquaculture":{icon:"maki-aquarium",fields:["name","operator","produce"],geometry:["area"],tags:{landuse:"aquaculture"},terms:["fish farm","crustacean","algae","aquafarming","shrimp farm","oyster farm","mariculture","algaculture"],name:"Aquaculture"},"landuse/basin":{icon:"maki-water",fields:["name"],geometry:["area"],tags:{landuse:"basin"},terms:[],name:"Basin"},"landuse/brownfield":{geometry:["area"],fields:["name"],tags:{landuse:"brownfield"},terms:[],matchScore:0.9,name:"Brownfield"},"landuse/cemetery":{icon:"maki-cemetery",fields:["name","religion","denomination"],geometry:["area"],tags:{landuse:"cemetery"},terms:[],name:"Cemetery"},"landuse/churchyard":{icon:"maki-religious-christian",fields:["name","religion","denomination"],geometry:["area"],tags:{landuse:"churchyard"},terms:[],name:"Churchyard"},"landuse/commercial":{icon:"maki-suitcase",fields:["name"],geometry:["area"],tags:{landuse:"commercial"},terms:[],matchScore:0.9,name:"Commercial Area"},"landuse/construction":{icon:"temaki-tools",fields:["name","construction","operator"],geometry:["area"],tags:{landuse:"construction"},terms:[],name:"Construction"},"landuse/farmland":{icon:"maki-farm",fields:["name","operator","crop","produce"],geometry:["area"],tags:{landuse:"farmland"},terms:["crop","grow","plant"],name:"Farmland"},"landuse/farmyard":{icon:"maki-farm",fields:["name","operator","crop"],geometry:["area"],tags:{landuse:"farmyard"},terms:["crop","grow","plant"],name:"Farmyard"},"landuse/forest":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle","produce"],geometry:["area"],tags:{landuse:"forest"},terms:["cut","forest","lumber","tree"],name:"Forest"},"landuse/garages":{icon:"fas-warehouse",geometry:["area"],fields:["name"],tags:{landuse:"garages"},terms:[],name:"Garage Landuse"},"landuse/grass":{geometry:["area"],tags:{landuse:"grass"},terms:[],name:"Grass"},"landuse/greenfield":{geometry:["area"],fields:["name"],tags:{landuse:"greenfield"},terms:[],matchScore:0.9,name:"Greenfield"},"landuse/greenhouse_horticulture":{icon:"maki-garden",fields:["name","operator"],geometry:["area"],terms:["flower","greenhouse","horticulture","grow","vivero"],tags:{landuse:"greenhouse_horticulture"},matchScore:0.9,name:"Greenhouse Horticulture"},"landuse/harbour":{icon:"maki-harbor",fields:["name","operator"],geometry:["area"],terms:["boat"],tags:{landuse:"harbour"},name:"Harbor"},"landuse/industrial":{icon:"maki-industry",fields:["name","industrial"],geometry:["area"],tags:{landuse:"industrial"},terms:[],matchScore:0.9,name:"Industrial Area"},"landuse/industrial/scrap_yard":{icon:"maki-car",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{industrial:"scrap_yard"},addTags:{landuse:"industrial",industrial:"scrap_yard"},removeTags:{landuse:"industrial",industrial:"scrap_yard"},reference:{key:"industrial",value:"scrap_yard"},terms:["car","junk","metal","salvage","scrap","u-pull-it","vehicle","wreck","yard"],name:"Scrap Yard"},"landuse/industrial/slaughterhouse":{icon:"maki-slaughterhouse",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{industrial:"slaughterhouse"},addTags:{landuse:"industrial",industrial:"slaughterhouse"},removeTags:{landuse:"industrial",industrial:"slaughterhouse"},reference:{key:"industrial",value:"slaughterhouse"},terms:["abattoir","beef","butchery","calf","chicken","cow","killing house","meat","pig","pork","poultry","shambles","stockyard"],name:"Slaughterhouse"},"landuse/landfill":{geometry:["area"],fields:["name"],tags:{landuse:"landfill"},terms:["dump"],name:"Landfill"},"landuse/meadow":{icon:"maki-garden",geometry:["area"],fields:["name"],tags:{landuse:"meadow"},terms:[],name:"Meadow"},"landuse/military":{icon:"temaki-military",fields:["name"],geometry:["area"],tags:{landuse:"military"},terms:[],matchScore:0.9,name:"Military Area"},"landuse/military/airfield":{icon:"maki-airfield",fields:["name","iata","icao"],geometry:["point","area"],tags:{military:"airfield"},addTags:{aeroway:"aerodrome",landuse:"military",military:"airfield"},removeTags:{aeroway:"aerodrome",landuse:"military",military:"airfield"},reference:{key:"military",value:"airfield"},terms:["aerodrome","aeroway","air force","airplane","airport","army","base","bomb","fight","force","guard","heli*","jet","marine","navy","plane","troop","war"],name:"Military Airfield"},"landuse/military/barracks":{icon:"temaki-military",fields:["name","building_area"],geometry:["point","area"],tags:{military:"barracks"},addTags:{landuse:"military",military:"barracks"},removeTags:{landuse:"military",military:"barracks"},terms:["air force","army","base","fight","force","guard","marine","navy","troop","war"],name:"Barracks"},"landuse/military/bunker":{icon:"temaki-military",fields:["name","bunker_type","building_area"],geometry:["point","area"],tags:{military:"bunker"},addTags:{building:"bunker",landuse:"military",military:"bunker"},removeTags:{building:"bunker",landuse:"military",military:"bunker"},terms:["air force","army","base","fight","force","guard","marine","navy","troop","war"],name:"Military Bunker"},"landuse/military/checkpoint":{icon:"maki-barrier",fields:["name"],geometry:["point","vertex","area"],tags:{military:"checkpoint"},addTags:{landuse:"military",military:"checkpoint"},removeTags:{landuse:"military",military:"checkpoint"},terms:["air force","army","base","force","guard","marine","navy","troop","war"],name:"Checkpoint"},"landuse/military/danger_area":{icon:"maki-danger",fields:["name"],geometry:["point","vertex","area"],tags:{military:"danger_area"},addTags:{landuse:"military",military:"danger_area"},removeTags:{landuse:"military",military:"danger_area"},terms:["air force","army","base","blast","bomb","explo*","force","guard","mine","marine","navy","troop","war"],name:"Danger Area"},"landuse/military/naval_base":{icon:"temaki-military",fields:["name"],geometry:["point","area"],tags:{military:"naval_base"},addTags:{landuse:"military",military:"naval_base"},removeTags:{landuse:"military",military:"naval_base"},terms:["base","fight","force","guard","marine","navy","ship","sub","troop","war"],name:"Naval Base"},"landuse/military/nuclear_explosion_site":{icon:"maki-danger",fields:["name"],geometry:["point","vertex","area"],tags:{military:"nuclear_explosion_site"},addTags:{landuse:"military",military:"nuclear_explosion_site"},removeTags:{landuse:"military",military:"nuclear_explosion_site"},terms:["atom","blast","bomb","detonat*","nuke","site","test"],name:"Nuclear Explosion Site"},"landuse/military/obstacle_course":{icon:"temaki-military",geometry:["point","area"],tags:{military:"obstacle_course"},addTags:{landuse:"military",military:"obstacle_course"},removeTags:{landuse:"military",military:"obstacle_course"},terms:["army","base","force","guard","marine","navy","troop","war"],name:"Obstacle Course"},"landuse/military/office":{icon:"temaki-military",fields:["name","building_area"],geometry:["point","area"],tags:{military:"office"},addTags:{landuse:"military",military:"office"},removeTags:{landuse:"military",military:"office"},terms:["air force","army","base","enlist","fight","force","guard","marine","navy","recruit","troop","war"],name:"Military Office"},"landuse/military/range":{icon:"temaki-military",fields:["name"],geometry:["point","area"],tags:{military:"range"},addTags:{landuse:"military",military:"range"},removeTags:{landuse:"military",military:"range"},terms:["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],name:"Military Range"},"landuse/military/training_area":{icon:"temaki-military",fields:["name"],geometry:["point","area"],tags:{military:"training_area"},addTags:{landuse:"military",military:"training_area"},removeTags:{landuse:"military",military:"training_area"},terms:["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],name:"Training Area"},"landuse/orchard":{icon:"maki-park-alt1",fields:["name","operator","trees"],geometry:["area"],tags:{landuse:"orchard"},terms:["fruit"],name:"Orchard"},"landuse/plant_nursery":{icon:"maki-garden",fields:["name","operator","plant"],geometry:["area"],tags:{landuse:"plant_nursery"},terms:["flower","garden","grow","vivero"],name:"Plant Nursery"},"landuse/quarry":{geometry:["area"],fields:["name"],tags:{landuse:"quarry"},terms:[],name:"Quarry"},"landuse/railway":{icon:"maki-rail",fields:["operator"],geometry:["area"],tags:{landuse:"railway"},terms:["rail","train","track"],name:"Railway Corridor"},"landuse/recreation_ground":{icon:"maki-pitch",geometry:["area"],fields:["name"],tags:{landuse:"recreation_ground"},terms:["playing fields"],name:"Recreation Ground"},"landuse/religious":{icon:"maki-place-of-worship",geometry:["area"],fields:["name","religion","denomination"],tags:{landuse:"religious"},terms:[],name:"Religious Area"},"landuse/residential":{icon:"maki-building",geometry:["area"],tags:{landuse:"residential"},terms:[],matchScore:0.9,name:"Residential Area"},"landuse/retail":{icon:"maki-commercial",geometry:["area"],fields:["name"],tags:{landuse:"retail"},matchScore:0.9,name:"Retail Area"},"landuse/vineyard":{fields:["name","operator","grape_variety"],geometry:["area"],tags:{landuse:"vineyard"},addTags:{landuse:"vineyard",crop:"grape"},removeTags:{landuse:"vineyard",crop:"grape",grape_variety:"*"},terms:["grape","wine"],name:"Vineyard"},leisure:{icon:"maki-pitch",fields:["name","leisure"],geometry:["point","vertex","area"],tags:{leisure:"*"},name:"Leisure"},"leisure/adult_gaming_centre":{icon:"maki-casino",fields:["name","operator","address","building_area","opening_hours","smoking"],geometry:["point","area"],terms:["gambling","slot machine"],tags:{leisure:"adult_gaming_centre"},name:"Adult Gaming Center"},"leisure/amusement_arcade":{icon:"maki-gaming",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["pay-to-play games","video games","driving simulators","pinball machines"],tags:{leisure:"amusement_arcade"},name:"Amusement Arcade"},"leisure/bandstand":{icon:"maki-music",fields:["name","building_area","operator"],geometry:["point","area"],tags:{leisure:"bandstand"},name:"Bandstand"},"leisure/beach_resort":{icon:"maki-beach",fields:["name","address","fee"],geometry:["point","area"],tags:{leisure:"beach_resort"},name:"Beach Resort"},"leisure/bird_hide":{icon:"temaki-binoculars",fields:["building_area"],geometry:["point","area"],tags:{leisure:"bird_hide"},terms:["machan","ornithology"],name:"Bird Hide"},"leisure/bleachers":{geometry:["point","area"],tags:{leisure:"bleachers"},terms:["crowd","bench","sports","stand","stands","seat","seating"],name:"Bleachers"},"leisure/bowling_alley":{icon:"temaki-bowling",fields:["name","operator","address","building_area","opening_hours","smoking"],geometry:["point","area"],terms:["bowling center"],tags:{leisure:"bowling_alley"},name:"Bowling Alley"},"leisure/common":{icon:"temaki-pedestrian",geometry:["point","area"],fields:["name"],terms:["open space"],tags:{leisure:"common"},name:"Common"},"leisure/dance":{icon:"maki-music",fields:["name","operator","address","building_area","dance/style","opening_hours"],geometry:["point","area"],terms:["ballroom","jive","swing","tango","waltz"],tags:{leisure:"dance"},name:"Dance Hall"},"leisure/dancing_school":{icon:"maki-music",fields:["name","operator","address","building_area","opening_hours","dance/style"],geometry:["point","area"],terms:["jive","swing","tango","waltz","dance teaching"],tags:{leisure:"dance","dance:teaching":"yes"},reference:{key:"leisure",value:"dance"},name:"Dance School"},"leisure/dog_park":{icon:"maki-dog-park",geometry:["point","area"],fields:["name"],terms:[],tags:{leisure:"dog_park"},name:"Dog Park"},"leisure/firepit":{icon:"maki-fire-station",fields:["access_simple"],geometry:["point","area"],tags:{leisure:"firepit"},terms:["fireplace","campfire"],name:"Firepit"},"leisure/fishing":{icon:"fas-fish",fields:["name","access_simple"],geometry:["point","area"],tags:{leisure:"fishing"},terms:["angler"],name:"Fishing Spot"},"leisure/fitness_centre":{icon:"fas-dumbbell",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre"},terms:["health","gym","leisure","studio"],name:"Gym / Fitness Center"},"leisure/fitness_centre/yoga":{icon:"maki-pitch",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],terms:["studio"],tags:{leisure:"fitness_centre",sport:"yoga"},reference:{key:"sport",value:"yoga"},name:"Yoga Studio"},"leisure/fitness_station":{icon:"maki-pitch",fields:["fitness_station","ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station"},addTags:{leisure:"fitness_station",sport:"fitness"},removeTags:{leisure:"fitness_station",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","trim trail"],name:"Outdoor Fitness Station"},"leisure/fitness_station/balance_beam":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"balance_beam"},addTags:{leisure:"fitness_station",fitness_station:"balance_beam",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"balance_beam",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["balance","exercise","fitness","gym","trim trail"],name:"Exercise Balance Beam"},"leisure/fitness_station/box":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"box"},addTags:{leisure:"fitness_station",fitness_station:"box",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"box",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["box","exercise","fitness","gym","jump","trim trail"],name:"Exercise Box"},"leisure/fitness_station/horizontal_bar":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"horizontal_bar"},addTags:{leisure:"fitness_station",fitness_station:"horizontal_bar",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"horizontal_bar",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","chinup","chin up","exercise","fitness","gym","pullup","pull up","trim trail"],name:"Exercise Horizontal Bar"},"leisure/fitness_station/horizontal_ladder":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"horizontal_ladder"},addTags:{leisure:"fitness_station",fitness_station:"horizontal_ladder",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"horizontal_ladder",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","chinup","chin up","exercise","fitness","gym","ladder","monkey bars","pullup","pull up","trim trail"],name:"Exercise Monkey Bars"},"leisure/fitness_station/hyperextension":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"hyperextension"},addTags:{leisure:"fitness_station",fitness_station:"hyperextension",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"hyperextension",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["back","exercise","extension","fitness","gym","roman chair","trim trail"],name:"Hyperextension Station"},"leisure/fitness_station/parallel_bars":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"parallel_bars"},addTags:{leisure:"fitness_station",fitness_station:"parallel_bars",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"parallel_bars",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","dip","exercise","fitness","gym","trim trail"],name:"Parallel Bars"},"leisure/fitness_station/push-up":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"push-up"},addTags:{leisure:"fitness_station",fitness_station:"push-up",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"push-up",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","exercise","fitness","gym","pushup","push up","trim trail"],name:"Push-Up Station"},"leisure/fitness_station/rings":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"rings"},addTags:{leisure:"fitness_station",fitness_station:"rings",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"rings",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","muscle up","pullup","pull up","trim trail"],name:"Exercise Rings"},"leisure/fitness_station/sign":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"sign"},addTags:{leisure:"fitness_station",fitness_station:"sign",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"sign",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","trim trail"],name:"Exercise Instruction Sign"},"leisure/fitness_station/sit-up":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"sit-up"},addTags:{leisure:"fitness_station",fitness_station:"sit-up",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"sit-up",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["crunch","exercise","fitness","gym","situp","sit up","trim trail"],name:"Sit-Up Station"},"leisure/fitness_station/stairs":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"stairs"},addTags:{leisure:"fitness_station",fitness_station:"stairs",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"stairs",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","steps","trim trail"],name:"Exercise Stairs"},"leisure/garden":{icon:"maki-garden",fields:["name","access_simple"],geometry:["point","vertex","area"],tags:{leisure:"garden"},name:"Garden"},"leisure/golf_course":{icon:"maki-golf",fields:["name","operator","address","opening_hours"],geometry:["point","area"],terms:["links"],tags:{leisure:"golf_course"},name:"Golf Course"},"leisure/hackerspace":{icon:"maki-commercial",fields:["name","address","building_area","opening_hours","website"],geometry:["point","area"],terms:["makerspace","hackspace","hacklab"],tags:{leisure:"hackerspace"},name:"Hackerspace"},"leisure/horse_riding":{icon:"maki-horse-riding",fields:["name","access_simple","operator","address","building"],geometry:["point","area"],terms:["equestrian","stable"],tags:{leisure:"horse_riding"},name:"Horseback Riding Facility"},"leisure/ice_rink":{icon:"maki-pitch",fields:["name","seasonal","sport_ice","operator","address","building","opening_hours"],geometry:["point","area"],terms:["hockey","skating","curling"],tags:{leisure:"ice_rink"},name:"Ice Rink"},"leisure/marina":{icon:"maki-harbor",fields:["name","operator","address","capacity","fee","sanitary_dump_station","power_supply","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","vertex","area"],terms:["boat"],tags:{leisure:"marina"},name:"Marina"},"leisure/miniature_golf":{icon:"maki-golf",fields:["name","operator","address","opening_hours"],geometry:["point","area"],terms:["crazy golf","mini golf","putt-putt"],tags:{leisure:"miniature_golf"},name:"Miniature Golf"},"leisure/nature_reserve":{icon:"maki-park",geometry:["point","area"],fields:["name"],tags:{leisure:"nature_reserve"},terms:["protected","wildlife"],name:"Nature Reserve"},"leisure/outdoor_seating":{icon:"maki-picnic-site",geometry:["point","area"],fields:["name","operator"],terms:["al fresco","beer garden","dining","cafe","restaurant","pub","bar","patio"],tags:{leisure:"outdoor_seating"},name:"Outdoor Seating Area"},"leisure/park":{icon:"maki-park",geometry:["point","area"],fields:["name"],terms:["esplanade","estate","forest","garden","grass","green","grounds","lawn","lot","meadow","parkland","place","playground","plaza","pleasure garden","recreation area","square","tract","village green","woodland"],tags:{leisure:"park"},name:"Park"},"leisure/picnic_table":{icon:"maki-picnic-site",geometry:["point"],tags:{leisure:"picnic_table"},terms:["bench"],name:"Picnic Table"},"leisure/pitch":{icon:"maki-pitch",fields:["name","sport","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch"},terms:["field"],name:"Sport Pitch"},"leisure/pitch/american_football":{icon:"maki-america-football",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"american_football"},reference:{key:"sport",value:"american_football"},terms:[],name:"American Football Field"},"leisure/pitch/badminton":{icon:"maki-tennis",fields:["name","surface","lit","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"badminton"},reference:{key:"sport",value:"badminton"},terms:[],name:"Badminton Court"},"leisure/pitch/baseball":{icon:"maki-baseball",fields:["name","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"baseball"},reference:{key:"sport",value:"baseball"},terms:[],name:"Baseball Field"},"leisure/pitch/basketball":{icon:"maki-basketball",fields:["name","surface","hoops","lit","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"basketball"},reference:{key:"sport",value:"basketball"},terms:[],name:"Basketball Court"},"leisure/pitch/beachvolleyball":{icon:"maki-volleyball",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"beachvolleyball"},addTags:{leisure:"pitch",sport:"beachvolleyball",surface:"sand"},removeTags:{leisure:"pitch",sport:"beachvolleyball",surface:"sand"},reference:{key:"sport",value:"beachvolleyball"},terms:["volleyball"],name:"Beach Volleyball Court"},"leisure/pitch/boules":{icon:"maki-pitch",fields:["name","boules","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"boules"},reference:{key:"sport",value:"boules"},terms:["bocce","lyonnaise","pétanque"],name:"Boules/Bocce Court"},"leisure/pitch/bowls":{icon:"maki-pitch",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"bowls"},reference:{key:"sport",value:"bowls"},terms:[],name:"Bowling Green"},"leisure/pitch/cricket":{icon:"maki-cricket",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"cricket"},reference:{key:"sport",value:"cricket"},terms:[],name:"Cricket Field"},"leisure/pitch/equestrian":{icon:"maki-horse-riding",fields:["name","surface","lit","building"],geometry:["point","area"],tags:{leisure:"pitch",sport:"equestrian"},reference:{key:"sport",value:"equestrian"},terms:["dressage","equestrian","horse","horseback","riding"],name:"Riding Arena"},"leisure/pitch/rugby_league":{icon:"maki-america-football",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"rugby_league"},reference:{key:"sport",value:"rugby_league"},terms:[],name:"Rugby League Field"},"leisure/pitch/rugby_union":{icon:"maki-america-football",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"rugby_union"},reference:{key:"sport",value:"rugby_union"},terms:[],name:"Rugby Union Field"},"leisure/pitch/skateboard":{icon:"maki-skateboard",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"skateboard"},reference:{key:"sport",value:"skateboard"},terms:[],name:"Skate Park"},"leisure/pitch/soccer":{icon:"maki-soccer",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"soccer"},reference:{key:"sport",value:"soccer"},terms:["football"],name:"Soccer Field"},"leisure/pitch/softball":{icon:"maki-baseball",fields:["name","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"softball"},reference:{key:"sport",value:"softball"},terms:["softball","diamond"],name:"Softball Field"},"leisure/pitch/table_tennis":{icon:"maki-tennis",fields:["name","lit","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"table_tennis"},reference:{key:"sport",value:"table_tennis"},terms:["table tennis","ping pong"],name:"Ping Pong Table"},"leisure/pitch/tennis":{icon:"maki-tennis",fields:["name","surface","lit","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"tennis"},reference:{key:"sport",value:"tennis"},terms:[],name:"Tennis Court"},"leisure/pitch/volleyball":{icon:"maki-volleyball",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"volleyball"},reference:{key:"sport",value:"volleyball"},terms:[],name:"Volleyball Court"},"leisure/playground":{icon:"maki-playground",fields:["name","operator","surface","playground/max_age","playground/min_age","access_simple"],geometry:["point","area"],terms:["jungle gym","play area"],tags:{leisure:"playground"},name:"Playground"},"leisure/resort":{icon:"maki-lodging",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{leisure:"resort"},name:"Resort"},"leisure/running_track":{icon:"maki-pitch",fields:["surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["point","line","area"],tags:{leisure:"track",sport:"running"},terms:["race*","running","sprint","track"],name:"Racetrack (Running)"},"leisure/sauna":{icon:"fas-thermometer-three-quarters",fields:["name","operator","address","opening_hours","access_simple","fee"],geometry:["point","area"],tags:{leisure:"sauna"},name:"Sauna"},"leisure/slipway":{icon:"maki-slipway",fields:["name","access_simple","fee"],geometry:["point","vertex","line"],terms:["boat launch","boat ramp","boat landing"],tags:{leisure:"slipway"},name:"Slipway"},"leisure/sports_centre":{icon:"maki-pitch",fields:["name","sport","building","address","opening_hours"],geometry:["point","area"],tags:{leisure:"sports_centre"},terms:[],name:"Sports Center / Complex"},"leisure/sports_centre/swimming":{icon:"maki-swimming",fields:["name","access_simple","operator","address","building"],geometry:["point","area"],terms:["dive","water"],tags:{leisure:"sports_centre",sport:"swimming"},reference:{key:"sport",value:"swimming"},name:"Swimming Pool Facility"},"leisure/stadium":{icon:"maki-pitch",fields:["name","sport","address"],geometry:["point","area"],tags:{leisure:"stadium"},name:"Stadium"},"leisure/swimming_pool":{icon:"maki-swimming",fields:["name","access_simple","operator","address","lit","location_pool","length","swimming_pool"],geometry:["point","area"],terms:["dive","water","aquatics"],tags:{leisure:"swimming_pool"},name:"Swimming Pool"},"leisure/track":{icon:"iD-highway-road",fields:["surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["point","line","area"],tags:{leisure:"track"},terms:["cycle","dog","greyhound","horse","race*","track"],name:"Racetrack (Non-Motorsport)"},"leisure/water_park":{icon:"maki-swimming",fields:["name","operator","address"],geometry:["point","area"],terms:["swim","pool","dive"],tags:{leisure:"water_park"},name:"Water Park"},line:{fields:["name"],geometry:["line"],tags:{},name:"Line",matchScore:0.1},man_made:{icon:"temaki-storage_tank",fields:["name","man_made"],geometry:["point","vertex","line","area"],tags:{man_made:"*"},name:"Man Made"},"man_made/adit":{icon:"maki-triangle",geometry:["point","area"],fields:["operator","direction"],terms:["entrance","underground","mine","cave"],tags:{man_made:"adit"},name:"Adit"},"man_made/antenna":{icon:"temaki-antenna",fields:["height","communication_multi"],geometry:["point"],terms:["broadcast","cell phone","cell","communication","mobile phone","radio","television","transmission","tv"],tags:{man_made:"antenna"},name:"Antenna"},"man_made/breakwater":{geometry:["line","area"],tags:{man_made:"breakwater"},name:"Breakwater"},"man_made/bridge":{icon:"maki-bridge",fields:["name","bridge","layer","maxweight"],geometry:["area"],tags:{man_made:"bridge"},addTags:{man_made:"bridge",layer:"1"},removeTags:{man_made:"bridge",layer:"*"},reference:{key:"man_made",value:"bridge"},name:"Bridge"},"man_made/bunker_silo":{icon:"temaki-silo",fields:["content"],geometry:["point","area"],terms:["Silage","Storage"],tags:{man_made:"bunker_silo"},name:"Bunker Silo"},"man_made/chimney":{icon:"temaki-chimney",geometry:["point","area"],tags:{man_made:"chimney"},name:"Chimney"},"man_made/clearcut":{icon:"maki-logging",geometry:["area"],tags:{man_made:"clearcut"},terms:["cut","forest","lumber","tree","wood"],name:"Clearcut Forest"},"man_made/crane":{icon:"temaki-crane",fields:["operator","height","crane/type"],geometry:["point","line","vertex","area"],tags:{man_made:"crane"},name:"Crane"},"man_made/cutline":{icon:"maki-logging",geometry:["line"],tags:{man_made:"cutline"},name:"Cut line"},"man_made/embankment":{geometry:["line"],tags:{man_made:"embankment"},name:"Embankment"},"man_made/flagpole":{icon:"maki-embassy",fields:["operator","flag/type","country","lit","height"],geometry:["point","vertex"],tags:{man_made:"flagpole"},name:"Flagpole"},"man_made/gasometer":{icon:"temaki-storage_tank",fields:["content","building_area"],geometry:["point","area"],terms:["gas holder"],tags:{man_made:"gasometer"},name:"Gasometer"},"man_made/groyne":{geometry:["line","area"],tags:{man_made:"groyne"},name:"Groyne"},"man_made/lighthouse":{icon:"maki-lighthouse",fields:["building_area"],geometry:["point","area"],tags:{man_made:"lighthouse"},name:"Lighthouse"},"man_made/mast":{icon:"maki-communications-tower",fields:["tower/type","tower/construction","height","communication_multi"],geometry:["point"],terms:["antenna","broadcast tower","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","radio mast","radio tower","television tower","transmission mast","transmission tower","tv tower"],tags:{man_made:"mast"},name:"Mast"},"man_made/mast/communication":{icon:"maki-communications-tower",fields:["tower/type","tower/construction","height","communication_multi"],geometry:["point"],terms:["antenna","broadcast tower","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","radio mast","radio tower","television tower","transmission mast","transmission tower","tv tower"],tags:{man_made:"mast","tower:type":"communication"},reference:{key:"tower:type",value:"communication"},name:"Communication Mast"},"man_made/mast/communication/mobile_phone":{icon:"maki-communications-tower",fields:["tower/type","tower/construction","height","communication_multi"],geometry:["point"],terms:["antenna","cell mast","cell phone mast","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","transmission mast","transmission tower"],tags:{man_made:"mast","tower:type":"communication","communication:mobile_phone":"yes"},reference:{key:"communication:mobile_phone",value:"yes"},name:"Mobile Phone Mast"},"man_made/mast/communication/radio":{icon:"maki-communications-tower",fields:["tower/type","tower/construction","height","communication_multi"],geometry:["point"],terms:["antenna","broadcast tower","communication mast","communication tower","guyed tower","radio mast","radio tower","transmission mast","transmission tower"],tags:{man_made:"mast","tower:type":"communication","communication:radio":"yes"},reference:{key:"communication:radio",value:"yes"},name:"Radio Broadcast Mast"},"man_made/mast/communication/television":{icon:"maki-communications-tower",fields:["tower/type","tower/construction","height","communication_multi"],geometry:["point"],terms:["antenna","broadcast tower","communication mast","communication tower","guyed tower","television mast","television tower","transmission mast","transmission tower","tv mast","tv tower"],tags:{man_made:"mast","tower:type":"communication","communication:television":"yes"},reference:{key:"communication:television",value:"yes"},name:"Television Broadcast Mast"},"man_made/monitoring_station":{icon:"temaki-antenna",geometry:["point","area"],fields:["monitoring_multi","operator"],terms:["weather","earthquake","seismology","air","gps"],tags:{man_made:"monitoring_station"},name:"Monitoring Station"},"man_made/observatory":{geometry:["point","area"],terms:["astronomical","meteorological"],tags:{man_made:"observatory"},name:"Observatory"},"man_made/petroleum_well":{icon:"temaki-storage_tank",geometry:["point"],terms:["drilling rig","oil derrick","oil drill","oil horse","oil rig","oil pump","petroleum well","pumpjack"],tags:{man_made:"petroleum_well"},name:"Oil Well"},"man_made/pier":{icon:"iD-highway-footway",fields:["name","surface","lit","width","access"],geometry:["line","area"],terms:["dock","jetty"],tags:{man_made:"pier"},name:"Pier"},"man_made/pipeline":{icon:"iD-pipeline-line",fields:["location","operator","substance","layer"],geometry:["line"],terms:["oil","natural gas","water","sewer","sewage"],tags:{man_made:"pipeline"},name:"Pipeline"},"man_made/pumping_station":{icon:"maki-water",geometry:["point","area"],tags:{man_made:"pumping_station"},name:"Pumping Station"},"man_made/silo":{icon:"temaki-silo",fields:["crop","building_area"],geometry:["point","area"],terms:["grain","corn","wheat"],tags:{man_made:"silo"},name:"Silo"},"man_made/storage_tank":{icon:"temaki-storage_tank",fields:["content","building_area"],geometry:["point","area"],terms:["water","oil","gas","petrol"],tags:{man_made:"storage_tank"},name:"Storage Tank"},"man_made/surveillance":{icon:"maki-attraction",geometry:["point","vertex"],fields:["surveillance","surveillance/type","surveillance/zone","direction"],terms:["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],tags:{man_made:"surveillance"},name:"Surveillance"},"man_made/surveillance/camera":{icon:"maki-attraction",geometry:["point","vertex"],fields:["surveillance","surveillance/type","camera/type","camera/mount","camera/direction","surveillance/zone","contact/webcam"],terms:["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],tags:{man_made:"surveillance","surveillance:type":"camera"},name:"Surveillance Camera"},"man_made/survey_point":{icon:"maki-monument",fields:["ref"],geometry:["point","vertex"],terms:["trig point","triangulation pillar","trigonometrical station"],tags:{man_made:"survey_point"},name:"Survey Point"},"man_made/tower":{icon:"temaki-tower",fields:["tower/type","tower/construction","height"],geometry:["point","area"],tags:{man_made:"tower"},name:"Tower"},"man_made/tower/communication":{icon:"temaki-tower",fields:["tower/type","tower/construction","height","communication_multi"],geometry:["point","area"],terms:["antenna","broadcast tower","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","radio mast","radio tower","television tower","transmission mast","transmission tower","tv tower"],tags:{man_made:"tower","tower:type":"communication"},reference:{key:"tower:type",value:"communication"},name:"Communication Tower"},"man_made/tower/observation":{icon:"temaki-tower",fields:["tower/type","tower/construction","height"],geometry:["point","area"],terms:["lookout tower","fire tower"],tags:{man_made:"tower","tower:type":"observation"},reference:{key:"tower:type",value:"observation"},name:"Observation Tower"},"man_made/wastewater_plant":{icon:"maki-water",fields:["name","operator","address"],geometry:["point","area"],terms:["sewage*","water treatment plant","reclamation plant"],tags:{man_made:"wastewater_plant"},name:"Wastewater Plant"},"man_made/water_tower":{icon:"maki-water",fields:["operator"],geometry:["point","area"],tags:{man_made:"water_tower"},name:"Water Tower"},"man_made/water_well":{icon:"maki-water",fields:["operator"],geometry:["point","area"],tags:{man_made:"water_well"},name:"Water Well"},"man_made/water_works":{icon:"maki-water",fields:["name","operator","address"],geometry:["point","area"],tags:{man_made:"water_works"},name:"Water Works"},"man_made/watermill":{icon:"maki-watermill",fields:["building_area"],geometry:["point","area"],terms:["water","wheel","mill"],tags:{man_made:"watermill"},name:"Watermill"},"man_made/windmill":{icon:"maki-windmill",fields:["building_area"],geometry:["point","area"],terms:["wind","wheel","mill"],tags:{man_made:"windmill"},name:"Windmill"},"man_made/works":{icon:"maki-industry",fields:["name","operator","address","building_area","product"],geometry:["point","area"],terms:["assembly","build","brewery","car","plant","plastic","processing","manufacture","refinery"],tags:{man_made:"works"},name:"Factory"},manhole:{icon:"maki-circle-stroked",fields:["manhole","operator","label","ref"],geometry:["point","vertex"],tags:{manhole:"*"},terms:["cover","hole","sewer","sewage","telecom"],name:"Manhole"},"manhole/drain":{icon:"maki-water",fields:["operator","ref"],geometry:["point","vertex"],tags:{manhole:"drain"},terms:["cover","drain","hole","rain","sewer","sewage","storm"],name:"Storm Drain"},"manhole/telecom":{icon:"maki-circle-stroked",fields:["operator","ref"],geometry:["point","vertex"],tags:{manhole:"telecom"},terms:["cover","phone","hole","telecom","telephone","bt"],name:"Telecom Manhole"},natural:{icon:"maki-natural",fields:["name","natural"],geometry:["point","vertex","area"],tags:{natural:"*"},name:"Natural"},"natural/bare_rock":{geometry:["area"],tags:{natural:"bare_rock"},terms:["rock"],name:"Bare Rock"},"natural/bay":{icon:"temaki-beach",geometry:["point","area"],fields:["name"],tags:{natural:"bay"},terms:[],name:"Bay"},"natural/beach":{icon:"temaki-beach",fields:["surface"],geometry:["point","area"],tags:{natural:"beach"},terms:["shore"],name:"Beach"},"natural/cave_entrance":{icon:"maki-triangle",geometry:["point","area"],fields:["fee","access_simple","direction"],tags:{natural:"cave_entrance"},terms:["cavern","hollow","grotto","shelter","cavity"],name:"Cave Entrance"},"natural/cliff":{icon:"maki-triangle",fields:["name","height"],geometry:["point","vertex","line","area"],tags:{natural:"cliff"},terms:["crag","escarpment","rock face","scarp"],name:"Cliff"},"natural/coastline":{geometry:["line"],tags:{natural:"coastline"},terms:["shore"],name:"Coastline"},"natural/fell":{geometry:["area"],tags:{natural:"fell"},terms:[],name:"Fell"},"natural/glacier":{geometry:["area"],tags:{natural:"glacier"},terms:[],name:"Glacier"},"natural/grassland":{geometry:["area"],tags:{natural:"grassland"},terms:["prairie","savanna"],name:"Grassland"},"natural/heath":{geometry:["area"],tags:{natural:"heath"},terms:[],name:"Heath"},"natural/mud":{geometry:["area"],tags:{natural:"mud"},terms:["wetland"],name:"Mud"},"natural/peak":{icon:"maki-mountain",fields:["name","elevation"],geometry:["point","vertex"],tags:{natural:"peak"},terms:["acme","aiguille","alp","climax","crest","crown","hill","mount","mountain","pinnacle","summit","tip","top"],name:"Peak"},"natural/reef":{icon:"temaki-beach",geometry:["point","area"],tags:{natural:"reef"},terms:["barrier","coral","ocean","sand","shoal"],name:"Reef"},"natural/ridge":{geometry:["line"],tags:{natural:"ridge"},terms:["crest"],name:"Ridge"},"natural/saddle":{icon:"maki-triangle-stroked",fields:["elevation"],geometry:["point","vertex"],tags:{natural:"saddle"},terms:["pass","mountain pass","top"],name:"Saddle"},"natural/sand":{geometry:["area"],tags:{natural:"sand"},terms:["desert"],name:"Sand"},"natural/scree":{geometry:["area"],tags:{natural:"scree"},terms:["loose rocks"],name:"Scree"},"natural/scrub":{geometry:["area"],tags:{natural:"scrub"},terms:["bush","shrubs"],name:"Scrub"},"natural/spring":{icon:"maki-water",fields:["name","intermittent"],geometry:["point","vertex"],tags:{natural:"spring"},terms:[],name:"Spring"},"natural/tree_row":{icon:"maki-park",fields:["leaf_type","leaf_cycle","denotation"],geometry:["line"],tags:{natural:"tree_row"},terms:[],name:"Tree Row"},"natural/tree":{icon:"maki-park",fields:["leaf_type_singular","leaf_cycle_singular","denotation"],geometry:["point","vertex"],tags:{natural:"tree"},terms:[],name:"Tree"},"natural/volcano":{icon:"maki-volcano",fields:["name","elevation","volcano/status","volcano/type"],geometry:["point","vertex"],tags:{natural:"volcano"},terms:["mountain","crater"],name:"Volcano"},"natural/water":{icon:"maki-water",fields:["water"],geometry:["area"],tags:{natural:"water"},name:"Water"},"natural/water/lake":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{natural:"water",water:"lake"},reference:{key:"natural",value:"water"},terms:["lakelet","loch","mere"],name:"Lake"},"natural/water/pond":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{natural:"water",water:"pond"},reference:{key:"natural",value:"water"},terms:["lakelet","millpond","tarn","pool","mere"],name:"Pond"},"natural/water/reservoir":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{natural:"water",water:"reservoir"},reference:{key:"natural",value:"water"},name:"Reservoir"},"natural/wetland":{icon:"maki-wetland",fields:["wetland"],geometry:["point","area"],tags:{natural:"wetland"},terms:["bog","marsh","reedbed","swamp","tidalflat"],name:"Wetland"},"natural/wood":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle"],geometry:["point","area"],tags:{natural:"wood"},terms:["tree"],name:"Wood"},"noexit/yes":{icon:"maki-barrier",geometry:["vertex"],terms:["no exit","road end","dead end"],tags:{noexit:"yes"},reference:{key:"noexit",value:"*"},name:"No Exit"},office:{icon:"maki-suitcase",fields:["name","office","address","building_area","opening_hours","smoking"],geometry:["point","vertex","area"],tags:{office:"*"},terms:[],name:"Office"},"office/administrative":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"administrative"},terms:[],searchable:false,name:"Administrative Office"},"office/physician":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"physician"},searchable:false,name:"Physician"},"office/travel_agent":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"travel_agent"},reference:{key:"shop",value:"travel_agency"},terms:[],name:"Travel Agency",searchable:false},"office/accountant":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"accountant"},terms:[],name:"Accountant Office"},"office/adoption_agency":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"adoption_agency"},terms:[],name:"Adoption Agency"},"office/advertising_agency":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"advertising_agency"},terms:["ad","ad agency","advert agency","advertising","marketing"],name:"Advertising Agency"},"office/architect":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"architect"},terms:[],name:"Architect Office"},"office/association":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"association"},terms:["association","non-profit","nonprofit","organization","society"],name:"Nonprofit Organization Office"},"office/charity":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"charity"},terms:["charitable organization"],name:"Charity Office"},"office/company":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours","smoking"],geometry:["point","area"],tags:{office:"company"},terms:[],name:"Corporate Office"},"office/coworking":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],terms:["coworking","office"],tags:{office:"coworking"},reference:{key:"amenity",value:"coworking_space"},name:"Coworking Space"},"office/educational_institution":{icon:"maki-school",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"educational_institution"},terms:[],name:"Educational Institution"},"office/employment_agency":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"employment_agency"},terms:["job"],name:"Employment Agency"},"office/energy_supplier":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"energy_supplier"},terms:["electricity","energy company","energy utility","gas utility"],name:"Energy Supplier Office"},"office/estate_agent":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"estate_agent"},terms:[],name:"Real Estate Office"},"office/financial":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"financial"},terms:[],name:"Financial Office"},"office/forestry":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"forestry"},terms:["forest","ranger"],name:"Forestry Office"},"office/foundation":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"foundation"},terms:[],name:"Foundation Office"},"office/government":{icon:"maki-town-hall",fields:["name","government","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"government"},terms:[],name:"Government Office"},"office/government/register_office":{icon:"maki-town-hall",fields:["name","address","building_area","opening_hours","operator"],geometry:["point","area"],terms:["clerk","marriage","death","birth","certificate"],tags:{office:"government",government:"register_office"},reference:{key:"government",value:"register_office"},name:"Register Office"},"office/government/tax":{icon:"maki-town-hall",fields:["name","address","building_area","opening_hours","operator"],geometry:["point","area"],terms:["fiscal authorities","revenue office","tax office"],tags:{office:"government",government:"tax"},reference:{key:"government",value:"tax"},name:"Tax and Revenue Office"},"office/guide":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"guide"},terms:["dive guide","mountain guide","tour guide"],name:"Tour Guide Office"},"office/insurance":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"insurance"},terms:[],name:"Insurance Office"},"office/it":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"it"},terms:["computer","information","software","technology"],name:"Information Technology Office"},"office/lawyer":{icon:"fas-balance-scale",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"lawyer"},terms:[],name:"Law Office"},"office/lawyer/notary":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"lawyer",lawyer:"notary"},reference:{key:"office",value:"notary"},searchable:false,name:"Notary Office"},"office/moving_company":{icon:"fas-people-carry",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"moving_company"},terms:["relocation"],name:"Moving Company Office"},"office/newspaper":{icon:"maki-library",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"newspaper"},terms:[],name:"Newspaper Office"},"office/ngo":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours","smoking"],geometry:["point","area"],tags:{office:"ngo"},terms:["ngo","non government","non-government","organization","organisation"],name:"NGO Office"},"office/notary":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"notary"},terms:["clerk","deeds","estate","signature","wills"],name:"Notary Office"},"office/political_party":{icon:"maki-town-hall",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"political_party"},terms:[],name:"Political Party"},"office/private_investigator":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"private_investigator"},terms:["PI","private eye","private detective"],name:"Private Investigator Office"},"office/quango":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"quango"},terms:["ngo","non government","non-government","organization","organisation","quasi autonomous","quasi-autonomous"],name:"Quasi-NGO Office"},"office/religion":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours","religion","denomination"],geometry:["point","area"],tags:{office:"religion"},terms:[],name:"Religious Office"},"office/research":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"research"},terms:[],name:"Research Office"},"office/surveyor":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"surveyor"},terms:[],name:"Surveyor Office"},"office/tax_advisor":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"tax_advisor"},terms:["tax","tax consultant"],name:"Tax Advisor Office"},"office/telecommunication":{icon:"maki-telephone",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"telecommunication"},terms:["communication","internet","phone","voice"],name:"Telecom Office"},"office/therapist":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"therapist"},terms:["therapy"],name:"Therapist Office"},"office/water_utility":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours","operator"],geometry:["point","area"],tags:{office:"water_utility"},terms:["water board","utility"],name:"Water Utility Office"},"piste/downhill":{icon:"maki-skiing",fields:["name","piste/type","piste/difficulty_downhill","piste/grooming_downhill","oneway","lit"],geometry:["line","area"],terms:["ski","alpine","snowboard","downhill","piste"],tags:{"piste:type":"downhill"},name:"Downhill Piste/Ski Run"},"piste/hike":{icon:"fas-snowflake",fields:["name","piste/type","piste/difficulty","piste/grooming_hike","oneway","lit"],geometry:["line","area"],terms:["hike","winter hiking","snowshoe","snowshoeing","piste","ski"],tags:{"piste:type":"hike"},name:"Snowshoeing or Winter Hiking Trail"},"piste/ice_skate":{icon:"fas-snowflake",fields:["name","piste/type","sport_ice","oneway","lit"],geometry:["line","area"],terms:["ice","skating","ski","piste"],tags:{"piste:type":"ice_skate"},name:"Ice Skating Piste"},"piste/nordic":{icon:"maki-skiing",fields:["name","piste/type","piste/difficulty_nordic","piste/grooming_nordic","oneway","lit"],geometry:["line","area"],terms:["ski","nordic","crosscountry","skating","piste"],tags:{"piste:type":"nordic"},name:"Nordic or Crosscountry Piste/Ski Trail"},"piste/piste":{icon:"maki-skiing",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","nordic","crosscountry","downhill","alpine","snowboard","skitour","ski touring","sled","luge","sleigh","sledge","ski-joring","husky","horse","winter hiking","snowshoe","snowshoeing","ice","skating"],tags:{"piste:type":"*"},name:"Winter Sport Trails"},"piste/skitour":{icon:"maki-skiing",fields:["name","piste/type","piste/difficulty_skitour","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","skitour","crosscountry","ski touring","piste"],tags:{"piste:type":"skitour"},name:"Ski Touring Trail"},"piste/sled":{icon:"fas-snowflake",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","sled","luge","sleigh","sledge","piste"],tags:{"piste:type":"sled"},name:"Sled Piste"},"piste/sleigh":{icon:"fas-snowflake",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","piste","sled","luge","sleigh","sledge","ski-joring","husky","horse"],tags:{"piste:type":"sleigh"},name:"Sleigh Piste"},"place/farm":{icon:"maki-farm",geometry:["point","area"],fields:["name"],tags:{place:"farm"},name:"Farm",searchable:false},"place/city_block":{icon:"maki-triangle-stroked",fields:["name"],geometry:["point","area"],tags:{place:"city_block"},name:"City Block"},"place/city":{icon:"maki-city",fields:["name","population"],geometry:["point","area"],tags:{place:"city"},name:"City"},"place/hamlet":{icon:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"hamlet"},name:"Hamlet"},"place/island":{icon:"maki-mountain",geometry:["point","area"],fields:["name"],terms:["archipelago","atoll","bar","cay","isle","islet","key","reef"],tags:{place:"island"},name:"Island"},"place/islet":{icon:"maki-mountain",geometry:["point","area"],fields:["name"],terms:["archipelago","atoll","bar","cay","isle","islet","key","reef"],tags:{place:"islet"},name:"Islet"},"place/isolated_dwelling":{icon:"maki-home",geometry:["point","area"],fields:["name"],tags:{place:"isolated_dwelling"},name:"Isolated Dwelling"},"place/locality":{icon:"maki-triangle-stroked",geometry:["point","area"],fields:["name"],tags:{place:"locality"},name:"Locality"},"place/neighbourhood":{icon:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"neighbourhood"},terms:["neighbourhood"],name:"Neighborhood"},"place/plot":{icon:"maki-triangle-stroked",fields:["name"],geometry:["point","area"],tags:{place:"plot"},terms:["tract","land","lot","parcel"],name:"Plot"},"place/quarter":{icon:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"quarter"},terms:["boro","borough","quarter"],name:"Sub-Borough / Quarter"},"place/square":{geometry:["point","area"],fields:["name"],tags:{place:"square"},name:"Square"},"place/suburb":{icon:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"suburb"},terms:["boro","borough","quarter"],name:"Borough / Suburb"},"place/town":{icon:"maki-town",fields:["name","population"],geometry:["point","area"],tags:{place:"town"},name:"Town"},"place/village":{icon:"maki-village",fields:["name","population"],geometry:["point","area"],tags:{place:"village"},name:"Village"},"playground/balance_beam":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"balancebeam"},name:"Play Balance Beam"},"playground/basket_spinner":{icon:"maki-playground",geometry:["point"],terms:["basket rotator"],tags:{playground:"basketrotator"},name:"Basket Spinner"},"playground/basket_swing":{icon:"maki-playground",geometry:["point"],tags:{playground:"basketswing"},name:"Basket Swing"},"playground/climbing_frame":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"climbingframe"},name:"Climbing Frame"},"playground/cushion":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"cushion"},name:"Bouncy Cushion"},"playground/horizontal_bar":{icon:"maki-pitch",fields:["height"],geometry:["point"],terms:["high bar"],tags:{playground:"horizontal_bar"},name:"Play Horizontal Bar"},"playground/rocker":{icon:"maki-playground",geometry:["point"],tags:{playground:"springy"},name:"Spring Rider",terms:["spring rocker","springy rocker"]},"playground/roundabout":{icon:"maki-stadium",fields:["bench"],geometry:["point","area"],tags:{playground:"roundabout"},name:"Play Roundabout",terms:["merry-go-round"]},"playground/sandpit":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"sandpit"},name:"Sandpit"},"playground/seesaw":{icon:"maki-playground",geometry:["point"],tags:{playground:"seesaw"},name:"Seesaw"},"playground/slide":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"slide"},name:"Slide"},"playground/structure":{icon:"maki-pitch",geometry:["point","area"],tags:{playground:"structure"},name:"Play Structure"},"playground/swing":{icon:"maki-playground",fields:["capacity","playground/baby","wheelchair"],geometry:["point"],tags:{playground:"swing"},name:"Swing"},"playground/zipwire":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"zipwire"},name:"Zip Wire"},point:{fields:["name"],geometry:["point"],tags:{},name:"Point",matchScore:0.1},"power/sub_station":{icon:"temaki-power",fields:["substation","operator","building","ref"],geometry:["point","area"],tags:{power:"sub_station"},reference:{key:"power",value:"substation"},name:"Substation",searchable:false},"power/cable/underground":{fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"cable",location:"underground"},name:"Underground Power Cable"},"power/generator":{icon:"temaki-power",fields:["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],geometry:["point","vertex","area"],terms:["hydro","solar","turbine","wind"],tags:{power:"generator"},name:"Power Generator"},"power/generator/method/photovoltaic":{icon:"fas-solar-panel",fields:["operator","generator/output/electricity","ref"],geometry:["point","vertex","area"],terms:["photovoltaic module","PV module","sunlight"],tags:{power:"generator","generator:source":"solar","generator:method":"photovoltaic","generator:type":"solar_photovoltaic_panel"},addTags:{power:"generator","generator:source":"solar","generator:method":"photovoltaic","generator:type":"solar_photovoltaic_panel","generator:output:electricity":"yes"},removeTags:{power:"generator","generator:source":"solar","generator:method":"photovoltaic","generator:type":"solar_photovoltaic_panel","generator:output:electricity":"yes"},reference:{key:"generator:method",value:"photovoltaic"},name:"Solar Panel"},"power/generator/source/nuclear":{icon:"temaki-radiation",fields:["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],geometry:["point","vertex","area"],terms:["fission","generator","nuclear","nuke","reactor"],tags:{power:"generator","generator:source":"nuclear","generator:method":"fission"},reference:{key:"generator:source",value:"nuclear"},name:"Nuclear Reactor"},"power/generator/source/wind":{icon:"temaki-wind_turbine",fields:["operator","generator/source","generator/method","generator/type","generator/output/electricity","height","ref"],geometry:["point","vertex","area"],terms:["generator","turbine","windmill","wind"],tags:{power:"generator","generator:source":"wind","generator:method":"wind_turbine"},reference:{key:"generator:source",value:"wind"},name:"Wind Turbine"},"power/line":{icon:"iD-power-line",fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"line"},name:"Power Line"},"power/minor_line":{icon:"iD-power-line",fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"minor_line"},name:"Minor Power Line"},"power/plant":{icon:"maki-industry",fields:["name","operator","address","plant/output/electricity","start_date"],geometry:["area"],tags:{power:"plant"},addTags:{power:"plant",landuse:"industrial"},removeTags:{power:"plant",landuse:"industrial"},terms:["coal","gas","generat*","hydro","nuclear","power","station"],name:"Power Station Grounds"},"power/pole":{fields:["ref"],geometry:["point","vertex"],tags:{power:"pole"},name:"Power Pole"},"power/substation":{icon:"temaki-power",fields:["substation","operator","building","ref"],geometry:["point","area"],tags:{power:"substation"},name:"Substation"},"power/switch":{icon:"temaki-power",fields:["switch","operator","location","cables","voltage","ref"],geometry:["point","vertex","area"],tags:{power:"switch"},name:"Power Switch"},"power/tower":{fields:["design","ref"],geometry:["point","vertex"],terms:["power"],tags:{power:"tower"},name:"High-Voltage Tower"},"power/transformer":{icon:"temaki-power",fields:["transformer","operator","location","rating","devices","phases","frequency","voltage/primary","voltage/secondary","voltage/tertiary","windings","windings/configuration","ref"],geometry:["point","vertex","area"],tags:{power:"transformer"},name:"Transformer"},"public_transport/linear_platform_aerialway":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",aerialway:"yes"},reference:{key:"public_transport",value:"platform"},terms:["aerialway","cable car","platform","public transit","public transportation","transit","transportation"],name:"Aerialway Stop / Platform"},"public_transport/linear_platform_bus":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter","passenger_information_display"],geometry:["line"],tags:{public_transport:"platform",bus:"yes"},addTags:{public_transport:"platform",bus:"yes",highway:"bus_stop"},removeTags:{public_transport:"platform",bus:"yes",highway:"bus_stop"},reference:{key:"public_transport",value:"platform"},terms:["bus","platform","public transit","public transportation","transit","transportation"],name:"Bus Stop / Platform"},"public_transport/linear_platform_ferry":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",ferry:"yes"},reference:{key:"public_transport",value:"platform"},terms:["boat","dock","ferry","pier","platform","public transit","public transportation","transit","transportation"],name:"Ferry Stop / Platform"},"public_transport/linear_platform_light_rail":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",light_rail:"yes"},addTags:{public_transport:"platform",light_rail:"yes",railway:"platform"},removeTags:{public_transport:"platform",light_rail:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],name:"Light Rail Stop / Platform"},"public_transport/linear_platform_monorail":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",monorail:"yes"},addTags:{public_transport:"platform",monorail:"yes",railway:"platform"},removeTags:{public_transport:"platform",monorail:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["monorail","platform","public transit","public transportation","rail","transit","transportation"],name:"Monorail Stop / Platform"},"public_transport/linear_platform_subway":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",subway:"yes"},addTags:{public_transport:"platform",subway:"yes",railway:"platform"},removeTags:{public_transport:"platform",subway:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],name:"Subway Stop / Platform"},"public_transport/linear_platform_train":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",train:"yes"},addTags:{public_transport:"platform",train:"yes",railway:"platform"},removeTags:{public_transport:"platform",train:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["platform","public transit","public transportation","rail","track","train","transit","transportation"],name:"Train Stop / Platform"},"public_transport/linear_platform_tram":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter","passenger_information_display"],geometry:["line"],tags:{public_transport:"platform",tram:"yes"},addTags:{public_transport:"platform",tram:"yes",railway:"platform"},removeTags:{public_transport:"platform",tram:"yes",railway:"platform"},reference:{key:"public_transport",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],name:"Tram Stop / Platform"},"public_transport/linear_platform_trolleybus":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",trolleybus:"yes"},addTags:{public_transport:"platform",trolleybus:"yes",highway:"bus_stop"},removeTags:{public_transport:"platform",trolleybus:"yes",highway:"bus_stop"},reference:{key:"public_transport",value:"platform"},terms:["bus","electric","platform","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Stop / Platform"},"public_transport/linear_platform":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform"},terms:["platform","public transit","public transportation","transit","transportation"],name:"Transit Stop / Platform",matchScore:0.2},"public_transport/platform_aerialway":{icon:"maki-aerialway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",aerialway:"yes"},reference:{key:"public_transport",value:"platform"},terms:["aerialway","cable car","platform","public transit","public transportation","transit","transportation"],name:"Aerialway Stop / Platform"},"public_transport/platform_bus":{icon:"maki-bus",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter","passenger_information_display"],geometry:["point","area"],tags:{public_transport:"platform",bus:"yes"},addTags:{public_transport:"platform",bus:"yes",highway:"bus_stop"},removeTags:{public_transport:"platform",bus:"yes",highway:"bus_stop"},reference:{key:"public_transport",value:"platform"},terms:["bus","platform","public transit","public transportation","transit","transportation"],name:"Bus Stop / Platform"},"public_transport/platform_ferry":{icon:"maki-ferry",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",ferry:"yes"},reference:{key:"public_transport",value:"platform"},terms:["boat","dock","ferry","pier","platform","public transit","public transportation","transit","transportation"],name:"Ferry Stop / Platform"},"public_transport/platform_light_rail":{icon:"temaki-light_rail",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",light_rail:"yes"},addTags:{public_transport:"platform",light_rail:"yes",railway:"platform"},removeTags:{public_transport:"platform",light_rail:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],name:"Light Rail Stop / Platform"},"public_transport/platform_monorail":{icon:"temaki-monorail",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",monorail:"yes"},addTags:{public_transport:"platform",monorail:"yes",railway:"platform"},removeTags:{public_transport:"platform",monorail:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["monorail","platform","public transit","public transportation","rail","transit","transportation"],name:"Monorail Stop / Platform"},"public_transport/platform_subway":{icon:"temaki-subway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",subway:"yes"},addTags:{public_transport:"platform",subway:"yes",railway:"platform"},removeTags:{public_transport:"platform",subway:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],name:"Subway Stop / Platform"},"public_transport/platform_train":{icon:"maki-rail",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",train:"yes"},addTags:{public_transport:"platform",train:"yes",railway:"platform"},removeTags:{public_transport:"platform",train:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["platform","public transit","public transportation","rail","track","train","transit","transportation"],name:"Train Stop / Platform"},"public_transport/platform_tram":{icon:"temaki-tram",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter","passenger_information_display"],geometry:["point","area"],tags:{public_transport:"platform",tram:"yes"},addTags:{public_transport:"platform",tram:"yes",railway:"platform"},removeTags:{public_transport:"platform",tram:"yes",railway:"platform"},reference:{key:"public_transport",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],name:"Tram Stop / Platform"},"public_transport/platform_trolleybus":{icon:"temaki-trolleybus",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",trolleybus:"yes"},addTags:{public_transport:"platform",trolleybus:"yes",highway:"bus_stop"},removeTags:{public_transport:"platform",trolleybus:"yes",highway:"bus_stop"},reference:{key:"public_transport",value:"platform"},terms:["bus","electric","platform","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Stop / Platform"},"public_transport/platform":{icon:"maki-bus",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform"},terms:["platform","public transit","public transportation","transit","transportation"],name:"Transit Stop / Platform",matchScore:0.2},"public_transport/station_aerialway":{icon:"maki-aerialway",fields:["name","network","operator","aerialway/access","aerialway/summer/access","elevation","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",aerialway:"yes"},reference:{key:"aerialway",value:"station"},terms:["aerialway","cable car","public transit","public transportation","station","terminal","transit","transportation"],name:"Aerialway Station"},"public_transport/station_bus":{icon:"maki-bus",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",bus:"yes"},addTags:{public_transport:"station",bus:"yes",amenity:"bus_station"},removeTags:{public_transport:"station",bus:"yes",amenity:"bus_station"},reference:{key:"amenity",value:"bus_station"},terms:["bus","public transit","public transportation","station","terminal","transit","transportation"],name:"Bus Station / Terminal"},"public_transport/station_ferry":{icon:"maki-ferry",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",ferry:"yes"},addTags:{public_transport:"station",ferry:"yes",amenity:"ferry_terminal"},removeTags:{public_transport:"station",ferry:"yes",amenity:"ferry_terminal"},reference:{key:"amenity",value:"ferry_terminal"},terms:["boat","dock","ferry","pier","public transit","public transportation","station","terminal","transit","transportation"],name:"Ferry Station / Terminal"},"public_transport/station_light_rail":{icon:"temaki-light_rail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",light_rail:"yes"},addTags:{public_transport:"station",light_rail:"yes",railway:"station",station:"light_rail"},removeTags:{public_transport:"station",light_rail:"yes",railway:"station",station:"light_rail"},reference:{key:"station",value:"light_rail"},terms:["electric","light rail","public transit","public transportation","rail","station","terminal","track","tram","trolley","transit","transportation"],name:"Light Rail Station"},"public_transport/station_monorail":{icon:"temaki-monorail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",monorail:"yes"},addTags:{public_transport:"station",monorail:"yes",railway:"station"},removeTags:{public_transport:"station",monorail:"yes",railway:"station"},reference:{key:"railway",value:"station"},terms:["monorail","public transit","public transportation","rail","station","terminal","transit","transportation"],name:"Monorail Station"},"public_transport/station_subway":{icon:"temaki-subway",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",subway:"yes"},addTags:{public_transport:"station",subway:"yes",railway:"station",station:"subway"},removeTags:{public_transport:"station",subway:"yes",railway:"station",station:"subway"},reference:{key:"station",value:"subway"},terms:["metro","public transit","public transportation","rail","station","subway","terminal","track","transit","transportation","underground"],name:"Subway Station"},"public_transport/station_train_halt":{icon:"maki-rail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",train:"yes",railway:"halt"},reference:{key:"railway",value:"halt"},terms:["halt","public transit","public transportation","rail","station","track","train","transit","transportation","whistle stop"],name:"Train Station (Halt / Request)"},"public_transport/station_train":{icon:"maki-rail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",train:"yes"},addTags:{public_transport:"station",train:"yes",railway:"station"},removeTags:{public_transport:"station",train:"yes",railway:"station"},reference:{key:"railway",value:"station"},terms:["public transit","public transportation","rail","station","terminal","track","train","transit","transportation"],name:"Train Station"},"public_transport/station_tram":{icon:"temaki-tram",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",tram:"yes"},reference:{key:"public_transport",value:"station"},terms:["electric","light rail","public transit","public transportation","rail","station","streetcar","terminal","track","tram","trolley","transit","transportation"],name:"Tram Station"},"public_transport/station_trolleybus":{icon:"temaki-trolleybus",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",trolleybus:"yes"},addTags:{public_transport:"station",trolleybus:"yes",amenity:"bus_station"},removeTags:{public_transport:"station",trolleybus:"yes",amenity:"bus_station"},reference:{key:"amenity",value:"bus_station"},terms:["bus","electric","public transit","public transportation","station","streetcar","terminal","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Station / Terminal"},"public_transport/station":{icon:"maki-rail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station"},terms:["public transit","public transportation","station","terminal","transit","transportation"],name:"Transit Station",matchScore:0.2},"public_transport/stop_area":{icon:"maki-bus",fields:["name","ref","network","operator"],geometry:["relation"],tags:{type:"public_transport",public_transport:"stop_area"},addTags:{type:"public_transport",public_transport:"stop_area","public_transport:version":"2"},removeTags:{type:"public_transport",public_transport:"stop_area","public_transport:version":"2"},reference:{key:"public_transport",value:"stop_area"},name:"Transit Stop Area"},"public_transport/stop_position_aerialway":{icon:"maki-aerialway",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",aerialway:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["aerialway","cable car","public transit","public transportation","transit","transportation"],name:"Aerialway Stopping Location"},"public_transport/stop_position_bus":{icon:"maki-bus",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",bus:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["bus","public transit","public transportation","transit","transportation"],name:"Bus Stopping Location"},"public_transport/stop_position_ferry":{icon:"maki-ferry",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",ferry:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["boat","dock","ferry","pier","public transit","public transportation","transit","transportation"],name:"Ferry Stopping Location"},"public_transport/stop_position_light_rail":{icon:"temaki-light_rail",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",light_rail:"yes"},addTags:{public_transport:"stop_position",light_rail:"yes",railway:"stop"},removeTags:{public_transport:"stop_position",light_rail:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["electric","light rail","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],name:"Light Rail Stopping Location"},"public_transport/stop_position_monorail":{icon:"temaki-monorail",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",monorail:"yes"},addTags:{public_transport:"stop_position",monorail:"yes",railway:"stop"},removeTags:{public_transport:"stop_position",monorail:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["monorail","public transit","public transportation","rail","transit","transportation"],name:"Monorail Stopping Location"},"public_transport/stop_position_subway":{icon:"temaki-subway",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",subway:"yes"},addTags:{public_transport:"stop_position",subway:"yes",railway:"stop"},removeTags:{public_transport:"stop_position",subway:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["metro","public transit","public transportation","rail","subway","track","transit","transportation","underground"],name:"Subway Stopping Location"},"public_transport/stop_position_train":{icon:"maki-rail",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",train:"yes"},addTags:{public_transport:"stop_position",train:"yes",railway:"stop"},removeTags:{public_transport:"stop_position",train:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["public transit","public transportation","rail","track","train","transit","transportation"],name:"Train Stopping Location"},"public_transport/stop_position_tram":{icon:"temaki-tram",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",tram:"yes"},addTags:{public_transport:"stop_position",tram:"yes",railway:"tram_stop"},removeTags:{public_transport:"stop_position",tram:"yes",railway:"tram_stop"},reference:{key:"public_transport",value:"stop_position"},terms:["electric","light rail","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],name:"Tram Stopping Location"},"public_transport/stop_position_trolleybus":{icon:"temaki-trolleybus",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",trolleybus:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["bus","electric","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Stopping Location"},"public_transport/stop_position":{icon:"maki-bus",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position"},terms:["public transit","public transportation","transit","transportation"],name:"Transit Stopping Location",matchScore:0.2},"railway/halt":{icon:"maki-rail",geometry:["point","vertex"],tags:{railway:"halt"},terms:["break","interrupt","rest","wait","interruption"],name:"Train Station (Halt / Request)",searchable:false},"railway/platform":{icon:"iD-highway-footway",fields:["name","ref_platform","surface","lit","shelter"],geometry:["line","area"],tags:{railway:"platform"},name:"Train Stop / Platform",searchable:false},"railway/station":{icon:"maki-rail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","vertex","area"],tags:{railway:"station"},terms:["train station","station"],name:"Train Station",searchable:false},"railway/tram_stop":{icon:"temaki-tram",fields:["name","network","operator"],geometry:["vertex"],tags:{railway:"tram_stop"},terms:["light rail","streetcar","tram","trolley"],name:"Tram Stopping Position",searchable:false},"railway/abandoned":{icon:"iD-railway-abandoned",fields:["name","structure","service_rail","usage_rail"],geometry:["line"],tags:{railway:"abandoned"},terms:[],name:"Abandoned Railway"},"railway/buffer_stop":{icon:"temaki-buffer_stop",geometry:["vertex"],tags:{railway:"buffer_stop"},terms:["stop","halt","buffer"],name:"Buffer Stop"},"railway/crossing":{icon:"temaki-pedestrian",geometry:["vertex"],tags:{railway:"crossing"},terms:["crossing","pedestrian crossing","railroad crossing","level crossing","grade crossing","path through railroad","train crossing"],name:"Railway Crossing (Path)"},"railway/derail":{icon:"maki-roadblock",geometry:["vertex"],tags:{railway:"derail"},terms:["derailer"],name:"Railway Derailer"},"railway/disused":{icon:"iD-railway-disused",fields:["structure","service_rail","usage_rail"],geometry:["line"],tags:{railway:"disused"},terms:[],name:"Disused Railway"},"railway/funicular":{icon:"iD-railway-rail",geometry:["line"],terms:["venicular","cliff railway","cable car","cable railway","funicular railway"],fields:["structure","gauge","service_rail"],tags:{railway:"funicular"},name:"Funicular"},"railway/level_crossing":{icon:"maki-cross",geometry:["vertex"],tags:{railway:"level_crossing"},terms:["crossing","railroad crossing","level crossing","grade crossing","road through railroad","train crossing"],name:"Railway Crossing (Road)"},"railway/light_rail":{icon:"iD-railway-light-rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"light_rail"},terms:["light rail","streetcar","trolley"],name:"Light Rail"},"railway/milestone":{icon:"temaki-milestone",geometry:["point","vertex"],fields:["railway/position","direction_vertex"],tags:{railway:"milestone"},terms:["milestone","marker"],name:"Railway Milestone"},"railway/miniature":{icon:"iD-railway-rail",geometry:["line"],tags:{railway:"miniature"},fields:["name","structure","gauge","electrified","service_rail"],terms:["rideable miniature railway","narrow gauge railway","minimum gauge railway"],name:"Miniature Railway"},"railway/monorail":{icon:"iD-railway-monorail",fields:["name","structure","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"monorail"},terms:[],name:"Monorail"},"railway/narrow_gauge":{icon:"iD-railway-rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"narrow_gauge"},terms:["narrow gauge railway","narrow gauge railroad"],name:"Narrow Gauge Rail"},"railway/rail":{icon:"iD-railway-rail",fields:["name","structure","gauge","electrified","maxspeed","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"rail"},terms:[],name:"Rail"},"railway/signal":{icon:"temaki-railway_signals",geometry:["point","vertex"],fields:["railway/position","railway/signal/direction","ref"],tags:{railway:"signal"},terms:["signal","lights"],name:"Railway Signal"},"railway/subway_entrance":{icon:"maki-entrance",geometry:["point","vertex"],fields:["name"],tags:{railway:"subway_entrance"},terms:["metro","transit"],name:"Subway Entrance"},"railway/subway":{icon:"iD-railway-subway",fields:["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"subway"},terms:["metro","transit"],name:"Subway"},"railway/switch":{icon:"temaki-junction",geometry:["vertex"],tags:{railway:"switch"},terms:["switch","points"],name:"Railway Switch"},"railway/train_wash":{icon:"maki-rail",geometry:["point","vertex","area"],fields:["operator","building_area"],tags:{railway:"wash"},terms:["wash","clean"],name:"Train Wash"},"railway/tram":{icon:"iD-railway-light-rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"tram"},terms:["light rail","streetcar","tram","trolley"],name:"Tram"},relation:{icon:"iD-relation",fields:["name","relation"],geometry:["relation"],tags:{},name:"Relation"},"route/ferry":{icon:"iD-ferry-line",geometry:["line"],fields:["name","operator","duration","access","to","from"],tags:{route:"ferry"},name:"Ferry Route"},"seamark/beacon_isolated_danger":{fields:["ref","operator","seamark/beacon_isolated_danger/shape"],geometry:["point","vertex"],terms:["beacon isolated danger","isolated danger beacon","iala"],tags:{"seamark:type":"beacon_isolated_danger"},name:"Danger Beacon"},"seamark/beacon_lateral":{fields:["ref","operator","seamark/beacon_lateral/colour","seamark/beacon_lateral/category","seamark/beacon_lateral/shape","seamark/beacon_lateral/system"],geometry:["point","vertex"],terms:["lateral beacon","beacon lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"beacon_lateral"},name:"Channel Beacon"},"seamark/buoy_lateral":{fields:["ref","operator","seamark/buoy_lateral/colour","seamark/buoy_lateral/category","seamark/buoy_lateral/shape","seamark/buoy_lateral/system"],geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral"},name:"Channel Buoy"},"seamark/buoy_lateral/green":{fields:["ref","operator","seamark/buoy_lateral/colour","seamark/buoy_lateral/category","seamark/buoy_lateral/shape","seamark/buoy_lateral/system"],geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral","seamark:buoy_lateral:colour":"green"},name:"Green Buoy"},"seamark/buoy_lateral/red":{fields:["ref","operator","seamark/buoy_lateral/colour","seamark/buoy_lateral/category","seamark/buoy_lateral/shape","seamark/buoy_lateral/system"],geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral","seamark:buoy_lateral:colour":"red"},name:"Red Buoy"},"seamark/mooring":{fields:["ref","operator","seamark/mooring/category"],geometry:["point"],terms:["dolphin","pile","bollard","buoy","post"],tags:{"seamark:type":"mooring"},name:"Mooring"},shop:{icon:"maki-shop",fields:["name","shop","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"*"},terms:[],name:"Shop"},"shop/fishmonger":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"fishmonger"},reference:{key:"shop",value:"seafood"},name:"Fishmonger",searchable:false},"shop/furnace":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["oven","stove"],tags:{shop:"furnace"},name:"Furnace Store",searchable:false},"shop/vacant":{icon:"maki-shop",fields:["name","address","building_area"],geometry:["point","area"],tags:{shop:"vacant"},name:"Vacant Shop",searchable:false},"shop/agrarian":{icon:"maki-shop",fields:["name","operator","agrarian","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["agricultural inputs","agricultural machines","seeds","pesticides","fertilizer","agricultural tools"],tags:{shop:"agrarian"},name:"Farm Supply Shop"},"shop/alcohol":{icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],terms:["alcohol","beer","booze","wine"],tags:{shop:"alcohol"},name:"Liquor Store"},"shop/anime":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"anime"},terms:["manga","japan","cosplay","figurine","dakimakura"],name:"Anime Shop"},"shop/antiques":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"antiques"},name:"Antiques Shop"},"shop/appliance":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["air conditioner","appliance","dishwasher","dryer","freezer","fridge","grill","kitchen","oven","refrigerator","stove","washer","washing machine"],tags:{shop:"appliance"},name:"Appliance Store"},"shop/art":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["art*","exhibit*","gallery"],tags:{shop:"art"},name:"Art Store"},"shop/baby_goods":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"baby_goods"},name:"Baby Goods Store"},"shop/bag":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["handbag","purse"],tags:{shop:"bag"},name:"Bag/Luggage Store"},"shop/bakery":{icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery"},name:"Bakery"},"shop/bathroom_furnishing":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bathroom_furnishing"},name:"Bathroom Furnishing Store"},"shop/beauty":{icon:"maki-shop",fields:["name","operator","address","building_area","beauty","opening_hours","payment_multi"],geometry:["point","area"],terms:["spa","salon","tanning"],tags:{shop:"beauty"},name:"Beauty Shop"},"shop/beauty/nails":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["manicure","pedicure"],tags:{shop:"beauty",beauty:"nails"},reference:{key:"shop",value:"beauty"},name:"Nail Salon"},"shop/beauty/tanning":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beauty",beauty:"tanning"},reference:{key:"leisure",value:"tanning_salon"},name:"Tanning Salon"},"shop/bed":{icon:"maki-lodging",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bed"},name:"Bedding/Mattress Store"},"shop/beverages":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beverages"},name:"Beverage Store"},"shop/bicycle":{icon:"maki-bicycle",fields:["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],geometry:["point","area"],terms:["bike","repair"],tags:{shop:"bicycle"},name:"Bicycle Shop"},"shop/bookmaker":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["betting"],tags:{shop:"bookmaker"},name:"Bookmaker"},"shop/books":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books"},name:"Book Store"},"shop/boutique":{icon:"maki-shop",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"boutique"},name:"Boutique"},"shop/butcher":{icon:"maki-slaughterhouse",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["meat"],tags:{shop:"butcher"},name:"Butcher"},"shop/candles":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"candles"},name:"Candle Shop"},"shop/car_parts":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["auto"],tags:{shop:"car_parts"},name:"Car Parts Store"},"shop/car_repair":{icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],terms:["auto","garage","service"],tags:{shop:"car_repair"},name:"Car Repair Shop"},"shop/car":{icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],terms:["auto"],tags:{shop:"car"},name:"Car Dealership"},"shop/carpet":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["rug"],tags:{shop:"carpet"},name:"Carpet Store"},"shop/catalogue":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"catalogue"},name:"Catalog Shop"},"shop/charity":{icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],terms:["thrift","op shop","nonprofit"],tags:{shop:"charity"},name:"Charity Store"},"shop/cheese":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cheese"},name:"Cheese Store"},"shop/chemist":{icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist"},terms:["apothecary","med*","drug*","gift"],name:"Drugstore"},"shop/chocolate":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chocolate"},name:"Chocolate Store"},"shop/clothes":{icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes"},name:"Clothing Store"},"shop/coffee":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"coffee"},name:"Coffee Store"},"shop/computer":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"computer"},name:"Computer Store"},"shop/confectionery":{icon:"maki-confectionary",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["sweet"],tags:{shop:"confectionery"},name:"Candy Store"},"shop/convenience":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience"},name:"Convenience Store"},"shop/copyshop":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"copyshop"},name:"Copy Store"},"shop/cosmetics":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cosmetics"},name:"Cosmetics Store"},"shop/country_store":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"country_store"},name:"Country Store"},"shop/craft":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"craft"},terms:["art*","paint*","frame"],name:"Arts and Crafts Store"},"shop/curtain":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["drape*","window"],tags:{shop:"curtain"},name:"Curtain Store"},"shop/dairy":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["milk","egg","cheese"],tags:{shop:"dairy"},name:"Dairy Store"},"shop/deli":{icon:"maki-restaurant",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["lunch","meat","sandwich"],tags:{shop:"deli"},name:"Deli"},"shop/department_store":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store"},name:"Department Store"},"shop/doityourself":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself"},name:"DIY Store"},"shop/dry_cleaning":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"dry_cleaning"},name:"Dry Cleaner"},"shop/e-cigarette":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"e-cigarette"},terms:["electronic","vapor"],name:"E-Cigarette Shop"},"shop/electronics":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["appliance","audio","blueray","camera","computer","dvd","home theater","radio","speaker","tv","video"],tags:{shop:"electronics"},name:"Electronics Store"},"shop/erotic":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["sex","porn"],tags:{shop:"erotic"},name:"Erotic Store"},"shop/fabric":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["sew"],tags:{shop:"fabric"},name:"Fabric Store"},"shop/farm":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["farm shop","farm stand"],tags:{shop:"farm"},name:"Produce Stand"},"shop/fashion":{icon:"maki-shop",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"fashion"},name:"Fashion Store"},"shop/florist":{icon:"maki-florist",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["flower"],tags:{shop:"florist"},name:"Florist"},"shop/frame":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"frame"},terms:["art*","paint*","photo*","frame"],name:"Framing Shop"},"shop/funeral_directors":{icon:"maki-cemetery",fields:["name","operator","address","building_area","religion","denomination"],geometry:["point","area"],terms:["undertaker","memorial home"],tags:{shop:"funeral_directors"},name:"Funeral Home"},"shop/furniture":{icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["chair","sofa","table"],tags:{shop:"furniture"},name:"Furniture Store"},"shop/garden_centre":{icon:"maki-garden-center",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["landscape","mulch","shrub","tree"],tags:{shop:"garden_centre"},name:"Garden Center"},"shop/gas":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["cng","lpg","natural gas","propane","refill","tank"],tags:{shop:"gas"},name:"Bottled Gas Shop"},"shop/gift":{icon:"maki-gift",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["souvenir"],tags:{shop:"gift"},name:"Gift Shop"},"shop/greengrocer":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["fruit","vegetable"],tags:{shop:"greengrocer"},name:"Greengrocer"},"shop/hairdresser_supply":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["barber","shampoo","conditioner"],tags:{shop:"hairdresser_supply"},name:"Hairdresser Supply Store"},"shop/hairdresser":{icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["barber"],tags:{shop:"hairdresser"},name:"Hairdresser"},"shop/hardware":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hardware"},name:"Hardware Store"},"shop/health_food":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["wholefood","vitamins","vegetarian","vegan"],tags:{shop:"health_food"},name:"Health Food Shop"},"shop/hearing_aids":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hearing_aids"},name:"Hearing Aids Store"},"shop/herbalist":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"herbalist"},name:"Herbalist"},"shop/hifi":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["stereo","video"],tags:{shop:"hifi"},name:"Hifi Store"},"shop/houseware":{icon:"fas-blender",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["home","household"],tags:{shop:"houseware"},name:"Houseware Store"},"shop/interior_decoration":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"interior_decoration"},name:"Interior Decoration Store"},"shop/jewelry":{icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["diamond","gem","ring"],tags:{shop:"jewelry"},name:"Jeweler"},"shop/kiosk":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],geometry:["point","area"],tags:{shop:"kiosk"},name:"Kiosk"},"shop/kitchen":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"kitchen"},name:"Kitchen Design Store"},"shop/laundry":{icon:"maki-laundry",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"laundry"},name:"Laundry"},"shop/leather":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"leather"},name:"Leather Store"},"shop/locksmith":{icon:"fas-key",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["key","lockpick"],tags:{shop:"locksmith"},name:"Locksmith"},"shop/lottery":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"lottery"},name:"Lottery Shop"},"shop/mall":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["shopping"],tags:{shop:"mall"},name:"Mall"},"shop/massage":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"massage"},name:"Massage Shop"},"shop/medical_supply":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"medical_supply"},name:"Medical Supply Store"},"shop/mobile_phone":{icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone"},name:"Mobile Phone Store"},"shop/money_lender":{icon:"maki-bank",fields:["name","operator","address","building_area","opening_hours","currency_multi"],geometry:["point","area"],tags:{shop:"money_lender"},name:"Money Lender"},"shop/motorcycle_repair":{icon:"fas-motorcycle",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],terms:["auto","bike","garage","motorcycle","repair","service"],tags:{shop:"motorcycle_repair"},name:"Motorcycle Repair Shop"},"shop/motorcycle":{icon:"fas-motorcycle",fields:["name","brand","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["bike"],tags:{shop:"motorcycle"},name:"Motorcycle Dealership"},"shop/music":{icon:"maki-music",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["CD","vinyl"],tags:{shop:"music"},name:"Music Store"},"shop/musical_instrument":{icon:"maki-music",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["guitar"],tags:{shop:"musical_instrument"},name:"Musical Instrument Store"},"shop/newsagent":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"newsagent"},name:"Newspaper/Magazine Shop"},"shop/nutrition_supplements":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"nutrition_supplements"},name:"Nutrition Supplements Store"},"shop/optician":{icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["eye","glasses"],tags:{shop:"optician"},name:"Optician"},"shop/organic":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket",organic:"only"},name:"Organic Goods Store"},"shop/outdoor":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["camping","climbing","hiking"],tags:{shop:"outdoor"},name:"Outdoors Store"},"shop/paint":{icon:"fas-paint-roller",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"paint"},name:"Paint Store"},"shop/party":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["balloons","costumes","decorations","invitations"],tags:{shop:"party"},name:"Party Supply Store"},"shop/pastry":{icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pastry"},terms:["patisserie","cake shop","cakery"],name:"Pastry Shop"},"shop/pawnbroker":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pawnbroker"},name:"Pawn Shop"},"shop/perfumery":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"perfumery"},name:"Perfume Store"},"shop/pet_grooming":{icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["dog"],tags:{shop:"pet_grooming"},name:"Pet Grooming Store"},"shop/pet":{icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["animal","cat","dog","fish","kitten","puppy","reptile"],tags:{shop:"pet"},name:"Pet Store"},"shop/photo":{icon:"maki-attraction",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["camera","film"],tags:{shop:"photo"},name:"Photography Store"},"shop/pyrotechnics":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pyrotechnics"},name:"Fireworks Store"},"shop/radiotechnics":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"radiotechnics"},name:"Radio/Electronic Component Store"},"shop/religion":{icon:"maki-shop",fields:["name","operator","address","building_area","religion","denomination","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"religion"},name:"Religious Store"},"shop/scuba_diving":{icon:"maki-swimming",fields:["name","operator","address","building_area","opening_hours","payment_multi","scuba_diving"],geometry:["point","area"],terms:["diving","scuba"],tags:{shop:"scuba_diving"},name:"Scuba Diving Shop"},"shop/seafood":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["fishmonger"],tags:{shop:"seafood"},name:"Seafood Shop"},"shop/second_hand":{icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],terms:["secondhand","second hand","resale","thrift","used"],tags:{shop:"second_hand"},name:"Consignment/Thrift Store"},"shop/sewing":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["haberdashery"],tags:{shop:"sewing"},name:"Sewing Supply Shop"},"shop/shoes":{icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes"},name:"Shoe Store"},"shop/sports":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports"},name:"Sporting Goods Store"},"shop/stationery":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["card","paper"],tags:{shop:"stationery"},name:"Stationery Store"},"shop/storage_rental":{icon:"fas-warehouse",fields:["name","operator","address","building","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"storage_rental"},name:"Storage Rental"},"shop/supermarket":{icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["grocery","store","shop"],tags:{shop:"supermarket"},name:"Supermarket"},"shop/tailor":{icon:"maki-clothing-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["clothes","suit"],tags:{shop:"tailor"},name:"Tailor"},"shop/tattoo":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tattoo"},name:"Tattoo Parlor"},"shop/tea":{icon:"maki-teahouse",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tea"},name:"Tea Store"},"shop/ticket":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"ticket"},name:"Ticket Seller"},"shop/tiles":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tiles"},name:"Tile Shop"},"shop/tobacco":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tobacco"},name:"Tobacco Shop"},"shop/toys":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys"},name:"Toy Store"},"shop/trade":{icon:"maki-shop",fields:["name","trade","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"trade"},name:"Trade Shop"},"shop/travel_agency":{icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency"},name:"Travel Agency"},"shop/tyres":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres"},name:"Tire Store"},"shop/vacuum_cleaner":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"vacuum_cleaner"},name:"Vacuum Cleaner Store"},"shop/variety_store":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store"},name:"Variety Store"},"shop/video_games":{icon:"maki-gaming",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"video_games"},name:"Video Game Store"},"shop/video":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["DVD"],tags:{shop:"video"},name:"Video Store"},"shop/watches":{icon:"maki-watch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"watches"},name:"Watches Shop"},"shop/water_sports":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"water_sports"},name:"Watersport/Swim Shop"},"shop/weapons":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["ammo","gun","knife","knives"],tags:{shop:"weapons"},name:"Weapon Shop"},"shop/wholesale":{icon:"maki-warehouse",fields:["name","operator","wholesale","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["warehouse club","cash and carry"],tags:{shop:"wholesale"},name:"Wholesale Store"},"shop/window_blind":{icon:"temaki-window",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"window_blind"},name:"Window Blind Store"},"shop/wine":{icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"wine"},name:"Wine Shop"},tourism:{icon:"maki-attraction",fields:["name","tourism"],geometry:["point","vertex","area"],tags:{tourism:"*"},name:"Tourism"},"tourism/alpine_hut":{icon:"maki-lodging",fields:["name","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],terms:["climbing hut"],tags:{tourism:"alpine_hut"},name:"Alpine Hut"},"tourism/apartment":{icon:"maki-lodging",fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"apartment"},name:"Guest Apartment / Condo"},"tourism/aquarium":{icon:"maki-aquarium",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["fish","sea","water"],tags:{tourism:"aquarium"},name:"Aquarium"},"tourism/artwork":{icon:"maki-art-gallery",fields:["name","artwork_type","artist"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork"},terms:["mural","sculpture","statue"],name:"Artwork"},"tourism/artwork/mural":{icon:"maki-art-gallery",fields:["name","artist"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"mural"},reference:{key:"artwork_type",value:"mural"},terms:["fresco","wall painting"],name:"Mural"},"tourism/artwork/sculpture":{icon:"maki-art-gallery",fields:["name","artist","material"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"sculpture"},reference:{key:"artwork_type",value:"sculpture"},terms:["statue","figure","carving"],name:"Sculpture"},"tourism/artwork/statue":{icon:"maki-art-gallery",fields:["name","artist","material"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"statue"},reference:{key:"artwork_type",value:"statue"},terms:["sculpture","figure","carving"],name:"Statue"},"tourism/attraction":{icon:"maki-star",fields:["name","operator","address"],geometry:["point","vertex","area"],tags:{tourism:"attraction"},name:"Tourist Attraction"},"tourism/camp_site":{icon:"maki-campsite",fields:["name","operator","address","access_simple","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","vertex","area"],terms:["tent","rv"],tags:{tourism:"camp_site"},name:"Campground"},"tourism/caravan_site":{icon:"maki-bus",fields:["name","operator","address","capacity","fee","sanitary_dump_station","power_supply","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","vertex","area"],terms:["Motor Home","Camper"],tags:{tourism:"caravan_site"},name:"RV Park"},"tourism/chalet":{icon:"maki-lodging",fields:["name","operator","address","building_area","smoking","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],terms:["holiday","holiday cottage","holiday home","vacation","vacation home"],tags:{tourism:"chalet"},name:"Holiday Cottage"},"tourism/gallery":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["art*","exhibit*","paint*","photo*","sculpt*"],tags:{tourism:"gallery"},name:"Art Gallery"},"tourism/guest_house":{icon:"maki-lodging",fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"guest_house"},terms:["B&B","Bed and Breakfast"],name:"Guest House"},"tourism/hostel":{icon:"maki-lodging",fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hostel"},name:"Hostel"},"tourism/hotel":{icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel"},name:"Hotel"},"tourism/information":{icon:"maki-information",fields:["information","operator","address","building_area"],geometry:["point","vertex","area"],tags:{tourism:"information"},name:"Information"},"tourism/information/board":{icon:"maki-information",fields:["name","operator","board_type","direction"],geometry:["point","vertex"],tags:{tourism:"information",information:"board"},reference:{key:"information",value:"board"},name:"Information Board"},"tourism/information/guidepost":{icon:"maki-information",fields:["name","elevation","operator","ref"],geometry:["point","vertex"],terms:["signpost"],tags:{tourism:"information",information:"guidepost"},reference:{key:"information",value:"guidepost"},name:"Guidepost"},"tourism/information/map":{icon:"maki-information",fields:["operator","map_type","map_size","direction"],geometry:["point","vertex"],tags:{tourism:"information",information:"map"},reference:{key:"information",value:"map"},name:"Map"},"tourism/information/office":{icon:"maki-information",fields:["name","operator","address","building_area"],geometry:["point","vertex","area"],tags:{tourism:"information",information:"office"},reference:{key:"information",value:"office"},name:"Tourist Information Office"},"tourism/motel":{icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"motel"},name:"Motel"},"tourism/museum":{icon:"maki-museum",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["art*","exhibit*","gallery","foundation","hall","institution","paint*","photo*","sculpt*"],tags:{tourism:"museum"},name:"Museum"},"tourism/picnic_site":{icon:"maki-picnic-site",fields:["name","operator","address","access_simple","capacity","smoking"],geometry:["point","vertex","area"],terms:["camp"],tags:{tourism:"picnic_site"},name:"Picnic Site"},"tourism/theme_park":{icon:"maki-amusement-park",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{tourism:"theme_park"},name:"Theme Park"},"tourism/trail_riding_station":{icon:"maki-horse-riding",fields:["name","horse_stables","horse_riding","horse_dressage","address","phone","website","description"],geometry:["point","area"],tags:{tourism:"trail_riding_station"},name:"Trail Riding Station",matchScore:2},"tourism/viewpoint":{icon:"temaki-binoculars",geometry:["point","vertex"],fields:["direction"],tags:{tourism:"viewpoint"},name:"Viewpoint"},"tourism/wilderness_hut":{icon:"maki-lodging",fields:["name","operator","address","building_area","fireplace"],geometry:["point","area"],terms:["wilderness hut","backcountry hut","bothy"],tags:{tourism:"wilderness_hut"},name:"Wilderness Hut"},"tourism/zoo":{icon:"maki-zoo",fields:["name","operator","address","opening_hours"],geometry:["point","area"],terms:["animal"],tags:{tourism:"zoo"},name:"Zoo"},traffic_calming:{icon:"temaki-diamond",fields:["traffic_calming","direction_vertex"],geometry:["vertex","line"],tags:{traffic_calming:"*"},terms:["bump","hump","slow","speed"],name:"Traffic Calming"},"traffic_calming/bump":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["hump","speed","slow"],tags:{traffic_calming:"bump"},name:"Speed Bump"},"traffic_calming/chicane":{icon:"temaki-diamond",fields:["direction_vertex"],geometry:["vertex","line"],terms:["driveway link","speed","slow"],tags:{traffic_calming:"chicane"},name:"Traffic Chicane"},"traffic_calming/choker":{icon:"temaki-diamond",fields:["direction_vertex"],geometry:["vertex","line"],terms:["speed","slow"],tags:{traffic_calming:"choker"},name:"Traffic Choker"},"traffic_calming/cushion":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["bump","hump","speed","slow"],tags:{traffic_calming:"cushion"},name:"Speed Cushion"},"traffic_calming/dip":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["speed","slow"],tags:{traffic_calming:"dip"},name:"Dip"},"traffic_calming/hump":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["bump","speed","slow"],tags:{traffic_calming:"hump"},name:"Speed Hump"},"traffic_calming/island":{icon:"temaki-diamond",geometry:["vertex"],terms:["circle","roundabout","slow"],tags:{traffic_calming:"island"},name:"Traffic Island"},"traffic_calming/rumble_strip":{icon:"temaki-diamond",fields:["direction_vertex"],geometry:["vertex","line"],terms:["audible lines","sleeper lines","growlers"],tags:{traffic_calming:"rumble_strip"},name:"Rumble Strip"},"traffic_calming/table":{icon:"temaki-diamond",fields:["surface"],geometry:["vertex"],tags:{traffic_calming:"table"},terms:["flat top","hump","speed","slow"],name:"Speed Table"},traffic_sign_vertex:{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction"],geometry:["vertex"],tags:{traffic_sign:"*"},terms:["road","highway"],name:"Traffic Sign"},traffic_sign:{icon:"maki-square-stroked",fields:["traffic_sign","direction"],geometry:["point"],tags:{traffic_sign:"*"},terms:["road","highway"],name:"Traffic Sign"},"traffic_sign/city_limit_vertex":{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction","name"],geometry:["vertex"],tags:{traffic_sign:"city_limit"},terms:["town","village","hamlet","boundary","edge","border","road","highway"],name:"City Limit Sign"},"traffic_sign/city_limit":{icon:"maki-square-stroked",fields:["traffic_sign","direction","name"],geometry:["point"],tags:{traffic_sign:"city_limit"},terms:["town","village","hamlet","boundary","edge","border","road","highway"],name:"City Limit Sign"},"traffic_sign/maxspeed_vertex":{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction","maxspeed"],geometry:["vertex"],tags:{traffic_sign:"maxspeed"},terms:["max speed","maximum speed","road","highway"],name:"Speed Limit Sign"},"traffic_sign/maxspeed":{icon:"maki-square-stroked",fields:["traffic_sign","direction","maxspeed"],geometry:["point"],tags:{traffic_sign:"maxspeed"},terms:["max speed","maximum speed","road","highway"],name:"Speed Limit Sign"},"type/multipolygon":{icon:"iD-multipolygon",geometry:["area","relation"],tags:{type:"multipolygon"},removeTags:{},name:"Multipolygon",searchable:false,matchScore:0.1},"type/boundary":{icon:"iD-boundary",fields:["name","boundary"],geometry:["relation"],tags:{type:"boundary"},name:"Boundary"},"type/boundary/administrative":{icon:"iD-boundary",fields:["name","admin_level"],geometry:["relation"],tags:{type:"boundary",boundary:"administrative"},reference:{key:"boundary",value:"administrative"},name:"Administrative Boundary"},"type/restriction":{icon:"iD-restriction",fields:["name","restriction","except"],geometry:["relation"],tags:{type:"restriction"},name:"Restriction"},"type/restriction/no_left_turn":{icon:"iD-restriction-no-left-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"no_left_turn"},name:"No Left Turn"},"type/restriction/no_right_turn":{icon:"iD-restriction-no-right-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"no_right_turn"},name:"No Right Turn"},"type/restriction/no_straight_on":{icon:"iD-restriction-no-straight-on",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"no_straight_on"},name:"No Straight On"},"type/restriction/no_u_turn":{icon:"iD-restriction-no-u-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"no_u_turn"},name:"No U-turn"},"type/restriction/only_left_turn":{icon:"iD-restriction-only-left-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"only_left_turn"},name:"Only Left Turn"},"type/restriction/only_right_turn":{icon:"iD-restriction-only-right-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"only_right_turn"},name:"Only Right Turn"},"type/restriction/only_straight_on":{icon:"iD-restriction-only-straight-on",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"only_straight_on"},name:"Only Straight On"},"type/restriction/only_u_turn":{icon:"iD-restriction-only-u-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"only_u_turn"},name:"Only U-turn"},"type/route_master":{icon:"iD-route-master",fields:["name","route_master","ref","operator","network"],geometry:["relation"],tags:{type:"route_master"},name:"Route Master"},"type/route":{icon:"iD-route",fields:["name","route","ref_route","operator","network"],geometry:["relation"],tags:{type:"route"},name:"Route"},"type/route/bicycle":{icon:"iD-route-bicycle",fields:["name","ref_route","network_bicycle","cycle_network","to","from"],geometry:["relation"],tags:{type:"route",route:"bicycle"},name:"Cycle Route"},"type/route/bus":{icon:"iD-route-bus",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"bus"},name:"Bus Route"},"type/route/detour":{icon:"iD-route-detour",fields:["name","ref_route","to","from"],geometry:["relation"],tags:{type:"route",route:"detour"},name:"Detour Route"},"type/route/ferry":{icon:"iD-route-ferry",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"ferry"},name:"Ferry Route"},"type/route/foot":{icon:"iD-route-foot",fields:["name","ref_route","operator","network_foot","to","from"],geometry:["relation"],tags:{type:"route",route:"foot"},name:"Foot Route"},"type/route/hiking":{icon:"iD-route-foot",fields:["name","ref_route","operator","network_foot","description","distance","to","from"],geometry:["relation"],tags:{type:"route",route:"hiking"},name:"Hiking Route"},"type/route/horse":{icon:"iD-route-horse",fields:["name","ref_route","operator","network_horse","description","distance","to","from"],geometry:["relation"],tags:{type:"route",route:"horse"},name:"Riding Route"},"type/route/light_rail":{icon:"iD-route-light-rail",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"light_rail"},name:"Light Rail Route"},"type/route/pipeline":{icon:"iD-route-pipeline",fields:["name","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"pipeline"},name:"Pipeline Route"},"type/route/piste":{icon:"iD-route-piste",fields:["name","piste/type","colour","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"piste"},name:"Piste/Ski Route"},"type/route/power":{icon:"iD-route-power",fields:["name","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"power"},name:"Power Route"},"type/route/road":{icon:"iD-route-road",fields:["name","ref_route","network_road","to","from"],geometry:["relation"],tags:{type:"route",route:"road"},name:"Road Route"},"type/route/subway":{icon:"iD-route-subway",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"subway"},name:"Subway Route"},"type/route/train":{icon:"iD-route-train",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"train"},name:"Train Route"},"type/route/tram":{icon:"iD-route-tram",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"tram"},name:"Tram Route"},"type/site":{icon:"iD-relation",fields:["name","site"],geometry:["relation"],tags:{type:"site"},name:"Site"},"type/waterway":{icon:"iD-route-water",fields:["name","waterway","ref"],geometry:["relation"],tags:{type:"waterway"},name:"Waterway"},vertex:{fields:["name"],geometry:["vertex"],tags:{},name:"Other",matchScore:0.1},"waterway/boatyard":{icon:"maki-harbor",fields:["name","operator"],geometry:["area","vertex","point"],tags:{waterway:"boatyard"},name:"Boatyard"},"waterway/canal":{icon:"iD-waterway-canal",fields:["name","width","intermittent"],geometry:["line"],tags:{waterway:"canal"},name:"Canal"},"waterway/dam":{icon:"maki-dam",geometry:["point","vertex","line","area"],fields:["name"],tags:{waterway:"dam"},name:"Dam"},"waterway/ditch":{icon:"iD-waterway-ditch",fields:["structure_waterway","intermittent"],geometry:["line"],tags:{waterway:"ditch"},name:"Ditch"},"waterway/dock":{icon:"maki-harbor",fields:["name","dock","operator"],geometry:["area","vertex","point"],terms:["boat","ship","vessel","marine"],tags:{waterway:"dock"},name:"Wet Dock / Dry Dock"},"waterway/drain":{icon:"iD-waterway-ditch",fields:["structure_waterway","intermittent"],geometry:["line"],tags:{waterway:"drain"},name:"Drain"},"waterway/fuel":{icon:"maki-fuel",fields:["name","operator","address","opening_hours","fuel_multi"],geometry:["point","area"],terms:["petrol","gas","diesel","boat"],tags:{waterway:"fuel"},name:"Marine Fuel Station"},"waterway/milestone":{icon:"temaki-milestone",geometry:["point","vertex"],fields:["distance","direction_vertex"],tags:{waterway:"milestone"},terms:["milestone","marker"],name:"Waterway Milestone"},"waterway/river":{icon:"iD-waterway-river",fields:["name","structure_waterway","width","intermittent"],geometry:["line"],terms:["beck","branch","brook","course","creek","estuary","rill","rivulet","run","runnel","stream","tributary","watercourse"],tags:{waterway:"river"},name:"River"},"waterway/riverbank":{icon:"maki-water",geometry:["area"],tags:{waterway:"riverbank"},name:"Riverbank"},"waterway/sanitary_dump_station":{icon:"temaki-storage_tank",fields:["name","operator","access_simple","fee","water_point"],geometry:["point","vertex","area"],terms:["Boat","Watercraft","Sanitary","Dump Station","Pumpout","Pump out","Elsan","CDP","CTDP","Chemical Toilet"],tags:{waterway:"sanitary_dump_station"},name:"Marine Toilet Disposal"},"waterway/stream_intermittent":{icon:"iD-waterway-stream",fields:["name","structure_waterway","width","intermittent"],geometry:["line"],terms:["arroyo","beck","branch","brook","burn","course","creek","drift","flood","flow","gully","run","runnel","rush","spate","spritz","tributary","wadi","wash","watercourse"],tags:{waterway:"stream",intermittent:"yes"},reference:{key:"waterway",value:"stream"},name:"Intermittent Stream"},"waterway/stream":{icon:"iD-waterway-stream",fields:["name","structure_waterway","width","intermittent"],geometry:["line"],terms:["beck","branch","brook","burn","course","creek","current","drift","flood","flow","freshet","race","rill","rindle","rivulet","run","runnel","rush","spate","spritz","surge","tide","torrent","tributary","watercourse"],tags:{waterway:"stream"},name:"Stream"},"waterway/water_point":{icon:"maki-drinking-water",geometry:["area","vertex","point"],tags:{waterway:"water_point"},name:"Marine Drinking Water"},"waterway/waterfall":{icon:"maki-waterfall",fields:["name","height","width","intermittent"],geometry:["vertex"],terms:["fall"],tags:{waterway:"waterfall"},name:"Waterfall"},"waterway/weir":{icon:"maki-dam",geometry:["vertex","line"],tags:{waterway:"weir"},name:"Weir"},"amenity/bank/ABANCA":{name:"ABANCA",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9598744"},addTags:{amenity:"bank",brand:"ABANCA","brand:wikidata":"Q9598744","brand:wikipedia":"es:Abanca",name:"ABANCA"},removeTags:{amenity:"bank",brand:"ABANCA","brand:wikidata":"Q9598744","brand:wikipedia":"es:Abanca",name:"ABANCA"},matchScore:2,suggestion:true},"amenity/bank/ABN AMRO":{name:"ABN AMRO",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q287471"},addTags:{amenity:"bank",brand:"ABN AMRO","brand:wikidata":"Q287471","brand:wikipedia":"en:ABN AMRO",name:"ABN AMRO"},removeTags:{amenity:"bank",brand:"ABN AMRO","brand:wikidata":"Q287471","brand:wikipedia":"en:ABN AMRO",name:"ABN AMRO"},matchScore:2,suggestion:true},"amenity/bank/ABSA":{name:"ABSA",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q331688"},addTags:{amenity:"bank",brand:"ABSA","brand:wikidata":"Q331688","brand:wikipedia":"en:ABSA Group Limited",name:"ABSA"},removeTags:{amenity:"bank",brand:"ABSA","brand:wikidata":"Q331688","brand:wikipedia":"en:ABSA Group Limited",name:"ABSA"},matchScore:2,suggestion:true},"amenity/bank/AIB":{name:"AIB",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1642179"},addTags:{amenity:"bank",brand:"AIB","brand:wikidata":"Q1642179","brand:wikipedia":"en:Allied Irish Banks",name:"AIB"},removeTags:{amenity:"bank",brand:"AIB","brand:wikidata":"Q1642179","brand:wikipedia":"en:Allied Irish Banks",name:"AIB"},matchScore:2,suggestion:true},"amenity/bank/ANZ":{name:"ANZ",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q714641"},addTags:{amenity:"bank",brand:"ANZ","brand:wikidata":"Q714641","brand:wikipedia":"en:Australia and New Zealand Banking Group",name:"ANZ"},removeTags:{amenity:"bank",brand:"ANZ","brand:wikidata":"Q714641","brand:wikipedia":"en:Australia and New Zealand Banking Group",name:"ANZ"},matchScore:2,suggestion:true},"amenity/bank/ASB Bank":{name:"ASB Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q297214"},addTags:{amenity:"bank",brand:"ASB Bank","brand:wikidata":"Q297214","brand:wikipedia":"en:ASB Bank",name:"ASB Bank"},removeTags:{amenity:"bank",brand:"ASB Bank","brand:wikidata":"Q297214","brand:wikipedia":"en:ASB Bank",name:"ASB Bank"},matchScore:2,suggestion:true},"amenity/bank/ATB Financial":{name:"ATB Financial",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q298762"},addTags:{amenity:"bank",brand:"ATB Financial","brand:wikidata":"Q298762","brand:wikipedia":"en:ATB Financial",name:"ATB Financial"},removeTags:{amenity:"bank",brand:"ATB Financial","brand:wikidata":"Q298762","brand:wikipedia":"en:ATB Financial",name:"ATB Financial"},matchScore:2,suggestion:true},"amenity/bank/AXA":{name:"AXA",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q160054"},addTags:{amenity:"bank",brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA"},removeTags:{amenity:"bank",brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA"},matchScore:2,suggestion:true},"amenity/bank/Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড":{name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q517050"},addTags:{amenity:"bank",brand:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড"},removeTags:{amenity:"bank",brand:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড"},matchScore:2,suggestion:true},"amenity/bank/Agribank":{name:"Agribank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4693829"},addTags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693829","brand:wikipedia":"en:AgriBank",name:"Agribank"},removeTags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693829","brand:wikipedia":"en:AgriBank",name:"Agribank"},matchScore:2,suggestion:true},"amenity/bank/Akbank":{name:"Akbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q416624"},addTags:{amenity:"bank",brand:"Akbank","brand:wikidata":"Q416624","brand:wikipedia":"en:Akbank",name:"Akbank"},removeTags:{amenity:"bank",brand:"Akbank","brand:wikidata":"Q416624","brand:wikipedia":"en:Akbank",name:"Akbank"},matchScore:2,suggestion:true},"amenity/bank/Alior Bank":{name:"Alior Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9148395"},addTags:{amenity:"bank",brand:"Alior Bank","brand:wikidata":"Q9148395","brand:wikipedia":"en:Alior Bank",name:"Alior Bank"},removeTags:{amenity:"bank",brand:"Alior Bank","brand:wikidata":"Q9148395","brand:wikipedia":"en:Alior Bank",name:"Alior Bank"},matchScore:2,suggestion:true},"amenity/bank/Allahabad Bank":{name:"Allahabad Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2018840"},addTags:{amenity:"bank",brand:"Allahabad Bank","brand:wikidata":"Q2018840","brand:wikipedia":"en:Allahabad Bank",name:"Allahabad Bank"},removeTags:{amenity:"bank",brand:"Allahabad Bank","brand:wikidata":"Q2018840","brand:wikipedia":"en:Allahabad Bank",name:"Allahabad Bank"},matchScore:2,suggestion:true},"amenity/bank/Allied Bank":{name:"Allied Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4732555"},addTags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732555","brand:wikipedia":"en:Allied Banking Corporation",name:"Allied Bank"},removeTags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732555","brand:wikipedia":"en:Allied Banking Corporation",name:"Allied Bank"},matchScore:2,suggestion:true},"amenity/bank/Alpha Bank":{name:"Alpha Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q747394"},addTags:{amenity:"bank",brand:"Alpha Bank","brand:wikidata":"Q747394","brand:wikipedia":"en:Alpha Bank",name:"Alpha Bank"},removeTags:{amenity:"bank",brand:"Alpha Bank","brand:wikidata":"Q747394","brand:wikipedia":"en:Alpha Bank",name:"Alpha Bank"},matchScore:2,suggestion:true},"amenity/bank/Andhra Bank":{name:"Andhra Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003476"},addTags:{amenity:"bank",brand:"Andhra Bank","brand:wikidata":"Q2003476","brand:wikipedia":"en:Andhra Bank",name:"Andhra Bank"},removeTags:{amenity:"bank",brand:"Andhra Bank","brand:wikidata":"Q2003476","brand:wikipedia":"en:Andhra Bank",name:"Andhra Bank"},matchScore:2,suggestion:true},"amenity/bank/Antonveneta":{name:"Antonveneta",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633689"},addTags:{amenity:"bank",brand:"Antonveneta","brand:wikidata":"Q3633689","brand:wikipedia":"en:Banca Antonveneta",name:"Antonveneta"},removeTags:{amenity:"bank",brand:"Antonveneta","brand:wikidata":"Q3633689","brand:wikipedia":"en:Banca Antonveneta",name:"Antonveneta"},matchScore:2,suggestion:true},"amenity/bank/Argenta":{name:"Argenta",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q932856"},addTags:{amenity:"bank",brand:"Argenta","brand:wikidata":"Q932856","brand:wikipedia":"en:Argenta (bank)",name:"Argenta"},removeTags:{amenity:"bank",brand:"Argenta","brand:wikidata":"Q932856","brand:wikipedia":"en:Argenta (bank)",name:"Argenta"},matchScore:2,suggestion:true},"amenity/bank/Arvest Bank":{name:"Arvest Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4802393"},addTags:{amenity:"bank",brand:"Arvest Bank","brand:wikidata":"Q4802393","brand:wikipedia":"en:Arvest Bank",name:"Arvest Bank"},removeTags:{amenity:"bank",brand:"Arvest Bank","brand:wikidata":"Q4802393","brand:wikipedia":"en:Arvest Bank",name:"Arvest Bank"},matchScore:2,suggestion:true},"amenity/bank/Asia United Bank":{name:"Asia United Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4806482"},addTags:{amenity:"bank",brand:"Asia United Bank","brand:wikidata":"Q4806482","brand:wikipedia":"en:Asia United Bank",name:"Asia United Bank"},removeTags:{amenity:"bank",brand:"Asia United Bank","brand:wikidata":"Q4806482","brand:wikipedia":"en:Asia United Bank",name:"Asia United Bank"},matchScore:2,suggestion:true},"amenity/bank/Askari Bank":{name:"Askari Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4807137"},addTags:{amenity:"bank",brand:"Askari Bank","brand:wikidata":"Q4807137","brand:wikipedia":"en:Askari Bank",name:"Askari Bank"},removeTags:{amenity:"bank",brand:"Askari Bank","brand:wikidata":"Q4807137","brand:wikipedia":"en:Askari Bank",name:"Askari Bank"},matchScore:2,suggestion:true},"amenity/bank/Associated Bank":{name:"Associated Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4809155"},addTags:{amenity:"bank",brand:"Associated Bank","brand:wikidata":"Q4809155","brand:wikipedia":"en:Associated Banc-Corp",name:"Associated Bank"},removeTags:{amenity:"bank",brand:"Associated Bank","brand:wikidata":"Q4809155","brand:wikipedia":"en:Associated Banc-Corp",name:"Associated Bank"},matchScore:2,suggestion:true},"amenity/bank/Attijariwafa Bank":{name:"Attijariwafa Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q758052"},addTags:{amenity:"bank",brand:"Attijariwafa Bank","brand:wikidata":"Q758052","brand:wikipedia":"en:Attijariwafa Bank",name:"Attijariwafa Bank"},removeTags:{amenity:"bank",brand:"Attijariwafa Bank","brand:wikidata":"Q758052","brand:wikipedia":"en:Attijariwafa Bank",name:"Attijariwafa Bank"},matchScore:2,suggestion:true},"amenity/bank/Axis Bank":{name:"Axis Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003549"},addTags:{amenity:"bank",brand:"Axis Bank","brand:wikidata":"Q2003549","brand:wikipedia":"en:Axis Bank",name:"Axis Bank"},removeTags:{amenity:"bank",brand:"Axis Bank","brand:wikidata":"Q2003549","brand:wikipedia":"en:Axis Bank",name:"Axis Bank"},matchScore:2,suggestion:true},"amenity/bank/BAC":{name:"BAC",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5715556"},addTags:{amenity:"bank",brand:"BAC","brand:wikidata":"Q5715556","brand:wikipedia":"en:Banco de America Central",name:"BAC"},removeTags:{amenity:"bank",brand:"BAC","brand:wikidata":"Q5715556","brand:wikipedia":"en:Banco de America Central",name:"BAC"},matchScore:2,suggestion:true},"amenity/bank/BAWAG PSK":{name:"BAWAG PSK",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q379938"},addTags:{amenity:"bank",brand:"BAWAG PSK","brand:wikidata":"Q379938","brand:wikipedia":"en:BAWAG P.S.K.",name:"BAWAG PSK"},removeTags:{amenity:"bank",brand:"BAWAG PSK","brand:wikidata":"Q379938","brand:wikipedia":"en:BAWAG P.S.K.",name:"BAWAG PSK"},matchScore:2,suggestion:true},"amenity/bank/BB&T":{name:"BB&T",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q795486"},addTags:{amenity:"bank",brand:"BB&T","brand:wikidata":"Q795486","brand:wikipedia":"en:BB&T",name:"BB&T"},removeTags:{amenity:"bank",brand:"BB&T","brand:wikidata":"Q795486","brand:wikipedia":"en:BB&T",name:"BB&T"},matchScore:2,suggestion:true},"amenity/bank/BBBank":{name:"BBBank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q795504"},addTags:{amenity:"bank",brand:"BBBank","brand:wikidata":"Q795504","brand:wikipedia":"en:BBBank",name:"BBBank"},removeTags:{amenity:"bank",brand:"BBBank","brand:wikidata":"Q795504","brand:wikipedia":"en:BBBank",name:"BBBank"},matchScore:2,suggestion:true},"amenity/bank/BBVA":{name:"BBVA",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806189"},addTags:{amenity:"bank",brand:"BBVA","brand:wikidata":"Q806189","brand:wikipedia":"en:Banco Bilbao Vizcaya Argentaria",name:"BBVA"},removeTags:{amenity:"bank",brand:"BBVA","brand:wikidata":"Q806189","brand:wikipedia":"en:Banco Bilbao Vizcaya Argentaria",name:"BBVA"},matchScore:2,suggestion:true},"amenity/bank/BBVA Bancomer":{name:"BBVA Bancomer",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2876794"},addTags:{amenity:"bank",brand:"BBVA Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"BBVA Bancomer"},removeTags:{amenity:"bank",brand:"BBVA Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"BBVA Bancomer"},matchScore:2,suggestion:true},"amenity/bank/BBVA Compass":{name:"BBVA Compass",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4835088"},addTags:{amenity:"bank",brand:"BBVA Compass","brand:wikidata":"Q4835088","brand:wikipedia":"en:BBVA Compass",name:"BBVA Compass"},removeTags:{amenity:"bank",brand:"BBVA Compass","brand:wikidata":"Q4835088","brand:wikipedia":"en:BBVA Compass",name:"BBVA Compass"},matchScore:2,suggestion:true},"amenity/bank/BBVA Continental":{name:"BBVA Continental",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4835089"},addTags:{amenity:"bank",brand:"BBVA Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"BBVA Continental"},removeTags:{amenity:"bank",brand:"BBVA Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"BBVA Continental"},matchScore:2,suggestion:true},"amenity/bank/BBVA Francés":{name:"BBVA Francés",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2876788"},addTags:{amenity:"bank",brand:"BBVA Francés","brand:wikidata":"Q2876788","brand:wikipedia":"en:BBVA Francés",name:"BBVA Francés"},removeTags:{amenity:"bank",brand:"BBVA Francés","brand:wikidata":"Q2876788","brand:wikipedia":"en:BBVA Francés",name:"BBVA Francés"},matchScore:2,suggestion:true},"amenity/bank/BCA":{name:"BCA",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806626"},addTags:{amenity:"bank",brand:"BCA","brand:wikidata":"Q806626","brand:wikipedia":"id:Bank Central Asia",name:"BCA"},removeTags:{amenity:"bank",brand:"BCA","brand:wikidata":"Q806626","brand:wikipedia":"id:Bank Central Asia",name:"BCA"},matchScore:2,suggestion:true},"amenity/bank/BCI":{name:"BCI",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882083"},addTags:{amenity:"bank",brand:"BCI","brand:wikidata":"Q2882083","brand:wikipedia":"es:Banco de Crédito e Inversiones",name:"BCI"},removeTags:{amenity:"bank",brand:"BCI","brand:wikidata":"Q2882083","brand:wikipedia":"es:Banco de Crédito e Inversiones",name:"BCI"},matchScore:2,suggestion:true},"amenity/bank/BCP (Bolivia)":{name:"BCP (Bolivia)",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q16826675"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q16826675","brand:wikipedia":"es:Banco de Crédito de Bolivia",name:"BCP"},removeTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q16826675","brand:wikipedia":"es:Banco de Crédito de Bolivia",name:"BCP"},matchScore:2,suggestion:true},"amenity/bank/BCP (France)":{name:"BCP (France)",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q118581"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},removeTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},matchScore:2,suggestion:true},"amenity/bank/BCP (Luxembourg)":{name:"BCP (Luxembourg)",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q118581"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},removeTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},matchScore:2,suggestion:true},"amenity/bank/BCP (Peru)":{name:"BCP (Peru)",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854124"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q4854124","brand:wikipedia":"es:Banco de Crédito del Perú",name:"BCP"},removeTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q4854124","brand:wikipedia":"es:Banco de Crédito del Perú",name:"BCP"},matchScore:2,suggestion:true},"amenity/bank/BCR":{name:"BCR",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6951632"},addTags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q6951632","brand:wikipedia":"es:Banco de Costa Rica",name:"BCR"},removeTags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q6951632","brand:wikipedia":"es:Banco de Costa Rica",name:"BCR"},matchScore:2,suggestion:true},"amenity/bank/BDO":{name:"BDO",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854129"},addTags:{amenity:"bank",brand:"BDO","brand:wikidata":"Q4854129","brand:wikipedia":"en:Banco de Oro",name:"BDO"},removeTags:{amenity:"bank",brand:"BDO","brand:wikidata":"Q4854129","brand:wikipedia":"en:Banco de Oro",name:"BDO"},matchScore:2,suggestion:true},"amenity/bank/BGŻ BNP Paribas":{name:"BGŻ BNP Paribas",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9164980"},addTags:{amenity:"bank",brand:"BGŻ BNP Paribas","brand:wikidata":"Q9164980","brand:wikipedia":"pl:Bank BGŻ BNP Paribas",name:"BGŻ BNP Paribas"},removeTags:{amenity:"bank",brand:"BGŻ BNP Paribas","brand:wikidata":"Q9164980","brand:wikipedia":"pl:Bank BGŻ BNP Paribas",name:"BGŻ BNP Paribas"},matchScore:2,suggestion:true},"amenity/bank/BMCE Bank":{name:"BMCE Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2300433"},addTags:{amenity:"bank",brand:"BMCE Bank","brand:wikidata":"Q2300433","brand:wikipedia":"ar:البنك المغربي للتجارة الخارجية",name:"BMCE Bank"},removeTags:{amenity:"bank",brand:"BMCE Bank","brand:wikidata":"Q2300433","brand:wikipedia":"ar:البنك المغربي للتجارة الخارجية",name:"BMCE Bank"},matchScore:2,suggestion:true},"amenity/bank/BMCI":{name:"BMCI",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883409"},addTags:{amenity:"bank",brand:"BMCI","brand:wikidata":"Q2883409","brand:wikipedia":"ar:البنك المغربي للتجارة والصناعة",name:"BMCI"},removeTags:{amenity:"bank",brand:"BMCI","brand:wikidata":"Q2883409","brand:wikipedia":"ar:البنك المغربي للتجارة والصناعة",name:"BMCI"},matchScore:2,suggestion:true},"amenity/bank/BMN":{name:"BMN",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3754900"},addTags:{amenity:"bank",brand:"BMN","brand:wikidata":"Q3754900","brand:wikipedia":"es:Banco Mare Nostrum",name:"BMN"},removeTags:{amenity:"bank",brand:"BMN","brand:wikidata":"Q3754900","brand:wikipedia":"es:Banco Mare Nostrum",name:"BMN"},matchScore:2,suggestion:true},"amenity/bank/BMO":{name:"BMO",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806693"},addTags:{amenity:"bank",brand:"BMO","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"BMO"},removeTags:{amenity:"bank",brand:"BMO","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"BMO"},matchScore:2,suggestion:true},"amenity/bank/BMO Harris Bank":{name:"BMO Harris Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4835981"},addTags:{amenity:"bank",brand:"BMO Harris Bank","brand:wikidata":"Q4835981","brand:wikipedia":"en:BMO Harris Bank",name:"BMO Harris Bank"},removeTags:{amenity:"bank",brand:"BMO Harris Bank","brand:wikidata":"Q4835981","brand:wikipedia":"en:BMO Harris Bank",name:"BMO Harris Bank"},matchScore:2,suggestion:true},"amenity/bank/BNA":{name:"BNA",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883410"},addTags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883410","brand:wikipedia":"fr:Banque nationale d'Algérie",name:"BNA"},removeTags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883410","brand:wikipedia":"fr:Banque nationale d'Algérie",name:"BNA"},matchScore:2,suggestion:true},"amenity/bank/BNI":{name:"BNI",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882611"},addTags:{amenity:"bank",brand:"BNI","brand:wikidata":"Q2882611","brand:wikipedia":"id:Bank Negara Indonesia",name:"BNI"},removeTags:{amenity:"bank",brand:"BNI","brand:wikidata":"Q2882611","brand:wikipedia":"id:Bank Negara Indonesia",name:"BNI"},matchScore:2,suggestion:true},"amenity/bank/BNL":{name:"BNL",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2201225"},addTags:{amenity:"bank",brand:"BNL","brand:wikidata":"Q2201225","brand:wikipedia":"en:Banca Nazionale del Lavoro",name:"BNL"},removeTags:{amenity:"bank",brand:"BNL","brand:wikidata":"Q2201225","brand:wikipedia":"en:Banca Nazionale del Lavoro",name:"BNL"},matchScore:2,suggestion:true},"amenity/bank/BNP Paribas":{name:"BNP Paribas",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q499707"},addTags:{amenity:"bank",brand:"BNP Paribas","brand:wikidata":"Q499707","brand:wikipedia":"en:BNP Paribas",name:"BNP Paribas"},removeTags:{amenity:"bank",brand:"BNP Paribas","brand:wikidata":"Q499707","brand:wikipedia":"en:BNP Paribas",name:"BNP Paribas"},matchScore:2,suggestion:true},"amenity/bank/BNP Paribas Fortis":{name:"BNP Paribas Fortis",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q796827"},addTags:{amenity:"bank",brand:"BNP Paribas Fortis","brand:wikidata":"Q796827","brand:wikipedia":"en:BNP Paribas Fortis",name:"BNP Paribas Fortis"},removeTags:{amenity:"bank",brand:"BNP Paribas Fortis","brand:wikidata":"Q796827","brand:wikipedia":"en:BNP Paribas Fortis",name:"BNP Paribas Fortis"},matchScore:2,suggestion:true},"amenity/bank/BOC":{name:"BOC",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q790068"},addTags:{amenity:"bank",brand:"BOC","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"BOC"},removeTags:{amenity:"bank",brand:"BOC","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"BOC"},matchScore:2,suggestion:true},"amenity/bank/BPI":{name:"BPI",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2501256"},addTags:{amenity:"bank",brand:"BPI","brand:wikidata":"Q2501256","brand:wikipedia":"en:Bank of the Philippine Islands",name:"BPI"},removeTags:{amenity:"bank",brand:"BPI","brand:wikidata":"Q2501256","brand:wikipedia":"en:Bank of the Philippine Islands",name:"BPI"},matchScore:2,suggestion:true},"amenity/bank/BRD":{name:"BRD",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q796927"},addTags:{amenity:"bank",brand:"BRD","brand:wikidata":"Q796927","brand:wikipedia":"ro:BRD - Groupe Société Générale",name:"BRD"},removeTags:{amenity:"bank",brand:"BRD","brand:wikidata":"Q796927","brand:wikipedia":"ro:BRD - Groupe Société Générale",name:"BRD"},matchScore:2,suggestion:true},"amenity/bank/BRED":{name:"BRED",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2877455"},addTags:{amenity:"bank",brand:"BRED","brand:wikidata":"Q2877455","brand:wikipedia":"fr:BRED Banque populaire",name:"BRED"},removeTags:{amenity:"bank",brand:"BRED","brand:wikidata":"Q2877455","brand:wikipedia":"fr:BRED Banque populaire",name:"BRED"},matchScore:2,suggestion:true},"amenity/bank/BRI":{name:"BRI",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q623042"},addTags:{amenity:"bank",brand:"BRI","brand:wikidata":"Q623042","brand:wikipedia":"id:Bank Rakyat Indonesia",name:"BRI"},removeTags:{amenity:"bank",brand:"BRI","brand:wikidata":"Q623042","brand:wikipedia":"id:Bank Rakyat Indonesia",name:"BRI"},matchScore:2,suggestion:true},"amenity/bank/BTN":{name:"BTN",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12474534"},addTags:{amenity:"bank",brand:"BTN","brand:en":"BTN","brand:wikidata":"Q12474534","brand:wikipedia":"id:Bank Tabungan Negara",name:"BTN","name:en":"BTN"},removeTags:{amenity:"bank",brand:"BTN","brand:en":"BTN","brand:wikidata":"Q12474534","brand:wikipedia":"id:Bank Tabungan Negara",name:"BTN","name:en":"BTN"},matchScore:2,suggestion:true},"amenity/bank/BW-Bank":{name:"BW-Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q798891"},addTags:{amenity:"bank",brand:"BW-Bank","brand:en":"BW-Bank","brand:wikidata":"Q798891","brand:wikipedia":"de:Baden-Württembergische Bank",name:"BW-Bank","name:en":"BW-Bank"},removeTags:{amenity:"bank",brand:"BW-Bank","brand:en":"BW-Bank","brand:wikidata":"Q798891","brand:wikipedia":"de:Baden-Württembergische Bank",name:"BW-Bank","name:en":"BW-Bank"},matchScore:2,suggestion:true},"amenity/bank/Banamex":{name:"Banamex",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q749474"},addTags:{amenity:"bank",brand:"Banamex","brand:wikidata":"Q749474","brand:wikipedia":"en:Grupo Financiero Banamex",name:"Banamex"},removeTags:{amenity:"bank",brand:"Banamex","brand:wikidata":"Q749474","brand:wikipedia":"en:Grupo Financiero Banamex",name:"Banamex"},matchScore:2,suggestion:true},"amenity/bank/Banca Intesa":{name:"Banca Intesa",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q647092"},addTags:{amenity:"bank",brand:"Banca Intesa","brand:wikidata":"Q647092","brand:wikipedia":"en:Banca Intesa",name:"Banca Intesa"},removeTags:{amenity:"bank",brand:"Banca Intesa","brand:wikidata":"Q647092","brand:wikipedia":"en:Banca Intesa",name:"Banca Intesa"},matchScore:2,suggestion:true},"amenity/bank/Banca March":{name:"Banca March",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q578252"},addTags:{amenity:"bank",brand:"Banca March","brand:wikidata":"Q578252","brand:wikipedia":"en:Banca March",name:"Banca March"},removeTags:{amenity:"bank",brand:"Banca March","brand:wikidata":"Q578252","brand:wikipedia":"en:Banca March",name:"Banca March"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Milano":{name:"Banca Popolare di Milano",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806154"},addTags:{amenity:"bank",brand:"Banca Popolare di Milano","brand:wikidata":"Q806154","brand:wikipedia":"en:Banca Popolare di Milano",name:"Banca Popolare di Milano"},removeTags:{amenity:"bank",brand:"Banca Popolare di Milano","brand:wikidata":"Q806154","brand:wikipedia":"en:Banca Popolare di Milano",name:"Banca Popolare di Milano"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Novara":{name:"Banca Popolare di Novara",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633742"},addTags:{amenity:"bank",brand:"Banca Popolare di Novara","brand:wikidata":"Q3633742","brand:wikipedia":"en:Banca Popolare di Novara",name:"Banca Popolare di Novara"},removeTags:{amenity:"bank",brand:"Banca Popolare di Novara","brand:wikidata":"Q3633742","brand:wikipedia":"en:Banca Popolare di Novara",name:"Banca Popolare di Novara"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Sondrio":{name:"Banca Popolare di Sondrio",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q686176"},addTags:{amenity:"bank",brand:"Banca Popolare di Sondrio","brand:wikidata":"Q686176","brand:wikipedia":"en:Banca Popolare di Sondrio",name:"Banca Popolare di Sondrio"},removeTags:{amenity:"bank",brand:"Banca Popolare di Sondrio","brand:wikidata":"Q686176","brand:wikipedia":"en:Banca Popolare di Sondrio",name:"Banca Popolare di Sondrio"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Verona":{name:"Banca Popolare di Verona",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3167468"},addTags:{amenity:"bank",brand:"Banca Popolare di Verona","brand:wikidata":"Q3167468","brand:wikipedia":"en:Banca Popolare di Verona",name:"Banca Popolare di Verona"},removeTags:{amenity:"bank",brand:"Banca Popolare di Verona","brand:wikidata":"Q3167468","brand:wikipedia":"en:Banca Popolare di Verona",name:"Banca Popolare di Verona"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Vicenza":{name:"Banca Popolare di Vicenza",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3127200"},addTags:{amenity:"bank",brand:"Banca Popolare di Vicenza","brand:wikidata":"Q3127200","brand:wikipedia":"en:Banca Popolare di Vicenza",name:"Banca Popolare di Vicenza"},removeTags:{amenity:"bank",brand:"Banca Popolare di Vicenza","brand:wikidata":"Q3127200","brand:wikipedia":"en:Banca Popolare di Vicenza",name:"Banca Popolare di Vicenza"},matchScore:2,suggestion:true},"amenity/bank/Banca Românească":{name:"Banca Românească",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854052"},addTags:{amenity:"bank",brand:"Banca Românească","brand:wikidata":"Q4854052","brand:wikipedia":"en:Banca Românească",name:"Banca Românească"},removeTags:{amenity:"bank",brand:"Banca Românească","brand:wikidata":"Q4854052","brand:wikipedia":"en:Banca Românească",name:"Banca Românească"},matchScore:2,suggestion:true},"amenity/bank/Banca Sella":{name:"Banca Sella",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633749"},addTags:{amenity:"bank",brand:"Banca Sella","brand:wikidata":"Q3633749","brand:wikipedia":"en:Banca Sella Group",name:"Banca Sella"},removeTags:{amenity:"bank",brand:"Banca Sella","brand:wikidata":"Q3633749","brand:wikipedia":"en:Banca Sella Group",name:"Banca Sella"},matchScore:2,suggestion:true},"amenity/bank/Banca Transilvania":{name:"Banca Transilvania",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806161"},addTags:{amenity:"bank",brand:"Banca Transilvania","brand:wikidata":"Q806161","brand:wikipedia":"en:Banca Transilvania",name:"Banca Transilvania"},removeTags:{amenity:"bank",brand:"Banca Transilvania","brand:wikidata":"Q806161","brand:wikipedia":"en:Banca Transilvania",name:"Banca Transilvania"},matchScore:2,suggestion:true},"amenity/bank/Bancaribe":{name:"Bancaribe",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5717827"},addTags:{amenity:"bank",brand:"Bancaribe","brand:wikidata":"Q5717827","brand:wikipedia":"en:Bancaribe",name:"Bancaribe"},removeTags:{amenity:"bank",brand:"Bancaribe","brand:wikidata":"Q5717827","brand:wikipedia":"en:Bancaribe",name:"Bancaribe"},matchScore:2,suggestion:true},"amenity/bank/Banco AV Villas":{name:"Banco AV Villas",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854068"},addTags:{amenity:"bank",brand:"Banco AV Villas","brand:wikidata":"Q4854068","brand:wikipedia":"en:Banco AV Villas",name:"Banco AV Villas"},removeTags:{amenity:"bank",brand:"Banco AV Villas","brand:wikidata":"Q4854068","brand:wikipedia":"en:Banco AV Villas",name:"Banco AV Villas"},matchScore:2,suggestion:true},"amenity/bank/Banco Azteca":{name:"Banco Azteca",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854076"},addTags:{amenity:"bank",brand:"Banco Azteca","brand:wikidata":"Q4854076","brand:wikipedia":"en:Banco Azteca",name:"Banco Azteca"},removeTags:{amenity:"bank",brand:"Banco Azteca","brand:wikidata":"Q4854076","brand:wikipedia":"en:Banco Azteca",name:"Banco Azteca"},matchScore:2,suggestion:true},"amenity/bank/Banco BPM":{name:"Banco BPM",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q27331643"},addTags:{amenity:"bank",brand:"Banco BPM","brand:wikidata":"Q27331643","brand:wikipedia":"en:Banco BPM",name:"Banco BPM"},removeTags:{amenity:"bank",brand:"Banco BPM","brand:wikidata":"Q27331643","brand:wikipedia":"en:Banco BPM",name:"Banco BPM"},matchScore:2,suggestion:true},"amenity/bank/Banco Estado":{name:"Banco Estado",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5718188"},addTags:{amenity:"bank",brand:"Banco Estado","brand:wikidata":"Q5718188","brand:wikipedia":"es:Banco del Estado de Chile",name:"Banco Estado"},removeTags:{amenity:"bank",brand:"Banco Estado","brand:wikidata":"Q5718188","brand:wikipedia":"es:Banco del Estado de Chile",name:"Banco Estado"},matchScore:2,suggestion:true},"amenity/bank/Banco Falabella":{name:"Banco Falabella",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854088"},addTags:{amenity:"bank",brand:"Banco Falabella","brand:wikidata":"Q4854088","brand:wikipedia":"en:Banco Falabella",name:"Banco Falabella"},removeTags:{amenity:"bank",brand:"Banco Falabella","brand:wikidata":"Q4854088","brand:wikipedia":"en:Banco Falabella",name:"Banco Falabella"},matchScore:2,suggestion:true},"amenity/bank/Banco Nacional":{name:"Banco Nacional",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854104"},addTags:{amenity:"bank",brand:"Banco Nacional","brand:wikidata":"Q4854104","brand:wikipedia":"en:Banco Nacional",name:"Banco Nacional"},removeTags:{amenity:"bank",brand:"Banco Nacional","brand:wikidata":"Q4854104","brand:wikipedia":"en:Banco Nacional",name:"Banco Nacional"},matchScore:2,suggestion:true},"amenity/bank/Banco Pastor":{name:"Banco Pastor",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806193"},addTags:{amenity:"bank",brand:"Banco Pastor","brand:wikidata":"Q806193","brand:wikipedia":"en:Banco Pastor",name:"Banco Pastor"},removeTags:{amenity:"bank",brand:"Banco Pastor","brand:wikidata":"Q806193","brand:wikipedia":"en:Banco Pastor",name:"Banco Pastor"},matchScore:2,suggestion:true},"amenity/bank/Banco Pichincha":{name:"Banco Pichincha",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854135"},addTags:{amenity:"bank",brand:"Banco Pichincha","brand:wikidata":"Q4854135","brand:wikipedia":"en:Banco Pichincha",name:"Banco Pichincha"},removeTags:{amenity:"bank",brand:"Banco Pichincha","brand:wikidata":"Q4854135","brand:wikipedia":"en:Banco Pichincha",name:"Banco Pichincha"},matchScore:2,suggestion:true},"amenity/bank/Banco Popular":{name:"Banco Popular",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q537259"},addTags:{amenity:"bank",brand:"Banco Popular","brand:wikidata":"Q537259","brand:wikipedia":"es:Banco Popular Español",name:"Banco Popular"},removeTags:{amenity:"bank",brand:"Banco Popular","brand:wikidata":"Q537259","brand:wikipedia":"es:Banco Popular Español",name:"Banco Popular"},matchScore:2,suggestion:true},"amenity/bank/Banco Provincia":{name:"Banco Provincia",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4856209"},addTags:{amenity:"bank",brand:"Banco Provincia","brand:wikidata":"Q4856209","brand:wikipedia":"es:Banco de la Provincia de Buenos Aires",name:"Banco Provincia"},removeTags:{amenity:"bank",brand:"Banco Provincia","brand:wikidata":"Q4856209","brand:wikipedia":"es:Banco de la Provincia de Buenos Aires",name:"Banco Provincia"},matchScore:2,suggestion:true},"amenity/bank/Banco Sabadell":{name:"Banco Sabadell",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q762330"},addTags:{amenity:"bank",brand:"Banco Sabadell","brand:wikidata":"Q762330","brand:wikipedia":"es:Banco Sabadell",name:"Banco Sabadell"},removeTags:{amenity:"bank",brand:"Banco Sabadell","brand:wikidata":"Q762330","brand:wikipedia":"es:Banco Sabadell",name:"Banco Sabadell"},matchScore:2,suggestion:true},"amenity/bank/Banco Santander":{name:"Banco Santander",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6496310"},addTags:{amenity:"bank",brand:"Banco Santander","brand:wikidata":"Q6496310","brand:wikipedia":"es:Banco Santander",name:"Banco Santander"},removeTags:{amenity:"bank",brand:"Banco Santander","brand:wikidata":"Q6496310","brand:wikipedia":"es:Banco Santander",name:"Banco Santander"},matchScore:2,suggestion:true},"amenity/bank/Banco de Bogotá":{name:"Banco de Bogotá",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854122"},addTags:{amenity:"bank",brand:"Banco de Bogotá","brand:wikidata":"Q4854122","brand:wikipedia":"es:Banco de Bogotá",name:"Banco de Bogotá"},removeTags:{amenity:"bank",brand:"Banco de Bogotá","brand:wikidata":"Q4854122","brand:wikipedia":"es:Banco de Bogotá",name:"Banco de Bogotá"},matchScore:2,suggestion:true},"amenity/bank/Banco de Chile":{name:"Banco de Chile",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882085"},addTags:{amenity:"bank",brand:"Banco de Chile","brand:wikidata":"Q2882085","brand:wikipedia":"es:Banco de Chile",name:"Banco de Chile"},removeTags:{amenity:"bank",brand:"Banco de Chile","brand:wikidata":"Q2882085","brand:wikipedia":"es:Banco de Chile",name:"Banco de Chile"},matchScore:2,suggestion:true},"amenity/bank/Banco de Venezuela":{name:"Banco de Venezuela",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q517093"},addTags:{amenity:"bank",brand:"Banco de Venezuela","brand:wikidata":"Q517093","brand:wikipedia":"es:Banco de Venezuela",name:"Banco de Venezuela"},removeTags:{amenity:"bank",brand:"Banco de Venezuela","brand:wikidata":"Q517093","brand:wikipedia":"es:Banco de Venezuela",name:"Banco de Venezuela"},matchScore:2,suggestion:true},"amenity/bank/Banco de la Nación":{name:"Banco de la Nación",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883376"},addTags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco de la Nación"},removeTags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco de la Nación"},matchScore:2,suggestion:true},"amenity/bank/Banco di Napoli":{name:"Banco di Napoli",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633835"},addTags:{amenity:"bank",brand:"Banco di Napoli","brand:wikidata":"Q3633835","brand:wikipedia":"en:Banco di Napoli",name:"Banco di Napoli"},removeTags:{amenity:"bank",brand:"Banco di Napoli","brand:wikidata":"Q3633835","brand:wikipedia":"en:Banco di Napoli",name:"Banco di Napoli"},matchScore:2,suggestion:true},"amenity/bank/Banco di Sardegna":{name:"Banco di Sardegna",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806205"},addTags:{amenity:"bank",brand:"Banco di Sardegna","brand:wikidata":"Q806205","brand:wikipedia":"en:Banco di Sardegna",name:"Banco di Sardegna"},removeTags:{amenity:"bank",brand:"Banco di Sardegna","brand:wikidata":"Q806205","brand:wikipedia":"en:Banco di Sardegna",name:"Banco di Sardegna"},matchScore:2,suggestion:true},"amenity/bank/Banco do Brasil":{name:"Banco do Brasil",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q610817"},addTags:{amenity:"bank",brand:"Banco do Brasil","brand:wikidata":"Q610817","brand:wikipedia":"en:Banco do Brasil",name:"Banco do Brasil"},removeTags:{amenity:"bank",brand:"Banco do Brasil","brand:wikidata":"Q610817","brand:wikipedia":"en:Banco do Brasil",name:"Banco do Brasil"},matchScore:2,suggestion:true},"amenity/bank/Banco do Nordeste":{name:"Banco do Nordeste",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854137"},addTags:{amenity:"bank",brand:"Banco do Nordeste","brand:wikidata":"Q4854137","brand:wikipedia":"en:Banco do Nordeste",name:"Banco do Nordeste"},removeTags:{amenity:"bank",brand:"Banco do Nordeste","brand:wikidata":"Q4854137","brand:wikipedia":"en:Banco do Nordeste",name:"Banco do Nordeste"},matchScore:2,suggestion:true},"amenity/bank/Bancolombia":{name:"Bancolombia",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806206"},addTags:{amenity:"bank",brand:"Bancolombia","brand:wikidata":"Q806206","brand:wikipedia":"en:Bancolombia",name:"Bancolombia"},removeTags:{amenity:"bank",brand:"Bancolombia","brand:wikidata":"Q806206","brand:wikipedia":"en:Bancolombia",name:"Bancolombia"},matchScore:2,suggestion:true},"amenity/bank/Bancomer":{name:"Bancomer",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2876794"},addTags:{amenity:"bank",brand:"Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"Bancomer"},removeTags:{amenity:"bank",brand:"Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"Bancomer"},matchScore:2,suggestion:true},"amenity/bank/Bancpost":{name:"Bancpost",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854143"},addTags:{amenity:"bank",brand:"Bancpost","brand:wikidata":"Q4854143","brand:wikipedia":"ro:Bancpost",name:"Bancpost"},removeTags:{amenity:"bank",brand:"Bancpost","brand:wikidata":"Q4854143","brand:wikipedia":"ro:Bancpost",name:"Bancpost"},matchScore:2,suggestion:true},"amenity/bank/Banesco":{name:"Banesco",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854841"},addTags:{amenity:"bank",brand:"Banesco","brand:wikidata":"Q4854841","brand:wikipedia":"en:Banesco",name:"Banesco"},removeTags:{amenity:"bank",brand:"Banesco","brand:wikidata":"Q4854841","brand:wikipedia":"en:Banesco",name:"Banesco"},matchScore:2,suggestion:true},"amenity/bank/Bangkok Bank":{name:"Bangkok Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806483"},addTags:{amenity:"bank",brand:"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"Bangkok Bank"},removeTags:{amenity:"bank",brand:"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"Bangkok Bank"},matchScore:2,suggestion:true},"amenity/bank/Bank Al Habib":{name:"Bank Al Habib",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4034833"},addTags:{amenity:"bank",brand:"Bank Al Habib","brand:wikidata":"Q4034833","brand:wikipedia":"ur:بينک الحبيب لمیٹڈ",name:"Bank Al Habib"},removeTags:{amenity:"bank",brand:"Bank Al Habib","brand:wikidata":"Q4034833","brand:wikipedia":"ur:بينک الحبيب لمیٹڈ",name:"Bank Al Habib"},matchScore:2,suggestion:true},"amenity/bank/Bank Alfalah":{name:"Bank Alfalah",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855895"},addTags:{amenity:"bank",brand:"Bank Alfalah","brand:wikidata":"Q4855895","brand:wikipedia":"en:Bank Alfalah",name:"Bank Alfalah"},removeTags:{amenity:"bank",brand:"Bank Alfalah","brand:wikidata":"Q4855895","brand:wikipedia":"en:Bank Alfalah",name:"Bank Alfalah"},matchScore:2,suggestion:true},"amenity/bank/Bank Austria":{name:"Bank Austria",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q697619"},addTags:{amenity:"bank",brand:"Bank Austria","brand:wikidata":"Q697619","brand:wikipedia":"en:Bank Austria",name:"Bank Austria"},removeTags:{amenity:"bank",brand:"Bank Austria","brand:wikidata":"Q697619","brand:wikipedia":"en:Bank Austria",name:"Bank Austria"},matchScore:2,suggestion:true},"amenity/bank/Bank Danamon":{name:"Bank Danamon",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855913"},addTags:{amenity:"bank",brand:"Bank Danamon","brand:wikidata":"Q4855913","brand:wikipedia":"en:Bank Danamon",name:"Bank Danamon"},removeTags:{amenity:"bank",brand:"Bank Danamon","brand:wikidata":"Q4855913","brand:wikipedia":"en:Bank Danamon",name:"Bank Danamon"},matchScore:2,suggestion:true},"amenity/bank/Bank Mandiri":{name:"Bank Mandiri",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806639"},addTags:{amenity:"bank",brand:"Bank Mandiri","brand:wikidata":"Q806639","brand:wikipedia":"en:Bank Mandiri",name:"Bank Mandiri"},removeTags:{amenity:"bank",brand:"Bank Mandiri","brand:wikidata":"Q806639","brand:wikipedia":"en:Bank Mandiri",name:"Bank Mandiri"},matchScore:2,suggestion:true},"amenity/bank/Bank Muamalat":{name:"Bank Muamalat",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855949"},addTags:{amenity:"bank",brand:"Bank Muamalat","brand:wikidata":"Q4855949","brand:wikipedia":"en:Bank Muamalat",name:"Bank Muamalat"},removeTags:{amenity:"bank",brand:"Bank Muamalat","brand:wikidata":"Q4855949","brand:wikipedia":"en:Bank Muamalat",name:"Bank Muamalat"},matchScore:2,suggestion:true},"amenity/bank/Bank Rakyat":{name:"Bank Rakyat",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855964"},addTags:{amenity:"bank",brand:"Bank Rakyat","brand:wikidata":"Q4855964","brand:wikipedia":"ms:Bank Rakyat",name:"Bank Rakyat"},removeTags:{amenity:"bank",brand:"Bank Rakyat","brand:wikidata":"Q4855964","brand:wikipedia":"ms:Bank Rakyat",name:"Bank Rakyat"},matchScore:2,suggestion:true},"amenity/bank/Bank of Africa":{name:"Bank of Africa",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882627"},addTags:{amenity:"bank",brand:"Bank of Africa","brand:wikidata":"Q2882627","brand:wikipedia":"en:Bank of Africa Group",name:"Bank of Africa"},removeTags:{amenity:"bank",brand:"Bank of Africa","brand:wikidata":"Q2882627","brand:wikipedia":"en:Bank of Africa Group",name:"Bank of Africa"},matchScore:2,suggestion:true},"amenity/bank/Bank of America":{name:"Bank of America",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q487907"},addTags:{amenity:"bank",brand:"Bank of America","brand:wikidata":"Q487907","brand:wikipedia":"en:Bank of America",name:"Bank of America"},removeTags:{amenity:"bank",brand:"Bank of America","brand:wikidata":"Q487907","brand:wikipedia":"en:Bank of America",name:"Bank of America"},matchScore:2,suggestion:true},"amenity/bank/Bank of Baroda":{name:"Bank of Baroda",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003797"},addTags:{amenity:"bank",brand:"Bank of Baroda","brand:wikidata":"Q2003797","brand:wikipedia":"en:Bank of Baroda",name:"Bank of Baroda"},removeTags:{amenity:"bank",brand:"Bank of Baroda","brand:wikidata":"Q2003797","brand:wikipedia":"en:Bank of Baroda",name:"Bank of Baroda"},matchScore:2,suggestion:true},"amenity/bank/Bank of Ceylon":{name:"Bank of Ceylon",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882652"},addTags:{amenity:"bank",brand:"Bank of Ceylon","brand:wikidata":"Q2882652","brand:wikipedia":"en:Bank of Ceylon",name:"Bank of Ceylon"},removeTags:{amenity:"bank",brand:"Bank of Ceylon","brand:wikidata":"Q2882652","brand:wikipedia":"en:Bank of Ceylon",name:"Bank of Ceylon"},matchScore:2,suggestion:true},"amenity/bank/Bank of China":{name:"Bank of China",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q790068"},addTags:{amenity:"bank",brand:"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"Bank of China"},removeTags:{amenity:"bank",brand:"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"Bank of China"},matchScore:2,suggestion:true},"amenity/bank/Bank of Commerce":{name:"Bank of Commerce",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4856092"},addTags:{amenity:"bank",brand:"Bank of Commerce","brand:wikidata":"Q4856092","brand:wikipedia":"en:Bank of Commerce",name:"Bank of Commerce"},removeTags:{amenity:"bank",brand:"Bank of Commerce","brand:wikidata":"Q4856092","brand:wikipedia":"en:Bank of Commerce",name:"Bank of Commerce"},matchScore:2,suggestion:true},"amenity/bank/Bank of Cyprus":{name:"Bank of Cyprus",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806678"},addTags:{amenity:"bank",brand:"Bank of Cyprus","brand:wikidata":"Q806678","brand:wikipedia":"en:Bank of Cyprus",name:"Bank of Cyprus"},removeTags:{amenity:"bank",brand:"Bank of Cyprus","brand:wikidata":"Q806678","brand:wikipedia":"en:Bank of Cyprus",name:"Bank of Cyprus"},matchScore:2,suggestion:true},"amenity/bank/Bank of India":{name:"Bank of India",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2004439"},addTags:{amenity:"bank",brand:"Bank of India","brand:wikidata":"Q2004439","brand:wikipedia":"en:Bank of India",name:"Bank of India"},removeTags:{amenity:"bank",brand:"Bank of India","brand:wikidata":"Q2004439","brand:wikipedia":"en:Bank of India",name:"Bank of India"},matchScore:2,suggestion:true},"amenity/bank/Bank of Ireland":{name:"Bank of Ireland",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806689"},addTags:{amenity:"bank",brand:"Bank of Ireland","brand:wikidata":"Q806689","brand:wikipedia":"en:Bank of Ireland",name:"Bank of Ireland"},removeTags:{amenity:"bank",brand:"Bank of Ireland","brand:wikidata":"Q806689","brand:wikipedia":"en:Bank of Ireland",name:"Bank of Ireland"},matchScore:2,suggestion:true},"amenity/bank/Bank of Maharashtra":{name:"Bank of Maharashtra",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2004304"},addTags:{amenity:"bank",brand:"Bank of Maharashtra","brand:wikidata":"Q2004304","brand:wikipedia":"en:Bank of Maharashtra",name:"Bank of Maharashtra"},removeTags:{amenity:"bank",brand:"Bank of Maharashtra","brand:wikidata":"Q2004304","brand:wikipedia":"en:Bank of Maharashtra",name:"Bank of Maharashtra"},matchScore:2,suggestion:true},"amenity/bank/Bank of Montreal":{name:"Bank of Montreal",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806693"},addTags:{amenity:"bank",brand:"Bank of Montreal","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"Bank of Montreal"},removeTags:{amenity:"bank",brand:"Bank of Montreal","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"Bank of Montreal"},matchScore:2,suggestion:true},"amenity/bank/Bank of New Zealand":{name:"Bank of New Zealand",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806687"},addTags:{amenity:"bank",brand:"Bank of New Zealand","brand:wikidata":"Q806687","brand:wikipedia":"en:Bank of New Zealand",name:"Bank of New Zealand"},removeTags:{amenity:"bank",brand:"Bank of New Zealand","brand:wikidata":"Q806687","brand:wikipedia":"en:Bank of New Zealand",name:"Bank of New Zealand"},matchScore:2,suggestion:true},"amenity/bank/Bank of Scotland":{name:"Bank of Scotland",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q627381"},addTags:{amenity:"bank",brand:"Bank of Scotland","brand:wikidata":"Q627381","brand:wikipedia":"en:Bank of Scotland",name:"Bank of Scotland"},removeTags:{amenity:"bank",brand:"Bank of Scotland","brand:wikidata":"Q627381","brand:wikipedia":"en:Bank of Scotland",name:"Bank of Scotland"},matchScore:2,suggestion:true},"amenity/bank/Bank of the West":{name:"Bank of the West",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2881919"},addTags:{amenity:"bank",brand:"Bank of the West","brand:wikidata":"Q2881919","brand:wikipedia":"en:Bank of the West",name:"Bank of the West"},removeTags:{amenity:"bank",brand:"Bank of the West","brand:wikidata":"Q2881919","brand:wikipedia":"en:Bank of the West",name:"Bank of the West"},matchScore:2,suggestion:true},"amenity/bank/Bankia":{name:"Bankia",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806807"},addTags:{amenity:"bank",brand:"Bankia","brand:wikidata":"Q806807","brand:wikipedia":"en:Bankia",name:"Bankia"},removeTags:{amenity:"bank",brand:"Bankia","brand:wikidata":"Q806807","brand:wikipedia":"en:Bankia",name:"Bankia"},matchScore:2,suggestion:true},"amenity/bank/Bankinter":{name:"Bankinter",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806808"},addTags:{amenity:"bank",brand:"Bankinter","brand:wikidata":"Q806808","brand:wikipedia":"es:Bankinter",name:"Bankinter"},removeTags:{amenity:"bank",brand:"Bankinter","brand:wikidata":"Q806808","brand:wikipedia":"es:Bankinter",name:"Bankinter"},matchScore:2,suggestion:true},"amenity/bank/Banner Bank":{name:"Banner Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4856910"},addTags:{amenity:"bank",brand:"Banner Bank","brand:wikidata":"Q4856910","brand:wikipedia":"en:Banner Bank",name:"Banner Bank"},removeTags:{amenity:"bank",brand:"Banner Bank","brand:wikidata":"Q4856910","brand:wikipedia":"en:Banner Bank",name:"Banner Bank"},matchScore:2,suggestion:true},"amenity/bank/Banorte":{name:"Banorte",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806914"},addTags:{amenity:"bank",brand:"Banorte","brand:wikidata":"Q806914","brand:wikipedia":"en:Banorte",name:"Banorte"},removeTags:{amenity:"bank",brand:"Banorte","brand:wikidata":"Q806914","brand:wikipedia":"en:Banorte",name:"Banorte"},matchScore:2,suggestion:true},"amenity/bank/Banque Atlantique":{name:"Banque Atlantique",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882890"},addTags:{amenity:"bank",brand:"Banque Atlantique","brand:wikidata":"Q2882890","brand:wikipedia":"en:Atlantic Bank Group",name:"Banque Atlantique"},removeTags:{amenity:"bank",brand:"Banque Atlantique","brand:wikidata":"Q2882890","brand:wikipedia":"en:Atlantic Bank Group",name:"Banque Atlantique"},matchScore:2,suggestion:true},"amenity/bank/Banque Laurentienne":{name:"Banque Laurentienne",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1360087"},addTags:{amenity:"bank",brand:"Banque Laurentienne","brand:wikidata":"Q1360087","brand:wikipedia":"en:Laurentian Bank of Canada",name:"Banque Laurentienne"},removeTags:{amenity:"bank",brand:"Banque Laurentienne","brand:wikidata":"Q1360087","brand:wikipedia":"en:Laurentian Bank of Canada",name:"Banque Laurentienne"},matchScore:2,suggestion:true},"amenity/bank/Banque Populaire":{name:"Banque Populaire",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883441"},addTags:{amenity:"bank",brand:"Banque Populaire","brand:wikidata":"Q2883441","brand:wikipedia":"en:Banque Populaire du Maroc",name:"Banque Populaire"},removeTags:{amenity:"bank",brand:"Banque Populaire","brand:wikidata":"Q2883441","brand:wikipedia":"en:Banque Populaire du Maroc",name:"Banque Populaire"},matchScore:2,suggestion:true},"amenity/bank/Banrisul":{name:"Banrisul",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4857098"},addTags:{amenity:"bank",brand:"Banrisul","brand:wikidata":"Q4857098","brand:wikipedia":"en:Banrisul",name:"Banrisul"},removeTags:{amenity:"bank",brand:"Banrisul","brand:wikidata":"Q4857098","brand:wikipedia":"en:Banrisul",name:"Banrisul"},matchScore:2,suggestion:true},"amenity/bank/Barclays":{name:"Barclays",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q245343"},addTags:{amenity:"bank",brand:"Barclays","brand:wikidata":"Q245343","brand:wikipedia":"en:Barclays",name:"Barclays"},removeTags:{amenity:"bank",brand:"Barclays","brand:wikidata":"Q245343","brand:wikipedia":"en:Barclays",name:"Barclays"},matchScore:2,suggestion:true},"amenity/bank/Belfius":{name:"Belfius",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1956014"},addTags:{amenity:"bank",brand:"Belfius","brand:wikidata":"Q1956014","brand:wikipedia":"en:Belfius",name:"Belfius"},removeTags:{amenity:"bank",brand:"Belfius","brand:wikidata":"Q1956014","brand:wikipedia":"en:Belfius",name:"Belfius"},matchScore:2,suggestion:true},"amenity/bank/Bendigo Bank":{name:"Bendigo Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4887077"},addTags:{amenity:"bank",brand:"Bendigo Bank","brand:wikidata":"Q4887077","brand:wikipedia":"en:Bendigo and Adelaide Bank",name:"Bendigo Bank"},removeTags:{amenity:"bank",brand:"Bendigo Bank","brand:wikidata":"Q4887077","brand:wikipedia":"en:Bendigo and Adelaide Bank",name:"Bendigo Bank"},matchScore:2,suggestion:true},"amenity/bank/Bradesco":{name:"Bradesco",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806181"},addTags:{amenity:"bank",brand:"Bradesco","brand:wikidata":"Q806181","brand:wikipedia":"en:Banco Bradesco",name:"Bradesco"},removeTags:{amenity:"bank",brand:"Bradesco","brand:wikidata":"Q806181","brand:wikipedia":"en:Banco Bradesco",name:"Bradesco"},matchScore:2,suggestion:true},"amenity/bank/Budapest Bank":{name:"Budapest Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q27493463"},addTags:{amenity:"bank",brand:"Budapest Bank","brand:wikidata":"Q27493463","brand:wikipedia":"en:Budapest Bank",name:"Budapest Bank"},removeTags:{amenity:"bank",brand:"Budapest Bank","brand:wikidata":"Q27493463","brand:wikipedia":"en:Budapest Bank",name:"Budapest Bank"},matchScore:2,suggestion:true},"amenity/bank/CEC Bank":{name:"CEC Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1023306"},addTags:{amenity:"bank",brand:"CEC Bank","brand:wikidata":"Q1023306","brand:wikipedia":"en:CEC Bank",name:"CEC Bank"},removeTags:{amenity:"bank",brand:"CEC Bank","brand:wikidata":"Q1023306","brand:wikipedia":"en:CEC Bank",name:"CEC Bank"},matchScore:2,suggestion:true},"amenity/bank/CIB Bank":{name:"CIB Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q839566"},addTags:{amenity:"bank",brand:"CIB Bank","brand:wikidata":"Q839566","brand:wikipedia":"en:CIB Bank",name:"CIB Bank"},removeTags:{amenity:"bank",brand:"CIB Bank","brand:wikidata":"Q839566","brand:wikipedia":"en:CIB Bank",name:"CIB Bank"},matchScore:2,suggestion:true},"amenity/bank/CIBC":{name:"CIBC",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q666694"},addTags:{amenity:"bank",brand:"CIBC","brand:wikidata":"Q666694","brand:wikipedia":"en:Canadian Imperial Bank of Commerce",name:"CIBC"},removeTags:{amenity:"bank",brand:"CIBC","brand:wikidata":"Q666694","brand:wikipedia":"en:Canadian Imperial Bank of Commerce",name:"CIBC"},matchScore:2,suggestion:true},"amenity/bank/CIH Bank":{name:"CIH Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3006220"},addTags:{amenity:"bank",brand:"CIH Bank","brand:wikidata":"Q3006220","brand:wikipedia":"en:CIH Bank",name:"CIH Bank"},removeTags:{amenity:"bank",brand:"CIH Bank","brand:wikidata":"Q3006220","brand:wikipedia":"en:CIH Bank",name:"CIH Bank"},matchScore:2,suggestion:true},"amenity/bank/CIMB Bank":{name:"CIMB Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3045976"},addTags:{amenity:"bank",brand:"CIMB Bank","brand:wikidata":"Q3045976","brand:wikipedia":"en:CIMB",name:"CIMB Bank"},removeTags:{amenity:"bank",brand:"CIMB Bank","brand:wikidata":"Q3045976","brand:wikipedia":"en:CIMB",name:"CIMB Bank"},matchScore:2,suggestion:true},"amenity/bank/CIMB Niaga":{name:"CIMB Niaga",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5011747"},addTags:{amenity:"bank",brand:"CIMB Niaga","brand:wikidata":"Q5011747","brand:wikipedia":"en:CIMB Niaga",name:"CIMB Niaga"},removeTags:{amenity:"bank",brand:"CIMB Niaga","brand:wikidata":"Q5011747","brand:wikipedia":"en:CIMB Niaga",name:"CIMB Niaga"},matchScore:2,suggestion:true},"amenity/bank/Caisse Desjardins":{name:"Caisse Desjardins",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2933350"},addTags:{amenity:"bank",brand:"Caisse Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Caisse Desjardins"},removeTags:{amenity:"bank",brand:"Caisse Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Caisse Desjardins"},matchScore:2,suggestion:true},"amenity/bank/Caixa Econômica Federal":{name:"Caixa Econômica Federal",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q835283"},addTags:{amenity:"bank",brand:"Caixa Econômica Federal","brand:wikidata":"Q835283","brand:wikipedia":"pt:Caixa Econômica Federal",name:"Caixa Econômica Federal"},removeTags:{amenity:"bank",brand:"Caixa Econômica Federal","brand:wikidata":"Q835283","brand:wikipedia":"pt:Caixa Econômica Federal",name:"Caixa Econômica Federal"},matchScore:2,suggestion:true},"amenity/bank/Caixa Geral de Depósitos":{name:"Caixa Geral de Depósitos",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1026044"},addTags:{amenity:"bank",brand:"Caixa Geral de Depósitos","brand:wikidata":"Q1026044","brand:wikipedia":"pt:Caixa Geral de Depósitos",name:"Caixa Geral de Depósitos"},removeTags:{amenity:"bank",brand:"Caixa Geral de Depósitos","brand:wikidata":"Q1026044","brand:wikipedia":"pt:Caixa Geral de Depósitos",name:"Caixa Geral de Depósitos"},matchScore:2,suggestion:true},"amenity/bank/Caixabank":{name:"Caixabank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q847225"},addTags:{amenity:"bank","brand:wikidata":"Q847225","brand:wikipedia":"en:CaixaBank",name:"Caixabank"},removeTags:{amenity:"bank","brand:wikidata":"Q847225","brand:wikipedia":"en:CaixaBank",name:"Caixabank"},matchScore:2,suggestion:true},"amenity/bank/CajaSur":{name:"CajaSur",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3751637"},addTags:{amenity:"bank",brand:"CajaSur","brand:wikidata":"Q3751637","brand:wikipedia":"en:CajaSur",name:"CajaSur"},removeTags:{amenity:"bank",brand:"CajaSur","brand:wikidata":"Q3751637","brand:wikipedia":"en:CajaSur",name:"CajaSur"},matchScore:2,suggestion:true},"amenity/bank/Canara Bank":{name:"Canara Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003777"},addTags:{amenity:"bank",brand:"Canara Bank","brand:wikidata":"Q2003777","brand:wikipedia":"en:Canara Bank",name:"Canara Bank"},removeTags:{amenity:"bank",brand:"Canara Bank","brand:wikidata":"Q2003777","brand:wikipedia":"en:Canara Bank",name:"Canara Bank"},matchScore:2,suggestion:true},"amenity/bank/Capital One":{name:"Capital One",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1034654"},addTags:{amenity:"bank",brand:"Capital One","brand:wikidata":"Q1034654","brand:wikipedia":"en:Capital One",name:"Capital One"},removeTags:{amenity:"bank",brand:"Capital One","brand:wikidata":"Q1034654","brand:wikipedia":"en:Capital One",name:"Capital One"},matchScore:2,suggestion:true},"amenity/bank/Cariparma":{name:"Cariparma",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2938832"},addTags:{amenity:"bank",brand:"Cariparma","brand:wikidata":"Q2938832","brand:wikipedia":"en:Crédit Agricole Italia",name:"Cariparma"},removeTags:{amenity:"bank",brand:"Cariparma","brand:wikidata":"Q2938832","brand:wikipedia":"en:Crédit Agricole Italia",name:"Cariparma"},matchScore:2,suggestion:true},"amenity/bank/Carisbo":{name:"Carisbo",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3661937"},addTags:{amenity:"bank",brand:"Carisbo","brand:wikidata":"Q3661937","brand:wikipedia":"en:Cassa di Risparmio in Bologna",name:"Carisbo"},removeTags:{amenity:"bank",brand:"Carisbo","brand:wikidata":"Q3661937","brand:wikipedia":"en:Cassa di Risparmio in Bologna",name:"Carisbo"},matchScore:2,suggestion:true},"amenity/bank/Cassa di Risparmio del Veneto":{name:"Cassa di Risparmio del Veneto",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3661909"},addTags:{amenity:"bank",brand:"Cassa di Risparmio del Veneto","brand:wikidata":"Q3661909","brand:wikipedia":"en:Cassa di Risparmio del Veneto",name:"Cassa di Risparmio del Veneto"},removeTags:{amenity:"bank",brand:"Cassa di Risparmio del Veneto","brand:wikidata":"Q3661909","brand:wikipedia":"en:Cassa di Risparmio del Veneto",name:"Cassa di Risparmio del Veneto"},matchScore:2,suggestion:true},"amenity/bank/CatalunyaCaixa":{name:"CatalunyaCaixa",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3750952"},addTags:{amenity:"bank",brand:"CatalunyaCaixa","brand:wikidata":"Q3750952","brand:wikipedia":"en:CatalunyaCaixa",name:"CatalunyaCaixa"},removeTags:{amenity:"bank",brand:"CatalunyaCaixa","brand:wikidata":"Q3750952","brand:wikipedia":"en:CatalunyaCaixa",name:"CatalunyaCaixa"},matchScore:2,suggestion:true},"amenity/bank/Central Bank of India":{name:"Central Bank of India",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2007090"},addTags:{amenity:"bank",brand:"Central Bank of India","brand:wikidata":"Q2007090","brand:wikipedia":"en:Central Bank of India",name:"Central Bank of India"},removeTags:{amenity:"bank",brand:"Central Bank of India","brand:wikidata":"Q2007090","brand:wikipedia":"en:Central Bank of India",name:"Central Bank of India"},matchScore:2,suggestion:true},"amenity/bank/Chase":{name:"Chase",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q524629"},addTags:{amenity:"bank",brand:"Chase","brand:wikidata":"Q524629","brand:wikipedia":"en:Chase Bank",name:"Chase"},removeTags:{amenity:"bank",brand:"Chase","brand:wikidata":"Q524629","brand:wikipedia":"en:Chase Bank",name:"Chase"},matchScore:2,suggestion:true},"amenity/bank/China Bank Savings":{name:"China Bank Savings",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q18387359"},addTags:{amenity:"bank",brand:"China Bank Savings","brand:wikidata":"Q18387359","brand:wikipedia":"en:China Bank Savings",name:"China Bank Savings"},removeTags:{amenity:"bank",brand:"China Bank Savings","brand:wikidata":"Q18387359","brand:wikipedia":"en:China Bank Savings",name:"China Bank Savings"},matchScore:2,suggestion:true},"amenity/bank/China Construction Bank":{name:"China Construction Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26299"},addTags:{amenity:"bank",brand:"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"China Construction Bank"},removeTags:{amenity:"bank",brand:"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"China Construction Bank"},matchScore:2,suggestion:true},"amenity/bank/Citibank":{name:"Citibank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q857063"},addTags:{amenity:"bank",brand:"Citibank","brand:wikidata":"Q857063","brand:wikipedia":"en:Citibank",name:"Citibank"},removeTags:{amenity:"bank",brand:"Citibank","brand:wikidata":"Q857063","brand:wikipedia":"en:Citibank",name:"Citibank"},matchScore:2,suggestion:true},"amenity/bank/Citizens Bank":{name:"Citizens Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q25209674"},addTags:{amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q25209674","brand:wikipedia":"en:Citizens Bank (South Bend, Indiana)",name:"Citizens Bank"},removeTags:{amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q25209674","brand:wikipedia":"en:Citizens Bank (South Bend, Indiana)",name:"Citizens Bank"},matchScore:2,suggestion:true},"amenity/bank/Comerica Bank":{name:"Comerica Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1114148"},addTags:{amenity:"bank",brand:"Comerica Bank","brand:wikidata":"Q1114148","brand:wikipedia":"en:Comerica",name:"Comerica Bank"},removeTags:{amenity:"bank",brand:"Comerica Bank","brand:wikidata":"Q1114148","brand:wikipedia":"en:Comerica",name:"Comerica Bank"},matchScore:2,suggestion:true},"amenity/bank/Commerzbank":{name:"Commerzbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q157617"},addTags:{amenity:"bank",brand:"Commerzbank","brand:wikidata":"Q157617","brand:wikipedia":"en:Commerzbank",name:"Commerzbank"},removeTags:{amenity:"bank",brand:"Commerzbank","brand:wikidata":"Q157617","brand:wikipedia":"en:Commerzbank",name:"Commerzbank"},matchScore:2,suggestion:true},"amenity/bank/Commonwealth Bank":{name:"Commonwealth Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q285328"},addTags:{amenity:"bank",brand:"Commonwealth Bank","brand:wikidata":"Q285328","brand:wikipedia":"en:Commonwealth Bank",name:"Commonwealth Bank"},removeTags:{amenity:"bank",brand:"Commonwealth Bank","brand:wikidata":"Q285328","brand:wikipedia":"en:Commonwealth Bank",name:"Commonwealth Bank"},matchScore:2,suggestion:true},"amenity/bank/Corporation Bank":{name:"Corporation Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003387"},addTags:{amenity:"bank",brand:"Corporation Bank","brand:wikidata":"Q2003387","brand:wikipedia":"en:Corporation Bank",name:"Corporation Bank"},removeTags:{amenity:"bank",brand:"Corporation Bank","brand:wikidata":"Q2003387","brand:wikipedia":"en:Corporation Bank",name:"Corporation Bank"},matchScore:2,suggestion:true},"amenity/bank/Credem":{name:"Credem",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3696881"},addTags:{amenity:"bank",brand:"Credem","brand:wikidata":"Q3696881","brand:wikipedia":"en:Credito Emiliano",name:"Credem"},removeTags:{amenity:"bank",brand:"Credem","brand:wikidata":"Q3696881","brand:wikipedia":"en:Credito Emiliano",name:"Credem"},matchScore:2,suggestion:true},"amenity/bank/Credicoop":{name:"Credicoop",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854086"},addTags:{amenity:"bank",brand:"Credicoop","brand:wikidata":"Q4854086","brand:wikipedia":"en:Banco Credicoop",name:"Credicoop"},removeTags:{amenity:"bank",brand:"Credicoop","brand:wikidata":"Q4854086","brand:wikipedia":"en:Banco Credicoop",name:"Credicoop"},matchScore:2,suggestion:true},"amenity/bank/Credit Suisse":{name:"Credit Suisse",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q372657"},addTags:{amenity:"bank",brand:"Credit Suisse","brand:wikidata":"Q372657","brand:wikipedia":"en:Credit Suisse",name:"Credit Suisse"},removeTags:{amenity:"bank",brand:"Credit Suisse","brand:wikidata":"Q372657","brand:wikipedia":"en:Credit Suisse",name:"Credit Suisse"},matchScore:2,suggestion:true},"amenity/bank/Credito Valtellinese":{name:"Credito Valtellinese",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3696888"},addTags:{amenity:"bank",brand:"Credito Valtellinese","brand:wikidata":"Q3696888","brand:wikipedia":"en:Credito Valtellinese",name:"Credito Valtellinese"},removeTags:{amenity:"bank",brand:"Credito Valtellinese","brand:wikidata":"Q3696888","brand:wikipedia":"en:Credito Valtellinese",name:"Credito Valtellinese"},matchScore:2,suggestion:true},"amenity/bank/Crelan":{name:"Crelan",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q389872"},addTags:{amenity:"bank",brand:"Crelan","brand:wikidata":"Q389872","brand:wikipedia":"en:Crelan",name:"Crelan"},removeTags:{amenity:"bank",brand:"Crelan","brand:wikidata":"Q389872","brand:wikipedia":"en:Crelan",name:"Crelan"},matchScore:2,suggestion:true},"amenity/bank/Crédit Agricole":{name:"Crédit Agricole",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q590952"},addTags:{amenity:"bank",brand:"Crédit Agricole","brand:wikidata":"Q590952","brand:wikipedia":"fr:Crédit agricole",name:"Crédit Agricole"},removeTags:{amenity:"bank",brand:"Crédit Agricole","brand:wikidata":"Q590952","brand:wikipedia":"fr:Crédit agricole",name:"Crédit Agricole"},matchScore:2,suggestion:true},"amenity/bank/Crédit Maritime":{name:"Crédit Maritime",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q17176866"},addTags:{amenity:"bank",brand:"Crédit Maritime","brand:wikidata":"Q17176866","brand:wikipedia":"fr:Crédit maritime",name:"Crédit Maritime"},removeTags:{amenity:"bank",brand:"Crédit Maritime","brand:wikidata":"Q17176866","brand:wikipedia":"fr:Crédit maritime",name:"Crédit Maritime"},matchScore:2,suggestion:true},"amenity/bank/Crédit Mutuel":{name:"Crédit Mutuel",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q642627"},addTags:{amenity:"bank",brand:"Crédit Mutuel","brand:wikidata":"Q642627","brand:wikipedia":"en:Crédit Mutuel",name:"Crédit Mutuel"},removeTags:{amenity:"bank",brand:"Crédit Mutuel","brand:wikidata":"Q642627","brand:wikipedia":"en:Crédit Mutuel",name:"Crédit Mutuel"},matchScore:2,suggestion:true},"amenity/bank/Crédit du Nord":{name:"Crédit du Nord",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3006209"},addTags:{amenity:"bank",brand:"Crédit du Nord","brand:wikidata":"Q3006209","brand:wikipedia":"en:Crédit du Nord",name:"Crédit du Nord"},removeTags:{amenity:"bank",brand:"Crédit du Nord","brand:wikidata":"Q3006209","brand:wikipedia":"en:Crédit du Nord",name:"Crédit du Nord"},matchScore:2,suggestion:true},"amenity/bank/Danske Bank":{name:"Danske Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1636974"},addTags:{amenity:"bank",brand:"Danske Bank","brand:wikidata":"Q1636974","brand:wikipedia":"en:Danske Bank",name:"Danske Bank"},removeTags:{amenity:"bank",brand:"Danske Bank","brand:wikidata":"Q1636974","brand:wikipedia":"en:Danske Bank",name:"Danske Bank"},matchScore:2,suggestion:true},"amenity/bank/Davivienda":{name:"Davivienda",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5242054"},addTags:{amenity:"bank",brand:"Davivienda","brand:wikidata":"Q5242054","brand:wikipedia":"en:Davivienda",name:"Davivienda"},removeTags:{amenity:"bank",brand:"Davivienda","brand:wikidata":"Q5242054","brand:wikipedia":"en:Davivienda",name:"Davivienda"},matchScore:2,suggestion:true},"amenity/bank/Denizbank":{name:"Denizbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1115064"},addTags:{amenity:"bank",brand:"Denizbank","brand:wikidata":"Q1115064","brand:wikipedia":"en:DenizBank",name:"Denizbank"},removeTags:{amenity:"bank",brand:"Denizbank","brand:wikidata":"Q1115064","brand:wikipedia":"en:DenizBank",name:"Denizbank"},matchScore:2,suggestion:true},"amenity/bank/Deutsche Bank":{name:"Deutsche Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q66048"},addTags:{amenity:"bank",brand:"Deutsche Bank","brand:wikidata":"Q66048","brand:wikipedia":"en:Deutsche Bank",name:"Deutsche Bank"},removeTags:{amenity:"bank",brand:"Deutsche Bank","brand:wikidata":"Q66048","brand:wikipedia":"en:Deutsche Bank",name:"Deutsche Bank"},matchScore:2,suggestion:true},"amenity/bank/Dubai Islamic Bank":{name:"Dubai Islamic Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5310570"},addTags:{amenity:"bank",brand:"Dubai Islamic Bank","brand:wikidata":"Q5310570","brand:wikipedia":"en:Dubai Islamic Bank",name:"Dubai Islamic Bank"},removeTags:{amenity:"bank",brand:"Dubai Islamic Bank","brand:wikidata":"Q5310570","brand:wikipedia":"en:Dubai Islamic Bank",name:"Dubai Islamic Bank"},matchScore:2,suggestion:true},"amenity/bank/EastWest Bank":{name:"EastWest Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5327595"},addTags:{amenity:"bank",brand:"EastWest Bank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Bank"},removeTags:{amenity:"bank",brand:"EastWest Bank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Bank"},matchScore:2,suggestion:true},"amenity/bank/Ecobank":{name:"Ecobank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q930225"},addTags:{amenity:"bank",brand:"Ecobank","brand:wikidata":"Q930225","brand:wikipedia":"en:Ecobank",name:"Ecobank"},removeTags:{amenity:"bank",brand:"Ecobank","brand:wikidata":"Q930225","brand:wikipedia":"en:Ecobank",name:"Ecobank"},matchScore:2,suggestion:true},"amenity/bank/Erste Bank":{name:"Erste Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q696867"},addTags:{amenity:"bank",brand:"Erste Bank","brand:wikidata":"Q696867","brand:wikipedia":"de:Erste Bank",name:"Erste Bank"},removeTags:{amenity:"bank",brand:"Erste Bank","brand:wikidata":"Q696867","brand:wikipedia":"de:Erste Bank",name:"Erste Bank"},matchScore:2,suggestion:true},"amenity/bank/FNB":{name:"FNB",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3072956"},addTags:{amenity:"bank",brand:"FNB","brand:wikidata":"Q3072956","brand:wikipedia":"en:First National Bank (South Africa)",name:"FNB"},removeTags:{amenity:"bank",brand:"FNB","brand:wikidata":"Q3072956","brand:wikipedia":"en:First National Bank (South Africa)",name:"FNB"},matchScore:2,suggestion:true},"amenity/bank/Faysal Bank":{name:"Faysal Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5439099"},addTags:{amenity:"bank",brand:"Faysal Bank","brand:wikidata":"Q5439099","brand:wikipedia":"en:Faysal Bank",name:"Faysal Bank"},removeTags:{amenity:"bank",brand:"Faysal Bank","brand:wikidata":"Q5439099","brand:wikipedia":"en:Faysal Bank",name:"Faysal Bank"},matchScore:2,suggestion:true},"amenity/bank/Federal Bank":{name:"Federal Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2044983"},addTags:{amenity:"bank",brand:"Federal Bank","brand:wikidata":"Q2044983","brand:wikipedia":"en:Federal Bank",name:"Federal Bank"},removeTags:{amenity:"bank",brand:"Federal Bank","brand:wikidata":"Q2044983","brand:wikipedia":"en:Federal Bank",name:"Federal Bank"},matchScore:2,suggestion:true},"amenity/bank/Fifth Third Bank":{name:"Fifth Third Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1411810"},addTags:{amenity:"bank",brand:"Fifth Third Bank","brand:wikidata":"Q1411810","brand:wikipedia":"en:Fifth Third Bank",name:"Fifth Third Bank"},removeTags:{amenity:"bank",brand:"Fifth Third Bank","brand:wikidata":"Q1411810","brand:wikipedia":"en:Fifth Third Bank",name:"Fifth Third Bank"},matchScore:2,suggestion:true},"amenity/bank/Finansbank":{name:"Finansbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1416237"},addTags:{amenity:"bank",brand:"Finansbank","brand:wikidata":"Q1416237","brand:wikipedia":"en:Finansbank",name:"Finansbank"},removeTags:{amenity:"bank",brand:"Finansbank","brand:wikidata":"Q1416237","brand:wikipedia":"en:Finansbank",name:"Finansbank"},matchScore:2,suggestion:true},"amenity/bank/First Citizens Bank":{name:"First Citizens Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5452734"},addTags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452734","brand:wikipedia":"en:First Citizens Bank (Trinidad and Tobago)",name:"First Citizens Bank"},removeTags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452734","brand:wikipedia":"en:First Citizens Bank (Trinidad and Tobago)",name:"First Citizens Bank"},matchScore:2,suggestion:true},"amenity/bank/GCB Bank":{name:"GCB Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1521346"},addTags:{amenity:"bank",brand:"GCB Bank","brand:wikidata":"Q1521346","brand:wikipedia":"en:GCB Bank Limited",name:"GCB Bank"},removeTags:{amenity:"bank",brand:"GCB Bank","brand:wikidata":"Q1521346","brand:wikipedia":"en:GCB Bank Limited",name:"GCB Bank"},matchScore:2,suggestion:true},"amenity/bank/Garanti":{name:"Garanti",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q322962"},addTags:{amenity:"bank",brand:"Garanti","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti"},removeTags:{amenity:"bank",brand:"Garanti","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti"},matchScore:2,suggestion:true},"amenity/bank/Garanti Bankası":{name:"Garanti Bankası",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q322962"},addTags:{amenity:"bank",brand:"Garanti Bankası","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti Bankası"},removeTags:{amenity:"bank",brand:"Garanti Bankası","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti Bankası"},matchScore:2,suggestion:true},"amenity/bank/Getin Bank":{name:"Getin Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9267646"},addTags:{amenity:"bank",brand:"Getin Bank","brand:wikidata":"Q9267646","brand:wikipedia":"en:Getin Bank",name:"Getin Bank"},removeTags:{amenity:"bank",brand:"Getin Bank","brand:wikidata":"Q9267646","brand:wikipedia":"en:Getin Bank",name:"Getin Bank"},matchScore:2,suggestion:true},"amenity/bank/Great Western Bank":{name:"Great Western Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5600185"},addTags:{amenity:"bank",brand:"Great Western Bank","brand:wikidata":"Q5600185","brand:wikipedia":"en:Great Western Bank (1907–present)",name:"Great Western Bank"},removeTags:{amenity:"bank",brand:"Great Western Bank","brand:wikidata":"Q5600185","brand:wikipedia":"en:Great Western Bank (1907–present)",name:"Great Western Bank"},matchScore:2,suggestion:true},"amenity/bank/Groupama":{name:"Groupama",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3083531"},addTags:{amenity:"bank",brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"en:Groupama",name:"Groupama"},removeTags:{amenity:"bank",brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"en:Groupama",name:"Groupama"},matchScore:2,suggestion:true},"amenity/bank/HBL Bank":{name:"HBL Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1566843"},addTags:{amenity:"bank",brand:"HBL Bank","brand:wikidata":"Q1566843","brand:wikipedia":"ur:ایچ بی ایل پاکستان",name:"HBL Bank"},removeTags:{amenity:"bank",brand:"HBL Bank","brand:wikidata":"Q1566843","brand:wikipedia":"ur:ایچ بی ایل پاکستان",name:"HBL Bank"},matchScore:2,suggestion:true},"amenity/bank/HDFC Bank":{name:"HDFC Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q631047"},addTags:{amenity:"bank",brand:"HDFC Bank","brand:wikidata":"Q631047","brand:wikipedia":"en:HDFC Bank",name:"HDFC Bank"},removeTags:{amenity:"bank",brand:"HDFC Bank","brand:wikidata":"Q631047","brand:wikipedia":"en:HDFC Bank",name:"HDFC Bank"},matchScore:2,suggestion:true},"amenity/bank/Halkbank":{name:"Halkbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3593818"},addTags:{amenity:"bank",brand:"Halkbank","brand:wikidata":"Q3593818","brand:wikipedia":"en:Halkbank a.d.",name:"Halkbank"},removeTags:{amenity:"bank",brand:"Halkbank","brand:wikidata":"Q3593818","brand:wikipedia":"en:Halkbank a.d.",name:"Halkbank"},matchScore:2,suggestion:true},"amenity/bank/Handelsbanken":{name:"Handelsbanken",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1421630"},addTags:{amenity:"bank",brand:"Handelsbanken","brand:wikidata":"Q1421630","brand:wikipedia":"en:Handelsbanken",name:"Handelsbanken"},removeTags:{amenity:"bank",brand:"Handelsbanken","brand:wikidata":"Q1421630","brand:wikipedia":"en:Handelsbanken",name:"Handelsbanken"},matchScore:2,suggestion:true},"amenity/bank/Heritage Bank":{name:"Heritage Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5738690"},addTags:{amenity:"bank",brand:"Heritage Bank","brand:wikidata":"Q5738690","brand:wikipedia":"en:Heritage Bank",name:"Heritage Bank"},removeTags:{amenity:"bank",brand:"Heritage Bank","brand:wikidata":"Q5738690","brand:wikipedia":"en:Heritage Bank",name:"Heritage Bank"},matchScore:2,suggestion:true},"amenity/bank/Hong Leong Bank":{name:"Hong Leong Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4383943"},addTags:{amenity:"bank",brand:"Hong Leong Bank","brand:wikidata":"Q4383943","brand:wikipedia":"en:Hong Leong Bank",name:"Hong Leong Bank"},removeTags:{amenity:"bank",brand:"Hong Leong Bank","brand:wikidata":"Q4383943","brand:wikipedia":"en:Hong Leong Bank",name:"Hong Leong Bank"},matchScore:2,suggestion:true},"amenity/bank/Hrvatska poštanska banka":{name:"Hrvatska poštanska banka",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5923981"},addTags:{amenity:"bank",brand:"Hrvatska poštanska banka","brand:wikidata":"Q5923981","brand:wikipedia":"en:Hrvatska poštanska banka",name:"Hrvatska poštanska banka"},removeTags:{amenity:"bank",brand:"Hrvatska poštanska banka","brand:wikidata":"Q5923981","brand:wikipedia":"en:Hrvatska poštanska banka",name:"Hrvatska poštanska banka"},matchScore:2,suggestion:true},"amenity/bank/HypoVereinsbank":{name:"HypoVereinsbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q220189"},addTags:{amenity:"bank",brand:"HypoVereinsbank","brand:wikidata":"Q220189","brand:wikipedia":"en:HypoVereinsbank",name:"HypoVereinsbank"},removeTags:{amenity:"bank",brand:"HypoVereinsbank","brand:wikidata":"Q220189","brand:wikipedia":"en:HypoVereinsbank",name:"HypoVereinsbank"},matchScore:2,suggestion:true},"amenity/bank/ICICI Bank":{name:"ICICI Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1653258"},addTags:{amenity:"bank",brand:"ICICI Bank","brand:wikidata":"Q1653258","brand:wikipedia":"en:ICICI Bank",name:"ICICI Bank"},removeTags:{amenity:"bank",brand:"ICICI Bank","brand:wikidata":"Q1653258","brand:wikipedia":"en:ICICI Bank",name:"ICICI Bank"},matchScore:2,suggestion:true},"amenity/bank/IDBI Bank":{name:"IDBI Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633485"},addTags:{amenity:"bank",brand:"IDBI Bank","brand:wikidata":"Q3633485","brand:wikipedia":"en:IDBI Bank",name:"IDBI Bank"},removeTags:{amenity:"bank",brand:"IDBI Bank","brand:wikidata":"Q3633485","brand:wikipedia":"en:IDBI Bank",name:"IDBI Bank"},matchScore:2,suggestion:true},"amenity/bank/ING":{name:"ING",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q645708"},addTags:{amenity:"bank",brand:"ING","brand:wikidata":"Q645708","brand:wikipedia":"en:ING Group",name:"ING"},removeTags:{amenity:"bank",brand:"ING","brand:wikidata":"Q645708","brand:wikipedia":"en:ING Group",name:"ING"},matchScore:2,suggestion:true},"amenity/bank/ING Bank Śląski":{name:"ING Bank Śląski",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1410383"},addTags:{amenity:"bank",brand:"ING Bank Śląski","brand:wikidata":"Q1410383","brand:wikipedia":"en:ING Bank Śląski",name:"ING Bank Śląski"},removeTags:{amenity:"bank",brand:"ING Bank Śląski","brand:wikidata":"Q1410383","brand:wikipedia":"en:ING Bank Śląski",name:"ING Bank Śląski"},matchScore:2,suggestion:true},"amenity/bank/Ibercaja":{name:"Ibercaja",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5907815"},addTags:{amenity:"bank",brand:"Ibercaja","brand:wikidata":"Q5907815","brand:wikipedia":"es:Ibercaja Banco",name:"Ibercaja"},removeTags:{amenity:"bank",brand:"Ibercaja","brand:wikidata":"Q5907815","brand:wikipedia":"es:Ibercaja Banco",name:"Ibercaja"},matchScore:2,suggestion:true},"amenity/bank/Indian Bank":{name:"Indian Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003789"},addTags:{amenity:"bank",brand:"Indian Bank","brand:wikidata":"Q2003789","brand:wikipedia":"en:Indian Bank",name:"Indian Bank"},removeTags:{amenity:"bank",brand:"Indian Bank","brand:wikidata":"Q2003789","brand:wikipedia":"en:Indian Bank",name:"Indian Bank"},matchScore:2,suggestion:true},"amenity/bank/Indian Overseas Bank":{name:"Indian Overseas Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003611"},addTags:{amenity:"bank",brand:"Indian Overseas Bank","brand:wikidata":"Q2003611","brand:wikipedia":"en:Indian Overseas Bank",name:"Indian Overseas Bank"},removeTags:{amenity:"bank",brand:"Indian Overseas Bank","brand:wikidata":"Q2003611","brand:wikipedia":"en:Indian Overseas Bank",name:"Indian Overseas Bank"},matchScore:2,suggestion:true},"amenity/bank/Interbank":{name:"Interbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2835558"},addTags:{amenity:"bank",brand:"Interbank","brand:wikidata":"Q2835558","brand:wikipedia":"es:Banco Interbank",name:"Interbank"},removeTags:{amenity:"bank",brand:"Interbank","brand:wikidata":"Q2835558","brand:wikipedia":"es:Banco Interbank",name:"Interbank"},matchScore:2,suggestion:true},"amenity/bank/Intesa Sanpaolo":{name:"Intesa Sanpaolo",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1343118"},addTags:{amenity:"bank",brand:"Intesa Sanpaolo","brand:wikidata":"Q1343118","brand:wikipedia":"it:Intesa Sanpaolo",name:"Intesa Sanpaolo"},removeTags:{amenity:"bank",brand:"Intesa Sanpaolo","brand:wikidata":"Q1343118","brand:wikipedia":"it:Intesa Sanpaolo",name:"Intesa Sanpaolo"},matchScore:2,suggestion:true},"amenity/bank/Itaú":{name:"Itaú",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2423252"},addTags:{amenity:"bank",brand:"Itaú","brand:wikidata":"Q2423252","brand:wikipedia":"en:Itaú Corpbanca",name:"Itaú"},removeTags:{amenity:"bank",brand:"Itaú","brand:wikidata":"Q2423252","brand:wikipedia":"en:Itaú Corpbanca",name:"Itaú"},matchScore:2,suggestion:true},"amenity/bank/JS Bank":{name:"JS Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6108986"},addTags:{amenity:"bank",brand:"JS Bank","brand:wikidata":"Q6108986","brand:wikipedia":"en:JS Bank",name:"JS Bank"},removeTags:{amenity:"bank",brand:"JS Bank","brand:wikidata":"Q6108986","brand:wikipedia":"en:JS Bank",name:"JS Bank"},matchScore:2,suggestion:true},"amenity/bank/Jyske Bank":{name:"Jyske Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q136672"},addTags:{amenity:"bank",brand:"Jyske Bank","brand:wikidata":"Q136672","brand:wikipedia":"en:Jyske Bank",name:"Jyske Bank"},removeTags:{amenity:"bank",brand:"Jyske Bank","brand:wikidata":"Q136672","brand:wikipedia":"en:Jyske Bank",name:"Jyske Bank"},matchScore:2,suggestion:true},"amenity/bank/K&H Bank":{name:"K&H Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6393834"},addTags:{amenity:"bank",brand:"K&H Bank","brand:wikidata":"Q6393834","brand:wikipedia":"en:K&H Bank",name:"K&H Bank"},removeTags:{amenity:"bank",brand:"K&H Bank","brand:wikidata":"Q6393834","brand:wikipedia":"en:K&H Bank",name:"K&H Bank"},matchScore:2,suggestion:true},"amenity/bank/Karnataka Bank":{name:"Karnataka Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2042632"},addTags:{amenity:"bank",brand:"Karnataka Bank","brand:wikidata":"Q2042632","brand:wikipedia":"en:Karnataka Bank",name:"Karnataka Bank"},removeTags:{amenity:"bank",brand:"Karnataka Bank","brand:wikidata":"Q2042632","brand:wikipedia":"en:Karnataka Bank",name:"Karnataka Bank"},matchScore:2,suggestion:true},"amenity/bank/Kasa Stefczyka":{name:"Kasa Stefczyka",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q57624461"},addTags:{amenity:"bank",brand:"Kasa Stefczyka","brand:wikidata":"Q57624461",name:"Kasa Stefczyka"},removeTags:{amenity:"bank",brand:"Kasa Stefczyka","brand:wikidata":"Q57624461",name:"Kasa Stefczyka"},matchScore:2,suggestion:true},"amenity/bank/Komerční banka":{name:"Komerční banka",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1541079"},addTags:{amenity:"bank",brand:"Komerční banka","brand:wikidata":"Q1541079","brand:wikipedia":"en:Komerční banka",name:"Komerční banka"},removeTags:{amenity:"bank",brand:"Komerční banka","brand:wikidata":"Q1541079","brand:wikipedia":"en:Komerční banka",name:"Komerční banka"},matchScore:2,suggestion:true},"amenity/bank/Kreissparkasse":{name:"Kreissparkasse",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2513770"},addTags:{amenity:"bank",brand:"Kreissparkasse","brand:wikidata":"Q2513770","brand:wikipedia":"de:Verband der Freien Sparkassen",name:"Kreissparkasse"},removeTags:{amenity:"bank",brand:"Kreissparkasse","brand:wikidata":"Q2513770","brand:wikipedia":"de:Verband der Freien Sparkassen",name:"Kreissparkasse"},matchScore:2,suggestion:true},"amenity/bank/Kutxabank":{name:"Kutxabank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5139377"},addTags:{amenity:"bank",brand:"Kutxabank","brand:wikidata":"Q5139377","brand:wikipedia":"en:Kutxabank",name:"Kutxabank"},removeTags:{amenity:"bank",brand:"Kutxabank","brand:wikidata":"Q5139377","brand:wikipedia":"en:Kutxabank",name:"Kutxabank"},matchScore:2,suggestion:true},"amenity/bank/La Banque Postale":{name:"La Banque Postale",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3206431"},addTags:{amenity:"bank",brand:"La Banque Postale","brand:wikidata":"Q3206431","brand:wikipedia":"en:La Banque postale",name:"La Banque Postale"},removeTags:{amenity:"bank",brand:"La Banque Postale","brand:wikidata":"Q3206431","brand:wikipedia":"en:La Banque postale",name:"La Banque Postale"},matchScore:2,suggestion:true},"amenity/bank/La Caixa":{name:"La Caixa",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q287753"},addTags:{amenity:"bank",brand:"La Caixa","brand:wikidata":"Q287753","brand:wikipedia":"en:La Caixa",name:"La Caixa"},removeTags:{amenity:"bank",brand:"La Caixa","brand:wikidata":"Q287753","brand:wikipedia":"en:La Caixa",name:"La Caixa"},matchScore:2,suggestion:true},"amenity/bank/Laboral Kutxa":{name:"Laboral Kutxa",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12052386"},addTags:{amenity:"bank",brand:"Laboral Kutxa","brand:wikidata":"Q12052386","brand:wikipedia":"en:Laboral Kutxa",name:"Laboral Kutxa"},removeTags:{amenity:"bank",brand:"Laboral Kutxa","brand:wikidata":"Q12052386","brand:wikipedia":"en:Laboral Kutxa",name:"Laboral Kutxa"},matchScore:2,suggestion:true},"amenity/bank/Landbank":{name:"Landbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6483872"},addTags:{amenity:"bank",brand:"Landbank","brand:wikidata":"Q6483872","brand:wikipedia":"en:Land Bank of the Philippines",name:"Landbank"},removeTags:{amenity:"bank",brand:"Landbank","brand:wikidata":"Q6483872","brand:wikipedia":"en:Land Bank of the Philippines",name:"Landbank"},matchScore:2,suggestion:true},"amenity/bank/Liberbank":{name:"Liberbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2891018"},addTags:{amenity:"bank",brand:"Liberbank","brand:wikidata":"Q2891018","brand:wikipedia":"en:Liberbank",name:"Liberbank"},removeTags:{amenity:"bank",brand:"Liberbank","brand:wikidata":"Q2891018","brand:wikipedia":"en:Liberbank",name:"Liberbank"},matchScore:2,suggestion:true},"amenity/bank/Lloyds Bank":{name:"Lloyds Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1152847"},addTags:{amenity:"bank",brand:"Lloyds Bank","brand:wikidata":"Q1152847","brand:wikipedia":"en:Lloyds Bank",name:"Lloyds Bank"},removeTags:{amenity:"bank",brand:"Lloyds Bank","brand:wikidata":"Q1152847","brand:wikipedia":"en:Lloyds Bank",name:"Lloyds Bank"},matchScore:2,suggestion:true},"amenity/bank/M&T Bank":{name:"M&T Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3272257"},addTags:{amenity:"bank",brand:"M&T Bank","brand:wikidata":"Q3272257","brand:wikipedia":"en:M&T Bank",name:"M&T Bank"},removeTags:{amenity:"bank",brand:"M&T Bank","brand:wikidata":"Q3272257","brand:wikipedia":"en:M&T Bank",name:"M&T Bank"},matchScore:2,suggestion:true},"amenity/bank/MCB":{name:"MCB",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15982510"},addTags:{amenity:"bank",brand:"MCB","brand:wikidata":"Q15982510","brand:wikipedia":"ur:ایم سی بی بینک لمیٹڈ",name:"MCB"},removeTags:{amenity:"bank",brand:"MCB","brand:wikidata":"Q15982510","brand:wikipedia":"ur:ایم سی بی بینک لمیٹڈ",name:"MCB"},matchScore:2,suggestion:true},"amenity/bank/Maybank":{name:"Maybank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1364018"},addTags:{amenity:"bank",brand:"Maybank","brand:wikidata":"Q1364018","brand:wikipedia":"en:Maybank",name:"Maybank"},removeTags:{amenity:"bank",brand:"Maybank","brand:wikidata":"Q1364018","brand:wikipedia":"en:Maybank",name:"Maybank"},matchScore:2,suggestion:true},"amenity/bank/Meezan Bank":{name:"Meezan Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6807934"},addTags:{amenity:"bank",brand:"Meezan Bank","brand:wikidata":"Q6807934","brand:wikipedia":"en:Meezan Bank",name:"Meezan Bank"},removeTags:{amenity:"bank",brand:"Meezan Bank","brand:wikidata":"Q6807934","brand:wikipedia":"en:Meezan Bank",name:"Meezan Bank"},matchScore:2,suggestion:true},"amenity/bank/Mibanco":{name:"Mibanco",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5558589"},addTags:{amenity:"bank",brand:"Mibanco","brand:wikidata":"Q5558589","brand:wikipedia":"es:MiBanco",name:"Mibanco"},removeTags:{amenity:"bank",brand:"Mibanco","brand:wikidata":"Q5558589","brand:wikipedia":"es:MiBanco",name:"Mibanco"},matchScore:2,suggestion:true},"amenity/bank/Millennium Bank":{name:"Millennium Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855947"},addTags:{amenity:"bank",brand:"Millennium Bank","brand:wikidata":"Q4855947","brand:wikipedia":"pl:Bank Millennium",name:"Millennium Bank"},removeTags:{amenity:"bank",brand:"Millennium Bank","brand:wikidata":"Q4855947","brand:wikipedia":"pl:Bank Millennium",name:"Millennium Bank"},matchScore:2,suggestion:true},"amenity/bank/Millennium bcp":{name:"Millennium bcp",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q118581"},addTags:{amenity:"bank",brand:"Millennium bcp","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"Millennium bcp"},removeTags:{amenity:"bank",brand:"Millennium bcp","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"Millennium bcp"},matchScore:2,suggestion:true},"amenity/bank/Monte dei Paschi di Siena":{name:"Monte dei Paschi di Siena",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q46730"},addTags:{amenity:"bank",brand:"Monte dei Paschi di Siena","brand:wikidata":"Q46730","brand:wikipedia":"en:Banca Monte dei Paschi di Siena",name:"Monte dei Paschi di Siena"},removeTags:{amenity:"bank",brand:"Monte dei Paschi di Siena","brand:wikidata":"Q46730","brand:wikipedia":"en:Banca Monte dei Paschi di Siena",name:"Monte dei Paschi di Siena"},matchScore:2,suggestion:true},"amenity/bank/Montepio":{name:"Montepio",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1946091"},addTags:{amenity:"bank",brand:"Montepio","brand:wikidata":"Q1946091","brand:wikipedia":"en:Montepio (bank)",name:"Montepio"},removeTags:{amenity:"bank",brand:"Montepio","brand:wikidata":"Q1946091","brand:wikipedia":"en:Montepio (bank)",name:"Montepio"},matchScore:2,suggestion:true},"amenity/bank/NAB":{name:"NAB",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1430985"},addTags:{amenity:"bank",brand:"NAB","brand:wikidata":"Q1430985","brand:wikipedia":"en:National Australia Bank",name:"NAB"},removeTags:{amenity:"bank",brand:"NAB","brand:wikidata":"Q1430985","brand:wikipedia":"en:National Australia Bank",name:"NAB"},matchScore:2,suggestion:true},"amenity/bank/NatWest":{name:"NatWest",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2740021"},addTags:{amenity:"bank",brand:"NatWest","brand:wikidata":"Q2740021","brand:wikipedia":"en:NatWest",name:"NatWest"},removeTags:{amenity:"bank",brand:"NatWest","brand:wikidata":"Q2740021","brand:wikipedia":"en:NatWest",name:"NatWest"},matchScore:2,suggestion:true},"amenity/bank/Nationwide":{name:"Nationwide",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q846735"},addTags:{amenity:"bank",brand:"Nationwide","brand:wikidata":"Q846735","brand:wikipedia":"en:Nationwide Building Society",name:"Nationwide"},removeTags:{amenity:"bank",brand:"Nationwide","brand:wikidata":"Q846735","brand:wikipedia":"en:Nationwide Building Society",name:"Nationwide"},matchScore:2,suggestion:true},"amenity/bank/Navy Federal Credit Union":{name:"Navy Federal Credit Union",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6982632"},addTags:{amenity:"bank",brand:"Navy Federal Credit Union","brand:wikidata":"Q6982632","brand:wikipedia":"en:Navy Federal Credit Union",name:"Navy Federal Credit Union"},removeTags:{amenity:"bank",brand:"Navy Federal Credit Union","brand:wikidata":"Q6982632","brand:wikipedia":"en:Navy Federal Credit Union",name:"Navy Federal Credit Union"},matchScore:2,suggestion:true},"amenity/bank/Nedbank":{name:"Nedbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2751701"},addTags:{amenity:"bank",brand:"Nedbank","brand:wikidata":"Q2751701","brand:wikipedia":"en:Nedbank",name:"Nedbank"},removeTags:{amenity:"bank",brand:"Nedbank","brand:wikidata":"Q2751701","brand:wikipedia":"en:Nedbank",name:"Nedbank"},matchScore:2,suggestion:true},"amenity/bank/Nordea":{name:"Nordea",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1123823"},addTags:{amenity:"bank",brand:"Nordea","brand:wikidata":"Q1123823","brand:wikipedia":"en:Nordea",name:"Nordea"},removeTags:{amenity:"bank",brand:"Nordea","brand:wikidata":"Q1123823","brand:wikipedia":"en:Nordea",name:"Nordea"},matchScore:2,suggestion:true},"amenity/bank/Novo Banco":{name:"Novo Banco",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q17488861"},addTags:{amenity:"bank",brand:"Novo Banco","brand:wikidata":"Q17488861","brand:wikipedia":"en:Novo Banco",name:"Novo Banco"},removeTags:{amenity:"bank",brand:"Novo Banco","brand:wikidata":"Q17488861","brand:wikipedia":"en:Novo Banco",name:"Novo Banco"},matchScore:2,suggestion:true},"amenity/bank/Oldenburgische Landesbank":{name:"Oldenburgische Landesbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q879591"},addTags:{amenity:"bank",brand:"Oldenburgische Landesbank","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"Oldenburgische Landesbank"},removeTags:{amenity:"bank",brand:"Oldenburgische Landesbank","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"Oldenburgische Landesbank"},matchScore:2,suggestion:true},"amenity/bank/One Network Bank":{name:"One Network Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7093019"},addTags:{amenity:"bank",brand:"One Network Bank","brand:wikidata":"Q7093019","brand:wikipedia":"en:One Network Bank",name:"One Network Bank"},removeTags:{amenity:"bank",brand:"One Network Bank","brand:wikidata":"Q7093019","brand:wikipedia":"en:One Network Bank",name:"One Network Bank"},matchScore:2,suggestion:true},"amenity/bank/Oriental Bank of Commerce":{name:"Oriental Bank of Commerce",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q367008"},addTags:{amenity:"bank",brand:"Oriental Bank of Commerce","brand:wikidata":"Q367008","brand:wikipedia":"en:Oriental Bank of Commerce",name:"Oriental Bank of Commerce"},removeTags:{amenity:"bank",brand:"Oriental Bank of Commerce","brand:wikidata":"Q367008","brand:wikipedia":"en:Oriental Bank of Commerce",name:"Oriental Bank of Commerce"},matchScore:2,suggestion:true},"amenity/bank/PNC Bank":{name:"PNC Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q38928"},addTags:{amenity:"bank",brand:"PNC Bank","brand:wikidata":"Q38928","brand:wikipedia":"en:PNC Financial Services",name:"PNC Bank"},removeTags:{amenity:"bank",brand:"PNC Bank","brand:wikidata":"Q38928","brand:wikipedia":"en:PNC Financial Services",name:"PNC Bank"},matchScore:2,suggestion:true},"amenity/bank/Panin Bank":{name:"Panin Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12502751"},addTags:{amenity:"bank",brand:"Panin Bank","brand:wikidata":"Q12502751","brand:wikipedia":"id:Panin Bank",name:"Panin Bank"},removeTags:{amenity:"bank",brand:"Panin Bank","brand:wikidata":"Q12502751","brand:wikipedia":"id:Panin Bank",name:"Panin Bank"},matchScore:2,suggestion:true},"amenity/bank/Patagonia":{name:"Patagonia",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882078"},addTags:{amenity:"bank",brand:"Patagonia","brand:wikidata":"Q2882078","brand:wikipedia":"en:Banco Patagonia",name:"Patagonia"},removeTags:{amenity:"bank",brand:"Patagonia","brand:wikidata":"Q2882078","brand:wikipedia":"en:Banco Patagonia",name:"Patagonia"},matchScore:2,suggestion:true},"amenity/bank/Pekao SA":{name:"Pekao SA",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806642"},addTags:{amenity:"bank",brand:"Pekao SA","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Pekao SA"},removeTags:{amenity:"bank",brand:"Pekao SA","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Pekao SA"},matchScore:2,suggestion:true},"amenity/bank/People's United Bank":{name:"People's United Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7165802"},addTags:{amenity:"bank",brand:"People's United Bank","brand:wikidata":"Q7165802","brand:wikipedia":"en:People's United Financial",name:"People's United Bank"},removeTags:{amenity:"bank",brand:"People's United Bank","brand:wikidata":"Q7165802","brand:wikipedia":"en:People's United Financial",name:"People's United Bank"},matchScore:2,suggestion:true},"amenity/bank/Peoples Bank":{name:"Peoples Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7166050"},addTags:{amenity:"bank",brand:"Peoples Bank","brand:wikidata":"Q7166050","brand:wikipedia":"en:Peoples Bank",name:"Peoples Bank"},removeTags:{amenity:"bank",brand:"Peoples Bank","brand:wikidata":"Q7166050","brand:wikipedia":"en:Peoples Bank",name:"Peoples Bank"},matchScore:2,suggestion:true},"amenity/bank/Philippine National Bank":{name:"Philippine National Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1657971"},addTags:{amenity:"bank",brand:"Philippine National Bank","brand:wikidata":"Q1657971","brand:wikipedia":"en:Philippine National Bank",name:"Philippine National Bank"},removeTags:{amenity:"bank",brand:"Philippine National Bank","brand:wikidata":"Q1657971","brand:wikipedia":"en:Philippine National Bank",name:"Philippine National Bank"},matchScore:2,suggestion:true},"amenity/bank/Piraeus Bank":{name:"Piraeus Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3312"},addTags:{amenity:"bank",brand:"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Piraeus Bank"},removeTags:{amenity:"bank",brand:"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Piraeus Bank"},matchScore:2,suggestion:true},"amenity/bank/Postbank":{name:"Postbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q708835"},addTags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q708835","brand:wikipedia":"en:Deutsche Postbank",name:"Postbank"},removeTags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q708835","brand:wikipedia":"en:Deutsche Postbank",name:"Postbank"},matchScore:2,suggestion:true},"amenity/bank/Prima banka":{name:"Prima banka",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q13538661"},addTags:{amenity:"bank",brand:"Prima banka","brand:wikidata":"Q13538661","brand:wikipedia":"sk:Prima banka Slovensko",name:"Prima banka"},removeTags:{amenity:"bank",brand:"Prima banka","brand:wikidata":"Q13538661","brand:wikipedia":"sk:Prima banka Slovensko",name:"Prima banka"},matchScore:2,suggestion:true},"amenity/bank/Punjab National Bank":{name:"Punjab National Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2743499"},addTags:{amenity:"bank",brand:"Punjab National Bank","brand:wikidata":"Q2743499","brand:wikipedia":"en:Punjab National Bank",name:"Punjab National Bank"},removeTags:{amenity:"bank",brand:"Punjab National Bank","brand:wikidata":"Q2743499","brand:wikipedia":"en:Punjab National Bank",name:"Punjab National Bank"},matchScore:2,suggestion:true},"amenity/bank/RBC":{name:"RBC",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q735261"},addTags:{amenity:"bank",brand:"RBC","brand:wikidata":"Q735261","brand:wikipedia":"en:Royal Bank of Canada",name:"RBC"},removeTags:{amenity:"bank",brand:"RBC","brand:wikidata":"Q735261","brand:wikipedia":"en:Royal Bank of Canada",name:"RBC"},matchScore:2,suggestion:true},"amenity/bank/RBS":{name:"RBS",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q160126"},addTags:{amenity:"bank",brand:"RBS","brand:wikidata":"Q160126","brand:wikipedia":"en:Royal Bank of Scotland",name:"RBS"},removeTags:{amenity:"bank",brand:"RBS","brand:wikidata":"Q160126","brand:wikipedia":"en:Royal Bank of Scotland",name:"RBS"},matchScore:2,suggestion:true},"amenity/bank/RCBC":{name:"RCBC",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7339070"},addTags:{amenity:"bank",brand:"RCBC","brand:wikidata":"Q7339070","brand:wikipedia":"en:Rizal Commercial Banking Corporation",name:"RCBC"},removeTags:{amenity:"bank",brand:"RCBC","brand:wikidata":"Q7339070","brand:wikipedia":"en:Rizal Commercial Banking Corporation",name:"RCBC"},matchScore:2,suggestion:true},"amenity/bank/Rabobank":{name:"Rabobank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q252004"},addTags:{amenity:"bank",brand:"Rabobank","brand:wikidata":"Q252004","brand:wikipedia":"en:Rabobank",name:"Rabobank"},removeTags:{amenity:"bank",brand:"Rabobank","brand:wikidata":"Q252004","brand:wikipedia":"en:Rabobank",name:"Rabobank"},matchScore:2,suggestion:true},"amenity/bank/Raiffeisen Polbank":{name:"Raiffeisen Polbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9303218"},addTags:{amenity:"bank",brand:"Raiffeisen Polbank","brand:wikidata":"Q9303218","brand:wikipedia":"pl:Raiffeisen Bank Polska",name:"Raiffeisen Polbank"},removeTags:{amenity:"bank",brand:"Raiffeisen Polbank","brand:wikidata":"Q9303218","brand:wikipedia":"pl:Raiffeisen Bank Polska",name:"Raiffeisen Polbank"},matchScore:2,suggestion:true},"amenity/bank/Regions Bank":{name:"Regions Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q917131"},addTags:{amenity:"bank",brand:"Regions Bank","brand:wikidata":"Q917131","brand:wikipedia":"en:Regions Financial Corporation",name:"Regions Bank"},removeTags:{amenity:"bank",brand:"Regions Bank","brand:wikidata":"Q917131","brand:wikipedia":"en:Regions Financial Corporation",name:"Regions Bank"},matchScore:2,suggestion:true},"amenity/bank/SNS Bank":{name:"SNS Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1857899"},addTags:{amenity:"bank",brand:"SNS Bank","brand:wikidata":"Q1857899","brand:wikipedia":"en:De Volksbank",name:"SNS Bank"},removeTags:{amenity:"bank",brand:"SNS Bank","brand:wikidata":"Q1857899","brand:wikipedia":"en:De Volksbank",name:"SNS Bank"},matchScore:2,suggestion:true},"amenity/bank/Sampath Bank":{name:"Sampath Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7410095"},addTags:{amenity:"bank",brand:"Sampath Bank","brand:wikidata":"Q7410095","brand:wikipedia":"en:Sampath Bank",name:"Sampath Bank"},removeTags:{amenity:"bank",brand:"Sampath Bank","brand:wikidata":"Q7410095","brand:wikipedia":"en:Sampath Bank",name:"Sampath Bank"},matchScore:2,suggestion:true},"amenity/bank/Santander":{name:"Santander",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5835668"},addTags:{amenity:"bank",brand:"Santander","brand:wikidata":"Q5835668","brand:wikipedia":"en:Santander Bank",name:"Santander"},removeTags:{amenity:"bank",brand:"Santander","brand:wikidata":"Q5835668","brand:wikipedia":"en:Santander Bank",name:"Santander"},matchScore:2,suggestion:true},"amenity/bank/Santander Río":{name:"Santander Río",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3385268"},addTags:{amenity:"bank",brand:"Santander Río","brand:wikidata":"Q3385268","brand:wikipedia":"es:Banco Santander Río",name:"Santander Río"},removeTags:{amenity:"bank",brand:"Santander Río","brand:wikidata":"Q3385268","brand:wikipedia":"es:Banco Santander Río",name:"Santander Río"},matchScore:2,suggestion:true},"amenity/bank/Santander Totta":{name:"Santander Totta",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854116"},addTags:{amenity:"bank",brand:"Santander Totta","brand:wikidata":"Q4854116","brand:wikipedia":"pt:Banco Santander Portugal",name:"Santander Totta"},removeTags:{amenity:"bank",brand:"Santander Totta","brand:wikidata":"Q4854116","brand:wikipedia":"pt:Banco Santander Portugal",name:"Santander Totta"},matchScore:2,suggestion:true},"amenity/bank/Sberbank":{name:"Sberbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q205012"},addTags:{amenity:"bank",brand:"Sberbank","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Sberbank"},removeTags:{amenity:"bank",brand:"Sberbank","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Sberbank"},matchScore:2,suggestion:true},"amenity/bank/Scotiabank":{name:"Scotiabank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q451476"},addTags:{amenity:"bank",brand:"Scotiabank","brand:wikidata":"Q451476","brand:wikipedia":"en:Scotiabank",name:"Scotiabank"},removeTags:{amenity:"bank",brand:"Scotiabank","brand:wikidata":"Q451476","brand:wikipedia":"en:Scotiabank",name:"Scotiabank"},matchScore:2,suggestion:true},"amenity/bank/Security Bank":{name:"Security Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7444945"},addTags:{amenity:"bank",brand:"Security Bank","brand:wikidata":"Q7444945","brand:wikipedia":"en:Security Bank",name:"Security Bank"},removeTags:{amenity:"bank",brand:"Security Bank","brand:wikidata":"Q7444945","brand:wikipedia":"en:Security Bank",name:"Security Bank"},matchScore:2,suggestion:true},"amenity/bank/Seylan Bank":{name:"Seylan Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3532083"},addTags:{amenity:"bank",brand:"Seylan Bank","brand:wikidata":"Q3532083","brand:wikipedia":"en:Seylan Bank",name:"Seylan Bank"},removeTags:{amenity:"bank",brand:"Seylan Bank","brand:wikidata":"Q3532083","brand:wikipedia":"en:Seylan Bank",name:"Seylan Bank"},matchScore:2,suggestion:true},"amenity/bank/Sicoob":{name:"Sicoob",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q28679754"},addTags:{amenity:"bank",brand:"Sicoob","brand:wikidata":"Q28679754","brand:wikipedia":"pt:Sistema de Cooperativas de Crédito do Brasil",name:"Sicoob"},removeTags:{amenity:"bank",brand:"Sicoob","brand:wikidata":"Q28679754","brand:wikipedia":"pt:Sistema de Cooperativas de Crédito do Brasil",name:"Sicoob"},matchScore:2,suggestion:true},"amenity/bank/Slovenská sporiteľňa":{name:"Slovenská sporiteľňa",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7541907"},addTags:{amenity:"bank",brand:"Slovenská sporiteľňa","brand:wikidata":"Q7541907","brand:wikipedia":"en:Slovenská sporiteľňa",name:"Slovenská sporiteľňa"},removeTags:{amenity:"bank",brand:"Slovenská sporiteľňa","brand:wikidata":"Q7541907","brand:wikipedia":"en:Slovenská sporiteľňa",name:"Slovenská sporiteľňa"},matchScore:2,suggestion:true},"amenity/bank/Société Générale":{name:"Société Générale",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q270363"},addTags:{amenity:"bank",brand:"Société Générale","brand:wikidata":"Q270363","brand:wikipedia":"en:Société Générale",name:"Société Générale"},removeTags:{amenity:"bank",brand:"Société Générale","brand:wikidata":"Q270363","brand:wikipedia":"en:Société Générale",name:"Société Générale"},matchScore:2,suggestion:true},"amenity/bank/Sonali Bank":{name:"Sonali Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3350382"},addTags:{amenity:"bank",brand:"Sonali Bank","brand:wikipedia":"en:Sonali Bank","brand:wikidata":"Q3350382",name:"Sonali Bank"},removeTags:{amenity:"bank",brand:"Sonali Bank","brand:wikipedia":"en:Sonali Bank","brand:wikidata":"Q3350382",name:"Sonali Bank"},matchScore:2,suggestion:true},"amenity/bank/Sparda-Bank":{name:"Sparda-Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2307136"},addTags:{amenity:"bank",brand:"Sparda-Bank","brand:wikidata":"Q2307136","brand:wikipedia":"en:Sparda-Bank",name:"Sparda-Bank"},removeTags:{amenity:"bank",brand:"Sparda-Bank","brand:wikidata":"Q2307136","brand:wikipedia":"en:Sparda-Bank",name:"Sparda-Bank"},matchScore:2,suggestion:true},"amenity/bank/Sparkasse":{name:"Sparkasse",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2513770"},addTags:{amenity:"bank",brand:"Sparkasse","brand:wikidata":"Q2513770","brand:wikipedia":"de:Verband der Freien Sparkassen",name:"Sparkasse"},removeTags:{amenity:"bank",brand:"Sparkasse","brand:wikidata":"Q2513770","brand:wikipedia":"de:Verband der Freien Sparkassen",name:"Sparkasse"},matchScore:2,suggestion:true},"amenity/bank/Stanbic Bank":{name:"Stanbic Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7597999"},addTags:{amenity:"bank",brand:"Stanbic Bank","brand:wikidata":"Q7597999","brand:wikipedia":"en:Stanbic Bank",name:"Stanbic Bank"},removeTags:{amenity:"bank",brand:"Stanbic Bank","brand:wikidata":"Q7597999","brand:wikipedia":"en:Stanbic Bank",name:"Stanbic Bank"},matchScore:2,suggestion:true},"amenity/bank/Standard Bank":{name:"Standard Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1576610"},addTags:{amenity:"bank",brand:"Standard Bank","brand:wikidata":"Q1576610","brand:wikipedia":"en:Standard Bank",name:"Standard Bank"},removeTags:{amenity:"bank",brand:"Standard Bank","brand:wikidata":"Q1576610","brand:wikipedia":"en:Standard Bank",name:"Standard Bank"},matchScore:2,suggestion:true},"amenity/bank/Standard Chartered":{name:"Standard Chartered",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q548278"},addTags:{amenity:"bank",brand:"Standard Chartered","brand:wikidata":"Q548278","brand:wikipedia":"en:Standard Chartered",name:"Standard Chartered"},removeTags:{amenity:"bank",brand:"Standard Chartered","brand:wikidata":"Q548278","brand:wikipedia":"en:Standard Chartered",name:"Standard Chartered"},matchScore:2,suggestion:true},"amenity/bank/State Bank of India":{name:"State Bank of India",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1340361"},addTags:{amenity:"bank",brand:"State Bank of India","brand:wikidata":"Q1340361","brand:wikipedia":"en:State Bank of India",name:"State Bank of India"},removeTags:{amenity:"bank",brand:"State Bank of India","brand:wikidata":"Q1340361","brand:wikipedia":"en:State Bank of India",name:"State Bank of India"},matchScore:2,suggestion:true},"amenity/bank/Summit Bank":{name:"Summit Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7637775"},addTags:{amenity:"bank",brand:"Summit Bank","brand:wikidata":"Q7637775","brand:wikipedia":"en:Summit Bank",name:"Summit Bank"},removeTags:{amenity:"bank",brand:"Summit Bank","brand:wikidata":"Q7637775","brand:wikipedia":"en:Summit Bank",name:"Summit Bank"},matchScore:2,suggestion:true},"amenity/bank/SunTrust":{name:"SunTrust",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q181507"},addTags:{amenity:"bank",brand:"SunTrust","brand:wikidata":"Q181507","brand:wikipedia":"en:SunTrust Banks",name:"SunTrust"},removeTags:{amenity:"bank",brand:"SunTrust","brand:wikidata":"Q181507","brand:wikipedia":"en:SunTrust Banks",name:"SunTrust"},matchScore:2,suggestion:true},"amenity/bank/Swedbank":{name:"Swedbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1145493"},addTags:{amenity:"bank",brand:"Swedbank","brand:wikidata":"Q1145493","brand:wikipedia":"en:Swedbank",name:"Swedbank"},removeTags:{amenity:"bank",brand:"Swedbank","brand:wikidata":"Q1145493","brand:wikipedia":"en:Swedbank",name:"Swedbank"},matchScore:2,suggestion:true},"amenity/bank/Syndicate Bank":{name:"Syndicate Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2004088"},addTags:{amenity:"bank",brand:"Syndicate Bank","brand:wikidata":"Q2004088","brand:wikipedia":"en:Syndicate Bank",name:"Syndicate Bank"},removeTags:{amenity:"bank",brand:"Syndicate Bank","brand:wikidata":"Q2004088","brand:wikipedia":"en:Syndicate Bank",name:"Syndicate Bank"},matchScore:2,suggestion:true},"amenity/bank/TCF Bank":{name:"TCF Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7669687"},addTags:{amenity:"bank",brand:"TCF Bank","brand:wikidata":"Q7669687","brand:wikipedia":"en:TCF Bank",name:"TCF Bank"},removeTags:{amenity:"bank",brand:"TCF Bank","brand:wikidata":"Q7669687","brand:wikipedia":"en:TCF Bank",name:"TCF Bank"},matchScore:2,suggestion:true},"amenity/bank/TD Bank":{name:"TD Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7669891"},addTags:{amenity:"bank",brand:"TD Bank","brand:wikidata":"Q7669891","brand:wikipedia":"en:TD Bank, N.A.",name:"TD Bank"},removeTags:{amenity:"bank",brand:"TD Bank","brand:wikidata":"Q7669891","brand:wikipedia":"en:TD Bank, N.A.",name:"TD Bank"},matchScore:2,suggestion:true},"amenity/bank/TD Canada Trust":{name:"TD Canada Trust",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1080670"},addTags:{amenity:"bank",brand:"TD Canada Trust","brand:wikidata":"Q1080670","brand:wikipedia":"en:TD Canada Trust",name:"TD Canada Trust"},removeTags:{amenity:"bank",brand:"TD Canada Trust","brand:wikidata":"Q1080670","brand:wikipedia":"en:TD Canada Trust",name:"TD Canada Trust"},matchScore:2,suggestion:true},"amenity/bank/TSB":{name:"TSB",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7671560"},addTags:{amenity:"bank",brand:"TSB","brand:wikidata":"Q7671560","brand:wikipedia":"en:TSB Bank (United Kingdom)",name:"TSB"},removeTags:{amenity:"bank",brand:"TSB","brand:wikidata":"Q7671560","brand:wikipedia":"en:TSB Bank (United Kingdom)",name:"TSB"},matchScore:2,suggestion:true},"amenity/bank/Targobank":{name:"Targobank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1455437"},addTags:{amenity:"bank",brand:"Targobank","brand:wikidata":"Q1455437","brand:wikipedia":"en:Targobank",name:"Targobank"},removeTags:{amenity:"bank",brand:"Targobank","brand:wikidata":"Q1455437","brand:wikipedia":"en:Targobank",name:"Targobank"},matchScore:2,suggestion:true},"amenity/bank/Tatra banka":{name:"Tatra banka",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1718069"},addTags:{amenity:"bank",brand:"Tatra banka","brand:wikidata":"Q1718069","brand:wikipedia":"en:Tatra banka",name:"Tatra banka"},removeTags:{amenity:"bank",brand:"Tatra banka","brand:wikidata":"Q1718069","brand:wikipedia":"en:Tatra banka",name:"Tatra banka"},matchScore:2,suggestion:true},"amenity/bank/Türkiye İş Bankası":{name:"Türkiye İş Bankası",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q909613"},addTags:{amenity:"bank",brand:"Türkiye İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"Türkiye İş Bankası"},removeTags:{amenity:"bank",brand:"Türkiye İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"Türkiye İş Bankası"},matchScore:2,suggestion:true},"amenity/bank/UBI Banca":{name:"UBI Banca",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1476162"},addTags:{amenity:"bank",brand:"UBI Banca","brand:wikidata":"Q1476162","brand:wikipedia":"en:UBI Banca",name:"UBI Banca"},removeTags:{amenity:"bank",brand:"UBI Banca","brand:wikidata":"Q1476162","brand:wikipedia":"en:UBI Banca",name:"UBI Banca"},matchScore:2,suggestion:true},"amenity/bank/UBL":{name:"UBL",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7887504"},addTags:{amenity:"bank",brand:"UBL","brand:en":"United Bank Limited Pakistan","brand:wikidata":"Q7887504","brand:wikipedia":"ur:یونائیٹڈ بینک (پاکستان)",name:"UBL","name:en":"United Bank Limited Pakistan"},removeTags:{amenity:"bank",brand:"UBL","brand:en":"United Bank Limited Pakistan","brand:wikidata":"Q7887504","brand:wikipedia":"ur:یونائیٹڈ بینک (پاکستان)",name:"UBL","name:en":"United Bank Limited Pakistan"},matchScore:2,suggestion:true},"amenity/bank/UBS":{name:"UBS",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q193199"},addTags:{amenity:"bank",brand:"UBS","brand:wikidata":"Q193199","brand:wikipedia":"en:UBS",name:"UBS"},removeTags:{amenity:"bank",brand:"UBS","brand:wikidata":"Q193199","brand:wikipedia":"en:UBS",name:"UBS"},matchScore:2,suggestion:true},"amenity/bank/UCO Bank":{name:"UCO Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2005310"},addTags:{amenity:"bank",brand:"UCO Bank","brand:wikidata":"Q2005310","brand:wikipedia":"en:UCO Bank",name:"UCO Bank"},removeTags:{amenity:"bank",brand:"UCO Bank","brand:wikidata":"Q2005310","brand:wikipedia":"en:UCO Bank",name:"UCO Bank"},matchScore:2,suggestion:true},"amenity/bank/US Bank":{name:"US Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q739084"},addTags:{amenity:"bank",brand:"US Bank","brand:wikidata":"Q739084","brand:wikipedia":"en:U.S. Bancorp",name:"US Bank"},removeTags:{amenity:"bank",brand:"US Bank","brand:wikidata":"Q739084","brand:wikipedia":"en:U.S. Bancorp",name:"US Bank"},matchScore:2,suggestion:true},"amenity/bank/Ulster Bank":{name:"Ulster Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2613366"},addTags:{amenity:"bank",brand:"Ulster Bank","brand:wikidata":"Q2613366","brand:wikipedia":"en:Ulster Bank",name:"Ulster Bank"},removeTags:{amenity:"bank",brand:"Ulster Bank","brand:wikidata":"Q2613366","brand:wikipedia":"en:Ulster Bank",name:"Ulster Bank"},matchScore:2,suggestion:true},"amenity/bank/Umpqua Bank":{name:"Umpqua Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7881772"},addTags:{amenity:"bank",brand:"Umpqua Bank","brand:wikidata":"Q7881772","brand:wikipedia":"en:Umpqua Holdings Corporation",name:"Umpqua Bank"},removeTags:{amenity:"bank",brand:"Umpqua Bank","brand:wikidata":"Q7881772","brand:wikipedia":"en:Umpqua Holdings Corporation",name:"Umpqua Bank"},matchScore:2,suggestion:true},"amenity/bank/UniCredit Bank":{name:"UniCredit Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q45568"},addTags:{amenity:"bank",brand:"UniCredit Bank","brand:wikidata":"Q45568","brand:wikipedia":"en:UniCredit",name:"UniCredit Bank"},removeTags:{amenity:"bank",brand:"UniCredit Bank","brand:wikidata":"Q45568","brand:wikipedia":"en:UniCredit",name:"UniCredit Bank"},matchScore:2,suggestion:true},"amenity/bank/Unicaja Banco":{name:"Unicaja Banco",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2543704"},addTags:{amenity:"bank",brand:"Unicaja Banco","brand:wikidata":"Q2543704","brand:wikipedia":"en:Unicaja",name:"Unicaja Banco"},removeTags:{amenity:"bank",brand:"Unicaja Banco","brand:wikidata":"Q2543704","brand:wikipedia":"en:Unicaja",name:"Unicaja Banco"},matchScore:2,suggestion:true},"amenity/bank/Union Bank of India":{name:"Union Bank of India",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2004078"},addTags:{amenity:"bank",brand:"Union Bank of India","brand:wikidata":"Q2004078","brand:wikipedia":"en:Union Bank of India",name:"Union Bank of India"},removeTags:{amenity:"bank",brand:"Union Bank of India","brand:wikidata":"Q2004078","brand:wikipedia":"en:Union Bank of India",name:"Union Bank of India"},matchScore:2,suggestion:true},"amenity/bank/UnionBank":{name:"UnionBank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1442804"},addTags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q1442804","brand:wikipedia":"en:MUFG Union Bank",name:"UnionBank"},removeTags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q1442804","brand:wikipedia":"en:MUFG Union Bank",name:"UnionBank"},matchScore:2,suggestion:true},"amenity/bank/Vakıfbank":{name:"Vakıfbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1148521"},addTags:{amenity:"bank",brand:"Vakıfbank","brand:wikidata":"Q1148521","brand:wikipedia":"en:VakıfBank",name:"Vakıfbank"},removeTags:{amenity:"bank",brand:"Vakıfbank","brand:wikidata":"Q1148521","brand:wikipedia":"en:VakıfBank",name:"Vakıfbank"},matchScore:2,suggestion:true},"amenity/bank/Veneto Banca":{name:"Veneto Banca",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3127221"},addTags:{amenity:"bank",brand:"Veneto Banca","brand:wikidata":"Q3127221","brand:wikipedia":"en:Veneto Banca",name:"Veneto Banca"},removeTags:{amenity:"bank",brand:"Veneto Banca","brand:wikidata":"Q3127221","brand:wikipedia":"en:Veneto Banca",name:"Veneto Banca"},matchScore:2,suggestion:true},"amenity/bank/Vijaya Bank":{name:"Vijaya Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003171"},addTags:{amenity:"bank",brand:"Vijaya Bank","brand:wikidata":"Q2003171","brand:wikipedia":"en:Vijaya Bank",name:"Vijaya Bank"},removeTags:{amenity:"bank",brand:"Vijaya Bank","brand:wikidata":"Q2003171","brand:wikipedia":"en:Vijaya Bank",name:"Vijaya Bank"},matchScore:2,suggestion:true},"amenity/bank/Volksbank":{name:"Volksbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q695110"},addTags:{amenity:"bank",brand:"Volksbank","brand:wikidata":"Q695110","brand:wikipedia":"en:Volksbank",name:"Volksbank"},removeTags:{amenity:"bank",brand:"Volksbank","brand:wikidata":"Q695110","brand:wikipedia":"en:Volksbank",name:"Volksbank"},matchScore:2,suggestion:true},"amenity/bank/Washington Federal":{name:"Washington Federal",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7971859"},addTags:{amenity:"bank",brand:"Washington Federal","brand:wikidata":"Q7971859","brand:wikipedia":"en:Washington Federal",name:"Washington Federal"},removeTags:{amenity:"bank",brand:"Washington Federal","brand:wikidata":"Q7971859","brand:wikipedia":"en:Washington Federal",name:"Washington Federal"},matchScore:2,suggestion:true},"amenity/bank/Wells Fargo":{name:"Wells Fargo",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q744149"},addTags:{amenity:"bank",brand:"Wells Fargo","brand:wikidata":"Q744149","brand:wikipedia":"en:Wells Fargo",name:"Wells Fargo"},removeTags:{amenity:"bank",brand:"Wells Fargo","brand:wikidata":"Q744149","brand:wikipedia":"en:Wells Fargo",name:"Wells Fargo"},matchScore:2,suggestion:true},"amenity/bank/Western Union":{name:"Western Union",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q861042"},addTags:{amenity:"bank",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},removeTags:{amenity:"bank",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},matchScore:2,suggestion:true},"amenity/bank/Westpac":{name:"Westpac",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2031726"},addTags:{amenity:"bank",brand:"Westpac","brand:wikidata":"Q2031726","brand:wikipedia":"en:Westpac",name:"Westpac"},removeTags:{amenity:"bank",brand:"Westpac","brand:wikidata":"Q2031726","brand:wikipedia":"en:Westpac",name:"Westpac"},matchScore:2,suggestion:true},"amenity/bank/Yorkshire Bank":{name:"Yorkshire Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q8055678"},addTags:{amenity:"bank",brand:"Yorkshire Bank","brand:wikidata":"Q8055678","brand:wikipedia":"en:Yorkshire Bank",name:"Yorkshire Bank"},removeTags:{amenity:"bank",brand:"Yorkshire Bank","brand:wikidata":"Q8055678","brand:wikipedia":"en:Yorkshire Bank",name:"Yorkshire Bank"},matchScore:2,suggestion:true},"amenity/bank/Yorkshire Building Society":{name:"Yorkshire Building Society",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12073381"},addTags:{amenity:"bank",brand:"Yorkshire Building Society","brand:wikidata":"Q12073381","brand:wikipedia":"en:Yorkshire Building Society",name:"Yorkshire Building Society"},removeTags:{amenity:"bank",brand:"Yorkshire Building Society","brand:wikidata":"Q12073381","brand:wikipedia":"en:Yorkshire Building Society",name:"Yorkshire Building Society"},matchScore:2,suggestion:true},"amenity/bank/Zagrebačka banka":{name:"Zagrebačka banka",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q140381"},addTags:{amenity:"bank",brand:"Zagrebačka banka","brand:wikidata":"Q140381","brand:wikipedia":"en:Zagrebačka banka",name:"Zagrebačka banka"},removeTags:{amenity:"bank",brand:"Zagrebačka banka","brand:wikidata":"Q140381","brand:wikipedia":"en:Zagrebačka banka",name:"Zagrebačka banka"},matchScore:2,suggestion:true},"amenity/bank/Zenith Bank":{name:"Zenith Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5978240"},addTags:{amenity:"bank",brand:"Zenith Bank","brand:wikidata":"Q5978240","brand:wikipedia":"en:Zenith Bank",name:"Zenith Bank"},removeTags:{amenity:"bank",brand:"Zenith Bank","brand:wikidata":"Q5978240","brand:wikipedia":"en:Zenith Bank",name:"Zenith Bank"},matchScore:2,suggestion:true},"amenity/bank/Ziraat Bankası":{name:"Ziraat Bankası",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q696003"},addTags:{amenity:"bank",brand:"Ziraat Bankası","brand:wikidata":"Q696003","brand:wikipedia":"en:Ziraat Bankası",name:"Ziraat Bankası"},removeTags:{amenity:"bank",brand:"Ziraat Bankası","brand:wikidata":"Q696003","brand:wikipedia":"en:Ziraat Bankası",name:"Ziraat Bankası"},matchScore:2,suggestion:true},"amenity/bank/mBank":{name:"mBank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1160928"},addTags:{amenity:"bank",brand:"mBank","brand:wikidata":"Q1160928","brand:wikipedia":"en:MBank",name:"mBank"},removeTags:{amenity:"bank",brand:"mBank","brand:wikidata":"Q1160928","brand:wikipedia":"en:MBank",name:"mBank"},matchScore:2,suggestion:true},"amenity/bank/ČSOB":{name:"ČSOB",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q340135"},addTags:{amenity:"bank",brand:"ČSOB","brand:wikidata":"Q340135","brand:wikipedia":"en:Československá obchodní banka",name:"ČSOB"},removeTags:{amenity:"bank",brand:"ČSOB","brand:wikidata":"Q340135","brand:wikipedia":"en:Československá obchodní banka",name:"ČSOB"},matchScore:2,suggestion:true},"amenity/bank/Česká spořitelna":{name:"Česká spořitelna",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q341100"},addTags:{amenity:"bank",brand:"Česká spořitelna","brand:wikidata":"Q341100","brand:wikipedia":"en:Česká spořitelna",name:"Česká spořitelna"},removeTags:{amenity:"bank",brand:"Česká spořitelna","brand:wikidata":"Q341100","brand:wikipedia":"en:Česká spořitelna",name:"Česká spořitelna"},matchScore:2,suggestion:true},"amenity/bank/İş Bankası":{name:"İş Bankası",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q909613"},addTags:{amenity:"bank",brand:"İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"İş Bankası"},removeTags:{amenity:"bank",brand:"İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"İş Bankası"},matchScore:2,suggestion:true},"amenity/bank/Εθνική Τράπεζα":{name:"Εθνική Τράπεζα",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1816028"},addTags:{amenity:"bank",brand:"Εθνική Τράπεζα","brand:en":"National Bank of Greece","brand:wikidata":"Q1816028","brand:wikipedia":"en:National Bank of Greece",name:"Εθνική Τράπεζα","name:en":"National Bank of Greece"},removeTags:{amenity:"bank",brand:"Εθνική Τράπεζα","brand:en":"National Bank of Greece","brand:wikidata":"Q1816028","brand:wikipedia":"en:National Bank of Greece",name:"Εθνική Τράπεζα","name:en":"National Bank of Greece"},matchScore:2,suggestion:true},"amenity/bank/Τράπεζα Πειραιώς":{name:"Τράπεζα Πειραιώς",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3312"},addTags:{amenity:"bank",brand:"Τράπεζα Πειραιώς","brand:en":"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Τράπεζα Πειραιώς","name:en":"Piraeus Bank"},removeTags:{amenity:"bank",brand:"Τράπεζα Πειραιώς","brand:en":"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Τράπεζα Πειραιώς","name:en":"Piraeus Bank"},matchScore:2,suggestion:true},"amenity/bank/Альфа-Банк":{name:"Альфа-Банк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1377835"},addTags:{amenity:"bank",brand:"Альфа-Банк","brand:en":"Alfa-Bank","brand:wikidata":"Q1377835","brand:wikipedia":"en:Alfa-Bank",name:"Альфа-Банк","name:en":"Alfa-Bank"},removeTags:{amenity:"bank",brand:"Альфа-Банк","brand:en":"Alfa-Bank","brand:wikidata":"Q1377835","brand:wikipedia":"en:Alfa-Bank",name:"Альфа-Банк","name:en":"Alfa-Bank"},matchScore:2,suggestion:true},"amenity/bank/Банка ДСК":{name:"Банка ДСК",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5206146"},addTags:{amenity:"bank",brand:"Банка ДСК","brand:en":"DSK Bank","brand:wikidata":"Q5206146","brand:wikipedia":"en:DSK Bank",name:"Банка ДСК","name:en":"DSK Bank"},removeTags:{amenity:"bank",brand:"Банка ДСК","brand:en":"DSK Bank","brand:wikidata":"Q5206146","brand:wikipedia":"en:DSK Bank",name:"Банка ДСК","name:en":"DSK Bank"},matchScore:2,suggestion:true},"amenity/bank/Белагропромбанк":{name:"Белагропромбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1991373"},addTags:{amenity:"bank",brand:"Белагропромбанк","brand:en":"Belagroprom Bank","brand:wikidata":"Q1991373","brand:wikipedia":"be:Белаграпрамбанк",name:"Белагропромбанк","name:en":"Belagroprom Bank"},removeTags:{amenity:"bank",brand:"Белагропромбанк","brand:en":"Belagroprom Bank","brand:wikidata":"Q1991373","brand:wikipedia":"be:Белаграпрамбанк",name:"Белагропромбанк","name:en":"Belagroprom Bank"},matchScore:2,suggestion:true},"amenity/bank/Беларусбанк":{name:"Беларусбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1997334"},addTags:{amenity:"bank",brand:"Беларусбанк","brand:en":"Belarusbank","brand:wikidata":"Q1997334","brand:wikipedia":"en:Belarusbank",name:"Беларусбанк","name:en":"Belarusbank"},removeTags:{amenity:"bank",brand:"Беларусбанк","brand:en":"Belarusbank","brand:wikidata":"Q1997334","brand:wikipedia":"en:Belarusbank",name:"Беларусбанк","name:en":"Belarusbank"},matchScore:2,suggestion:true},"amenity/bank/Бинбанк":{name:"Бинбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4086829"},addTags:{amenity:"bank",brand:"Бинбанк","brand:en":"B&N Bank","brand:wikidata":"Q4086829","brand:wikipedia":"en:B&N Bank",name:"Бинбанк","name:en":"B&N Bank"},removeTags:{amenity:"bank",brand:"Бинбанк","brand:en":"B&N Bank","brand:wikidata":"Q4086829","brand:wikipedia":"en:B&N Bank",name:"Бинбанк","name:en":"B&N Bank"},matchScore:2,suggestion:true},"amenity/bank/ВТБ":{name:"ВТБ",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1549389"},addTags:{amenity:"bank",brand:"ВТБ","brand:en":"VTB Bank","brand:wikidata":"Q1549389","brand:wikipedia":"en:VTB Bank",name:"ВТБ","name:en":"VTB Bank"},removeTags:{amenity:"bank",brand:"ВТБ","brand:en":"VTB Bank","brand:wikidata":"Q1549389","brand:wikipedia":"en:VTB Bank",name:"ВТБ","name:en":"VTB Bank"},matchScore:2,suggestion:true},"amenity/bank/Газпромбанк":{name:"Газпромбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1924338"},addTags:{amenity:"bank",brand:"Газпромбанк","brand:en":"Gazprombank","brand:wikidata":"Q1924338","brand:wikipedia":"en:Gazprombank",name:"Газпромбанк","name:en":"Gazprombank"},removeTags:{amenity:"bank",brand:"Газпромбанк","brand:en":"Gazprombank","brand:wikidata":"Q1924338","brand:wikipedia":"en:Gazprombank",name:"Газпромбанк","name:en":"Gazprombank"},matchScore:2,suggestion:true},"amenity/bank/Казкоммерцбанк":{name:"Казкоммерцбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1168179"},addTags:{amenity:"bank",brand:"Казкоммерцбанк","brand:en":"Kazkommertsbank","brand:wikidata":"Q1168179","brand:wikipedia":"en:Kazkommertsbank",name:"Казкоммерцбанк","name:en":"Kazkommertsbank"},removeTags:{amenity:"bank",brand:"Казкоммерцбанк","brand:en":"Kazkommertsbank","brand:wikidata":"Q1168179","brand:wikipedia":"en:Kazkommertsbank",name:"Казкоммерцбанк","name:en":"Kazkommertsbank"},matchScore:2,suggestion:true},"amenity/bank/Московский индустриальный банк":{name:"Московский индустриальный банк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4304145"},addTags:{amenity:"bank",brand:"Московский индустриальный банк","brand:en":"Moscow Industrial Bank","brand:wikidata":"Q4304145","brand:wikipedia":"ru:Московский индустриальный банк",name:"Московский индустриальный банк","name:en":"Moscow Industrial Bank"},removeTags:{amenity:"bank",brand:"Московский индустриальный банк","brand:en":"Moscow Industrial Bank","brand:wikidata":"Q4304145","brand:wikipedia":"ru:Московский индустриальный банк",name:"Московский индустриальный банк","name:en":"Moscow Industrial Bank"},matchScore:2,suggestion:true},"amenity/bank/Мособлбанк":{name:"Мособлбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4304446"},addTags:{amenity:"bank",brand:"Мособлбанк","brand:en":"Mosobl Bank","brand:wikidata":"Q4304446","brand:wikipedia":"ru:Мособлбанк",name:"Мособлбанк","name:en":"Mosobl Bank"},removeTags:{amenity:"bank",brand:"Мособлбанк","brand:en":"Mosobl Bank","brand:wikidata":"Q4304446","brand:wikipedia":"ru:Мособлбанк",name:"Мособлбанк","name:en":"Mosobl Bank"},matchScore:2,suggestion:true},"amenity/bank/ОТП Банк":{name:"ОТП Банк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q912778"},addTags:{amenity:"bank",brand:"ОТП Банк","brand:en":"OTP Bank","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"ОТП Банк","name:en":"OTP Bank"},removeTags:{amenity:"bank",brand:"ОТП Банк","brand:en":"OTP Bank","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"ОТП Банк","name:en":"OTP Bank"},matchScore:2,suggestion:true},"amenity/bank/Обединена Българска Банка":{name:"Обединена Българска Банка",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7887555"},addTags:{amenity:"bank",brand:"Обединена Българска Банка","brand:en":"United Bulgarian Bank","brand:wikidata":"Q7887555","brand:wikipedia":"en:United Bulgarian Bank",name:"Обединена Българска Банка","name:en":"United Bulgarian Bank"},removeTags:{amenity:"bank",brand:"Обединена Българска Банка","brand:en":"United Bulgarian Bank","brand:wikidata":"Q7887555","brand:wikipedia":"en:United Bulgarian Bank",name:"Обединена Българска Банка","name:en":"United Bulgarian Bank"},matchScore:2,suggestion:true},"amenity/bank/Ощадбанк":{name:"Ощадбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4340839"},addTags:{amenity:"bank",brand:"Ощадбанк","brand:en":"State Savings Bank of Ukraine","brand:wikidata":"Q4340839","brand:wikipedia":"uk:Ощадбанк",name:"Ощадбанк","name:en":"State Savings Bank of Ukraine"},removeTags:{amenity:"bank",brand:"Ощадбанк","brand:en":"State Savings Bank of Ukraine","brand:wikidata":"Q4340839","brand:wikipedia":"uk:Ощадбанк",name:"Ощадбанк","name:en":"State Savings Bank of Ukraine"},matchScore:2,suggestion:true},"amenity/bank/ПУМБ":{name:"ПУМБ",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4341156"},addTags:{amenity:"bank",brand:"ПУМБ","brand:en":"First Ukrainian International Bank","brand:wikidata":"Q4341156","brand:wikipedia":"en:First Ukrainian International Bank",name:"ПУМБ","name:en":"First Ukrainian International Bank"},removeTags:{amenity:"bank",brand:"ПУМБ","brand:en":"First Ukrainian International Bank","brand:wikidata":"Q4341156","brand:wikipedia":"en:First Ukrainian International Bank",name:"ПУМБ","name:en":"First Ukrainian International Bank"},matchScore:2,suggestion:true},"amenity/bank/Почта Банк":{name:"Почта Банк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q24930461"},addTags:{amenity:"bank",brand:"Почта Банк","brand:en":"Post Bank","brand:wikidata":"Q24930461","brand:wikipedia":"en:Post Bank (Russia)",name:"Почта Банк","name:en":"Post Bank"},removeTags:{amenity:"bank",brand:"Почта Банк","brand:en":"Post Bank","brand:wikidata":"Q24930461","brand:wikipedia":"en:Post Bank (Russia)",name:"Почта Банк","name:en":"Post Bank"},matchScore:2,suggestion:true},"amenity/bank/ПриватБанк":{name:"ПриватБанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1515015"},addTags:{amenity:"bank",brand:"ПриватБанк","brand:en":"PrivatBank","brand:wikidata":"Q1515015","brand:wikipedia":"uk:ПриватБанк",name:"ПриватБанк","name:en":"PrivatBank"},removeTags:{amenity:"bank",brand:"ПриватБанк","brand:en":"PrivatBank","brand:wikidata":"Q1515015","brand:wikipedia":"uk:ПриватБанк",name:"ПриватБанк","name:en":"PrivatBank"},matchScore:2,suggestion:true},"amenity/bank/Приорбанк":{name:"Приорбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3919658"},addTags:{amenity:"bank",brand:"Приорбанк","brand:en":"PriorBank","brand:wikidata":"Q3919658","brand:wikipedia":"be:Пріорбанк",name:"Приорбанк","name:en":"PriorBank"},removeTags:{amenity:"bank",brand:"Приорбанк","brand:en":"PriorBank","brand:wikidata":"Q3919658","brand:wikipedia":"be:Пріорбанк",name:"Приорбанк","name:en":"PriorBank"},matchScore:2,suggestion:true},"amenity/bank/Промсвязьбанк":{name:"Промсвязьбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q649100"},addTags:{amenity:"bank",brand:"Промсвязьбанк","brand:en":"Promsvyazbank","brand:wikidata":"Q649100","brand:wikipedia":"en:Promsvyazbank",name:"Промсвязьбанк","name:en":"Promsvyazbank"},removeTags:{amenity:"bank",brand:"Промсвязьбанк","brand:en":"Promsvyazbank","brand:wikidata":"Q649100","brand:wikipedia":"en:Promsvyazbank",name:"Промсвязьбанк","name:en":"Promsvyazbank"},matchScore:2,suggestion:true},"amenity/bank/Райффайзен":{name:"Райффайзен",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4389244"},addTags:{amenity:"bank",brand:"Райффайзен","brand:en":"Raiffeisenbank","brand:wikidata":"Q4389244","brand:wikipedia":"en:Raiffeisenbank (Russia)",name:"Райффайзен","name:en":"Raiffeisenbank"},removeTags:{amenity:"bank",brand:"Райффайзен","brand:en":"Raiffeisenbank","brand:wikidata":"Q4389244","brand:wikipedia":"en:Raiffeisenbank (Russia)",name:"Райффайзен","name:en":"Raiffeisenbank"},matchScore:2,suggestion:true},"amenity/bank/Райффайзен Банк Аваль":{name:"Райффайзен Банк Аваль",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4389243"},addTags:{amenity:"bank",brand:"Райффайзен Банк Аваль","brand:en":"Raiffeisen Bank Aval","brand:wikidata":"Q4389243","brand:wikipedia":"en:Raiffeisen Bank Aval",name:"Райффайзен Банк Аваль","name:en":"Raiffeisen Bank Aval"},removeTags:{amenity:"bank",brand:"Райффайзен Банк Аваль","brand:en":"Raiffeisen Bank Aval","brand:wikidata":"Q4389243","brand:wikipedia":"en:Raiffeisen Bank Aval",name:"Райффайзен Банк Аваль","name:en":"Raiffeisen Bank Aval"},matchScore:2,suggestion:true},"amenity/bank/Росбанк":{name:"Росбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1119857"},addTags:{amenity:"bank",brand:"Росбанк","brand:en":"Rosbank","brand:wikidata":"Q1119857","brand:wikipedia":"en:Rosbank",name:"Росбанк","name:en":"Rosbank"},removeTags:{amenity:"bank",brand:"Росбанк","brand:en":"Rosbank","brand:wikidata":"Q1119857","brand:wikipedia":"en:Rosbank",name:"Росбанк","name:en":"Rosbank"},matchScore:2,suggestion:true},"amenity/bank/Россельхозбанк":{name:"Россельхозбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3920226"},addTags:{amenity:"bank",brand:"Россельхозбанк","brand:en":"Rosselkhozbank","brand:wikidata":"Q3920226","brand:wikipedia":"en:Rosselkhozbank",name:"Россельхозбанк","name:en":"Rosselkhozbank"},removeTags:{amenity:"bank",brand:"Россельхозбанк","brand:en":"Rosselkhozbank","brand:wikidata":"Q3920226","brand:wikipedia":"en:Rosselkhozbank",name:"Россельхозбанк","name:en":"Rosselkhozbank"},matchScore:2,suggestion:true},"amenity/bank/Русский Стандарт":{name:"Русский Стандарт",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4400854"},addTags:{amenity:"bank",brand:"Русский Стандарт","brand:en":"Russian Standard Bank","brand:wikidata":"Q4400854","brand:wikipedia":"en:Russian Standard Bank",name:"Русский Стандарт","name:en":"Russian Standard Bank"},removeTags:{amenity:"bank",brand:"Русский Стандарт","brand:en":"Russian Standard Bank","brand:wikidata":"Q4400854","brand:wikipedia":"en:Russian Standard Bank",name:"Русский Стандарт","name:en":"Russian Standard Bank"},matchScore:2,suggestion:true},"amenity/bank/Сбербанк":{name:"Сбербанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4378147"},addTags:{amenity:"bank",brand:"Сбербанк","brand:en":"Prisbank","brand:wikidata":"Q4378147","brand:wikipedia":"ru:Приднестровский Сбербанк",name:"Сбербанк","name:en":"Prisbank"},removeTags:{amenity:"bank",brand:"Сбербанк","brand:en":"Prisbank","brand:wikidata":"Q4378147","brand:wikipedia":"ru:Приднестровский Сбербанк",name:"Сбербанк","name:en":"Prisbank"},matchScore:2,suggestion:true},"amenity/bank/Совкомбанк":{name:"Совкомбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4426566"},addTags:{amenity:"bank",brand:"Совкомбанк","brand:en":"Sovcom Bank","brand:wikidata":"Q4426566","brand:wikipedia":"ru:Совкомбанк",name:"Совкомбанк","name:en":"Sovcom Bank"},removeTags:{amenity:"bank",brand:"Совкомбанк","brand:en":"Sovcom Bank","brand:wikidata":"Q4426566","brand:wikipedia":"ru:Совкомбанк",name:"Совкомбанк","name:en":"Sovcom Bank"},matchScore:2,suggestion:true},"amenity/bank/УкрСиббанк":{name:"УкрСиббанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1976290"},addTags:{amenity:"bank",brand:"УкрСиббанк","brand:en":"UkrSibbank","brand:wikidata":"Q1976290","brand:wikipedia":"en:UkrSibbank",name:"УкрСиббанк","name:en":"UkrSibbank"},removeTags:{amenity:"bank",brand:"УкрСиббанк","brand:en":"UkrSibbank","brand:wikidata":"Q1976290","brand:wikipedia":"en:UkrSibbank",name:"УкрСиббанк","name:en":"UkrSibbank"},matchScore:2,suggestion:true},"amenity/bank/Укргазбанк":{name:"Укргазбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4470692"},addTags:{amenity:"bank",brand:"Укргазбанк","brand:en":"Ukrgasbank","brand:wikidata":"Q4470692","brand:wikipedia":"ru:Укргазбанк",name:"Укргазбанк","name:en":"Ukrgasbank"},removeTags:{amenity:"bank",brand:"Укргазбанк","brand:en":"Ukrgasbank","brand:wikidata":"Q4470692","brand:wikipedia":"ru:Укргазбанк",name:"Укргазбанк","name:en":"Ukrgasbank"},matchScore:2,suggestion:true},"amenity/bank/Укрсоцбанк":{name:"Укрсоцбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3547885"},addTags:{amenity:"bank",brand:"Укрсоцбанк","brand:en":"Ukrsotsbank","brand:wikidata":"Q3547885","brand:wikipedia":"en:Ukrsotsbank",name:"Укрсоцбанк","name:en":"Ukrsotsbank"},removeTags:{amenity:"bank",brand:"Укрсоцбанк","brand:en":"Ukrsotsbank","brand:wikidata":"Q3547885","brand:wikipedia":"en:Ukrsotsbank",name:"Укрсоцбанк","name:en":"Ukrsotsbank"},matchScore:2,suggestion:true},"amenity/bank/Уралсиб":{name:"Уралсиб",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4476693"},addTags:{amenity:"bank",brand:"Уралсиб","brand:en":"Uralsib bank","brand:wikidata":"Q4476693","brand:wikipedia":"ru:Уралсиб (банк)",name:"Уралсиб","name:en":"Uralsib bank"},removeTags:{amenity:"bank",brand:"Уралсиб","brand:en":"Uralsib bank","brand:wikidata":"Q4476693","brand:wikipedia":"ru:Уралсиб (банк)",name:"Уралсиб","name:en":"Uralsib bank"},matchScore:2,suggestion:true},"amenity/bank/Хаан банк":{name:"Хаан банк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q25632240"},addTags:{amenity:"bank",brand:"Хаан банк","brand:wikidata":"Q25632240","brand:wikipedia":"mn:ХААН банк",name:"Хаан банк"},removeTags:{amenity:"bank",brand:"Хаан банк","brand:wikidata":"Q25632240","brand:wikipedia":"mn:ХААН банк",name:"Хаан банк"},matchScore:2,suggestion:true},"amenity/bank/Хоум Кредит":{name:"Хоум Кредит",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4500466"},addTags:{amenity:"bank",brand:"Хоум Кредит","brand:en":"Home Credit & Finance Bank","brand:wikidata":"Q4500466","brand:wikipedia":"en:Home Credit & Finance Bank",name:"Хоум Кредит","name:en":"Home Credit & Finance Bank"},removeTags:{amenity:"bank",brand:"Хоум Кредит","brand:en":"Home Credit & Finance Bank","brand:wikidata":"Q4500466","brand:wikipedia":"en:Home Credit & Finance Bank",name:"Хоум Кредит","name:en":"Home Credit & Finance Bank"},matchScore:2,suggestion:true},"amenity/bank/בנק הפועלים":{name:"בנק הפועלים",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2666775"},addTags:{amenity:"bank",brand:"בנק הפועלים","brand:en":"Bank Hapoalim","brand:wikidata":"Q2666775","brand:wikipedia":"en:Bank Hapoalim",name:"בנק הפועלים","name:en":"Bank Hapoalim"},removeTags:{amenity:"bank",brand:"בנק הפועלים","brand:en":"Bank Hapoalim","brand:wikidata":"Q2666775","brand:wikipedia":"en:Bank Hapoalim",name:"בנק הפועלים","name:en":"Bank Hapoalim"},matchScore:2,suggestion:true},"amenity/bank/בנק לאומי":{name:"בנק לאומי",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806641"},addTags:{amenity:"bank",brand:"בנק לאומי","brand:en":"Bank Leumi","brand:wikidata":"Q806641","brand:wikipedia":"en:Bank Leumi",name:"בנק לאומי","name:en":"Bank Leumi"},removeTags:{amenity:"bank",brand:"בנק לאומי","brand:en":"Bank Leumi","brand:wikidata":"Q806641","brand:wikipedia":"en:Bank Leumi",name:"בנק לאומי","name:en":"Bank Leumi"},matchScore:2,suggestion:true},"amenity/bank/بانک آینده":{name:"بانک آینده",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5938144"},addTags:{amenity:"bank",brand:"بانک آینده","brand:en":"Ayandeh Bank","brand:wikidata":"Q5938144","brand:wikipedia":"en:Ayandeh Bank",name:"بانک آینده","name:en":"Ayandeh Bank"},removeTags:{amenity:"bank",brand:"بانک آینده","brand:en":"Ayandeh Bank","brand:wikidata":"Q5938144","brand:wikipedia":"en:Ayandeh Bank",name:"بانک آینده","name:en":"Ayandeh Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک اقتصاد نوین":{name:"بانک اقتصاد نوین",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5323768"},addTags:{amenity:"bank",brand:"بانک اقتصاد نوین","brand:en":"EN Bank","brand:wikidata":"Q5323768","brand:wikipedia":"en:EN Bank",name:"بانک اقتصاد نوین","name:en":"EN Bank"},removeTags:{amenity:"bank",brand:"بانک اقتصاد نوین","brand:en":"EN Bank","brand:wikidata":"Q5323768","brand:wikipedia":"en:EN Bank",name:"بانک اقتصاد نوین","name:en":"EN Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک رفاه":{name:"بانک رفاه",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7307083"},addTags:{amenity:"bank",brand:"بانک رفاه","brand:en":"Refah Bank","brand:wikidata":"Q7307083","brand:wikipedia":"en:Refah Bank",name:"بانک رفاه","name:en":"Refah Bank"},removeTags:{amenity:"bank",brand:"بانک رفاه","brand:en":"Refah Bank","brand:wikidata":"Q7307083","brand:wikipedia":"en:Refah Bank",name:"بانک رفاه","name:en":"Refah Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک سامان":{name:"بانک سامان",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4117676"},addTags:{amenity:"bank",brand:"بانک سامان","brand:en":"Saman Bank","brand:wikidata":"Q4117676","brand:wikipedia":"en:Saman Bank",name:"بانک سامان","name:en":"Saman Bank"},removeTags:{amenity:"bank",brand:"بانک سامان","brand:en":"Saman Bank","brand:wikidata":"Q4117676","brand:wikipedia":"en:Saman Bank",name:"بانک سامان","name:en":"Saman Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک سرمایه":{name:"بانک سرمایه",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7424291"},addTags:{amenity:"bank",brand:"بانک سرمایه","brand:en":"Sarmayeh Bank","brand:wikidata":"Q7424291","brand:wikipedia":"en:Sarmayeh Bank",name:"بانک سرمایه","name:en":"Sarmayeh Bank"},removeTags:{amenity:"bank",brand:"بانک سرمایه","brand:en":"Sarmayeh Bank","brand:wikidata":"Q7424291","brand:wikipedia":"en:Sarmayeh Bank",name:"بانک سرمایه","name:en":"Sarmayeh Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک سپه":{name:"بانک سپه",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882624"},addTags:{amenity:"bank",brand:"بانک سپه","brand:en":"Bank Sepah","brand:wikidata":"Q2882624","brand:wikipedia":"en:Bank Sepah",name:"بانک سپه","name:en":"Bank Sepah"},removeTags:{amenity:"bank",brand:"بانک سپه","brand:en":"Bank Sepah","brand:wikidata":"Q2882624","brand:wikipedia":"en:Bank Sepah",name:"بانک سپه","name:en":"Bank Sepah"},matchScore:2,suggestion:true},"amenity/bank/بانک سینا":{name:"بانک سینا",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10860246"},addTags:{amenity:"bank",brand:"بانک سینا","brand:en":"Sina Bank","brand:wikidata":"Q10860246","brand:wikipedia":"en:Sina Bank",name:"بانک سینا","name:en":"Sina Bank"},removeTags:{amenity:"bank",brand:"بانک سینا","brand:en":"Sina Bank","brand:wikidata":"Q10860246","brand:wikipedia":"en:Sina Bank",name:"بانک سینا","name:en":"Sina Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک شهر":{name:"بانک شهر",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5941033"},addTags:{amenity:"bank",brand:"بانک شهر","brand:en":"Shahr Bank","brand:wikidata":"Q5941033","brand:wikipedia":"fa:بانک شهر",name:"بانک شهر","name:en":"Shahr Bank"},removeTags:{amenity:"bank",brand:"بانک شهر","brand:en":"Shahr Bank","brand:wikidata":"Q5941033","brand:wikipedia":"fa:بانک شهر",name:"بانک شهر","name:en":"Shahr Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک صادرات":{name:"بانک صادرات",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882608"},addTags:{amenity:"bank",brand:"بانک صادرات","brand:en":"Bank Saderat Iran","brand:wikidata":"Q2882608","brand:wikipedia":"en:Bank Saderat Iran",name:"بانک صادرات","name:en":"Bank Saderat Iran"},removeTags:{amenity:"bank",brand:"بانک صادرات","brand:en":"Bank Saderat Iran","brand:wikidata":"Q2882608","brand:wikipedia":"en:Bank Saderat Iran",name:"بانک صادرات","name:en":"Bank Saderat Iran"},matchScore:2,suggestion:true},"amenity/bank/بانک قوامین":{name:"بانک قوامین",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10860253"},addTags:{amenity:"bank",brand:"بانک قوامین","brand:en":"Ghavamin Bank","brand:wikidata":"Q10860253","brand:wikipedia":"en:Ghavamin Bank",name:"بانک قوامین","name:en":"Ghavamin Bank"},removeTags:{amenity:"bank",brand:"بانک قوامین","brand:en":"Ghavamin Bank","brand:wikidata":"Q10860253","brand:wikipedia":"en:Ghavamin Bank",name:"بانک قوامین","name:en":"Ghavamin Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک مسکن":{name:"بانک مسکن",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855942"},addTags:{amenity:"bank",brand:"بانک مسکن","brand:en":"Bank Maskan","brand:wikidata":"Q4855942","brand:wikipedia":"en:Bank Maskan",name:"بانک مسکن","name:en":"Bank Maskan"},removeTags:{amenity:"bank",brand:"بانک مسکن","brand:en":"Bank Maskan","brand:wikidata":"Q4855942","brand:wikipedia":"en:Bank Maskan",name:"بانک مسکن","name:en":"Bank Maskan"},matchScore:2,suggestion:true},"amenity/bank/بانک ملت":{name:"بانک ملت",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855944"},addTags:{amenity:"bank",brand:"بانک ملت","brand:en":"Bank Mellat","brand:wikidata":"Q4855944","brand:wikipedia":"en:Bank Mellat",name:"بانک ملت","name:en":"Bank Mellat"},removeTags:{amenity:"bank",brand:"بانک ملت","brand:en":"Bank Mellat","brand:wikidata":"Q4855944","brand:wikipedia":"en:Bank Mellat",name:"بانک ملت","name:en":"Bank Mellat"},matchScore:2,suggestion:true},"amenity/bank/بانک ملی ایران":{name:"بانک ملی ایران",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806640"},addTags:{amenity:"bank",brand:"بانک ملی ایران","brand:en":"Bank Melli Iran","brand:wikidata":"Q806640","brand:wikipedia":"en:Bank Melli Iran",name:"بانک ملی ایران","name:en":"Bank Melli Iran"},removeTags:{amenity:"bank",brand:"بانک ملی ایران","brand:en":"Bank Melli Iran","brand:wikidata":"Q806640","brand:wikipedia":"en:Bank Melli Iran",name:"بانک ملی ایران","name:en":"Bank Melli Iran"},matchScore:2,suggestion:true},"amenity/bank/بانک پارسیان":{name:"بانک پارسیان",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2410404"},addTags:{amenity:"bank",brand:"بانک پارسیان","brand:en":"Parsian Bank","brand:wikidata":"Q2410404","brand:wikipedia":"en:Parsian Bank",name:"بانک پارسیان","name:en":"Parsian Bank"},removeTags:{amenity:"bank",brand:"بانک پارسیان","brand:en":"Parsian Bank","brand:wikidata":"Q2410404","brand:wikipedia":"en:Parsian Bank",name:"بانک پارسیان","name:en":"Parsian Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک پاسارگاد":{name:"بانک پاسارگاد",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855962"},addTags:{amenity:"bank",brand:"بانک پاسارگاد","brand:en":"Bank Pasargad","brand:wikidata":"Q4855962","brand:wikipedia":"en:Bank Pasargad",name:"بانک پاسارگاد","name:en":"Bank Pasargad"},removeTags:{amenity:"bank",brand:"بانک پاسارگاد","brand:en":"Bank Pasargad","brand:wikidata":"Q4855962","brand:wikipedia":"en:Bank Pasargad",name:"بانک پاسارگاد","name:en":"Bank Pasargad"},matchScore:2,suggestion:true},"amenity/bank/بانک کشاورزی":{name:"بانک کشاورزی",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6395007"},addTags:{amenity:"bank",brand:"بانک کشاورزی","brand:en":"Bank Keshavarzi Iran","brand:wikidata":"Q6395007","brand:wikipedia":"en:Bank Keshavarzi Iran",name:"بانک کشاورزی","name:en":"Bank Keshavarzi Iran"},removeTags:{amenity:"bank",brand:"بانک کشاورزی","brand:en":"Bank Keshavarzi Iran","brand:wikidata":"Q6395007","brand:wikipedia":"en:Bank Keshavarzi Iran",name:"بانک کشاورزی","name:en":"Bank Keshavarzi Iran"},matchScore:2,suggestion:true},"amenity/bank/پست بانک":{name:"پست بانک",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7233625"},addTags:{amenity:"bank",brand:"پست بانک","brand:en":"Post Bank of Iran","brand:wikidata":"Q7233625","brand:wikipedia":"en:Post Bank of Iran",name:"پست بانک","name:en":"Post Bank of Iran"},removeTags:{amenity:"bank",brand:"پست بانک","brand:en":"Post Bank of Iran","brand:wikidata":"Q7233625","brand:wikipedia":"en:Post Bank of Iran",name:"پست بانک","name:en":"Post Bank of Iran"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารกรุงเทพ":{name:"ธนาคารกรุงเทพ",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806483"},addTags:{amenity:"bank",brand:"ธนาคารกรุงเทพ","brand:en":"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"ธนาคารกรุงเทพ","name:en":"Bangkok Bank"},removeTags:{amenity:"bank",brand:"ธนาคารกรุงเทพ","brand:en":"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"ธนาคารกรุงเทพ","name:en":"Bangkok Bank"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารกรุงไทย":{name:"ธนาคารกรุงไทย",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q962865"},addTags:{amenity:"bank",brand:"ธนาคารกรุงไทย","brand:en":"Krung Thai Bank","brand:wikidata":"Q962865","brand:wikipedia":"en:Krung Thai Bank",name:"ธนาคารกรุงไทย","name:en":"Krung Thai Bank"},removeTags:{amenity:"bank",brand:"ธนาคารกรุงไทย","brand:en":"Krung Thai Bank","brand:wikidata":"Q962865","brand:wikipedia":"en:Krung Thai Bank",name:"ธนาคารกรุงไทย","name:en":"Krung Thai Bank"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารกสิกรไทย":{name:"ธนาคารกสิกรไทย",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q276557"},addTags:{amenity:"bank",brand:"ธนาคารกสิกรไทย","brand:en":"en:Kasikornbank","brand:wikidata":"Q276557","brand:wikipedia":"en:Kasikornbank",name:"ธนาคารกสิกรไทย","name:en":"en:Kasikornbank"},removeTags:{amenity:"bank",brand:"ธนาคารกสิกรไทย","brand:en":"en:Kasikornbank","brand:wikidata":"Q276557","brand:wikipedia":"en:Kasikornbank",name:"ธนาคารกสิกรไทย","name:en":"en:Kasikornbank"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารออมสิน":{name:"ธนาคารออมสิน",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6579041"},addTags:{amenity:"bank",brand:"ธนาคารออมสิน","brand:en":"Government Savings Bank","brand:wikidata":"Q6579041","brand:wikipedia":"en:Government Savings Bank (Thailand)",name:"ธนาคารออมสิน","name:en":"Government Savings Bank"},removeTags:{amenity:"bank",brand:"ธนาคารออมสิน","brand:en":"Government Savings Bank","brand:wikidata":"Q6579041","brand:wikipedia":"en:Government Savings Bank (Thailand)",name:"ธนาคารออมสิน","name:en":"Government Savings Bank"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารไทยพาณิชย์":{name:"ธนาคารไทยพาณิชย์",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2038986"},addTags:{amenity:"bank",brand:"ธนาคารไทยพาณิชย์","brand:en":"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"ธนาคารไทยพาณิชย์","name:en":"Siam Commercial Bank"},removeTags:{amenity:"bank",brand:"ธนาคารไทยพาณิชย์","brand:en":"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"ธนาคารไทยพาณิชย์","name:en":"Siam Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/みずほ銀行":{name:"みずほ銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882956"},addTags:{amenity:"bank",brand:"みずほ銀行","brand:en":"Mizuho Bank","brand:wikidata":"Q2882956","brand:wikipedia":"en:Mizuho Bank",name:"みずほ銀行","name:en":"Mizuho Bank"},removeTags:{amenity:"bank",brand:"みずほ銀行","brand:en":"Mizuho Bank","brand:wikidata":"Q2882956","brand:wikipedia":"en:Mizuho Bank",name:"みずほ銀行","name:en":"Mizuho Bank"},matchScore:2,suggestion:true},"amenity/bank/三井住友銀行":{name:"三井住友銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2660418"},addTags:{amenity:"bank",brand:"三井住友銀行","brand:en":"Sumitomo Mitsui Banking Corporation","brand:wikidata":"Q2660418","brand:wikipedia":"en:Sumitomo Mitsui Banking Corporation",name:"三井住友銀行","name:en":"Sumitomo Mitsui Banking Corporation"},removeTags:{amenity:"bank",brand:"三井住友銀行","brand:en":"Sumitomo Mitsui Banking Corporation","brand:wikidata":"Q2660418","brand:wikipedia":"en:Sumitomo Mitsui Banking Corporation",name:"三井住友銀行","name:en":"Sumitomo Mitsui Banking Corporation"},matchScore:2,suggestion:true},"amenity/bank/三菱東京UFJ銀行":{name:"三菱東京UFJ銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q988284"},addTags:{amenity:"bank",brand:"三菱東京UFJ銀行","brand:en":"MUFG Bank","brand:wikidata":"Q988284","brand:wikipedia":"en:MUFG Bank",name:"三菱東京UFJ銀行","name:en":"MUFG Bank"},removeTags:{amenity:"bank",brand:"三菱東京UFJ銀行","brand:en":"MUFG Bank","brand:wikidata":"Q988284","brand:wikipedia":"en:MUFG Bank",name:"三菱東京UFJ銀行","name:en":"MUFG Bank"},matchScore:2,suggestion:true},"amenity/bank/上海商業儲蓄銀行":{name:"上海商業儲蓄銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4207208"},addTags:{amenity:"bank",brand:"上海商業儲蓄銀行","brand:en":"Shanghai Commercial and Savings Bank","brand:wikidata":"Q4207208","brand:wikipedia":"en:Shanghai Commercial and Savings Bank",name:"上海商業儲蓄銀行","name:en":"Shanghai Commercial and Savings Bank"},removeTags:{amenity:"bank",brand:"上海商業儲蓄銀行","brand:en":"Shanghai Commercial and Savings Bank","brand:wikidata":"Q4207208","brand:wikipedia":"en:Shanghai Commercial and Savings Bank",name:"上海商業儲蓄銀行","name:en":"Shanghai Commercial and Savings Bank"},matchScore:2,suggestion:true},"amenity/bank/中国农业银行":{name:"中国农业银行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26298"},addTags:{amenity:"bank",brand:"中国农业银行","brand:en":"Agricultural Bank of China","brand:wikidata":"Q26298","brand:wikipedia":"en:Agricultural Bank of China",name:"中国农业银行","name:en":"Agricultural Bank of China"},removeTags:{amenity:"bank",brand:"中国农业银行","brand:en":"Agricultural Bank of China","brand:wikidata":"Q26298","brand:wikipedia":"en:Agricultural Bank of China",name:"中国农业银行","name:en":"Agricultural Bank of China"},matchScore:2,suggestion:true},"amenity/bank/中国工商银行":{name:"中国工商银行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26463"},addTags:{amenity:"bank",brand:"中国工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"中国工商银行","name:en":"Industrial and Commercial Bank of China"},removeTags:{amenity:"bank",brand:"中国工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"中国工商银行","name:en":"Industrial and Commercial Bank of China"},matchScore:2,suggestion:true},"amenity/bank/中国建设银行":{name:"中国建设银行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26299"},addTags:{amenity:"bank",brand:"中国建设银行","brand:en":"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"中国建设银行","name:en":"China Construction Bank"},removeTags:{amenity:"bank",brand:"中国建设银行","brand:en":"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"中国建设银行","name:en":"China Construction Bank"},matchScore:2,suggestion:true},"amenity/bank/中国邮政储蓄银行":{name:"中国邮政储蓄银行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q986744"},addTags:{amenity:"bank",brand:"中国邮政储蓄银行","brand:en":"Postal Savings Bank of China","brand:wikidata":"Q986744","brand:wikipedia":"en:Postal Savings Bank of China",name:"中国邮政储蓄银行","name:en":"Postal Savings Bank of China"},removeTags:{amenity:"bank",brand:"中国邮政储蓄银行","brand:en":"Postal Savings Bank of China","brand:wikidata":"Q986744","brand:wikipedia":"en:Postal Savings Bank of China",name:"中国邮政储蓄银行","name:en":"Postal Savings Bank of China"},matchScore:2,suggestion:true},"amenity/bank/中国银行":{name:"中国银行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q790068"},addTags:{amenity:"bank",brand:"中国银行","brand:en":"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"中国银行","name:en":"Bank of China"},removeTags:{amenity:"bank",brand:"中国银行","brand:en":"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"中国银行","name:en":"Bank of China"},matchScore:2,suggestion:true},"amenity/bank/中國信託商業銀行":{name:"中國信託商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5100191"},addTags:{amenity:"bank",brand:"中國信託商業銀行","brand:en":"CTBC Bank","brand:wikidata":"Q5100191","brand:wikipedia":"en:CTBC Bank",name:"中國信託商業銀行","name:en":"CTBC Bank"},removeTags:{amenity:"bank",brand:"中國信託商業銀行","brand:en":"CTBC Bank","brand:wikidata":"Q5100191","brand:wikipedia":"en:CTBC Bank",name:"中國信託商業銀行","name:en":"CTBC Bank"},matchScore:2,suggestion:true},"amenity/bank/交通银行":{name:"交通银行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806680"},addTags:{amenity:"bank",brand:"交通银行","brand:en":"Bank of Communications","brand:wikidata":"Q806680","brand:wikipedia":"en:Bank of Communications",name:"交通银行","name:en":"Bank of Communications"},removeTags:{amenity:"bank",brand:"交通银行","brand:en":"Bank of Communications","brand:wikidata":"Q806680","brand:wikipedia":"en:Bank of Communications",name:"交通银行","name:en":"Bank of Communications"},matchScore:2,suggestion:true},"amenity/bank/京都中央信用金庫":{name:"京都中央信用金庫",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11374844"},addTags:{amenity:"bank",brand:"京都中央信用金庫","brand:en":"Kyoto Chuo Shinkin Bank","brand:wikidata":"Q11374844","brand:wikipedia":"jp:京都中央信用金庫",name:"京都中央信用金庫","name:en":"Kyoto Chuo Shinkin Bank"},removeTags:{amenity:"bank",brand:"京都中央信用金庫","brand:en":"Kyoto Chuo Shinkin Bank","brand:wikidata":"Q11374844","brand:wikipedia":"jp:京都中央信用金庫",name:"京都中央信用金庫","name:en":"Kyoto Chuo Shinkin Bank"},matchScore:2,suggestion:true},"amenity/bank/京都銀行":{name:"京都銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11375713"},addTags:{amenity:"bank",brand:"京都銀行","brand:en":"Bank of Kyoto","brand:wikidata":"Q11375713","brand:wikipedia":"en:Bank of Kyoto",name:"京都銀行","name:en":"Bank of Kyoto"},removeTags:{amenity:"bank",brand:"京都銀行","brand:en":"Bank of Kyoto","brand:wikidata":"Q11375713","brand:wikipedia":"en:Bank of Kyoto",name:"京都銀行","name:en":"Bank of Kyoto"},matchScore:2,suggestion:true},"amenity/bank/元大商業銀行":{name:"元大商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10889602"},addTags:{amenity:"bank",brand:"元大商業銀行","brand:en":"Yuanta Commercial Bank","brand:wikidata":"Q10889602","brand:wikipedia":"zh:元大商業銀行",name:"元大商業銀行","name:en":"Yuanta Commercial Bank"},removeTags:{amenity:"bank",brand:"元大商業銀行","brand:en":"Yuanta Commercial Bank","brand:wikidata":"Q10889602","brand:wikipedia":"zh:元大商業銀行",name:"元大商業銀行","name:en":"Yuanta Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/兆豐國際商業銀行":{name:"兆豐國際商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q709757"},addTags:{amenity:"bank",brand:"兆豐國際商業銀行","brand:en":"Mega International Commercial Bank","brand:wikidata":"Q709757","brand:wikipedia":"en:Mega International Commercial Bank",name:"兆豐國際商業銀行","name:en":"Mega International Commercial Bank"},removeTags:{amenity:"bank",brand:"兆豐國際商業銀行","brand:en":"Mega International Commercial Bank","brand:wikidata":"Q709757","brand:wikipedia":"en:Mega International Commercial Bank",name:"兆豐國際商業銀行","name:en":"Mega International Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/北洋銀行":{name:"北洋銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11402354"},addTags:{amenity:"bank",brand:"北洋銀行","brand:en":"North Pacific Bank","brand:wikidata":"Q11402354","brand:wikipedia":"ja:北洋銀行",name:"北洋銀行","name:en":"North Pacific Bank"},removeTags:{amenity:"bank",brand:"北洋銀行","brand:en":"North Pacific Bank","brand:wikidata":"Q11402354","brand:wikipedia":"ja:北洋銀行",name:"北洋銀行","name:en":"North Pacific Bank"},matchScore:2,suggestion:true},"amenity/bank/北海道銀行":{name:"北海道銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5878076"},addTags:{amenity:"bank",brand:"北海道銀行","brand:en":"Hokkaido Bank","brand:wikidata":"Q5878076","brand:wikipedia":"en:Hokkaido Bank",name:"北海道銀行","name:en":"Hokkaido Bank"},removeTags:{amenity:"bank",brand:"北海道銀行","brand:en":"Hokkaido Bank","brand:wikidata":"Q5878076","brand:wikipedia":"en:Hokkaido Bank",name:"北海道銀行","name:en":"Hokkaido Bank"},matchScore:2,suggestion:true},"amenity/bank/台中商業銀行":{name:"台中商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6136958"},addTags:{amenity:"bank",brand:"台中商業銀行","brand:en":"Taichung Bank","brand:wikidata":"Q6136958","brand:wikipedia":"en:Taichung Bank",name:"台中商業銀行","name:en":"Taichung Bank"},removeTags:{amenity:"bank",brand:"台中商業銀行","brand:en":"Taichung Bank","brand:wikidata":"Q6136958","brand:wikipedia":"en:Taichung Bank",name:"台中商業銀行","name:en":"Taichung Bank"},matchScore:2,suggestion:true},"amenity/bank/台北富邦商業銀行":{name:"台北富邦商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q697293"},addTags:{amenity:"bank",brand:"台北富邦商業銀行","brand:en":"Taipei Fubon Bank","brand:wikidata":"Q697293","brand:wikipedia":"en:Taipei Fubon Bank",name:"台北富邦商業銀行","name:en":"Taipei Fubon Bank"},removeTags:{amenity:"bank",brand:"台北富邦商業銀行","brand:en":"Taipei Fubon Bank","brand:wikidata":"Q697293","brand:wikipedia":"en:Taipei Fubon Bank",name:"台北富邦商業銀行","name:en":"Taipei Fubon Bank"},matchScore:2,suggestion:true},"amenity/bank/台新國際商業銀行":{name:"台新國際商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7676420"},addTags:{amenity:"bank",brand:"台新國際商業銀行","brand:en":"Taishin International Bank","brand:wikidata":"Q7676420","brand:wikipedia":"en:Taishin International Bank",name:"台新國際商業銀行","name:en":"Taishin International Bank"},removeTags:{amenity:"bank",brand:"台新國際商業銀行","brand:en":"Taishin International Bank","brand:wikidata":"Q7676420","brand:wikipedia":"en:Taishin International Bank",name:"台新國際商業銀行","name:en":"Taishin International Bank"},matchScore:2,suggestion:true},"amenity/bank/合作金庫商業銀行":{name:"合作金庫商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q701540"},addTags:{amenity:"bank",brand:"合作金庫商業銀行","brand:en":"Taiwan Cooperative Bank","brand:wikidata":"Q701540","brand:wikipedia":"en:Taiwan Cooperative Bank",name:"合作金庫商業銀行","name:en":"Taiwan Cooperative Bank"},removeTags:{amenity:"bank",brand:"合作金庫商業銀行","brand:en":"Taiwan Cooperative Bank","brand:wikidata":"Q701540","brand:wikipedia":"en:Taiwan Cooperative Bank",name:"合作金庫商業銀行","name:en":"Taiwan Cooperative Bank"},matchScore:2,suggestion:true},"amenity/bank/國泰世華商業銀行":{name:"國泰世華商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q702656"},addTags:{amenity:"bank",brand:"國泰世華商業銀行","brand:en":"Cathay United Bank","brand:wikidata":"Q702656","brand:wikipedia":"en:Cathay United Bank",name:"國泰世華商業銀行","name:en":"Cathay United Bank"},removeTags:{amenity:"bank",brand:"國泰世華商業銀行","brand:en":"Cathay United Bank","brand:wikidata":"Q702656","brand:wikipedia":"en:Cathay United Bank",name:"國泰世華商業銀行","name:en":"Cathay United Bank"},matchScore:2,suggestion:true},"amenity/bank/大眾商業銀行":{name:"大眾商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10937047"},addTags:{amenity:"bank",brand:"大眾商業銀行","brand:en":"Ta Chong Commercial Bank","brand:wikidata":"Q10937047","brand:wikipedia":"zh:大眾商業銀行",name:"大眾商業銀行","name:en":"Ta Chong Commercial Bank"},removeTags:{amenity:"bank",brand:"大眾商業銀行","brand:en":"Ta Chong Commercial Bank","brand:wikidata":"Q10937047","brand:wikipedia":"zh:大眾商業銀行",name:"大眾商業銀行","name:en":"Ta Chong Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/安泰商業銀行":{name:"安泰商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10946952"},addTags:{amenity:"bank",brand:"安泰商業銀行","brand:en":"Entie Commercial Bank","brand:wikidata":"Q10946952","brand:wikipedia":"zh:安泰商業銀行",name:"安泰商業銀行","name:en":"Entie Commercial Bank"},removeTags:{amenity:"bank",brand:"安泰商業銀行","brand:en":"Entie Commercial Bank","brand:wikidata":"Q10946952","brand:wikipedia":"zh:安泰商業銀行",name:"安泰商業銀行","name:en":"Entie Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/工商银行":{name:"工商银行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26463"},addTags:{amenity:"bank",brand:"工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"工商银行","name:en":"Industrial and Commercial Bank of China"},removeTags:{amenity:"bank",brand:"工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"工商银行","name:en":"Industrial and Commercial Bank of China"},matchScore:2,suggestion:true},"amenity/bank/彰化商業銀行":{name:"彰化商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5071627"},addTags:{amenity:"bank",brand:"彰化商業銀行","brand:en":"Chang Hwa Bank","brand:wikidata":"Q5071627","brand:wikipedia":"en:Chang Hwa Bank",name:"彰化商業銀行","name:en":"Chang Hwa Bank"},removeTags:{amenity:"bank",brand:"彰化商業銀行","brand:en":"Chang Hwa Bank","brand:wikidata":"Q5071627","brand:wikipedia":"en:Chang Hwa Bank",name:"彰化商業銀行","name:en":"Chang Hwa Bank"},matchScore:2,suggestion:true},"amenity/bank/招商银行":{name:"招商银行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1073327"},addTags:{amenity:"bank",brand:"招商银行","brand:en":"China Merchants Bank","brand:wikidata":"Q1073327","brand:wikipedia":"en:China Merchants Bank",name:"招商银行","name:en":"China Merchants Bank"},removeTags:{amenity:"bank",brand:"招商银行","brand:en":"China Merchants Bank","brand:wikidata":"Q1073327","brand:wikipedia":"en:China Merchants Bank",name:"招商银行","name:en":"China Merchants Bank"},matchScore:2,suggestion:true},"amenity/bank/板信商業銀行":{name:"板信商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11104946"},addTags:{amenity:"bank",brand:"板信商業銀行","brand:en":"Bank of Panshin","brand:wikidata":"Q11104946","brand:wikipedia":"zh:板信商業銀行",name:"板信商業銀行","name:en":"Bank of Panshin"},removeTags:{amenity:"bank",brand:"板信商業銀行","brand:en":"Bank of Panshin","brand:wikidata":"Q11104946","brand:wikipedia":"zh:板信商業銀行",name:"板信商業銀行","name:en":"Bank of Panshin"},matchScore:2,suggestion:true},"amenity/bank/横浜銀行":{name:"横浜銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2744340"},addTags:{amenity:"bank",brand:"横浜銀行","brand:en":"Bank of Yokohama","brand:wikidata":"Q2744340","brand:wikipedia":"en:Bank of Yokohama",name:"横浜銀行","name:en":"Bank of Yokohama"},removeTags:{amenity:"bank",brand:"横浜銀行","brand:en":"Bank of Yokohama","brand:wikidata":"Q2744340","brand:wikipedia":"en:Bank of Yokohama",name:"横浜銀行","name:en":"Bank of Yokohama"},matchScore:2,suggestion:true},"amenity/bank/永豐商業銀行":{name:"永豐商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855976"},addTags:{amenity:"bank",brand:"永豐商業銀行","brand:en":"Bank SinoPac","brand:wikidata":"Q4855976","brand:wikipedia":"en:Bank SinoPac",name:"永豐商業銀行","name:en":"Bank SinoPac"},removeTags:{amenity:"bank",brand:"永豐商業銀行","brand:en":"Bank SinoPac","brand:wikidata":"Q4855976","brand:wikipedia":"en:Bank SinoPac",name:"永豐商業銀行","name:en":"Bank SinoPac"},matchScore:2,suggestion:true},"amenity/bank/玉山商業銀行":{name:"玉山商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5321663"},addTags:{amenity:"bank",brand:"玉山商業銀行","brand:en":"E.SUN Commercial Bank","brand:wikidata":"Q5321663","brand:wikipedia":"en:E.SUN Commercial Bank",name:"玉山商業銀行","name:en":"E.SUN Commercial Bank"},removeTags:{amenity:"bank",brand:"玉山商業銀行","brand:en":"E.SUN Commercial Bank","brand:wikidata":"Q5321663","brand:wikipedia":"en:E.SUN Commercial Bank",name:"玉山商業銀行","name:en":"E.SUN Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/第一商業銀行":{name:"第一商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11602128"},addTags:{amenity:"bank",brand:"第一商業銀行","brand:en":"First Commercial Bank","brand:wikidata":"Q11602128","brand:wikipedia":"zh:第一商業銀行",name:"第一商業銀行","name:en":"First Commercial Bank"},removeTags:{amenity:"bank",brand:"第一商業銀行","brand:en":"First Commercial Bank","brand:wikidata":"Q11602128","brand:wikipedia":"zh:第一商業銀行",name:"第一商業銀行","name:en":"First Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/聯邦商業銀行":{name:"聯邦商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15927195"},addTags:{amenity:"bank",brand:"聯邦商業銀行","brand:en":"Union Bank of Taiwan","brand:wikidata":"Q15927195","brand:wikipedia":"zh:聯邦商業銀行",name:"聯邦商業銀行","name:en":"Union Bank of Taiwan"},removeTags:{amenity:"bank",brand:"聯邦商業銀行","brand:en":"Union Bank of Taiwan","brand:wikidata":"Q15927195","brand:wikipedia":"zh:聯邦商業銀行",name:"聯邦商業銀行","name:en":"Union Bank of Taiwan"},matchScore:2,suggestion:true},"amenity/bank/臺灣中小企業銀行":{name:"臺灣中小企業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15913812"},addTags:{amenity:"bank",brand:"臺灣中小企業銀行","brand:en":"Taiwan Business Bank","brand:wikidata":"Q15913812","brand:wikipedia":"zh:臺灣中小企業銀行",name:"臺灣中小企業銀行","name:en":"Taiwan Business Bank"},removeTags:{amenity:"bank",brand:"臺灣中小企業銀行","brand:en":"Taiwan Business Bank","brand:wikidata":"Q15913812","brand:wikipedia":"zh:臺灣中小企業銀行",name:"臺灣中小企業銀行","name:en":"Taiwan Business Bank"},matchScore:2,suggestion:true},"amenity/bank/臺灣土地銀行":{name:"臺灣土地銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q717592"},addTags:{amenity:"bank",brand:"臺灣土地銀行","brand:en":"Land Bank of Taiwan","brand:wikidata":"Q717592","brand:wikipedia":"en:Land Bank of Taiwan",name:"臺灣土地銀行","name:en":"Land Bank of Taiwan"},removeTags:{amenity:"bank",brand:"臺灣土地銀行","brand:en":"Land Bank of Taiwan","brand:wikidata":"Q717592","brand:wikipedia":"en:Land Bank of Taiwan",name:"臺灣土地銀行","name:en":"Land Bank of Taiwan"},matchScore:2,suggestion:true},"amenity/bank/臺灣新光商業銀行":{name:"臺灣新光商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15909616"},addTags:{amenity:"bank",brand:"臺灣新光商業銀行","brand:en":"Shin Kong Commercial Bank","brand:wikidata":"Q15909616","brand:wikipedia":"zh:臺灣新光商業銀行",name:"臺灣新光商業銀行","name:en":"Shin Kong Commercial Bank"},removeTags:{amenity:"bank",brand:"臺灣新光商業銀行","brand:en":"Shin Kong Commercial Bank","brand:wikidata":"Q15909616","brand:wikipedia":"zh:臺灣新光商業銀行",name:"臺灣新光商業銀行","name:en":"Shin Kong Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/臺灣銀行":{name:"臺灣銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q706533"},addTags:{amenity:"bank",brand:"臺灣銀行","brand:en":"Bank of Taiwan","brand:wikidata":"Q706533","brand:wikipedia":"en:Bank of Taiwan",name:"臺灣銀行","name:en":"Bank of Taiwan"},removeTags:{amenity:"bank",brand:"臺灣銀行","brand:en":"Bank of Taiwan","brand:wikidata":"Q706533","brand:wikipedia":"en:Bank of Taiwan",name:"臺灣銀行","name:en":"Bank of Taiwan"},matchScore:2,suggestion:true},"amenity/bank/華南商業銀行":{name:"華南商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11620043"},addTags:{amenity:"bank",brand:"華南商業銀行","brand:en":"Hua Nan Commercial Bank","brand:wikidata":"Q11620043","brand:wikipedia":"zh:華南商業銀行",name:"華南商業銀行","name:en":"Hua Nan Commercial Bank"},removeTags:{amenity:"bank",brand:"華南商業銀行","brand:en":"Hua Nan Commercial Bank","brand:wikidata":"Q11620043","brand:wikipedia":"zh:華南商業銀行",name:"華南商業銀行","name:en":"Hua Nan Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/遠東國際商業銀行":{name:"遠東國際商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15911143"},addTags:{amenity:"bank",brand:"遠東國際商業銀行","brand:en":"Far Eastern International Bank","brand:wikidata":"Q15911143","brand:wikipedia":"zh:遠東國際商業銀行",name:"遠東國際商業銀行","name:en":"Far Eastern International Bank"},removeTags:{amenity:"bank",brand:"遠東國際商業銀行","brand:en":"Far Eastern International Bank","brand:wikidata":"Q15911143","brand:wikipedia":"zh:遠東國際商業銀行",name:"遠東國際商業銀行","name:en":"Far Eastern International Bank"},matchScore:2,suggestion:true},"amenity/bank/陽信商業銀行":{name:"陽信商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11658759"},addTags:{amenity:"bank",brand:"陽信商業銀行","brand:en":"Sunny Commercial Bank","brand:wikidata":"Q11658759","brand:wikipedia":"zh:陽信商業銀行",name:"陽信商業銀行","name:en":"Sunny Commercial Bank"},removeTags:{amenity:"bank",brand:"陽信商業銀行","brand:en":"Sunny Commercial Bank","brand:wikidata":"Q11658759","brand:wikipedia":"zh:陽信商業銀行",name:"陽信商業銀行","name:en":"Sunny Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/静岡銀行":{name:"静岡銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7499501"},addTags:{amenity:"bank",brand:"静岡銀行","brand:en":"Shizuoka Bank","brand:wikidata":"Q7499501","brand:wikipedia":"en:Shizuoka Bank",name:"静岡銀行","name:en":"Shizuoka Bank"},removeTags:{amenity:"bank",brand:"静岡銀行","brand:en":"Shizuoka Bank","brand:wikidata":"Q7499501","brand:wikipedia":"en:Shizuoka Bank",name:"静岡銀行","name:en":"Shizuoka Bank"},matchScore:2,suggestion:true},"amenity/bank/국민은행":{name:"국민은행",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q496606"},addTags:{amenity:"bank",brand:"국민은행","brand:en":"KB Kookmin Bank","brand:wikidata":"Q496606","brand:wikipedia":"en:KB Kookmin Bank",name:"국민은행","name:en":"KB Kookmin Bank"},removeTags:{amenity:"bank",brand:"국민은행","brand:en":"KB Kookmin Bank","brand:wikidata":"Q496606","brand:wikipedia":"en:KB Kookmin Bank",name:"국민은행","name:en":"KB Kookmin Bank"},matchScore:2,suggestion:true},"amenity/bank/기업은행":{name:"기업은행",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q483855"},addTags:{amenity:"bank",brand:"기업은행","brand:en":"Industrial Bank of Korea","brand:wikidata":"Q483855","brand:wikipedia":"en:Industrial Bank of Korea",name:"기업은행","name:en":"Industrial Bank of Korea"},removeTags:{amenity:"bank",brand:"기업은행","brand:en":"Industrial Bank of Korea","brand:wikidata":"Q483855","brand:wikipedia":"en:Industrial Bank of Korea",name:"기업은행","name:en":"Industrial Bank of Korea"},matchScore:2,suggestion:true},"amenity/bank/신한은행":{name:"신한은행",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q487230"},addTags:{amenity:"bank",brand:"신한은행","brand:en":"Sinhan Bank","brand:wikidata":"Q487230","brand:wikipedia":"en:Shinhan Bank",name:"신한은행","name:en":"Sinhan Bank"},removeTags:{amenity:"bank",brand:"신한은행","brand:en":"Sinhan Bank","brand:wikidata":"Q487230","brand:wikipedia":"en:Shinhan Bank",name:"신한은행","name:en":"Sinhan Bank"},matchScore:2,suggestion:true},"amenity/bank/우리은행":{name:"우리은행",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q494369"},addTags:{amenity:"bank",brand:"우리은행","brand:en":"Woori Bank","brand:wikidata":"Q494369","brand:wikipedia":"en:Woori Bank",name:"우리은행","name:en":"Woori Bank"},removeTags:{amenity:"bank",brand:"우리은행","brand:en":"Woori Bank","brand:wikidata":"Q494369","brand:wikipedia":"en:Woori Bank",name:"우리은행","name:en":"Woori Bank"},matchScore:2,suggestion:true},"amenity/bank/하나은행":{name:"하나은행",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q484047"},addTags:{amenity:"bank",brand:"하나은행","brand:en":"Korea Exchange Bank","brand:wikidata":"Q484047","brand:wikipedia":"en:Korea Exchange Bank",name:"하나은행","name:en":"Korea Exchange Bank"},removeTags:{amenity:"bank",brand:"하나은행","brand:en":"Korea Exchange Bank","brand:wikidata":"Q484047","brand:wikipedia":"en:Korea Exchange Bank",name:"하나은행","name:en":"Korea Exchange Bank"},matchScore:2,suggestion:true},"amenity/bicycle_rental/Call a Bike":{name:"Call a Bike",icon:"maki-bicycle",fields:["capacity","network","operator","payment_multi"],geometry:["point","vertex","area"],tags:{amenity:"bicycle_rental","brand:wikidata":"Q1060525"},addTags:{amenity:"bicycle_rental",brand:"Call a Bike","brand:wikidata":"Q1060525","brand:wikipedia":"en:Call a Bike",name:"Call a Bike"},removeTags:{amenity:"bicycle_rental",brand:"Call a Bike","brand:wikidata":"Q1060525","brand:wikipedia":"en:Call a Bike",name:"Call a Bike"},matchScore:2,suggestion:true},"amenity/bureau_de_change/Travelex":{name:"Travelex",icon:"maki-bank",fields:["name","currency_multi","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"bureau_de_change","brand:wikidata":"Q2337964"},addTags:{amenity:"bureau_de_change",brand:"Travelex","brand:wikidata":"Q2337964","brand:wikipedia":"en:Travelex",name:"Travelex"},removeTags:{amenity:"bureau_de_change",brand:"Travelex","brand:wikidata":"Q2337964","brand:wikipedia":"en:Travelex",name:"Travelex"},matchScore:2,suggestion:true},"amenity/cafe/85度C":{name:"85度C",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q4644852"},addTags:{amenity:"cafe",brand:"85度C","brand:en":"85C Bakery Cafe","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",name:"85度C","name:en":"85C Bakery Cafe"},removeTags:{amenity:"cafe",brand:"85度C","brand:en":"85C Bakery Cafe","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",name:"85度C","name:en":"85C Bakery Cafe"},matchScore:2,suggestion:true},"amenity/cafe/Barista":{name:"Barista",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q644735"},addTags:{amenity:"cafe",brand:"Barista","brand:wikidata":"Q644735","brand:wikipedia":"en:Barista (company)",name:"Barista"},removeTags:{amenity:"cafe",brand:"Barista","brand:wikidata":"Q644735","brand:wikipedia":"en:Barista (company)",name:"Barista"},matchScore:2,suggestion:true},"amenity/cafe/Cafe Coffee Day":{name:"Cafe Coffee Day",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q5017235"},addTags:{amenity:"cafe",brand:"Cafe Coffee Day","brand:wikidata":"Q5017235","brand:wikipedia":"en:Café Coffee Day",name:"Cafe Coffee Day"},removeTags:{amenity:"cafe",brand:"Cafe Coffee Day","brand:wikidata":"Q5017235","brand:wikipedia":"en:Café Coffee Day",name:"Cafe Coffee Day"},matchScore:2,suggestion:true},"amenity/cafe/Caffè Nero":{name:"Caffè Nero",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q675808"},addTags:{amenity:"cafe",brand:"Caffè Nero","brand:wikidata":"Q675808","brand:wikipedia":"en:Caffè Nero",name:"Caffè Nero"},removeTags:{amenity:"cafe",brand:"Caffè Nero","brand:wikidata":"Q675808","brand:wikipedia":"en:Caffè Nero",name:"Caffè Nero"},matchScore:2,suggestion:true},"amenity/cafe/Café Amazon":{name:"Café Amazon",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q43247503"},addTags:{amenity:"cafe",brand:"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",name:"Café Amazon"},removeTags:{amenity:"cafe",brand:"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",name:"Café Amazon"},matchScore:2,suggestion:true},"amenity/cafe/Caribou Coffee":{name:"Caribou Coffee",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q5039494"},addTags:{amenity:"cafe",brand:"Caribou Coffee","brand:wikidata":"Q5039494","brand:wikipedia":"en:Caribou Coffee",name:"Caribou Coffee"},removeTags:{amenity:"cafe",brand:"Caribou Coffee","brand:wikidata":"Q5039494","brand:wikipedia":"en:Caribou Coffee",name:"Caribou Coffee"},matchScore:2,suggestion:true},"amenity/cafe/Chatime":{name:"Chatime",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q16829306"},addTags:{amenity:"cafe",brand:"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"en:Chatime",name:"Chatime"},removeTags:{amenity:"cafe",brand:"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"en:Chatime",name:"Chatime"},matchScore:2,suggestion:true},"amenity/cafe/Coffee Fellows":{name:"Coffee Fellows",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q23461429"},addTags:{amenity:"cafe",brand:"Coffee Fellows","brand:wikidata":"Q23461429","brand:wikipedia":"en:Coffee Fellows",name:"Coffee Fellows"},removeTags:{amenity:"cafe",brand:"Coffee Fellows","brand:wikidata":"Q23461429","brand:wikipedia":"en:Coffee Fellows",name:"Coffee Fellows"},matchScore:2,suggestion:true},"amenity/cafe/Coffee House":{name:"Coffee House",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11855430"},addTags:{amenity:"cafe",brand:"Coffee House","brand:wikidata":"Q11855430","brand:wikipedia":"fi:Coffee House",name:"Coffee House"},removeTags:{amenity:"cafe",brand:"Coffee House","brand:wikidata":"Q11855430","brand:wikipedia":"fi:Coffee House",name:"Coffee House"},matchScore:2,suggestion:true},"amenity/cafe/Coffee Time":{name:"Coffee Time",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q5140932"},addTags:{amenity:"cafe",brand:"Coffee Time","brand:wikidata":"Q5140932","brand:wikipedia":"en:Coffee Time",name:"Coffee Time"},removeTags:{amenity:"cafe",brand:"Coffee Time","brand:wikidata":"Q5140932","brand:wikipedia":"en:Coffee Time",name:"Coffee Time"},matchScore:2,suggestion:true},"amenity/cafe/Costa":{name:"Costa",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q608845"},addTags:{amenity:"cafe",brand:"Costa","brand:wikidata":"Q608845","brand:wikipedia":"en:Costa Coffee",name:"Costa"},removeTags:{amenity:"cafe",brand:"Costa","brand:wikidata":"Q608845","brand:wikipedia":"en:Costa Coffee",name:"Costa"},matchScore:2,suggestion:true},"amenity/cafe/Country Style":{name:"Country Style",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q5177435"},addTags:{amenity:"cafe",brand:"Country Style","brand:wikidata":"Q5177435","brand:wikipedia":"en:Country Style",name:"Country Style"},removeTags:{amenity:"cafe",brand:"Country Style","brand:wikidata":"Q5177435","brand:wikipedia":"en:Country Style",name:"Country Style"},matchScore:2,suggestion:true},"amenity/cafe/Espresso House":{name:"Espresso House",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q10489162"},addTags:{amenity:"cafe",brand:"Espresso House","brand:wikidata":"Q10489162","brand:wikipedia":"en:Espresso House",name:"Espresso House"},removeTags:{amenity:"cafe",brand:"Espresso House","brand:wikidata":"Q10489162","brand:wikipedia":"en:Espresso House",name:"Espresso House"},matchScore:2,suggestion:true},"amenity/cafe/Havanna":{name:"Havanna",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2900869"},addTags:{amenity:"cafe",brand:"Havanna","brand:wikidata":"Q2900869","brand:wikipedia":"es:Havanna",name:"Havanna"},removeTags:{amenity:"cafe",brand:"Havanna","brand:wikidata":"Q2900869","brand:wikipedia":"es:Havanna",name:"Havanna"},matchScore:2,suggestion:true},"amenity/cafe/Joe & The Juice":{name:"Joe & The Juice",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q26221514"},addTags:{amenity:"cafe",brand:"Joe & The Juice","brand:wikidata":"Q26221514","brand:wikipedia":"en:Joe & The Juice",name:"Joe & The Juice"},removeTags:{amenity:"cafe",brand:"Joe & The Juice","brand:wikidata":"Q26221514","brand:wikipedia":"en:Joe & The Juice",name:"Joe & The Juice"},matchScore:2,suggestion:true},"amenity/cafe/Le Pain Quotidien":{name:"Le Pain Quotidien",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2046903"},addTags:{amenity:"cafe",brand:"Le Pain Quotidien","brand:wikidata":"Q2046903","brand:wikipedia":"en:Le Pain Quotidien",name:"Le Pain Quotidien"},removeTags:{amenity:"cafe",brand:"Le Pain Quotidien","brand:wikidata":"Q2046903","brand:wikipedia":"en:Le Pain Quotidien",name:"Le Pain Quotidien"},matchScore:2,suggestion:true},"amenity/cafe/McCafé":{name:"McCafé",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q3114287"},addTags:{amenity:"cafe",brand:"McCafé","brand:wikidata":"Q3114287","brand:wikipedia":"en:McCafé",cuisine:"coffee_shop",name:"McCafé"},removeTags:{amenity:"cafe",brand:"McCafé","brand:wikidata":"Q3114287","brand:wikipedia":"en:McCafé",cuisine:"coffee_shop",name:"McCafé"},matchScore:2,suggestion:true},"amenity/cafe/Patisserie Valerie":{name:"Patisserie Valerie",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q22101966"},addTags:{amenity:"cafe",brand:"Patisserie Valerie","brand:wikidata":"Q22101966","brand:wikipedia":"en:Patisserie Valerie",name:"Patisserie Valerie"},removeTags:{amenity:"cafe",brand:"Patisserie Valerie","brand:wikidata":"Q22101966","brand:wikipedia":"en:Patisserie Valerie",name:"Patisserie Valerie"},matchScore:2,suggestion:true},"amenity/cafe/Peet's Coffee":{name:"Peet's Coffee",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q1094101"},addTags:{amenity:"cafe",brand:"Peet's Coffee","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",name:"Peet's Coffee"},removeTags:{amenity:"cafe",brand:"Peet's Coffee","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",name:"Peet's Coffee"},matchScore:2,suggestion:true},"amenity/cafe/Peet's Coffee & Tea":{name:"Peet's Coffee & Tea",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q1094101"},addTags:{amenity:"cafe",brand:"Peet's Coffee & Tea","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",name:"Peet's Coffee & Tea"},removeTags:{amenity:"cafe",brand:"Peet's Coffee & Tea","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",name:"Peet's Coffee & Tea"},matchScore:2,suggestion:true},"amenity/cafe/Pret A Manger":{name:"Pret A Manger",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2109109"},addTags:{amenity:"cafe",brand:"Pret A Manger","brand:wikidata":"Q2109109","brand:wikipedia":"en:Pret a Manger",name:"Pret A Manger"},removeTags:{amenity:"cafe",brand:"Pret A Manger","brand:wikidata":"Q2109109","brand:wikipedia":"en:Pret a Manger",name:"Pret A Manger"},matchScore:2,suggestion:true},"amenity/cafe/Second Cup":{name:"Second Cup",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q862180"},addTags:{amenity:"cafe",brand:"Second Cup","brand:wikidata":"Q862180","brand:wikipedia":"en:Second Cup",name:"Second Cup"},removeTags:{amenity:"cafe",brand:"Second Cup","brand:wikidata":"Q862180","brand:wikipedia":"en:Second Cup",name:"Second Cup"},matchScore:2,suggestion:true},"amenity/cafe/Segafredo":{name:"Segafredo",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q21282762"},addTags:{amenity:"cafe",brand:"Segafredo","brand:wikidata":"Q21282762","brand:wikipedia":"it:Segafredo Zanetti",name:"Segafredo"},removeTags:{amenity:"cafe",brand:"Segafredo","brand:wikidata":"Q21282762","brand:wikipedia":"it:Segafredo Zanetti",name:"Segafredo"},matchScore:2,suggestion:true},"amenity/cafe/Starbucks":{name:"Starbucks",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Starbucks"},removeTags:{amenity:"cafe",brand:"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Starbucks"},matchScore:2,suggestion:true},"amenity/cafe/The Coffee Bean & Tea Leaf":{name:"The Coffee Bean & Tea Leaf",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q1141384"},addTags:{amenity:"cafe",brand:"The Coffee Bean & Tea Leaf","brand:wikidata":"Q1141384","brand:wikipedia":"en:The Coffee Bean & Tea Leaf",name:"The Coffee Bean & Tea Leaf"},removeTags:{amenity:"cafe",brand:"The Coffee Bean & Tea Leaf","brand:wikidata":"Q1141384","brand:wikipedia":"en:The Coffee Bean & Tea Leaf",name:"The Coffee Bean & Tea Leaf"},matchScore:2,suggestion:true},"amenity/cafe/The Coffee Club":{name:"The Coffee Club",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q7726599"},addTags:{amenity:"cafe",brand:"The Coffee Club","brand:wikidata":"Q7726599","brand:wikipedia":"en:The Coffee Club",name:"The Coffee Club"},removeTags:{amenity:"cafe",brand:"The Coffee Club","brand:wikidata":"Q7726599","brand:wikipedia":"en:The Coffee Club",name:"The Coffee Club"},matchScore:2,suggestion:true},"amenity/cafe/Tim Hortons":{name:"Tim Hortons",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q175106"},addTags:{amenity:"cafe",brand:"Tim Hortons","brand:wikidata":"Q175106","brand:wikipedia":"en:Tim Hortons",name:"Tim Hortons"},removeTags:{amenity:"cafe",brand:"Tim Hortons","brand:wikidata":"Q175106","brand:wikipedia":"en:Tim Hortons",name:"Tim Hortons"},matchScore:2,suggestion:true},"amenity/cafe/Wayne's Coffee":{name:"Wayne's Coffee",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2637272"},addTags:{amenity:"cafe",brand:"Wayne's Coffee","brand:wikidata":"Q2637272","brand:wikipedia":"en:Wayne's Coffee",name:"Wayne's Coffee"},removeTags:{amenity:"cafe",brand:"Wayne's Coffee","brand:wikidata":"Q2637272","brand:wikipedia":"en:Wayne's Coffee",name:"Wayne's Coffee"},matchScore:2,suggestion:true},"amenity/cafe/Старбакс":{name:"Старбакс",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"Старбакс","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",name:"Старбакс","name:en":"Starbucks"},removeTags:{amenity:"cafe",brand:"Старбакс","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",name:"Старбакс","name:en":"Starbucks"},matchScore:2,suggestion:true},"amenity/cafe/Шоколадница":{name:"Шоколадница",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q30891188"},addTags:{amenity:"cafe",brand:"Шоколадница","brand:en":"Chocolate","brand:wikidata":"Q30891188","brand:wikipedia":"ru:Шоколадница (сеть кофеен)",name:"Шоколадница","name:en":"Chocolate"},removeTags:{amenity:"cafe",brand:"Шоколадница","brand:en":"Chocolate","brand:wikidata":"Q30891188","brand:wikipedia":"ru:Шоколадница (сеть кофеен)",name:"Шоколадница","name:en":"Chocolate"},matchScore:2,suggestion:true},"amenity/cafe/ארומה":{name:"ארומה",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2909872"},addTags:{amenity:"cafe",brand:"ארומה","brand:en":"Aroma Espresso Bar","brand:wikidata":"Q2909872","brand:wikipedia":"en:Aroma Espresso Bar",name:"ארומה","name:en":"Aroma Espresso Bar"},removeTags:{amenity:"cafe",brand:"ארומה","brand:en":"Aroma Espresso Bar","brand:wikidata":"Q2909872","brand:wikipedia":"en:Aroma Espresso Bar",name:"ארומה","name:en":"Aroma Espresso Bar"},matchScore:2,suggestion:true},"amenity/cafe/คาเฟ่ อเมซอน":{name:"คาเฟ่ อเมซอน",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q43247503"},addTags:{amenity:"cafe",brand:"คาเฟ่ อเมซอน","brand:en":"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",name:"คาเฟ่ อเมซอน","name:en":"Café Amazon"},removeTags:{amenity:"cafe",brand:"คาเฟ่ อเมซอน","brand:en":"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",name:"คาเฟ่ อเมซอน","name:en":"Café Amazon"},matchScore:2,suggestion:true},"amenity/cafe/エクセルシオール カフェ":{name:"エクセルシオール カフェ",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11289828"},addTags:{amenity:"cafe",brand:"エクセルシオール カフェ","brand:en":"EXCELSIOR CAFFÉ","brand:wikidata":"Q11289828","brand:wikipedia":"ja:エクセルシオール カフェ",cuisine:"coffee_shop",name:"エクセルシオール カフェ"},removeTags:{amenity:"cafe",brand:"エクセルシオール カフェ","brand:en":"EXCELSIOR CAFFÉ","brand:wikidata":"Q11289828","brand:wikipedia":"ja:エクセルシオール カフェ",cuisine:"coffee_shop",name:"エクセルシオール カフェ"},matchScore:2,suggestion:true},"amenity/cafe/カフェ・ド・クリエ":{name:"カフェ・ド・クリエ",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q17219077"},addTags:{amenity:"cafe",brand:"カフェ・ド・クリエ","brand:en":"Cafe de CRIE","brand:wikidata":"Q17219077","brand:wikipedia":"ja:ポッカクリエイト",name:"カフェ・ド・クリエ","name:en":"Cafe de CRIE"},removeTags:{amenity:"cafe",brand:"カフェ・ド・クリエ","brand:en":"Cafe de CRIE","brand:wikidata":"Q17219077","brand:wikipedia":"ja:ポッカクリエイト",name:"カフェ・ド・クリエ","name:en":"Cafe de CRIE"},matchScore:2,suggestion:true},"amenity/cafe/カフェ・ベローチェ":{name:"カフェ・ベローチェ",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11294597"},addTags:{amenity:"cafe",brand:"カフェ・ベローチェ","brand:en":"CAFFÈ VELOCE","brand:wikidata":"Q11294597","brand:wikipedia":"ja:カフェ・ベローチェ",cuisine:"coffee_shop",name:"カフェ・ベローチェ","name:en":"CAFFÈ VELOCE"},removeTags:{amenity:"cafe",brand:"カフェ・ベローチェ","brand:en":"CAFFÈ VELOCE","brand:wikidata":"Q11294597","brand:wikipedia":"ja:カフェ・ベローチェ",cuisine:"coffee_shop",name:"カフェ・ベローチェ","name:en":"CAFFÈ VELOCE"},matchScore:2,suggestion:true},"amenity/cafe/コメダ珈琲店":{name:"コメダ珈琲店",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11302679"},addTags:{amenity:"cafe",brand:"コメダ珈琲店","brand:en":"Komeda Coffee Shop","brand:wikidata":"Q11302679","brand:wikipedia":"ja:コメダ",cuisine:"coffee_shop",name:"コメダ珈琲店","name:en":"Komeda Coffee Shop"},removeTags:{amenity:"cafe",brand:"コメダ珈琲店","brand:en":"Komeda Coffee Shop","brand:wikidata":"Q11302679","brand:wikipedia":"ja:コメダ",cuisine:"coffee_shop",name:"コメダ珈琲店","name:en":"Komeda Coffee Shop"},matchScore:2,suggestion:true},"amenity/cafe/サンマルクカフェ":{name:"サンマルクカフェ",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11305989"},addTags:{amenity:"cafe",brand:"サンマルクカフェ","brand:en":"ST.MARC CAFÉ","brand:wikidata":"Q11305989","brand:wikipedia":"ja:サンマルクホールディングス",cuisine:"coffee_shop",name:"サンマルクカフェ","name:en":"ST.MARC CAFÉ"},removeTags:{amenity:"cafe",brand:"サンマルクカフェ","brand:en":"ST.MARC CAFÉ","brand:wikidata":"Q11305989","brand:wikipedia":"ja:サンマルクホールディングス",cuisine:"coffee_shop",name:"サンマルクカフェ","name:en":"ST.MARC CAFÉ"},matchScore:2,suggestion:true},"amenity/cafe/スターバックス":{name:"スターバックス",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"スターバックス","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"ja:スターバックス",cuisine:"coffee_shop",name:"スターバックス","name:en":"Starbucks"},removeTags:{amenity:"cafe",brand:"スターバックス","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"ja:スターバックス",cuisine:"coffee_shop",name:"スターバックス","name:en":"Starbucks"},matchScore:2,suggestion:true},"amenity/cafe/タリーズコーヒー":{name:"タリーズコーヒー",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q3541983"},addTags:{amenity:"cafe",brand:"タリーズコーヒー","brand:en":"Tully's Coffee","brand:wikidata":"Q3541983","brand:wikipedia":"en:Tully's Coffee",name:"タリーズコーヒー","name:en":"Tully's Coffee"},removeTags:{amenity:"cafe",brand:"タリーズコーヒー","brand:en":"Tully's Coffee","brand:wikidata":"Q3541983","brand:wikipedia":"en:Tully's Coffee",name:"タリーズコーヒー","name:en":"Tully's Coffee"},matchScore:2,suggestion:true},"amenity/cafe/ドトールコーヒーショップ":{name:"ドトールコーヒーショップ",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11322732"},addTags:{amenity:"cafe",brand:"ドトールコーヒーショップ","brand:en":"Doutor","brand:wikidata":"Q11322732","brand:wikipedia":"ja:ドトールコーヒーショップ",cuisine:"coffee_shop",name:"ドトールコーヒーショップ","name:en":"Doutor Coffee Shop"},removeTags:{amenity:"cafe",brand:"ドトールコーヒーショップ","brand:en":"Doutor","brand:wikidata":"Q11322732","brand:wikipedia":"ja:ドトールコーヒーショップ",cuisine:"coffee_shop",name:"ドトールコーヒーショップ","name:en":"Doutor Coffee Shop"},matchScore:2,suggestion:true},"amenity/cafe/星巴克":{name:"星巴克",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"星巴克","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"zh:星巴克",cuisine:"coffee_shop",name:"星巴克","name:en":"Starbucks"},removeTags:{amenity:"cafe",brand:"星巴克","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"zh:星巴克",cuisine:"coffee_shop",name:"星巴克","name:en":"Starbucks"},matchScore:2,suggestion:true},"amenity/cafe/스타벅스":{name:"스타벅스",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"스타벅스","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"ko:스타벅스",cuisine:"coffee_shop",name:"스타벅스","name:en":"Starbucks"},removeTags:{amenity:"cafe",brand:"스타벅스","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"ko:스타벅스",cuisine:"coffee_shop",name:"스타벅스","name:en":"Starbucks"},matchScore:2,suggestion:true},"amenity/car_rental/Alamo":{name:"Alamo",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1429287"},addTags:{amenity:"car_rental",brand:"Alamo","brand:wikidata":"Q1429287","brand:wikipedia":"en:Alamo Rent a Car",name:"Alamo"},removeTags:{amenity:"car_rental",brand:"Alamo","brand:wikidata":"Q1429287","brand:wikipedia":"en:Alamo Rent a Car",name:"Alamo"},matchScore:2,suggestion:true},"amenity/car_rental/Avis":{name:"Avis",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q791136"},addTags:{amenity:"car_rental",brand:"Avis","brand:wikidata":"Q791136","brand:wikipedia":"en:Avis Rent a Car",name:"Avis"},removeTags:{amenity:"car_rental",brand:"Avis","brand:wikidata":"Q791136","brand:wikipedia":"en:Avis Rent a Car",name:"Avis"},matchScore:2,suggestion:true},"amenity/car_rental/Budget":{name:"Budget",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1001437"},addTags:{amenity:"car_rental",brand:"Budget","brand:wikidata":"Q1001437","brand:wikipedia":"en:Budget Rent a Car",name:"Budget"},removeTags:{amenity:"car_rental",brand:"Budget","brand:wikidata":"Q1001437","brand:wikipedia":"en:Budget Rent a Car",name:"Budget"},matchScore:2,suggestion:true},"amenity/car_rental/Dollar":{name:"Dollar",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1235661"},addTags:{amenity:"car_rental",brand:"Dollar","brand:wikidata":"Q1235661","brand:wikipedia":"en:Dollar Rent A Car",name:"Dollar"},removeTags:{amenity:"car_rental",brand:"Dollar","brand:wikidata":"Q1235661","brand:wikipedia":"en:Dollar Rent A Car",name:"Dollar"},matchScore:2,suggestion:true},"amenity/car_rental/Enterprise":{name:"Enterprise",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q17085454"},addTags:{amenity:"car_rental",brand:"Enterprise","brand:wikidata":"Q17085454","brand:wikipedia":"en:Enterprise Rent-A-Car",name:"Enterprise"},removeTags:{amenity:"car_rental",brand:"Enterprise","brand:wikidata":"Q17085454","brand:wikipedia":"en:Enterprise Rent-A-Car",name:"Enterprise"},matchScore:2,suggestion:true},"amenity/car_rental/Europcar":{name:"Europcar",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1376256"},addTags:{amenity:"car_rental",brand:"Europcar","brand:wikidata":"Q1376256","brand:wikipedia":"en:Europcar",name:"Europcar"},removeTags:{amenity:"car_rental",brand:"Europcar","brand:wikidata":"Q1376256","brand:wikipedia":"en:Europcar",name:"Europcar"},matchScore:2,suggestion:true},"amenity/car_rental/Hertz":{name:"Hertz",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1543874"},addTags:{amenity:"car_rental",brand:"Hertz","brand:wikidata":"Q1543874","brand:wikipedia":"en:The Hertz Corporation",name:"Hertz"},removeTags:{amenity:"car_rental",brand:"Hertz","brand:wikidata":"Q1543874","brand:wikipedia":"en:The Hertz Corporation",name:"Hertz"},matchScore:2,suggestion:true},"amenity/car_rental/Localiza":{name:"Localiza",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q10319490"},addTags:{amenity:"car_rental",brand:"Localiza","brand:wikidata":"Q10319490","brand:wikipedia":"en:Localiza",name:"Localiza"},removeTags:{amenity:"car_rental",brand:"Localiza","brand:wikidata":"Q10319490","brand:wikipedia":"en:Localiza",name:"Localiza"},matchScore:2,suggestion:true},"amenity/car_rental/Sixt":{name:"Sixt",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q705664"},addTags:{amenity:"car_rental",brand:"Sixt","brand:wikidata":"Q705664","brand:wikipedia":"en:Sixt",name:"Sixt"},removeTags:{amenity:"car_rental",brand:"Sixt","brand:wikidata":"Q705664","brand:wikipedia":"en:Sixt",name:"Sixt"},matchScore:2,suggestion:true},"amenity/car_rental/Thrifty":{name:"Thrifty",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q2429546"},addTags:{amenity:"car_rental",brand:"Thrifty","brand:wikidata":"Q2429546","brand:wikipedia":"en:Thrifty Car Rental",name:"Thrifty"},removeTags:{amenity:"car_rental",brand:"Thrifty","brand:wikidata":"Q2429546","brand:wikipedia":"en:Thrifty Car Rental",name:"Thrifty"},matchScore:2,suggestion:true},"amenity/car_rental/U-Haul":{name:"U-Haul",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q7862902"},addTags:{amenity:"car_rental",brand:"U-Haul","brand:wikidata":"Q7862902","brand:wikipedia":"en:U-Haul",name:"U-Haul"},removeTags:{amenity:"car_rental",brand:"U-Haul","brand:wikidata":"Q7862902","brand:wikipedia":"en:U-Haul",name:"U-Haul"},matchScore:2,suggestion:true},"amenity/car_rental/オリックスレンタカー":{name:"オリックスレンタカー",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q11123021"},addTags:{amenity:"car_rental",brand:"オリックスレンタカー","brand:en":"ORIX Car Rental","brand:wikidata":"Q11123021","brand:wikipedia":"ja:オリックスレンタカー",name:"オリックスレンタカー","name:en":"ORIX Car Rental"},removeTags:{amenity:"car_rental",brand:"オリックスレンタカー","brand:en":"ORIX Car Rental","brand:wikidata":"Q11123021","brand:wikipedia":"ja:オリックスレンタカー",name:"オリックスレンタカー","name:en":"ORIX Car Rental"},matchScore:2,suggestion:true},"amenity/car_rental/トヨタレンタカー":{name:"トヨタレンタカー",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q11321580"},addTags:{amenity:"car_rental",brand:"トヨタレンタカー","brand:en":"Toyota Rental Car","brand:wikidata":"Q11321580","brand:wikipedia":"ja:トヨタレンタリース",name:"トヨタレンタカー","name:en":"Toyota Rental Car"},removeTags:{amenity:"car_rental",brand:"トヨタレンタカー","brand:en":"Toyota Rental Car","brand:wikidata":"Q11321580","brand:wikipedia":"ja:トヨタレンタリース",name:"トヨタレンタカー","name:en":"Toyota Rental Car"},matchScore:2,suggestion:true},"amenity/car_rental/ニッポンレンタカー":{name:"ニッポンレンタカー",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q11086533"},addTags:{amenity:"car_rental",brand:"ニッポンレンタカー","brand:en":"Nippon Car Rental","brand:wikidata":"Q11086533","brand:wikipedia":"ja:ニッポンレンタカー",name:"ニッポンレンタカー","name:en":"Nippon Car Rental"},removeTags:{amenity:"car_rental",brand:"ニッポンレンタカー","brand:en":"Nippon Car Rental","brand:wikidata":"Q11086533","brand:wikipedia":"ja:ニッポンレンタカー",name:"ニッポンレンタカー","name:en":"Nippon Car Rental"},matchScore:2,suggestion:true},"amenity/car_rental/日産レンタカー":{name:"日産レンタカー",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q11086838"},addTags:{amenity:"car_rental",brand:"日産レンタカー","brand:en":"Nissan Car Rental","brand:wikidata":"Q11086838","brand:wikipedia":"ja:日産レンタカー",name:"日産レンタカー","name:en":"Nissan Car Rental"},removeTags:{amenity:"car_rental",brand:"日産レンタカー","brand:en":"Nissan Car Rental","brand:wikidata":"Q11086838","brand:wikipedia":"ja:日産レンタカー",name:"日産レンタカー","name:en":"Nissan Car Rental"},matchScore:2,suggestion:true},"amenity/charging_station/ChargePoint":{name:"ChargePoint",icon:"fas-charging-station",fields:["operator","capacity"],geometry:["point"],tags:{amenity:"charging_station","brand:wikidata":"Q5176149"},addTags:{amenity:"charging_station",brand:"ChargePoint","brand:wikidata":"Q5176149","brand:wikipedia":"en:ChargePoint",name:"ChargePoint"},removeTags:{amenity:"charging_station",brand:"ChargePoint","brand:wikidata":"Q5176149","brand:wikipedia":"en:ChargePoint",name:"ChargePoint"},matchScore:2,suggestion:true},"amenity/charging_station/Enel - stazione di ricarica":{name:"Enel - stazione di ricarica",icon:"fas-charging-station",fields:["operator","capacity"],geometry:["point"],tags:{amenity:"charging_station","brand:wikidata":"Q651222"},addTags:{amenity:"charging_station",brand:"Enel - stazione di ricarica","brand:wikidata":"Q651222","brand:wikipedia":"en:Enel",name:"Enel - stazione di ricarica"},removeTags:{amenity:"charging_station",brand:"Enel - stazione di ricarica","brand:wikidata":"Q651222","brand:wikipedia":"en:Enel",name:"Enel - stazione di ricarica"},matchScore:2,suggestion:true},"amenity/charging_station/Tesla Supercharger":{name:"Tesla Supercharger",icon:"fas-charging-station",fields:["operator","capacity"],geometry:["point"],tags:{amenity:"charging_station","brand:wikidata":"Q17089620"},addTags:{amenity:"charging_station",brand:"Tesla Supercharger","brand:wikidata":"Q17089620","brand:wikipedia":"en:Tesla Supercharger",name:"Tesla Supercharger"},removeTags:{amenity:"charging_station",brand:"Tesla Supercharger","brand:wikidata":"Q17089620","brand:wikipedia":"en:Tesla Supercharger",name:"Tesla Supercharger"},matchScore:2,suggestion:true},"amenity/cinema/Cinema City":{name:"Cinema City",icon:"maki-cinema",fields:["name","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q543651"},addTags:{amenity:"cinema",brand:"Cinema City","brand:wikidata":"Q543651","brand:wikipedia":"en:Cinema City International",name:"Cinema City"},removeTags:{amenity:"cinema",brand:"Cinema City","brand:wikidata":"Q543651","brand:wikipedia":"en:Cinema City International",name:"Cinema City"},matchScore:2,suggestion:true},"amenity/cinema/Cinemark":{name:"Cinemark",icon:"maki-cinema",fields:["name","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q707530"},addTags:{amenity:"cinema",brand:"Cinemark","brand:wikidata":"Q707530","brand:wikipedia":"en:Cinemark Theatres",name:"Cinemark"},removeTags:{amenity:"cinema",brand:"Cinemark","brand:wikidata":"Q707530","brand:wikipedia":"en:Cinemark Theatres",name:"Cinemark"},matchScore:2,suggestion:true},"amenity/cinema/Cinemex":{name:"Cinemex",icon:"maki-cinema",fields:["name","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q3333072"},addTags:{amenity:"cinema",brand:"Cinemex","brand:wikidata":"Q3333072","brand:wikipedia":"en:Cinemex",name:"Cinemex"},removeTags:{amenity:"cinema",brand:"Cinemex","brand:wikidata":"Q3333072","brand:wikipedia":"en:Cinemex",name:"Cinemex"},matchScore:2,suggestion:true},"amenity/cinema/Cinepolis":{name:"Cinepolis",icon:"maki-cinema",fields:["name","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q5686673"},addTags:{amenity:"cinema",brand:"Cinepolis","brand:wikidata":"Q5686673","brand:wikipedia":"en:Cinépolis",name:"Cinepolis"},removeTags:{amenity:"cinema",brand:"Cinepolis","brand:wikidata":"Q5686673","brand:wikipedia":"en:Cinépolis",name:"Cinepolis"},matchScore:2,suggestion:true},"amenity/cinema/Cineworld":{name:"Cineworld",icon:"maki-cinema",fields:["name","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q5120901"},addTags:{amenity:"cinema",brand:"Cineworld","brand:wikidata":"Q5120901","brand:wikipedia":"en:Cineworld",name:"Cineworld"},removeTags:{amenity:"cinema",brand:"Cineworld","brand:wikidata":"Q5120901","brand:wikipedia":"en:Cineworld",name:"Cineworld"},matchScore:2,suggestion:true},"amenity/cinema/Odeon":{name:"Odeon",icon:"maki-cinema",fields:["name","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q6127470"},addTags:{amenity:"cinema",brand:"Odeon","brand:wikidata":"Q6127470","brand:wikipedia":"en:Odeon Cinemas",name:"Odeon"},removeTags:{amenity:"cinema",brand:"Odeon","brand:wikidata":"Q6127470","brand:wikipedia":"en:Odeon Cinemas",name:"Odeon"},matchScore:2,suggestion:true},"amenity/fast_food/A&W (Canada)":{name:"A&W (Canada)",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q2818848"},addTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q2818848","brand:wikipedia":"en:A&W (Canada)",cuisine:"burger",name:"A&W"},removeTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q2818848","brand:wikipedia":"en:A&W (Canada)",cuisine:"burger",name:"A&W"},matchScore:2,suggestion:true},"amenity/fast_food/A&W (USA)":{name:"A&W (USA)",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q277641"},addTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q277641","brand:wikipedia":"en:A&W Restaurants",cuisine:"burger",name:"A&W"},removeTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q277641","brand:wikipedia":"en:A&W Restaurants",cuisine:"burger",name:"A&W"},matchScore:2,suggestion:true},"amenity/fast_food/Arby's":{name:"Arby's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q630866"},addTags:{amenity:"fast_food",brand:"Arby's","brand:wikidata":"Q630866","brand:wikipedia":"en:Arby's",name:"Arby's"},removeTags:{amenity:"fast_food",brand:"Arby's","brand:wikidata":"Q630866","brand:wikipedia":"en:Arby's",name:"Arby's"},matchScore:2,suggestion:true},"amenity/fast_food/Bob's":{name:"Bob's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1392113"},addTags:{amenity:"fast_food",brand:"Bob's","brand:wikidata":"Q1392113","brand:wikipedia":"en:Bob's",cuisine:"burger",name:"Bob's"},removeTags:{amenity:"fast_food",brand:"Bob's","brand:wikidata":"Q1392113","brand:wikipedia":"en:Bob's",cuisine:"burger",name:"Bob's"},matchScore:2,suggestion:true},"amenity/fast_food/Bojangles'":{name:"Bojangles'",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q891163"},addTags:{amenity:"fast_food",brand:"Bojangles'","brand:wikidata":"Q891163","brand:wikipedia":"en:Bojangles' Famous Chicken 'n Biscuits",cuisine:"chicken",name:"Bojangles'"},removeTags:{amenity:"fast_food",brand:"Bojangles'","brand:wikidata":"Q891163","brand:wikipedia":"en:Bojangles' Famous Chicken 'n Biscuits",cuisine:"chicken",name:"Bojangles'"},matchScore:2,suggestion:true},"amenity/fast_food/Booster Juice":{name:"Booster Juice",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4943796"},addTags:{amenity:"fast_food",brand:"Booster Juice","brand:wikidata":"Q4943796","brand:wikipedia":"en:Booster Juice",name:"Booster Juice"},removeTags:{amenity:"fast_food",brand:"Booster Juice","brand:wikidata":"Q4943796","brand:wikipedia":"en:Booster Juice",name:"Booster Juice"},matchScore:2,suggestion:true},"amenity/fast_food/Boston Market":{name:"Boston Market",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q603617"},addTags:{amenity:"fast_food",brand:"Boston Market","brand:wikidata":"Q603617","brand:wikipedia":"en:Boston Market",name:"Boston Market"},removeTags:{amenity:"fast_food",brand:"Boston Market","brand:wikidata":"Q603617","brand:wikipedia":"en:Boston Market",name:"Boston Market"},matchScore:2,suggestion:true},"amenity/fast_food/Burger King":{name:"Burger King",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q177054"},addTags:{amenity:"fast_food",brand:"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Burger King"},removeTags:{amenity:"fast_food",brand:"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Burger King"},matchScore:2,suggestion:true},"amenity/fast_food/Burger Machine":{name:"Burger Machine",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4998549"},addTags:{amenity:"fast_food",brand:"Burger Machine","brand:wikidata":"Q4998549","brand:wikipedia":"en:Burger Machine",cuisine:"burger",name:"Burger Machine"},removeTags:{amenity:"fast_food",brand:"Burger Machine","brand:wikidata":"Q4998549","brand:wikipedia":"en:Burger Machine",cuisine:"burger",name:"Burger Machine"},matchScore:2,suggestion:true},"amenity/fast_food/BurgerFi":{name:"BurgerFi",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q39045496"},addTags:{amenity:"fast_food",brand:"BurgerFi",cuisine:"burger","brand:wikidata":"Q39045496","brand:wikipedia":"en:BurgerFi",name:"BurgerFi"},removeTags:{amenity:"fast_food",brand:"BurgerFi",cuisine:"burger","brand:wikidata":"Q39045496","brand:wikipedia":"en:BurgerFi",name:"BurgerFi"},matchScore:2,suggestion:true},"amenity/fast_food/Captain D's":{name:"Captain D's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5036616"},addTags:{amenity:"fast_food",brand:"Captain D's","brand:wikidata":"Q5036616","brand:wikipedia":"en:Captain D's",cuisine:"seafood",name:"Captain D's"},removeTags:{amenity:"fast_food",brand:"Captain D's","brand:wikidata":"Q5036616","brand:wikipedia":"en:Captain D's",cuisine:"seafood",name:"Captain D's"},matchScore:2,suggestion:true},"amenity/fast_food/Carl's Jr.":{name:"Carl's Jr.",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1043486"},addTags:{amenity:"fast_food",brand:"Carl's Jr.","brand:wikidata":"Q1043486","brand:wikipedia":"en:Carl's Jr.",cuisine:"burger",name:"Carl's Jr."},removeTags:{amenity:"fast_food",brand:"Carl's Jr.","brand:wikidata":"Q1043486","brand:wikipedia":"en:Carl's Jr.",cuisine:"burger",name:"Carl's Jr."},matchScore:2,suggestion:true},"amenity/fast_food/Checkers":{name:"Checkers",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q3419341"},addTags:{amenity:"fast_food",brand:"Checkers","brand:wikidata":"Q3419341","brand:wikipedia":"en:Checkers and Rally's",cuisine:"burger",name:"Checkers"},removeTags:{amenity:"fast_food",brand:"Checkers","brand:wikidata":"Q3419341","brand:wikipedia":"en:Checkers and Rally's",cuisine:"burger",name:"Checkers"},matchScore:2,suggestion:true},"amenity/fast_food/Chick-fil-A":{name:"Chick-fil-A",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q491516"},addTags:{amenity:"fast_food",brand:"Chick-fil-A","brand:wikidata":"Q491516","brand:wikipedia":"en:Chick-fil-A",cuisine:"chicken",name:"Chick-fil-A"},removeTags:{amenity:"fast_food",brand:"Chick-fil-A","brand:wikidata":"Q491516","brand:wikipedia":"en:Chick-fil-A",cuisine:"chicken",name:"Chick-fil-A"},matchScore:2,suggestion:true},"amenity/fast_food/Chicken Express":{name:"Chicken Express",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5096235"},addTags:{amenity:"fast_food",brand:"Chicken Express","brand:wikidata":"Q5096235","brand:wikipedia":"en:Chicken Express",name:"Chicken Express"},removeTags:{amenity:"fast_food",brand:"Chicken Express","brand:wikidata":"Q5096235","brand:wikipedia":"en:Chicken Express",name:"Chicken Express"},matchScore:2,suggestion:true},"amenity/fast_food/Chipotle":{name:"Chipotle",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q465751"},addTags:{amenity:"fast_food",brand:"Chipotle","brand:wikidata":"Q465751","brand:wikipedia":"en:Chipotle Mexican Grill",cuisine:"mexican",name:"Chipotle"},removeTags:{amenity:"fast_food",brand:"Chipotle","brand:wikidata":"Q465751","brand:wikipedia":"en:Chipotle Mexican Grill",cuisine:"mexican",name:"Chipotle"},matchScore:2,suggestion:true},"amenity/fast_food/Chowking":{name:"Chowking",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1076816"},addTags:{amenity:"fast_food",brand:"Chowking","brand:wikidata":"Q1076816","brand:wikipedia":"en:Chowking",name:"Chowking"},removeTags:{amenity:"fast_food",brand:"Chowking","brand:wikidata":"Q1076816","brand:wikipedia":"en:Chowking",name:"Chowking"},matchScore:2,suggestion:true},"amenity/fast_food/Church's Chicken":{name:"Church's Chicken",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1089932"},addTags:{amenity:"fast_food",brand:"Church's Chicken","brand:wikidata":"Q1089932","brand:wikipedia":"en:Church's Chicken",name:"Church's Chicken"},removeTags:{amenity:"fast_food",brand:"Church's Chicken","brand:wikidata":"Q1089932","brand:wikipedia":"en:Church's Chicken",name:"Church's Chicken"},matchScore:2,suggestion:true},"amenity/fast_food/CoCo壱番屋":{name:"CoCo壱番屋",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5986105"},addTags:{amenity:"fast_food",brand:"CoCo壱番屋","brand:en":"Ichibanya","brand:wikidata":"Q5986105","brand:wikipedia":"en:Ichibanya",cuisine:"japanese",name:"CoCo壱番屋","name:en":"Ichibanya"},removeTags:{amenity:"fast_food",brand:"CoCo壱番屋","brand:en":"Ichibanya","brand:wikidata":"Q5986105","brand:wikipedia":"en:Ichibanya",cuisine:"japanese",name:"CoCo壱番屋","name:en":"Ichibanya"},matchScore:2,suggestion:true},"amenity/fast_food/Cook Out":{name:"Cook Out",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5166992"},addTags:{amenity:"fast_food",brand:"Cook Out","brand:wikidata":"Q5166992","brand:wikipedia":"en:Cook Out (restaurant)",name:"Cook Out"},removeTags:{amenity:"fast_food",brand:"Cook Out","brand:wikidata":"Q5166992","brand:wikipedia":"en:Cook Out (restaurant)",name:"Cook Out"},matchScore:2,suggestion:true},"amenity/fast_food/Culver's":{name:"Culver's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1143589"},addTags:{amenity:"fast_food",brand:"Culver's","brand:wikidata":"Q1143589","brand:wikipedia":"en:Culver's",name:"Culver's"},removeTags:{amenity:"fast_food",brand:"Culver's","brand:wikidata":"Q1143589","brand:wikipedia":"en:Culver's",name:"Culver's"},matchScore:2,suggestion:true},"amenity/fast_food/Dairy Queen":{name:"Dairy Queen",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1141226"},addTags:{amenity:"fast_food",brand:"Dairy Queen","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream",name:"Dairy Queen"},removeTags:{amenity:"fast_food",brand:"Dairy Queen","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream",name:"Dairy Queen"},matchScore:2,suggestion:true},"amenity/fast_food/Daylight Donuts":{name:"Daylight Donuts",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q48970508"},addTags:{amenity:"fast_food",brand:"Daylight Donuts","brand:wikidata":"Q48970508","brand:wikipedia":"en:Daylight Donuts",cuisine:"donut",name:"Daylight Donuts"},removeTags:{amenity:"fast_food",brand:"Daylight Donuts","brand:wikidata":"Q48970508","brand:wikipedia":"en:Daylight Donuts",cuisine:"donut",name:"Daylight Donuts"},matchScore:2,suggestion:true},"amenity/fast_food/Del Taco":{name:"Del Taco",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1183818"},addTags:{amenity:"fast_food",brand:"Del Taco","brand:wikidata":"Q1183818","brand:wikipedia":"en:Del Taco",cuisine:"mexican",name:"Del Taco"},removeTags:{amenity:"fast_food",brand:"Del Taco","brand:wikidata":"Q1183818","brand:wikipedia":"en:Del Taco",cuisine:"mexican",name:"Del Taco"},matchScore:2,suggestion:true},"amenity/fast_food/Domino's Pizza":{name:"Domino's Pizza",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q839466"},addTags:{amenity:"fast_food",brand:"Domino's Pizza","brand:wikidata":"Q839466","brand:wikipedia":"en:Domino's Pizza",cuisine:"pizza",name:"Domino's Pizza"},removeTags:{amenity:"fast_food",brand:"Domino's Pizza","brand:wikidata":"Q839466","brand:wikipedia":"en:Domino's Pizza",cuisine:"pizza",name:"Domino's Pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Dunkin' Donuts":{name:"Dunkin' Donuts",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q847743"},addTags:{amenity:"fast_food",brand:"Dunkin' Donuts","brand:wikidata":"Q847743","brand:wikipedia":"en:Dunkin' Donuts",cuisine:"donut",name:"Dunkin' Donuts"},removeTags:{amenity:"fast_food",brand:"Dunkin' Donuts","brand:wikidata":"Q847743","brand:wikipedia":"en:Dunkin' Donuts",cuisine:"donut",name:"Dunkin' Donuts"},matchScore:2,suggestion:true},"amenity/fast_food/Einstein Bros. Bagels":{name:"Einstein Bros. Bagels",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5349788"},addTags:{amenity:"fast_food",brand:"Einstein Bros. Bagels","brand:wikidata":"Q5349788","brand:wikipedia":"en:Einstein Bros. Bagels",cuisine:"bagel",name:"Einstein Bros. Bagels"},removeTags:{amenity:"fast_food",brand:"Einstein Bros. Bagels","brand:wikidata":"Q5349788","brand:wikipedia":"en:Einstein Bros. Bagels",cuisine:"bagel",name:"Einstein Bros. Bagels"},matchScore:2,suggestion:true},"amenity/fast_food/El Pollo Loco":{name:"El Pollo Loco",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q2353849"},addTags:{amenity:"fast_food",brand:"El Pollo Loco","brand:wikidata":"Q2353849","brand:wikipedia":"en:El Pollo Loco",cuisine:"mexican",name:"El Pollo Loco"},removeTags:{amenity:"fast_food",brand:"El Pollo Loco","brand:wikidata":"Q2353849","brand:wikipedia":"en:El Pollo Loco",cuisine:"mexican",name:"El Pollo Loco"},matchScore:2,suggestion:true},"amenity/fast_food/Extreme Pita":{name:"Extreme Pita",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5422367"},addTags:{amenity:"fast_food",brand:"Extreme Pita","brand:wikidata":"Q5422367","brand:wikipedia":"en:Extreme Pita",cuisine:"pita",name:"Extreme Pita"},removeTags:{amenity:"fast_food",brand:"Extreme Pita","brand:wikidata":"Q5422367","brand:wikipedia":"en:Extreme Pita",cuisine:"pita",name:"Extreme Pita"},matchScore:2,suggestion:true},"amenity/fast_food/Fazoli's":{name:"Fazoli's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1399195"},addTags:{amenity:"fast_food",brand:"Fazoli's","brand:wikidata":"Q1399195","brand:wikipedia":"en:Fazoli's",cuisine:"italian",name:"Fazoli's"},removeTags:{amenity:"fast_food",brand:"Fazoli's","brand:wikidata":"Q1399195","brand:wikipedia":"en:Fazoli's",cuisine:"italian",name:"Fazoli's"},matchScore:2,suggestion:true},"amenity/fast_food/Firehouse Subs":{name:"Firehouse Subs",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5451873"},addTags:{amenity:"fast_food",brand:"Firehouse Subs","brand:wikidata":"Q5451873","brand:wikipedia":"en:Firehouse Subs",cuisine:"sandwich",name:"Firehouse Subs"},removeTags:{amenity:"fast_food",brand:"Firehouse Subs","brand:wikidata":"Q5451873","brand:wikipedia":"en:Firehouse Subs",cuisine:"sandwich",name:"Firehouse Subs"},matchScore:2,suggestion:true},"amenity/fast_food/Five Guys":{name:"Five Guys",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1131810"},addTags:{amenity:"fast_food",brand:"Five Guys","brand:wikidata":"Q1131810","brand:wikipedia":"en:Five Guys",cuisine:"burger",name:"Five Guys"},removeTags:{amenity:"fast_food",brand:"Five Guys","brand:wikidata":"Q1131810","brand:wikipedia":"en:Five Guys",cuisine:"burger",name:"Five Guys"},matchScore:2,suggestion:true},"amenity/fast_food/Habib's":{name:"Habib's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q2504930"},addTags:{amenity:"fast_food",brand:"Habib's","brand:wikidata":"Q2504930","brand:wikipedia":"en:Habib's",cuisine:"middle_eastern",name:"Habib's"},removeTags:{amenity:"fast_food",brand:"Habib's","brand:wikidata":"Q2504930","brand:wikipedia":"en:Habib's",cuisine:"middle_eastern",name:"Habib's"},matchScore:2,suggestion:true},"amenity/fast_food/Hallo Pizza":{name:"Hallo Pizza",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1571798"},addTags:{amenity:"fast_food",brand:"Hallo Pizza","brand:wikidata":"Q1571798","brand:wikipedia":"de:Hallo Pizza",cuisine:"pizza",name:"Hallo Pizza"},removeTags:{amenity:"fast_food",brand:"Hallo Pizza","brand:wikidata":"Q1571798","brand:wikipedia":"de:Hallo Pizza",cuisine:"pizza",name:"Hallo Pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Hardee's":{name:"Hardee's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1585088"},addTags:{amenity:"fast_food",brand:"Hardee's","brand:wikidata":"Q1585088","brand:wikipedia":"en:Hardee's",cuisine:"burger",name:"Hardee's"},removeTags:{amenity:"fast_food",brand:"Hardee's","brand:wikidata":"Q1585088","brand:wikipedia":"en:Hardee's",cuisine:"burger",name:"Hardee's"},matchScore:2,suggestion:true},"amenity/fast_food/Harvey's":{name:"Harvey's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1466184"},addTags:{amenity:"fast_food",brand:"Harvey's","brand:wikidata":"Q1466184","brand:wikipedia":"en:Harvey's",cuisine:"burger",name:"Harvey's"},removeTags:{amenity:"fast_food",brand:"Harvey's","brand:wikidata":"Q1466184","brand:wikipedia":"en:Harvey's",cuisine:"burger",name:"Harvey's"},matchScore:2,suggestion:true},"amenity/fast_food/Hesburger":{name:"Hesburger",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1276832"},addTags:{amenity:"fast_food",brand:"Hesburger","brand:wikidata":"Q1276832","brand:wikipedia":"en:Hesburger",cuisine:"burger",name:"Hesburger"},removeTags:{amenity:"fast_food",brand:"Hesburger","brand:wikidata":"Q1276832","brand:wikipedia":"en:Hesburger",cuisine:"burger",name:"Hesburger"},matchScore:2,suggestion:true},"amenity/fast_food/Hungry Jacks":{name:"Hungry Jacks",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q3036373"},addTags:{amenity:"fast_food",brand:"Hungry Jacks","brand:wikidata":"Q3036373","brand:wikipedia":"en:Hungry Jack's",cuisine:"burger",name:"Hungry Jacks"},removeTags:{amenity:"fast_food",brand:"Hungry Jacks","brand:wikidata":"Q3036373","brand:wikipedia":"en:Hungry Jack's",cuisine:"burger",name:"Hungry Jacks"},matchScore:2,suggestion:true},"amenity/fast_food/In-N-Out Burger":{name:"In-N-Out Burger",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1205312"},addTags:{amenity:"fast_food",brand:"In-N-Out Burger","brand:wikidata":"Q1205312","brand:wikipedia":"en:In-N-Out Burger",cuisine:"burger",name:"In-N-Out Burger"},removeTags:{amenity:"fast_food",brand:"In-N-Out Burger","brand:wikidata":"Q1205312","brand:wikipedia":"en:In-N-Out Burger",cuisine:"burger",name:"In-N-Out Burger"},matchScore:2,suggestion:true},"amenity/fast_food/Jack in the Box":{name:"Jack in the Box",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1538507"},addTags:{amenity:"fast_food",brand:"Jack in the Box","brand:wikidata":"Q1538507","brand:wikipedia":"en:Jack in the Box",cuisine:"burger",name:"Jack in the Box"},removeTags:{amenity:"fast_food",brand:"Jack in the Box","brand:wikidata":"Q1538507","brand:wikipedia":"en:Jack in the Box",cuisine:"burger",name:"Jack in the Box"},matchScore:2,suggestion:true},"amenity/fast_food/Jamba Juice":{name:"Jamba Juice",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q3088784"},addTags:{amenity:"fast_food",brand:"Jamba Juice","brand:wikidata":"Q3088784","brand:wikipedia":"en:Jamba Juice",cuisine:"juice",name:"Jamba Juice"},removeTags:{amenity:"fast_food",brand:"Jamba Juice","brand:wikidata":"Q3088784","brand:wikipedia":"en:Jamba Juice",cuisine:"juice",name:"Jamba Juice"},matchScore:2,suggestion:true},"amenity/fast_food/Jersey Mike's Subs":{name:"Jersey Mike's Subs",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q6184897"},addTags:{amenity:"fast_food",brand:"Jersey Mike's Subs","brand:wikidata":"Q6184897","brand:wikipedia":"en:Jersey Mike's Subs",cuisine:"sandwich",name:"Jersey Mike's Subs"},removeTags:{amenity:"fast_food",brand:"Jersey Mike's Subs","brand:wikidata":"Q6184897","brand:wikipedia":"en:Jersey Mike's Subs",cuisine:"sandwich",name:"Jersey Mike's Subs"},matchScore:2,suggestion:true},"amenity/fast_food/Jimmy John's":{name:"Jimmy John's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1689380"},addTags:{amenity:"fast_food",brand:"Jimmy John's","brand:wikidata":"Q1689380","brand:wikipedia":"en:Jimmy John's",cuisine:"sandwich",name:"Jimmy John's"},removeTags:{amenity:"fast_food",brand:"Jimmy John's","brand:wikidata":"Q1689380","brand:wikipedia":"en:Jimmy John's",cuisine:"sandwich",name:"Jimmy John's"},matchScore:2,suggestion:true},"amenity/fast_food/Jollibee":{name:"Jollibee",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q37614"},addTags:{amenity:"fast_food",brand:"Jollibee","brand:wikidata":"Q37614","brand:wikipedia":"en:Jollibee",cuisine:"burger",name:"Jollibee"},removeTags:{amenity:"fast_food",brand:"Jollibee","brand:wikidata":"Q37614","brand:wikipedia":"en:Jollibee",cuisine:"burger",name:"Jollibee"},matchScore:2,suggestion:true},"amenity/fast_food/KFC":{name:"KFC",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q524757"},addTags:{amenity:"fast_food",brand:"KFC","brand:wikidata":"Q524757","brand:wikipedia":"en:KFC",cuisine:"chicken",name:"KFC"},removeTags:{amenity:"fast_food",brand:"KFC","brand:wikidata":"Q524757","brand:wikipedia":"en:KFC",cuisine:"chicken",name:"KFC"},matchScore:2,suggestion:true},"amenity/fast_food/Kochlöffel":{name:"Kochlöffel",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q315539"},addTags:{amenity:"fast_food",brand:"Kochlöffel","brand:wikidata":"Q315539","brand:wikipedia":"en:Kochlöffel",name:"Kochlöffel"},removeTags:{amenity:"fast_food",brand:"Kochlöffel","brand:wikidata":"Q315539","brand:wikipedia":"en:Kochlöffel",name:"Kochlöffel"},matchScore:2,suggestion:true},"amenity/fast_food/Kotipizza":{name:"Kotipizza",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1628625"},addTags:{amenity:"fast_food",brand:"Kotipizza","brand:wikidata":"Q1628625","brand:wikipedia":"en:Kotipizza",cuisine:"pizza",name:"Kotipizza"},removeTags:{amenity:"fast_food",brand:"Kotipizza","brand:wikidata":"Q1628625","brand:wikipedia":"en:Kotipizza",cuisine:"pizza",name:"Kotipizza"},matchScore:2,suggestion:true},"amenity/fast_food/Krispy Kreme":{name:"Krispy Kreme",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1192805"},addTags:{amenity:"fast_food",brand:"Krispy Kreme","brand:wikidata":"Q1192805","brand:wikipedia":"en:Krispy Kreme",cuisine:"donut",name:"Krispy Kreme"},removeTags:{amenity:"fast_food",brand:"Krispy Kreme","brand:wikidata":"Q1192805","brand:wikipedia":"en:Krispy Kreme",cuisine:"donut",name:"Krispy Kreme"},matchScore:2,suggestion:true},"amenity/fast_food/Little Caesars":{name:"Little Caesars",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1393809"},addTags:{amenity:"fast_food",brand:"Little Caesars","brand:wikidata":"Q1393809","brand:wikipedia":"en:Little Caesars",cuisine:"pizza",name:"Little Caesars"},removeTags:{amenity:"fast_food",brand:"Little Caesars","brand:wikidata":"Q1393809","brand:wikipedia":"en:Little Caesars",cuisine:"pizza",name:"Little Caesars"},matchScore:2,suggestion:true},"amenity/fast_food/Long John Silver's":{name:"Long John Silver's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1535221"},addTags:{amenity:"fast_food",brand:"Long John Silver's","brand:wikidata":"Q1535221","brand:wikipedia":"en:Long John Silver's",cuisine:"seafood",name:"Long John Silver's"},removeTags:{amenity:"fast_food",brand:"Long John Silver's","brand:wikidata":"Q1535221","brand:wikipedia":"en:Long John Silver's",cuisine:"seafood",name:"Long John Silver's"},matchScore:2,suggestion:true},"amenity/fast_food/Lotteria":{name:"Lotteria",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q249525"},addTags:{amenity:"fast_food",brand:"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"en:Lotteria",cuisine:"burger",name:"Lotteria"},removeTags:{amenity:"fast_food",brand:"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"en:Lotteria",cuisine:"burger",name:"Lotteria"},matchScore:2,suggestion:true},"amenity/fast_food/Mang Inasal":{name:"Mang Inasal",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q6748573"},addTags:{amenity:"fast_food",brand:"Mang Inasal","brand:wikidata":"Q6748573","brand:wikipedia":"en:Mang Inasal",cuisine:"barbecue",name:"Mang Inasal"},removeTags:{amenity:"fast_food",brand:"Mang Inasal","brand:wikidata":"Q6748573","brand:wikipedia":"en:Mang Inasal",cuisine:"barbecue",name:"Mang Inasal"},matchScore:2,suggestion:true},"amenity/fast_food/McDonald's":{name:"McDonald's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"McDonald's"},removeTags:{amenity:"fast_food",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"McDonald's"},matchScore:2,suggestion:true},"amenity/fast_food/Moe's Southwest Grill":{name:"Moe's Southwest Grill",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q6889938"},addTags:{amenity:"fast_food",brand:"Moe's Southwest Grill","brand:wikidata":"Q6889938","brand:wikipedia":"en:Moe's Southwest Grill",cuisine:"mexican",name:"Moe's Southwest Grill"},removeTags:{amenity:"fast_food",brand:"Moe's Southwest Grill","brand:wikidata":"Q6889938","brand:wikipedia":"en:Moe's Southwest Grill",cuisine:"mexican",name:"Moe's Southwest Grill"},matchScore:2,suggestion:true},"amenity/fast_food/Mr. Sub":{name:"Mr. Sub",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q6929225"},addTags:{amenity:"fast_food",brand:"Mr. Sub","brand:wikidata":"Q6929225","brand:wikipedia":"en:Mr. Sub",cuisine:"sandwich",name:"Mr. Sub"},removeTags:{amenity:"fast_food",brand:"Mr. Sub","brand:wikidata":"Q6929225","brand:wikipedia":"en:Mr. Sub",cuisine:"sandwich",name:"Mr. Sub"},matchScore:2,suggestion:true},"amenity/fast_food/Nordsee":{name:"Nordsee",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q74866"},addTags:{amenity:"fast_food",brand:"Nordsee","brand:wikidata":"Q74866","brand:wikipedia":"en:Nordsee",cuisine:"seafood",name:"Nordsee"},removeTags:{amenity:"fast_food",brand:"Nordsee","brand:wikidata":"Q74866","brand:wikipedia":"en:Nordsee",cuisine:"seafood",name:"Nordsee"},matchScore:2,suggestion:true},"amenity/fast_food/O'Tacos":{name:"O'Tacos",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q28494040"},addTags:{amenity:"fast_food",brand:"O'Tacos","brand:wikidata":"Q28494040","brand:wikipedia":"en:O'Tacos",cuisine:"mexican",name:"O'Tacos"},removeTags:{amenity:"fast_food",brand:"O'Tacos","brand:wikidata":"Q28494040","brand:wikipedia":"en:O'Tacos",cuisine:"mexican",name:"O'Tacos"},matchScore:2,suggestion:true},"amenity/fast_food/Panago":{name:"Panago",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q17111672"},addTags:{amenity:"fast_food",brand:"Panago","brand:wikidata":"Q17111672","brand:wikipedia":"en:Panago",cuisine:"pizza",name:"Panago"},removeTags:{amenity:"fast_food",brand:"Panago","brand:wikidata":"Q17111672","brand:wikipedia":"en:Panago",cuisine:"pizza",name:"Panago"},matchScore:2,suggestion:true},"amenity/fast_food/Panda Express":{name:"Panda Express",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1358690"},addTags:{amenity:"fast_food",brand:"Panda Express","brand:wikidata":"Q1358690","brand:wikipedia":"en:Panda Express",cuisine:"chinese",name:"Panda Express"},removeTags:{amenity:"fast_food",brand:"Panda Express","brand:wikidata":"Q1358690","brand:wikipedia":"en:Panda Express",cuisine:"chinese",name:"Panda Express"},matchScore:2,suggestion:true},"amenity/fast_food/Panera Bread":{name:"Panera Bread",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q7130852"},addTags:{amenity:"fast_food",brand:"Panera Bread","brand:wikidata":"Q7130852","brand:wikipedia":"en:Panera Bread",cuisine:"sandwich",name:"Panera Bread"},removeTags:{amenity:"fast_food",brand:"Panera Bread","brand:wikidata":"Q7130852","brand:wikipedia":"en:Panera Bread",cuisine:"sandwich",name:"Panera Bread"},matchScore:2,suggestion:true},"amenity/fast_food/Papa John's":{name:"Papa John's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q2759586"},addTags:{amenity:"fast_food",brand:"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"en:Papa John's Pizza",cuisine:"pizza",name:"Papa John's"},removeTags:{amenity:"fast_food",brand:"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"en:Papa John's Pizza",cuisine:"pizza",name:"Papa John's"},matchScore:2,suggestion:true},"amenity/fast_food/Papa Murphy's":{name:"Papa Murphy's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q7132349"},addTags:{amenity:"fast_food",brand:"Papa Murphy's","brand:wikidata":"Q7132349","brand:wikipedia":"en:Papa Murphy's",cuisine:"pizza",name:"Papa Murphy's"},removeTags:{amenity:"fast_food",brand:"Papa Murphy's","brand:wikidata":"Q7132349","brand:wikipedia":"en:Papa Murphy's",cuisine:"pizza",name:"Papa Murphy's"},matchScore:2,suggestion:true},"amenity/fast_food/Pita Pit":{name:"Pita Pit",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q7757289"},addTags:{amenity:"fast_food",brand:"Pita Pit","brand:wikidata":"Q7757289","brand:wikipedia":"en:Pita Pit",cuisine:"pita",name:"Pita Pit"},removeTags:{amenity:"fast_food",brand:"Pita Pit","brand:wikidata":"Q7757289","brand:wikipedia":"en:Pita Pit",cuisine:"pita",name:"Pita Pit"},matchScore:2,suggestion:true},"amenity/fast_food/Pizza Hut Delivery":{name:"Pizza Hut Delivery",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q191615"},addTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Delivery"},removeTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Delivery"},matchScore:2,suggestion:true},"amenity/fast_food/Pizza Hut Express":{name:"Pizza Hut Express",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q191615"},addTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikipedia":"en:Pizza Hut","brand:wikidata":"Q191615",cuisine:"pizza",name:"Pizza Hut Express"},removeTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikipedia":"en:Pizza Hut","brand:wikidata":"Q191615",cuisine:"pizza",name:"Pizza Hut Express"},matchScore:2,suggestion:true},"amenity/fast_food/Pizza Nova":{name:"Pizza Nova",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q7199971"},addTags:{amenity:"fast_food",brand:"Pizza Nova","brand:wikidata":"Q7199971","brand:wikipedia":"en:Pizza Nova",cuisine:"pizza",name:"Pizza Nova"},removeTags:{amenity:"fast_food",brand:"Pizza Nova","brand:wikidata":"Q7199971","brand:wikipedia":"en:Pizza Nova",cuisine:"pizza",name:"Pizza Nova"},matchScore:2,suggestion:true},"amenity/fast_food/Pizza Pizza":{name:"Pizza Pizza",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1194143"},addTags:{amenity:"fast_food",brand:"Pizza Pizza","brand:wikidata":"Q1194143","brand:wikipedia":"en:Pizza Pizza",cuisine:"pizza",name:"Pizza Pizza"},removeTags:{amenity:"fast_food",brand:"Pizza Pizza","brand:wikidata":"Q1194143","brand:wikipedia":"en:Pizza Pizza",cuisine:"pizza",name:"Pizza Pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Pollo Campero":{name:"Pollo Campero",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q942741"},addTags:{amenity:"fast_food",brand:"Pollo Campero","brand:wikidata":"Q942741","brand:wikipedia":"en:Pollo Campero",cuisine:"chicken",name:"Pollo Campero"},removeTags:{amenity:"fast_food",brand:"Pollo Campero","brand:wikidata":"Q942741","brand:wikipedia":"en:Pollo Campero",cuisine:"chicken",name:"Pollo Campero"},matchScore:2,suggestion:true},"amenity/fast_food/Popeye's":{name:"Popeye's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1330910"},addTags:{amenity:"fast_food",brand:"Popeye's","brand:wikidata":"Q1330910","brand:wikipedia":"en:Popeyes",cuisine:"chicken",name:"Popeye's"},removeTags:{amenity:"fast_food",brand:"Popeye's","brand:wikidata":"Q1330910","brand:wikipedia":"en:Popeyes",cuisine:"chicken",name:"Popeye's"},matchScore:2,suggestion:true},"amenity/fast_food/Potbelly":{name:"Potbelly",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q7234777"},addTags:{amenity:"fast_food",brand:"Potbelly","brand:wikidata":"Q7234777","brand:wikipedia":"en:Potbelly Sandwich Works",cuisine:"sandwich",name:"Potbelly"},removeTags:{amenity:"fast_food",brand:"Potbelly","brand:wikidata":"Q7234777","brand:wikipedia":"en:Potbelly Sandwich Works",cuisine:"sandwich",name:"Potbelly"},matchScore:2,suggestion:true},"amenity/fast_food/Qdoba":{name:"Qdoba",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1363885"},addTags:{amenity:"fast_food",brand:"Qdoba","brand:wikidata":"Q1363885","brand:wikipedia":"en:Qdoba",cuisine:"mexican",name:"Qdoba"},removeTags:{amenity:"fast_food",brand:"Qdoba","brand:wikidata":"Q1363885","brand:wikipedia":"en:Qdoba",cuisine:"mexican",name:"Qdoba"},matchScore:2,suggestion:true},"amenity/fast_food/Quick":{name:"Quick",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q286494"},addTags:{amenity:"fast_food",brand:"Quick","brand:wikidata":"Q286494","brand:wikipedia":"en:Quick (restaurant)",cuisine:"burger",name:"Quick"},removeTags:{amenity:"fast_food",brand:"Quick","brand:wikidata":"Q286494","brand:wikipedia":"en:Quick (restaurant)",cuisine:"burger",name:"Quick"},matchScore:2,suggestion:true},"amenity/fast_food/Quiznos":{name:"Quiznos",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1936229"},addTags:{amenity:"fast_food",brand:"Quiznos","brand:wikidata":"Q1936229","brand:wikipedia":"en:Quiznos",cuisine:"sandwich",name:"Quiznos"},removeTags:{amenity:"fast_food",brand:"Quiznos","brand:wikidata":"Q1936229","brand:wikipedia":"en:Quiznos",cuisine:"sandwich",name:"Quiznos"},matchScore:2,suggestion:true},"amenity/fast_food/Rally's":{name:"Rally's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q3419341"},addTags:{amenity:"fast_food",brand:"Rally's","brand:wikidata":"Q3419341","brand:wikipedia":"en:Checkers and Rally's",cuisine:"burger",name:"Rally's"},removeTags:{amenity:"fast_food",brand:"Rally's","brand:wikidata":"Q3419341","brand:wikipedia":"en:Checkers and Rally's",cuisine:"burger",name:"Rally's"},matchScore:2,suggestion:true},"amenity/fast_food/Red Rooster":{name:"Red Rooster",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q376466"},addTags:{amenity:"fast_food",brand:"Red Rooster","brand:wikidata":"Q376466","brand:wikipedia":"en:Red Rooster",cuisine:"chicken",name:"Red Rooster"},removeTags:{amenity:"fast_food",brand:"Red Rooster","brand:wikidata":"Q376466","brand:wikipedia":"en:Red Rooster",cuisine:"chicken",name:"Red Rooster"},matchScore:2,suggestion:true},"amenity/fast_food/Sbarro":{name:"Sbarro",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q2589409"},addTags:{amenity:"fast_food",brand:"Sbarro","brand:wikidata":"Q2589409","brand:wikipedia":"en:Sbarro",cuisine:"pizza",name:"Sbarro"},removeTags:{amenity:"fast_food",brand:"Sbarro","brand:wikidata":"Q2589409","brand:wikipedia":"en:Sbarro",cuisine:"pizza",name:"Sbarro"},matchScore:2,suggestion:true},"amenity/fast_food/Smashburger":{name:"Smashburger",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q17061332"},addTags:{amenity:"fast_food",brand:"Smashburger","brand:wikidata":"Q17061332","brand:wikipedia":"en:Smashburger",cuisine:"burger",name:"Smashburger"},removeTags:{amenity:"fast_food",brand:"Smashburger","brand:wikidata":"Q17061332","brand:wikipedia":"en:Smashburger",cuisine:"burger",name:"Smashburger"},matchScore:2,suggestion:true},"amenity/fast_food/Smoothie King":{name:"Smoothie King",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5491421"},addTags:{amenity:"fast_food",brand:"Smoothie King","brand:wikidata":"Q5491421","brand:wikipedia":"en:Smoothie King",cuisine:"juice",name:"Smoothie King"},removeTags:{amenity:"fast_food",brand:"Smoothie King","brand:wikidata":"Q5491421","brand:wikipedia":"en:Smoothie King",cuisine:"juice",name:"Smoothie King"},matchScore:2,suggestion:true},"amenity/fast_food/Sonic":{name:"Sonic",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q7561808"},addTags:{amenity:"fast_food",brand:"Sonic","brand:wikidata":"Q7561808","brand:wikipedia":"en:Sonic Drive-In",cuisine:"burger",name:"Sonic"},removeTags:{amenity:"fast_food",brand:"Sonic","brand:wikidata":"Q7561808","brand:wikipedia":"en:Sonic Drive-In",cuisine:"burger",name:"Sonic"},matchScore:2,suggestion:true},"amenity/fast_food/Steers":{name:"Steers",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q56599145"},addTags:{amenity:"fast_food",brand:"Steers","brand:wikidata":"Q56599145","brand:wikipedia":"en:Steers",cuisine:"burger",name:"Steers"},removeTags:{amenity:"fast_food",brand:"Steers","brand:wikidata":"Q56599145","brand:wikipedia":"en:Steers",cuisine:"burger",name:"Steers"},matchScore:2,suggestion:true},"amenity/fast_food/Subway":{name:"Subway",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q244457"},addTags:{amenity:"fast_food",brand:"Subway","brand:wikidata":"Q244457","brand:wikipedia":"en:Subway (restaurant)",cuisine:"sandwich",name:"Subway"},removeTags:{amenity:"fast_food",brand:"Subway","brand:wikidata":"Q244457","brand:wikipedia":"en:Subway (restaurant)",cuisine:"sandwich",name:"Subway"},matchScore:2,suggestion:true},"amenity/fast_food/Taco Bell":{name:"Taco Bell",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q752941"},addTags:{amenity:"fast_food",brand:"Taco Bell","brand:wikidata":"Q752941","brand:wikipedia":"en:Taco Bell",cuisine:"mexican",name:"Taco Bell"},removeTags:{amenity:"fast_food",brand:"Taco Bell","brand:wikidata":"Q752941","brand:wikipedia":"en:Taco Bell",cuisine:"mexican",name:"Taco Bell"},matchScore:2,suggestion:true},"amenity/fast_food/Taco Bueno":{name:"Taco Bueno",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q7673958"},addTags:{amenity:"fast_food",brand:"Taco Bueno","brand:wikidata":"Q7673958","brand:wikipedia":"en:Taco Bueno",cuisine:"mexican",name:"Taco Bueno"},removeTags:{amenity:"fast_food",brand:"Taco Bueno","brand:wikidata":"Q7673958","brand:wikipedia":"en:Taco Bueno",cuisine:"mexican",name:"Taco Bueno"},matchScore:2,suggestion:true},"amenity/fast_food/Taco Cabana":{name:"Taco Cabana",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q12070488"},addTags:{amenity:"fast_food",brand:"Taco Cabana","brand:wikidata":"Q12070488","brand:wikipedia":"en:Taco Cabana",cuisine:"mexican",name:"Taco Cabana"},removeTags:{amenity:"fast_food",brand:"Taco Cabana","brand:wikidata":"Q12070488","brand:wikipedia":"en:Taco Cabana",cuisine:"mexican",name:"Taco Cabana"},matchScore:2,suggestion:true},"amenity/fast_food/Taco Del Mar":{name:"Taco Del Mar",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q7673972"},addTags:{amenity:"fast_food",brand:"Taco Del Mar","brand:wikidata":"Q7673972","brand:wikipedia":"en:Taco del Mar",cuisine:"mexican",name:"Taco Del Mar"},removeTags:{amenity:"fast_food",brand:"Taco Del Mar","brand:wikidata":"Q7673972","brand:wikipedia":"en:Taco del Mar",cuisine:"mexican",name:"Taco Del Mar"},matchScore:2,suggestion:true},"amenity/fast_food/Taco John's":{name:"Taco John's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q7673962"},addTags:{amenity:"fast_food",brand:"Taco John's","brand:wikidata":"Q7673962","brand:wikipedia":"en:Taco John's",cuisine:"mexican",name:"Taco John's"},removeTags:{amenity:"fast_food",brand:"Taco John's","brand:wikidata":"Q7673962","brand:wikipedia":"en:Taco John's",cuisine:"mexican",name:"Taco John's"},matchScore:2,suggestion:true},"amenity/fast_food/Taco Time":{name:"Taco Time",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q7673969"},addTags:{amenity:"fast_food",brand:"Taco Time","brand:wikidata":"Q7673969","brand:wikipedia":"en:Taco Time",cuisine:"mexican",name:"Taco Time"},removeTags:{amenity:"fast_food",brand:"Taco Time","brand:wikidata":"Q7673969","brand:wikipedia":"en:Taco Time",cuisine:"mexican",name:"Taco Time"},matchScore:2,suggestion:true},"amenity/fast_food/Telepizza":{name:"Telepizza",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q2699863"},addTags:{amenity:"fast_food",brand:"Telepizza","brand:wikidata":"Q2699863","brand:wikipedia":"en:Telepizza",cuisine:"pizza",name:"Telepizza"},removeTags:{amenity:"fast_food",brand:"Telepizza","brand:wikidata":"Q2699863","brand:wikipedia":"en:Telepizza",cuisine:"pizza",name:"Telepizza"},matchScore:2,suggestion:true},"amenity/fast_food/Thai Express":{name:"Thai Express",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q7709119"},addTags:{amenity:"fast_food",brand:"Thai Express","brand:wikidata":"Q7709119","brand:wikipedia":"en:Thai Express",cuisine:"thai",name:"Thai Express"},removeTags:{amenity:"fast_food",brand:"Thai Express","brand:wikidata":"Q7709119","brand:wikipedia":"en:Thai Express",cuisine:"thai",name:"Thai Express"},matchScore:2,suggestion:true},"amenity/fast_food/The Pizza Company":{name:"The Pizza Company",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q2413520"},addTags:{amenity:"fast_food",brand:"The Pizza Company","brand:wikidata":"Q2413520","brand:wikipedia":"en:The Pizza Company",cuisine:"pizza",name:"The Pizza Company"},removeTags:{amenity:"fast_food",brand:"The Pizza Company","brand:wikidata":"Q2413520","brand:wikipedia":"en:The Pizza Company",cuisine:"pizza",name:"The Pizza Company"},matchScore:2,suggestion:true},"amenity/fast_food/Wendy's":{name:"Wendy's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q550258"},addTags:{amenity:"fast_food",brand:"Wendy's","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"Wendy's"},removeTags:{amenity:"fast_food",brand:"Wendy's","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"Wendy's"},matchScore:2,suggestion:true},"amenity/fast_food/Whataburger":{name:"Whataburger",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q376627"},addTags:{amenity:"fast_food",brand:"Whataburger","brand:wikidata":"Q376627","brand:wikipedia":"en:Whataburger",cuisine:"burger",name:"Whataburger"},removeTags:{amenity:"fast_food",brand:"Whataburger","brand:wikidata":"Q376627","brand:wikipedia":"en:Whataburger",cuisine:"burger",name:"Whataburger"},matchScore:2,suggestion:true},"amenity/fast_food/White Castle":{name:"White Castle",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1244034"},addTags:{amenity:"fast_food",brand:"White Castle","brand:wikidata":"Q1244034","brand:wikipedia":"en:White Castle (restaurant)",cuisine:"burger",name:"White Castle"},removeTags:{amenity:"fast_food",brand:"White Castle","brand:wikidata":"Q1244034","brand:wikipedia":"en:White Castle (restaurant)",cuisine:"burger",name:"White Castle"},matchScore:2,suggestion:true},"amenity/fast_food/Wienerschnitzel":{name:"Wienerschnitzel",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q324679"},addTags:{amenity:"fast_food",brand:"Wienerschnitzel","brand:wikidata":"Q324679","brand:wikipedia":"en:Wienerschnitzel",cuisine:"hot_dog",name:"Wienerschnitzel"},removeTags:{amenity:"fast_food",brand:"Wienerschnitzel","brand:wikidata":"Q324679","brand:wikipedia":"en:Wienerschnitzel",cuisine:"hot_dog",name:"Wienerschnitzel"},matchScore:2,suggestion:true},"amenity/fast_food/Wimpy":{name:"Wimpy",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q2811992"},addTags:{amenity:"fast_food",brand:"Wimpy","brand:wikidata":"Q2811992","brand:wikipedia":"en:Wimpy (restaurant)",cuisine:"burger",name:"Wimpy"},removeTags:{amenity:"fast_food",brand:"Wimpy","brand:wikidata":"Q2811992","brand:wikipedia":"en:Wimpy (restaurant)",cuisine:"burger",name:"Wimpy"},matchScore:2,suggestion:true},"amenity/fast_food/Zaxby's":{name:"Zaxby's",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q8067525"},addTags:{amenity:"fast_food",brand:"Zaxby's","brand:wikidata":"Q8067525","brand:wikipedia":"en:Zaxby's",cuisine:"chicken",name:"Zaxby's"},removeTags:{amenity:"fast_food",brand:"Zaxby's","brand:wikidata":"Q8067525","brand:wikipedia":"en:Zaxby's",cuisine:"chicken",name:"Zaxby's"},matchScore:2,suggestion:true},"amenity/fast_food/Бургер Кинг":{name:"Бургер Кинг",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q177054"},addTags:{amenity:"fast_food",brand:"Бургер Кинг","brand:en":"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Бургер Кинг","name:en":"Burger King"},removeTags:{amenity:"fast_food",brand:"Бургер Кинг","brand:en":"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Бургер Кинг","name:en":"Burger King"},matchScore:2,suggestion:true},"amenity/fast_food/Крошка Картошка":{name:"Крошка Картошка",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4241838"},addTags:{amenity:"fast_food",brand:"Крошка Картошка","brand:wikidata":"Q4241838","brand:wikipedia":"ru:Крошка Картошка",name:"Крошка Картошка"},removeTags:{amenity:"fast_food",brand:"Крошка Картошка","brand:wikidata":"Q4241838","brand:wikipedia":"ru:Крошка Картошка",name:"Крошка Картошка"},matchScore:2,suggestion:true},"amenity/fast_food/Макдоналдс":{name:"Макдоналдс",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"Макдоналдс","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"Макдоналдс","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"Макдоналдс","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"Макдоналдс","name:en":"McDonald's"},matchScore:2,suggestion:true},"amenity/fast_food/Папа Джонс":{name:"Папа Джонс",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q2759586"},addTags:{amenity:"fast_food",brand:"Папа Джонс","brand:en":"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"ru:Papa John’s",cuisine:"pizza",name:"Папа Джонс","name:en":"Papa John's"},removeTags:{amenity:"fast_food",brand:"Папа Джонс","brand:en":"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"ru:Papa John’s",cuisine:"pizza",name:"Папа Джонс","name:en":"Papa John's"},matchScore:2,suggestion:true},"amenity/fast_food/Стардог!s":{name:"Стардог!s",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4439856"},addTags:{amenity:"fast_food",brand:"Стардог!s","brand:en":"Stardog!s","brand:wikidata":"Q4439856","brand:wikipedia":"ru:Стардогс",name:"Стардог!s","name:en":"Stardog!s"},removeTags:{amenity:"fast_food",brand:"Стардог!s","brand:en":"Stardog!s","brand:wikidata":"Q4439856","brand:wikipedia":"ru:Стардогс",name:"Стардог!s","name:en":"Stardog!s"},matchScore:2,suggestion:true},"amenity/fast_food/Теремок":{name:"Теремок",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4455593"},addTags:{amenity:"fast_food",brand:"Теремок","brand:en":"Teremok","brand:wikidata":"Q4455593","brand:wikipedia":"ru:Теремок (сеть быстрого питания)",name:"Теремок","name:en":"Teremok"},removeTags:{amenity:"fast_food",brand:"Теремок","brand:en":"Teremok","brand:wikidata":"Q4455593","brand:wikipedia":"ru:Теремок (сеть быстрого питания)",name:"Теремок","name:en":"Teremok"},matchScore:2,suggestion:true},"amenity/fast_food/מקדונלד'ס":{name:"מקדונלד'ס",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q12061542"},addTags:{amenity:"fast_food",brand:"מקדונלד'ס","brand:en":"McDonald's","brand:wikidata":"Q12061542","brand:wikipedia":"en:McDonald's Israel",cuisine:"burger",name:"מקדונלד'ס","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"מקדונלד'ס","brand:en":"McDonald's","brand:wikidata":"Q12061542","brand:wikipedia":"en:McDonald's Israel",cuisine:"burger",name:"מקדונלד'ס","name:en":"McDonald's"},matchScore:2,suggestion:true},"amenity/fast_food/かっぱ寿司":{name:"かっぱ寿司",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11263916"},addTags:{amenity:"fast_food",brand:"かっぱ寿司","brand:en":"Kappazushi","brand:wikidata":"Q11263916","brand:wikipedia":"ja:かっぱ寿司",cuisine:"sushi",name:"かっぱ寿司","name:en":"Kappazushi"},removeTags:{amenity:"fast_food",brand:"かっぱ寿司","brand:en":"Kappazushi","brand:wikidata":"Q11263916","brand:wikipedia":"ja:かっぱ寿司",cuisine:"sushi",name:"かっぱ寿司","name:en":"Kappazushi"},matchScore:2,suggestion:true},"amenity/fast_food/かつや":{name:"かつや",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q2855257"},addTags:{amenity:"fast_food",brand:"かつや","brand:en":"Katsuya","brand:wikidata":"Q2855257","brand:wikipedia":"ja:かつや",cuisine:"fried_food",name:"かつや","name:en":"Katsuya","name:ko":"카쯔야","name:zh":"吉豚屋"},removeTags:{amenity:"fast_food",brand:"かつや","brand:en":"Katsuya","brand:wikidata":"Q2855257","brand:wikipedia":"ja:かつや",cuisine:"fried_food",name:"かつや","name:en":"Katsuya","name:ko":"카쯔야","name:zh":"吉豚屋"},matchScore:2,suggestion:true},"amenity/fast_food/くら寿司":{name:"くら寿司",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q6445491"},addTags:{amenity:"fast_food",brand:"くら寿司","brand:en":"Kurazushi","brand:wikidata":"Q6445491","brand:wikipedia":"ja:くらコーポレーション",cuisine:"sushi",name:"くら寿司","name:en":"Kurazushi"},removeTags:{amenity:"fast_food",brand:"くら寿司","brand:en":"Kurazushi","brand:wikidata":"Q6445491","brand:wikipedia":"ja:くらコーポレーション",cuisine:"sushi",name:"くら寿司","name:en":"Kurazushi"},matchScore:2,suggestion:true},"amenity/fast_food/すき家":{name:"すき家",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q6137375"},addTags:{amenity:"fast_food",brand:"すき家","brand:en":"Sukiya","brand:wikidata":"Q6137375","brand:wikipedia":"ja:すき家",name:"すき家","name:en":"Sukiya"},removeTags:{amenity:"fast_food",brand:"すき家","brand:en":"Sukiya","brand:wikidata":"Q6137375","brand:wikipedia":"ja:すき家",name:"すき家","name:en":"Sukiya"},matchScore:2,suggestion:true},"amenity/fast_food/なか卯":{name:"なか卯",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11274132"},addTags:{amenity:"fast_food",brand:"なか卯","brand:en":"Nakau","brand:wikidata":"Q11274132","brand:wikipedia":"ja:なか卯",name:"なか卯","name:en":"Nakau"},removeTags:{amenity:"fast_food",brand:"なか卯","brand:en":"Nakau","brand:wikidata":"Q11274132","brand:wikipedia":"ja:なか卯",name:"なか卯","name:en":"Nakau"},matchScore:2,suggestion:true},"amenity/fast_food/はま寿司":{name:"はま寿司",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q17220385"},addTags:{amenity:"fast_food",brand:"はま寿司","brand:en":"Hamazushi","brand:wikidata":"Q17220385","brand:wikipedia":"ja:はま寿司",name:"はま寿司","name:en":"Hamazushi"},removeTags:{amenity:"fast_food",brand:"はま寿司","brand:en":"Hamazushi","brand:wikidata":"Q17220385","brand:wikipedia":"ja:はま寿司",name:"はま寿司","name:en":"Hamazushi"},matchScore:2,suggestion:true},"amenity/fast_food/ほっかほっか亭":{name:"ほっかほっか亭",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5878035"},addTags:{amenity:"fast_food",brand:"ほっかほっか亭","brand:en":"Hokka Hokka Tei","brand:wikidata":"Q5878035","brand:wikipedia":"ja:ほっかほっか亭",name:"ほっかほっか亭","name:en":"Hokka Hokka Tei"},removeTags:{amenity:"fast_food",brand:"ほっかほっか亭","brand:en":"Hokka Hokka Tei","brand:wikidata":"Q5878035","brand:wikipedia":"ja:ほっかほっか亭",name:"ほっかほっか亭","name:en":"Hokka Hokka Tei"},matchScore:2,suggestion:true},"amenity/fast_food/ほっともっと":{name:"ほっともっと",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q10850949"},addTags:{amenity:"fast_food",brand:"ほっともっと","brand:en":"Hotto Motto","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",name:"ほっともっと","name:en":"Hotto Motto"},removeTags:{amenity:"fast_food",brand:"ほっともっと","brand:en":"Hotto Motto","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",name:"ほっともっと","name:en":"Hotto Motto"},matchScore:2,suggestion:true},"amenity/fast_food/オリジン弁当":{name:"オリジン弁当",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11292632"},addTags:{amenity:"fast_food",brand:"オリジン弁当","brand:en":"Origin Bentō","brand:wikidata":"Q11292632","brand:wikipedia":"ja:オリジン東秀",name:"オリジン弁当","name:en":"Origin Bentō"},removeTags:{amenity:"fast_food",brand:"オリジン弁当","brand:en":"Origin Bentō","brand:wikidata":"Q11292632","brand:wikipedia":"ja:オリジン東秀",name:"オリジン弁当","name:en":"Origin Bentō"},matchScore:2,suggestion:true},"amenity/fast_food/ケンタッキーフライドチキン":{name:"ケンタッキーフライドチキン",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q524757"},addTags:{amenity:"fast_food",brand:"ケンタッキーフライドチキン","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"ja:KFCコーポレーション",cuisine:"chicken",name:"ケンタッキーフライドチキン","name:en":"KFC"},removeTags:{amenity:"fast_food",brand:"ケンタッキーフライドチキン","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"ja:KFCコーポレーション",cuisine:"chicken",name:"ケンタッキーフライドチキン","name:en":"KFC"},matchScore:2,suggestion:true},"amenity/fast_food/サブウェイ":{name:"サブウェイ",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q244457"},addTags:{amenity:"fast_food",brand:"サブウェイ","brand:en":"Subway","brand:wikidata":"Q244457","brand:wikipedia":"ja:サブウェイ",cuisine:"sandwich",name:"サブウェイ","name:en":"Subway"},removeTags:{amenity:"fast_food",brand:"サブウェイ","brand:en":"Subway","brand:wikidata":"Q244457","brand:wikipedia":"ja:サブウェイ",cuisine:"sandwich",name:"サブウェイ","name:en":"Subway"},matchScore:2,suggestion:true},"amenity/fast_food/スシロー":{name:"スシロー",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11257037"},addTags:{amenity:"fast_food",brand:"スシロー","brand:en":"Sushiro","brand:wikidata":"Q11257037","brand:wikipedia":"ja:あきんどスシロー",cuisine:"sushi",name:"スシロー","name:en":"Sushiro","name:zh":"壽司郎"},removeTags:{amenity:"fast_food",brand:"スシロー","brand:en":"Sushiro","brand:wikidata":"Q11257037","brand:wikipedia":"ja:あきんどスシロー",cuisine:"sushi",name:"スシロー","name:en":"Sushiro","name:zh":"壽司郎"},matchScore:2,suggestion:true},"amenity/fast_food/ピザハット":{name:"ピザハット",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q191615"},addTags:{amenity:"fast_food",brand:"ピザハット","brand:en":"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"ja:ピザハット",cuisine:"pizza",name:"ピザハット","name:en":"Pizza Hut"},removeTags:{amenity:"fast_food",brand:"ピザハット","brand:en":"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"ja:ピザハット",cuisine:"pizza",name:"ピザハット","name:en":"Pizza Hut"},matchScore:2,suggestion:true},"amenity/fast_food/マクドナルド":{name:"マクドナルド",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"マクドナルド","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"ja:マクドナルド",cuisine:"burger",name:"マクドナルド","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"マクドナルド","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"ja:マクドナルド",cuisine:"burger",name:"マクドナルド","name:en":"McDonald's"},matchScore:2,suggestion:true},"amenity/fast_food/ミスタードーナツ":{name:"ミスタードーナツ",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1065819"},addTags:{amenity:"fast_food",brand:"ミスタードーナツ","brand:en":"Mister Donut","brand:wikidata":"Q1065819","brand:wikipedia":"en:Mister Donut",cuisine:"donut",name:"ミスタードーナツ","name:en":"Mister Donut"},removeTags:{amenity:"fast_food",brand:"ミスタードーナツ","brand:en":"Mister Donut","brand:wikidata":"Q1065819","brand:wikipedia":"en:Mister Donut",cuisine:"donut",name:"ミスタードーナツ","name:en":"Mister Donut"},matchScore:2,suggestion:true},"amenity/fast_food/モスバーガー":{name:"モスバーガー",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1204169"},addTags:{amenity:"fast_food",brand:"モスバーガー","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"ja:モスバーガー",cuisine:"burger",name:"モスバーガー","name:en":"MOS Burger"},removeTags:{amenity:"fast_food",brand:"モスバーガー","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"ja:モスバーガー",cuisine:"burger",name:"モスバーガー","name:en":"MOS Burger"},matchScore:2,suggestion:true},"amenity/fast_food/ロッテリア":{name:"ロッテリア",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q249525"},addTags:{amenity:"fast_food",brand:"ロッテリア","brand:en":"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"ja:ロッテリア",cuisine:"burger",name:"ロッテリア","name:en":"Lotteria"},removeTags:{amenity:"fast_food",brand:"ロッテリア","brand:en":"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"ja:ロッテリア",cuisine:"burger",name:"ロッテリア","name:en":"Lotteria"},matchScore:2,suggestion:true},"amenity/fast_food/吉野家":{name:"吉野家",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q776272"},addTags:{amenity:"fast_food",brand:"吉野家","brand:en":"Yoshinoya","brand:wikidata":"Q776272","brand:wikipedia":"ja:吉野家",name:"吉野家","name:en":"Yoshinoya"},removeTags:{amenity:"fast_food",brand:"吉野家","brand:en":"Yoshinoya","brand:wikidata":"Q776272","brand:wikipedia":"ja:吉野家",name:"吉野家","name:en":"Yoshinoya"},matchScore:2,suggestion:true},"amenity/fast_food/富士そば":{name:"富士そば",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11414722"},addTags:{amenity:"fast_food",brand:"富士そば","brand:en":"Fuji Soba","brand:wikidata":"Q11414722","brand:wikipedia":"ja:名代富士そば",name:"富士そば","name:en":"Fuji Soba"},removeTags:{amenity:"fast_food",brand:"富士そば","brand:en":"Fuji Soba","brand:wikidata":"Q11414722","brand:wikipedia":"ja:名代富士そば",name:"富士そば","name:en":"Fuji Soba"},matchScore:2,suggestion:true},"amenity/fast_food/幸楽苑":{name:"幸楽苑",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11484003"},addTags:{amenity:"fast_food",brand:"幸楽苑","brand:en":"Kourakuen","brand:wikidata":"Q11484003","brand:wikipedia":"ja:幸楽苑",name:"幸楽苑","name:en":"Kourakuen"},removeTags:{amenity:"fast_food",brand:"幸楽苑","brand:en":"Kourakuen","brand:wikidata":"Q11484003","brand:wikipedia":"ja:幸楽苑",name:"幸楽苑","name:en":"Kourakuen"},matchScore:2,suggestion:true},"amenity/fast_food/摩斯漢堡":{name:"摩斯漢堡",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1204169"},addTags:{amenity:"fast_food",brand:"摩斯漢堡","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"zh:摩斯漢堡",cuisine:"burger",name:"摩斯漢堡","name:en":"MOS Burger"},removeTags:{amenity:"fast_food",brand:"摩斯漢堡","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"zh:摩斯漢堡",cuisine:"burger",name:"摩斯漢堡","name:en":"MOS Burger"},matchScore:2,suggestion:true},"amenity/fast_food/松屋":{name:"松屋",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q848773"},addTags:{amenity:"fast_food",brand:"松屋","brand:en":"Matsuya Foods","brand:wikidata":"Q848773","brand:wikipedia":"zh:松屋食品",name:"松屋","name:en":"Matsuya Foods"},removeTags:{amenity:"fast_food",brand:"松屋","brand:en":"Matsuya Foods","brand:wikidata":"Q848773","brand:wikipedia":"zh:松屋食品",name:"松屋","name:en":"Matsuya Foods"},matchScore:2,suggestion:true},"amenity/fast_food/肯德基":{name:"肯德基",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q524757"},addTags:{amenity:"fast_food",brand:"肯德基","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"zh:肯德基",name:"肯德基","name:en":"KFC"},removeTags:{amenity:"fast_food",brand:"肯德基","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"zh:肯德基",name:"肯德基","name:en":"KFC"},matchScore:2,suggestion:true},"amenity/fast_food/麥當勞":{name:"麥當勞",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"麥當勞","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh_classical:麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"麥當勞","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh_classical:麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's"},matchScore:2,suggestion:true},"amenity/fast_food/麦当劳":{name:"麦当劳",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"麦当劳","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh:麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"麦当劳","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh:麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's"},matchScore:2,suggestion:true},"amenity/fast_food/롯데리아":{name:"롯데리아",icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q249525"},addTags:{amenity:"fast_food",brand:"롯데리아","brand:en":"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"ko:롯데리아",cuisine:"burger",name:"롯데리아","name:en":"Lotteria"},removeTags:{amenity:"fast_food",brand:"롯데리아","brand:en":"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"ko:롯데리아",cuisine:"burger",name:"롯데리아","name:en":"Lotteria"},matchScore:2,suggestion:true},"amenity/fuel/1-2-3":{name:"1-2-3",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4545742"},addTags:{amenity:"fuel",brand:"1-2-3","brand:wikidata":"Q4545742","brand:wikipedia":"en:1-2-3 (fuel station)",name:"1-2-3"},removeTags:{amenity:"fuel",brand:"1-2-3","brand:wikidata":"Q4545742","brand:wikipedia":"en:1-2-3 (fuel station)",name:"1-2-3"},matchScore:2,suggestion:true},"amenity/fuel/ABC":{name:"ABC",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q10397504"},addTags:{amenity:"fuel",brand:"ABC","brand:wikidata":"Q10397504","brand:wikipedia":"fi:ABC-ketju",name:"ABC"},removeTags:{amenity:"fuel",brand:"ABC","brand:wikidata":"Q10397504","brand:wikipedia":"fi:ABC-ketju",name:"ABC"},matchScore:2,suggestion:true},"amenity/fuel/ADNOC":{name:"ADNOC",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q166729"},addTags:{amenity:"fuel",brand:"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ADNOC"},removeTags:{amenity:"fuel",brand:"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ADNOC"},matchScore:2,suggestion:true},"amenity/fuel/Afriquia":{name:"Afriquia",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2829178"},addTags:{amenity:"fuel",brand:"Afriquia","brand:wikidata":"Q2829178","brand:wikipedia":"en:Akwa Group",name:"Afriquia"},removeTags:{amenity:"fuel",brand:"Afriquia","brand:wikidata":"Q2829178","brand:wikipedia":"en:Akwa Group",name:"Afriquia"},matchScore:2,suggestion:true},"amenity/fuel/Agip":{name:"Agip",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q377915"},addTags:{amenity:"fuel",brand:"Agip","brand:wikidata":"Q377915","brand:wikipedia":"en:Agip",name:"Agip"},removeTags:{amenity:"fuel",brand:"Agip","brand:wikidata":"Q377915","brand:wikipedia":"en:Agip",name:"Agip"},matchScore:2,suggestion:true},"amenity/fuel/Aral":{name:"Aral",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q565734"},addTags:{amenity:"fuel",brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral"},removeTags:{amenity:"fuel",brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral"},matchScore:2,suggestion:true},"amenity/fuel/Arco":{name:"Arco",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q304769"},addTags:{amenity:"fuel",brand:"Arco","brand:wikidata":"Q304769","brand:wikipedia":"en:ARCO",name:"Arco"},removeTags:{amenity:"fuel",brand:"Arco","brand:wikidata":"Q304769","brand:wikipedia":"en:ARCO",name:"Arco"},matchScore:2,suggestion:true},"amenity/fuel/Avia":{name:"Avia",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q300147"},addTags:{amenity:"fuel",brand:"Avia","brand:wikidata":"Q300147","brand:wikipedia":"de:Avia International",name:"Avia"},removeTags:{amenity:"fuel",brand:"Avia","brand:wikidata":"Q300147","brand:wikipedia":"de:Avia International",name:"Avia"},matchScore:2,suggestion:true},"amenity/fuel/BP":{name:"BP",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q152057"},addTags:{amenity:"fuel",brand:"BP","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP"},removeTags:{amenity:"fuel",brand:"BP","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP"},matchScore:2,suggestion:true},"amenity/fuel/Bharat Petroleum":{name:"Bharat Petroleum",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q854826"},addTags:{amenity:"fuel",brand:"Bharat Petroleum","brand:wikidata":"Q854826","brand:wikipedia":"en:Bharat Petroleum",name:"Bharat Petroleum"},removeTags:{amenity:"fuel",brand:"Bharat Petroleum","brand:wikidata":"Q854826","brand:wikipedia":"en:Bharat Petroleum",name:"Bharat Petroleum"},matchScore:2,suggestion:true},"amenity/fuel/Bliska":{name:"Bliska",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4016378"},addTags:{amenity:"fuel",brand:"Bliska","brand:wikidata":"Q4016378","brand:wikipedia":"pl:Bliska",name:"Bliska"},removeTags:{amenity:"fuel",brand:"Bliska","brand:wikidata":"Q4016378","brand:wikipedia":"pl:Bliska",name:"Bliska"},matchScore:2,suggestion:true},"amenity/fuel/CAMPSA":{name:"CAMPSA",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1031623"},addTags:{amenity:"fuel",brand:"CAMPSA","brand:wikidata":"Q1031623","brand:wikipedia":"en:Campsa",name:"CAMPSA"},removeTags:{amenity:"fuel",brand:"CAMPSA","brand:wikidata":"Q1031623","brand:wikipedia":"en:Campsa",name:"CAMPSA"},matchScore:2,suggestion:true},"amenity/fuel/CEPSA":{name:"CEPSA",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q608819"},addTags:{amenity:"fuel",brand:"CEPSA","brand:wikidata":"Q608819","brand:wikipedia":"en:Compañía Española de Petróleos",name:"CEPSA"},removeTags:{amenity:"fuel",brand:"CEPSA","brand:wikidata":"Q608819","brand:wikipedia":"en:Compañía Española de Petróleos",name:"CEPSA"},matchScore:2,suggestion:true},"amenity/fuel/Caltex":{name:"Caltex",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q277470"},addTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q277470","brand:wikipedia":"en:Caltex",name:"Caltex"},removeTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q277470","brand:wikipedia":"en:Caltex",name:"Caltex"},matchScore:2,suggestion:true},"amenity/fuel/Canadian Tire Gas+":{name:"Canadian Tire Gas+",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1032400"},addTags:{amenity:"fuel",brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire"},removeTags:{amenity:"fuel",brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire"},matchScore:2,suggestion:true},"amenity/fuel/Cenex":{name:"Cenex",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5011381"},addTags:{amenity:"fuel",brand:"Cenex","brand:wikidata":"Q5011381","brand:wikipedia":"en:CHS Inc.",name:"Cenex"},removeTags:{amenity:"fuel",brand:"Cenex","brand:wikidata":"Q5011381","brand:wikipedia":"en:CHS Inc.",name:"Cenex"},matchScore:2,suggestion:true},"amenity/fuel/Clark":{name:"Clark",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5127157"},addTags:{amenity:"fuel",brand:"Clark","brand:wikidata":"Q5127157","brand:wikipedia":"en:Clark Brands",name:"Clark"},removeTags:{amenity:"fuel",brand:"Clark","brand:wikidata":"Q5127157","brand:wikipedia":"en:Clark Brands",name:"Clark"},matchScore:2,suggestion:true},"amenity/fuel/Co-op":{name:"Co-op",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5440676"},addTags:{amenity:"fuel",brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op"},removeTags:{amenity:"fuel",brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op"},matchScore:2,suggestion:true},"amenity/fuel/Conoco":{name:"Conoco",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1126518"},addTags:{amenity:"fuel",brand:"Conoco","brand:wikidata":"Q1126518","brand:wikipedia":"en:Conoco",name:"Conoco"},removeTags:{amenity:"fuel",brand:"Conoco","brand:wikidata":"Q1126518","brand:wikipedia":"en:Conoco",name:"Conoco"},matchScore:2,suggestion:true},"amenity/fuel/Costco Gasoline":{name:"Costco Gasoline",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q715583"},addTags:{amenity:"fuel",brand:"Costco Gasoline","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Gasoline"},removeTags:{amenity:"fuel",brand:"Costco Gasoline","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Gasoline"},matchScore:2,suggestion:true},"amenity/fuel/Diamond Shamrock":{name:"Diamond Shamrock",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q16973722"},addTags:{amenity:"fuel",brand:"Diamond Shamrock","brand:wikidata":"Q16973722","brand:wikipedia":"en:Diamond Shamrock",name:"Diamond Shamrock"},removeTags:{amenity:"fuel",brand:"Diamond Shamrock","brand:wikidata":"Q16973722","brand:wikipedia":"en:Diamond Shamrock",name:"Diamond Shamrock"},matchScore:2,suggestion:true},"amenity/fuel/EKO (Canada)":{name:"EKO (Canada)",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3045934"},addTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q3045934","brand:wikipedia":"fr:EKO",name:"EKO"},removeTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q3045934","brand:wikipedia":"fr:EKO",name:"EKO"},matchScore:2,suggestion:true},"amenity/fuel/EKO (Greece)":{name:"EKO (Greece)",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q903198"},addTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q903198","brand:wikipedia":"el:Ελληνικά Πετρέλαια",name:"EKO"},removeTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q903198","brand:wikipedia":"el:Ελληνικά Πετρέλαια",name:"EKO"},matchScore:2,suggestion:true},"amenity/fuel/ENEOS":{name:"ENEOS",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1640290"},addTags:{amenity:"fuel",brand:"ENEOS","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"ENEOS"},removeTags:{amenity:"fuel",brand:"ENEOS","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"ENEOS"},matchScore:2,suggestion:true},"amenity/fuel/Elan":{name:"Elan",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q57980752"},addTags:{amenity:"fuel",brand:"Elan","brand:wikidata":"Q57980752",name:"Elan"},removeTags:{amenity:"fuel",brand:"Elan","brand:wikidata":"Q57980752",name:"Elan"},matchScore:2,suggestion:true},"amenity/fuel/Eni":{name:"Eni",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q565594"},addTags:{amenity:"fuel",brand:"Eni","brand:wikidata":"Q565594","brand:wikipedia":"en:Eni",name:"Eni"},removeTags:{amenity:"fuel",brand:"Eni","brand:wikidata":"Q565594","brand:wikipedia":"en:Eni",name:"Eni"},matchScore:2,suggestion:true},"amenity/fuel/Esso":{name:"Esso",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q867662"},addTags:{amenity:"fuel",brand:"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"Esso"},removeTags:{amenity:"fuel",brand:"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"Esso"},matchScore:2,suggestion:true},"amenity/fuel/Esso Express":{name:"Esso Express",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2350336"},addTags:{amenity:"fuel",brand:"Esso Express","brand:wikidata":"Q2350336","brand:wikipedia":"nl:Esso Express",name:"Esso Express"},removeTags:{amenity:"fuel",brand:"Esso Express","brand:wikidata":"Q2350336","brand:wikipedia":"nl:Esso Express",name:"Esso Express"},matchScore:2,suggestion:true},"amenity/fuel/Exxon":{name:"Exxon",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4781944"},addTags:{amenity:"fuel",brand:"Exxon","brand:wikidata":"Q4781944","brand:wikipedia":"en:Exxon",name:"Exxon"},removeTags:{amenity:"fuel",brand:"Exxon","brand:wikidata":"Q4781944","brand:wikipedia":"en:Exxon",name:"Exxon"},matchScore:2,suggestion:true},"amenity/fuel/Freie Tankstelle":{name:"Freie Tankstelle",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1009104"},addTags:{amenity:"fuel",brand:"Freie Tankstelle","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"Freie Tankstelle"},removeTags:{amenity:"fuel",brand:"Freie Tankstelle","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"Freie Tankstelle"},matchScore:2,suggestion:true},"amenity/fuel/Gazprom":{name:"Gazprom",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q102673"},addTags:{amenity:"fuel",brand:"Gazprom","brand:wikidata":"Q102673","brand:wikipedia":"en:Gazprom",name:"Gazprom"},removeTags:{amenity:"fuel",brand:"Gazprom","brand:wikidata":"Q102673","brand:wikipedia":"en:Gazprom",name:"Gazprom"},matchScore:2,suggestion:true},"amenity/fuel/GetGo":{name:"GetGo",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5553766"},addTags:{amenity:"fuel",brand:"GetGo","brand:wikidata":"Q5553766","brand:wikipedia":"en:GetGo",name:"GetGo"},removeTags:{amenity:"fuel",brand:"GetGo","brand:wikidata":"Q5553766","brand:wikipedia":"en:GetGo",name:"GetGo"},matchScore:2,suggestion:true},"amenity/fuel/Goil":{name:"Goil",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5555383"},addTags:{amenity:"fuel",brand:"Goil","brand:wikidata":"Q5555383","brand:wikipedia":"en:Ghana Oil Company",name:"Goil"},removeTags:{amenity:"fuel",brand:"Goil","brand:wikidata":"Q5555383","brand:wikipedia":"en:Ghana Oil Company",name:"Goil"},matchScore:2,suggestion:true},"amenity/fuel/HEM":{name:"HEM",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1563517"},addTags:{amenity:"fuel",brand:"HEM","brand:wikidata":"Q1563517","brand:wikipedia":"de:Deutsche Tamoil",name:"HEM"},removeTags:{amenity:"fuel",brand:"HEM","brand:wikidata":"Q1563517","brand:wikipedia":"de:Deutsche Tamoil",name:"HEM"},matchScore:2,suggestion:true},"amenity/fuel/Hindustan Petroleum":{name:"Hindustan Petroleum",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1619375"},addTags:{amenity:"fuel",brand:"Hindustan Petroleum","brand:wikidata":"Q1619375","brand:wikipedia":"en:Hindustan Petroleum",name:"Hindustan Petroleum"},removeTags:{amenity:"fuel",brand:"Hindustan Petroleum","brand:wikidata":"Q1619375","brand:wikipedia":"en:Hindustan Petroleum",name:"Hindustan Petroleum"},matchScore:2,suggestion:true},"amenity/fuel/Indian Oil":{name:"Indian Oil",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1289348"},addTags:{amenity:"fuel",brand:"Indian Oil","brand:wikidata":"Q1289348","brand:wikipedia":"en:Indian Oil Corporation",name:"Indian Oil"},removeTags:{amenity:"fuel",brand:"Indian Oil","brand:wikidata":"Q1289348","brand:wikipedia":"en:Indian Oil Corporation",name:"Indian Oil"},matchScore:2,suggestion:true},"amenity/fuel/Ingo":{name:"Ingo",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q17048617"},addTags:{amenity:"fuel",brand:"Ingo","brand:wikidata":"Q17048617","brand:wikipedia":"en:Ingo (brand)",name:"Ingo"},removeTags:{amenity:"fuel",brand:"Ingo","brand:wikidata":"Q17048617","brand:wikipedia":"en:Ingo (brand)",name:"Ingo"},matchScore:2,suggestion:true},"amenity/fuel/Intermarché":{name:"Intermarché",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3153200"},addTags:{amenity:"fuel",brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché"},removeTags:{amenity:"fuel",brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché"},matchScore:2,suggestion:true},"amenity/fuel/Ipiranga":{name:"Ipiranga",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2081136"},addTags:{amenity:"fuel",brand:"Ipiranga","brand:wikidata":"Q2081136","brand:wikipedia":"pt:Ipiranga (empresa)",name:"Ipiranga"},removeTags:{amenity:"fuel",brand:"Ipiranga","brand:wikidata":"Q2081136","brand:wikipedia":"pt:Ipiranga (empresa)",name:"Ipiranga"},matchScore:2,suggestion:true},"amenity/fuel/Jet":{name:"Jet",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q568940"},addTags:{amenity:"fuel",brand:"Jet","brand:wikidata":"Q568940","brand:wikipedia":"en:Jet (brand)",name:"Jet"},removeTags:{amenity:"fuel",brand:"Jet","brand:wikidata":"Q568940","brand:wikipedia":"en:Jet (brand)",name:"Jet"},matchScore:2,suggestion:true},"amenity/fuel/Kroger":{name:"Kroger",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q153417"},addTags:{amenity:"fuel",brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger"},removeTags:{amenity:"fuel",brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger"},matchScore:2,suggestion:true},"amenity/fuel/Kwik Trip":{name:"Kwik Trip",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q6450420"},addTags:{amenity:"fuel",brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip"},removeTags:{amenity:"fuel",brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip"},matchScore:2,suggestion:true},"amenity/fuel/Lukoil":{name:"Lukoil",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q329347"},addTags:{amenity:"fuel",brand:"Lukoil","brand:wikidata":"Q329347","brand:wikipedia":"en:Lukoil",name:"Lukoil"},removeTags:{amenity:"fuel",brand:"Lukoil","brand:wikidata":"Q329347","brand:wikipedia":"en:Lukoil",name:"Lukoil"},matchScore:2,suggestion:true},"amenity/fuel/Marathon":{name:"Marathon",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q458363"},addTags:{amenity:"fuel",brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon"},removeTags:{amenity:"fuel",brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon"},matchScore:2,suggestion:true},"amenity/fuel/Maxol":{name:"Maxol",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3302837"},addTags:{amenity:"fuel",brand:"Maxol","brand:wikidata":"Q3302837","brand:wikipedia":"en:Maxol",name:"Maxol"},removeTags:{amenity:"fuel",brand:"Maxol","brand:wikidata":"Q3302837","brand:wikipedia":"en:Maxol",name:"Maxol"},matchScore:2,suggestion:true},"amenity/fuel/Mobil":{name:"Mobil",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3088656"},addTags:{amenity:"fuel",brand:"Mobil","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil"},removeTags:{amenity:"fuel",brand:"Mobil","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil"},matchScore:2,suggestion:true},"amenity/fuel/Murphy USA":{name:"Murphy USA",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q19604459"},addTags:{amenity:"fuel",brand:"Murphy USA","brand:wikidata":"Q19604459","brand:wikipedia":"en:Murphy USA",name:"Murphy USA"},removeTags:{amenity:"fuel",brand:"Murphy USA","brand:wikidata":"Q19604459","brand:wikipedia":"en:Murphy USA",name:"Murphy USA"},matchScore:2,suggestion:true},"amenity/fuel/Neste":{name:"Neste",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q616376"},addTags:{amenity:"fuel",brand:"Neste","brand:wikidata":"Q616376","brand:wikipedia":"en:Neste",name:"Neste"},removeTags:{amenity:"fuel",brand:"Neste","brand:wikidata":"Q616376","brand:wikipedia":"en:Neste",name:"Neste"},matchScore:2,suggestion:true},"amenity/fuel/OIL!":{name:"OIL!",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2007561"},addTags:{amenity:"fuel",brand:"OIL!","brand:wikidata":"Q2007561","brand:wikipedia":"de:OIL! Tankstellen",name:"OIL!"},removeTags:{amenity:"fuel",brand:"OIL!","brand:wikidata":"Q2007561","brand:wikipedia":"de:OIL! Tankstellen",name:"OIL!"},matchScore:2,suggestion:true},"amenity/fuel/OK":{name:"OK",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q12329785"},addTags:{amenity:"fuel",brand:"OK","brand:wikidata":"Q12329785","brand:wikipedia":"da:OK a.m.b.a.",name:"OK"},removeTags:{amenity:"fuel",brand:"OK","brand:wikidata":"Q12329785","brand:wikipedia":"da:OK a.m.b.a.",name:"OK"},matchScore:2,suggestion:true},"amenity/fuel/OMV":{name:"OMV",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q168238"},addTags:{amenity:"fuel",brand:"OMV","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"OMV"},removeTags:{amenity:"fuel",brand:"OMV","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"OMV"},matchScore:2,suggestion:true},"amenity/fuel/Oilibya":{name:"Oilibya",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7081491"},addTags:{amenity:"fuel",brand:"Oilibya","brand:wikidata":"Q7081491","brand:wikipedia":"en:Oilibya",name:"Oilibya","name:ar":"أويليبيا"},removeTags:{amenity:"fuel",brand:"Oilibya","brand:wikidata":"Q7081491","brand:wikipedia":"en:Oilibya",name:"Oilibya","name:ar":"أويليبيا"},matchScore:2,suggestion:true},"amenity/fuel/Opet":{name:"Opet",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7072824"},addTags:{amenity:"fuel",brand:"Opet","brand:wikidata":"Q7072824","brand:wikipedia":"en:Opet",name:"Opet"},removeTags:{amenity:"fuel",brand:"Opet","brand:wikidata":"Q7072824","brand:wikipedia":"en:Opet",name:"Opet"},matchScore:2,suggestion:true},"amenity/fuel/Oxxo":{name:"Oxxo",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1342538"},addTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",amenity:"fuel"},removeTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",amenity:"fuel"},matchScore:2,suggestion:true},"amenity/fuel/Pacific Pride":{name:"Pacific Pride",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7122637"},addTags:{amenity:"fuel",brand:"Pacific Pride","brand:wikidata":"Q7122637","brand:wikipedia":"en:Pacific Pride",name:"Pacific Pride"},removeTags:{amenity:"fuel",brand:"Pacific Pride","brand:wikidata":"Q7122637","brand:wikipedia":"en:Pacific Pride",name:"Pacific Pride"},matchScore:2,suggestion:true},"amenity/fuel/Pemex":{name:"Pemex",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q871308"},addTags:{amenity:"fuel",brand:"Pemex","brand:wikidata":"Q871308","brand:wikipedia":"en:Pemex",name:"Pemex"},removeTags:{amenity:"fuel",brand:"Pemex","brand:wikidata":"Q871308","brand:wikipedia":"en:Pemex",name:"Pemex"},matchScore:2,suggestion:true},"amenity/fuel/Pertamina":{name:"Pertamina",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1641044"},addTags:{amenity:"fuel",brand:"Pertamina","brand:wikidata":"Q1641044","brand:wikipedia":"en:Pertamina",name:"Pertamina"},removeTags:{amenity:"fuel",brand:"Pertamina","brand:wikidata":"Q1641044","brand:wikipedia":"en:Pertamina",name:"Pertamina"},matchScore:2,suggestion:true},"amenity/fuel/PetroPerú":{name:"PetroPerú",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2506390"},addTags:{amenity:"fuel",brand:"PetroPerú","brand:wikidata":"Q2506390","brand:wikipedia":"es:Petroperú",name:"PetroPerú"},removeTags:{amenity:"fuel",brand:"PetroPerú","brand:wikidata":"Q2506390","brand:wikipedia":"es:Petroperú",name:"PetroPerú"},matchScore:2,suggestion:true},"amenity/fuel/Petrochina":{name:"Petrochina",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q503182"},addTags:{amenity:"fuel",brand:"Petrochina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"Petrochina"},removeTags:{amenity:"fuel",brand:"Petrochina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"Petrochina"},matchScore:2,suggestion:true},"amenity/fuel/Petroecuador":{name:"Petroecuador",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1812822"},addTags:{amenity:"fuel",brand:"Petroecuador","brand:wikidata":"Q1812822","brand:wikipedia":"en:Petroecuador",name:"Petroecuador"},removeTags:{amenity:"fuel",brand:"Petroecuador","brand:wikidata":"Q1812822","brand:wikipedia":"en:Petroecuador",name:"Petroecuador"},matchScore:2,suggestion:true},"amenity/fuel/Petrol Ofisi":{name:"Petrol Ofisi",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1278087"},addTags:{amenity:"fuel",brand:"Petrol Ofisi","brand:wikidata":"Q1278087","brand:wikipedia":"en:Petrol Ofisi",name:"Petrol Ofisi"},removeTags:{amenity:"fuel",brand:"Petrol Ofisi","brand:wikidata":"Q1278087","brand:wikipedia":"en:Petrol Ofisi",name:"Petrol Ofisi"},matchScore:2,suggestion:true},"amenity/fuel/Petrolimex":{name:"Petrolimex",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q10831598"},addTags:{amenity:"fuel",brand:"Petrolimex","brand:wikidata":"Q10831598","brand:wikipedia":"en:Petrolimex",name:"Petrolimex"},removeTags:{amenity:"fuel",brand:"Petrolimex","brand:wikidata":"Q10831598","brand:wikipedia":"en:Petrolimex",name:"Petrolimex"},matchScore:2,suggestion:true},"amenity/fuel/Petrolina":{name:"Petrolina",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q17013948"},addTags:{amenity:"fuel",brand:"Petrolina","brand:wikidata":"Q17013948","brand:wikipedia":"en:Petrolina (company)",name:"Petrolina"},removeTags:{amenity:"fuel",brand:"Petrolina","brand:wikidata":"Q17013948","brand:wikipedia":"en:Petrolina (company)",name:"Petrolina"},matchScore:2,suggestion:true},"amenity/fuel/Petrom":{name:"Petrom",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1755034"},addTags:{amenity:"fuel",brand:"Petrom","brand:wikidata":"Q1755034","brand:wikipedia":"en:Petrom",name:"Petrom"},removeTags:{amenity:"fuel",brand:"Petrom","brand:wikidata":"Q1755034","brand:wikipedia":"en:Petrom",name:"Petrom"},matchScore:2,suggestion:true},"amenity/fuel/Petronas":{name:"Petronas",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q221692"},addTags:{amenity:"fuel",brand:"Petronas","brand:wikidata":"Q221692","brand:wikipedia":"en:Petronas",name:"Petronas"},removeTags:{amenity:"fuel",brand:"Petronas","brand:wikidata":"Q221692","brand:wikipedia":"en:Petronas",name:"Petronas"},matchScore:2,suggestion:true},"amenity/fuel/Petronor":{name:"Petronor",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1726547"},addTags:{amenity:"fuel",brand:"Petronor","brand:wikidata":"Q1726547","brand:wikipedia":"es:Petronor",name:"Petronor"},removeTags:{amenity:"fuel",brand:"Petronor","brand:wikidata":"Q1726547","brand:wikipedia":"es:Petronor",name:"Petronor"},matchScore:2,suggestion:true},"amenity/fuel/Phillips 66":{name:"Phillips 66",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1656230"},addTags:{amenity:"fuel",brand:"Phillips 66","brand:wikidata":"Q1656230","brand:wikipedia":"en:Phillips 66",name:"Phillips 66"},removeTags:{amenity:"fuel",brand:"Phillips 66","brand:wikidata":"Q1656230","brand:wikipedia":"en:Phillips 66",name:"Phillips 66"},matchScore:2,suggestion:true},"amenity/fuel/Preem":{name:"Preem",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q598835"},addTags:{amenity:"fuel",brand:"Preem","brand:wikidata":"Q598835","brand:wikipedia":"en:Preem",name:"Preem"},removeTags:{amenity:"fuel",brand:"Preem","brand:wikidata":"Q598835","brand:wikipedia":"en:Preem",name:"Preem"},matchScore:2,suggestion:true},"amenity/fuel/QT":{name:"QT",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7271953"},addTags:{amenity:"fuel",brand:"QT","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QT"},removeTags:{amenity:"fuel",brand:"QT","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QT"},matchScore:2,suggestion:true},"amenity/fuel/Repsol":{name:"Repsol",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q174747"},addTags:{amenity:"fuel",brand:"Repsol","brand:wikidata":"Q174747","brand:wikipedia":"es:Repsol",name:"Repsol"},removeTags:{amenity:"fuel",brand:"Repsol","brand:wikidata":"Q174747","brand:wikipedia":"es:Repsol",name:"Repsol"},matchScore:2,suggestion:true},"amenity/fuel/Rompetrol":{name:"Rompetrol",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1788862"},addTags:{amenity:"fuel",brand:"Rompetrol","brand:wikidata":"Q1788862","brand:wikipedia":"en:Rompetrol",name:"Rompetrol"},removeTags:{amenity:"fuel",brand:"Rompetrol","brand:wikidata":"Q1788862","brand:wikipedia":"en:Rompetrol",name:"Rompetrol"},matchScore:2,suggestion:true},"amenity/fuel/Rubis":{name:"Rubis",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3446514"},addTags:{amenity:"fuel",brand:"Rubis","brand:wikidata":"Q3446514","brand:wikipedia":"en:Rubis (company)",name:"Rubis"},removeTags:{amenity:"fuel",brand:"Rubis","brand:wikidata":"Q3446514","brand:wikipedia":"en:Rubis (company)",name:"Rubis"},matchScore:2,suggestion:true},"amenity/fuel/Safeway":{name:"Safeway",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1508234"},addTags:{amenity:"fuel",brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway"},removeTags:{amenity:"fuel",brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway"},matchScore:2,suggestion:true},"amenity/fuel/Sam's Club":{name:"Sam's Club",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1972120"},addTags:{amenity:"fuel",brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},removeTags:{amenity:"fuel",brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},matchScore:2,suggestion:true},"amenity/fuel/Sasol":{name:"Sasol",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q905998"},addTags:{amenity:"fuel",brand:"Sasol","brand:wikidata":"Q905998","brand:wikipedia":"en:Sasol",name:"Sasol"},removeTags:{amenity:"fuel",brand:"Sasol","brand:wikidata":"Q905998","brand:wikipedia":"en:Sasol",name:"Sasol"},matchScore:2,suggestion:true},"amenity/fuel/Sea Oil":{name:"Sea Oil",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7389549"},addTags:{amenity:"fuel",brand:"Sea Oil","brand:wikidata":"Q7389549","brand:wikipedia":"en:Seaoil Philippines",name:"Sea Oil"},removeTags:{amenity:"fuel",brand:"Sea Oil","brand:wikidata":"Q7389549","brand:wikipedia":"en:Seaoil Philippines",name:"Sea Oil"},matchScore:2,suggestion:true},"amenity/fuel/Sheetz":{name:"Sheetz",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7492551"},addTags:{amenity:"fuel",brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz"},removeTags:{amenity:"fuel",brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz"},matchScore:2,suggestion:true},"amenity/fuel/Shell":{name:"Shell",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q154950"},addTags:{amenity:"fuel",brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell"},removeTags:{amenity:"fuel",brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell"},matchScore:2,suggestion:true},"amenity/fuel/Shell Express":{name:"Shell Express",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2289188"},addTags:{amenity:"fuel",brand:"Shell Express","brand:wikidata":"Q2289188","brand:wikipedia":"nl:Shell Express",name:"Shell Express"},removeTags:{amenity:"fuel",brand:"Shell Express","brand:wikidata":"Q2289188","brand:wikipedia":"nl:Shell Express",name:"Shell Express"},matchScore:2,suggestion:true},"amenity/fuel/Slovnaft":{name:"Slovnaft",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1587563"},addTags:{amenity:"fuel",brand:"Slovnaft","brand:wikidata":"Q1587563","brand:wikipedia":"en:Slovnaft",name:"Slovnaft"},removeTags:{amenity:"fuel",brand:"Slovnaft","brand:wikidata":"Q1587563","brand:wikipedia":"en:Slovnaft",name:"Slovnaft"},matchScore:2,suggestion:true},"amenity/fuel/Socar":{name:"Socar",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1622293"},addTags:{amenity:"fuel",brand:"Socar","brand:wikidata":"Q1622293","brand:wikipedia":"en:SOCAR",name:"Socar"},removeTags:{amenity:"fuel",brand:"Socar","brand:wikidata":"Q1622293","brand:wikipedia":"en:SOCAR",name:"Socar"},matchScore:2,suggestion:true},"amenity/fuel/Sokimex":{name:"Sokimex",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1149575"},addTags:{amenity:"fuel",brand:"Sokimex","brand:wikidata":"Q1149575","brand:wikipedia":"en:Sokimex",name:"Sokimex"},removeTags:{amenity:"fuel",brand:"Sokimex","brand:wikidata":"Q1149575","brand:wikipedia":"en:Sokimex",name:"Sokimex"},matchScore:2,suggestion:true},"amenity/fuel/Speedway":{name:"Speedway",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7575683"},addTags:{amenity:"fuel",brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway"},removeTags:{amenity:"fuel",brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway"},matchScore:2,suggestion:true},"amenity/fuel/Sprint":{name:"Sprint",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q57588452"},addTags:{amenity:"fuel",brand:"Sprint","brand:wikidata":"Q57588452",name:"Sprint"},removeTags:{amenity:"fuel",brand:"Sprint","brand:wikidata":"Q57588452",name:"Sprint"},matchScore:2,suggestion:true},"amenity/fuel/St1":{name:"St1",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7592214"},addTags:{amenity:"fuel",brand:"St1","brand:wikidata":"Q7592214","brand:wikipedia":"en:St1",name:"St1"},removeTags:{amenity:"fuel",brand:"St1","brand:wikidata":"Q7592214","brand:wikipedia":"en:St1",name:"St1"},matchScore:2,suggestion:true},"amenity/fuel/Star":{name:"Star",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2031095"},addTags:{amenity:"fuel",brand:"Star","brand:wikidata":"Q2031095","brand:wikipedia":"de:Orlen Deutschland",name:"Star"},removeTags:{amenity:"fuel",brand:"Star","brand:wikidata":"Q2031095","brand:wikipedia":"de:Orlen Deutschland",name:"Star"},matchScore:2,suggestion:true},"amenity/fuel/Statoil":{name:"Statoil",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1776022"},addTags:{amenity:"fuel",brand:"Statoil","brand:wikidata":"Q1776022","brand:wikipedia":"en:Equinor",name:"Statoil"},removeTags:{amenity:"fuel",brand:"Statoil","brand:wikidata":"Q1776022","brand:wikipedia":"en:Equinor",name:"Statoil"},matchScore:2,suggestion:true},"amenity/fuel/Super U":{name:"Super U",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2529029"},addTags:{amenity:"fuel",brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U"},removeTags:{amenity:"fuel",brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U"},matchScore:2,suggestion:true},"amenity/fuel/Tamoil":{name:"Tamoil",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q706793"},addTags:{amenity:"fuel",brand:"Tamoil","brand:wikidata":"Q706793","brand:wikipedia":"en:Tamoil",name:"Tamoil"},removeTags:{amenity:"fuel",brand:"Tamoil","brand:wikidata":"Q706793","brand:wikipedia":"en:Tamoil",name:"Tamoil"},matchScore:2,suggestion:true},"amenity/fuel/Tanka":{name:"Tanka",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q10690640"},addTags:{amenity:"fuel",brand:"Tanka","brand:wikidata":"Q10690640","brand:wikipedia":"sv:Tanka (bensinstationskedja)",name:"Tanka"},removeTags:{amenity:"fuel",brand:"Tanka","brand:wikidata":"Q10690640","brand:wikipedia":"sv:Tanka (bensinstationskedja)",name:"Tanka"},matchScore:2,suggestion:true},"amenity/fuel/Teboil":{name:"Teboil",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7692079"},addTags:{amenity:"fuel",brand:"Teboil","brand:wikidata":"Q7692079","brand:wikipedia":"en:Teboil",name:"Teboil"},removeTags:{amenity:"fuel",brand:"Teboil","brand:wikidata":"Q7692079","brand:wikipedia":"en:Teboil",name:"Teboil"},matchScore:2,suggestion:true},"amenity/fuel/Terpel":{name:"Terpel",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7703003"},addTags:{amenity:"fuel",brand:"Terpel","brand:wikidata":"Q7703003","brand:wikipedia":"en:Terpel",name:"Terpel"},removeTags:{amenity:"fuel",brand:"Terpel","brand:wikidata":"Q7703003","brand:wikipedia":"en:Terpel",name:"Terpel"},matchScore:2,suggestion:true},"amenity/fuel/Uno-X":{name:"Uno-X",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3362746"},addTags:{amenity:"fuel",brand:"Uno-X","brand:wikidata":"Q3362746","brand:wikipedia":"en:Uno-X",name:"Uno-X"},removeTags:{amenity:"fuel",brand:"Uno-X","brand:wikidata":"Q3362746","brand:wikipedia":"en:Uno-X",name:"Uno-X"},matchScore:2,suggestion:true},"amenity/fuel/WOG":{name:"WOG",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q12072939"},addTags:{amenity:"fuel",brand:"WOG","brand:wikidata":"Q12072939","brand:wikipedia":"en:WOG (gas stations)",name:"WOG"},removeTags:{amenity:"fuel",brand:"WOG","brand:wikidata":"Q12072939","brand:wikipedia":"en:WOG (gas stations)",name:"WOG"},matchScore:2,suggestion:true},"amenity/fuel/Wawa":{name:"Wawa",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5936320"},addTags:{amenity:"fuel",brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa"},removeTags:{amenity:"fuel",brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa"},matchScore:2,suggestion:true},"amenity/fuel/Westfalen":{name:"Westfalen",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1411209"},addTags:{amenity:"fuel",brand:"Westfalen","brand:wikidata":"Q1411209","brand:wikipedia":"en:Westfalen AG",name:"Westfalen"},removeTags:{amenity:"fuel",brand:"Westfalen","brand:wikidata":"Q1411209","brand:wikipedia":"en:Westfalen AG",name:"Westfalen"},matchScore:2,suggestion:true},"amenity/fuel/Woolworths Petrol":{name:"Woolworths Petrol",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5023980"},addTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol"},removeTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol"},matchScore:2,suggestion:true},"amenity/fuel/YPF":{name:"YPF",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2006989"},addTags:{amenity:"fuel",brand:"YPF","brand:wikidata":"Q2006989","brand:wikipedia":"en:YPF",name:"YPF"},removeTags:{amenity:"fuel",brand:"YPF","brand:wikidata":"Q2006989","brand:wikipedia":"en:YPF",name:"YPF"},matchScore:2,suggestion:true},"amenity/fuel/bft":{name:"bft",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1009104"},addTags:{amenity:"fuel",brand:"bft","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"bft"},removeTags:{amenity:"fuel",brand:"bft","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"bft"},matchScore:2,suggestion:true},"amenity/fuel/Башнефть":{name:"Башнефть",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q809985"},addTags:{amenity:"fuel",brand:"Башнефть","brand:en":"Bashneft","brand:wikidata":"Q809985","brand:wikipedia":"en:Bashneft",name:"Башнефть","name:en":"Bashneft"},removeTags:{amenity:"fuel",brand:"Башнефть","brand:en":"Bashneft","brand:wikidata":"Q809985","brand:wikipedia":"en:Bashneft",name:"Башнефть","name:en":"Bashneft"},matchScore:2,suggestion:true},"amenity/fuel/ОККО":{name:"ОККО",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7072617"},addTags:{amenity:"fuel",brand:"ОККО","brand:en":"OKKO","brand:wikidata":"Q7072617","brand:wikipedia":"en:OKKO",name:"ОККО","name:en":"OKKO"},removeTags:{amenity:"fuel",brand:"ОККО","brand:en":"OKKO","brand:wikidata":"Q7072617","brand:wikipedia":"en:OKKO",name:"ОККО","name:en":"OKKO"},matchScore:2,suggestion:true},"amenity/fuel/ПТК":{name:"ПТК",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4360193"},addTags:{amenity:"fuel",brand:"ПТК","brand:en":"The Petersburg Fuel Company","brand:wikidata":"Q4360193","brand:wikipedia":"en:Petersburg Fuel Company",name:"ПТК","name:en":"The Petersburg Fuel Company"},removeTags:{amenity:"fuel",brand:"ПТК","brand:en":"The Petersburg Fuel Company","brand:wikidata":"Q4360193","brand:wikipedia":"en:Petersburg Fuel Company",name:"ПТК","name:en":"The Petersburg Fuel Company"},matchScore:2,suggestion:true},"amenity/fuel/Роснефть":{name:"Роснефть",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1141123"},addTags:{amenity:"fuel",brand:"Роснефть","brand:en":"Rosneft","brand:wikidata":"Q1141123","brand:wikipedia":"en:Rosneft",name:"Роснефть","name:en":"Rosneft"},removeTags:{amenity:"fuel",brand:"Роснефть","brand:en":"Rosneft","brand:wikidata":"Q1141123","brand:wikipedia":"en:Rosneft",name:"Роснефть","name:en":"Rosneft"},matchScore:2,suggestion:true},"amenity/fuel/Сургутнефтегаз":{name:"Сургутнефтегаз",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q680776"},addTags:{amenity:"fuel",brand:"Сургутнефтегаз","brand:en":"Surgutneftegas","brand:wikidata":"Q680776","brand:wikipedia":"en:Surgutneftegas",name:"Сургутнефтегаз","name:en":"Surgutneftegas"},removeTags:{amenity:"fuel",brand:"Сургутнефтегаз","brand:en":"Surgutneftegas","brand:wikidata":"Q680776","brand:wikipedia":"en:Surgutneftegas",name:"Сургутнефтегаз","name:en":"Surgutneftegas"},matchScore:2,suggestion:true},"amenity/fuel/ТНК":{name:"ТНК",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2298901"},addTags:{amenity:"fuel",brand:"ТНК","brand:wikidata":"Q2298901","brand:wikipedia":"en:TNK-BP",name:"ТНК"},removeTags:{amenity:"fuel",brand:"ТНК","brand:wikidata":"Q2298901","brand:wikipedia":"en:TNK-BP",name:"ТНК"},matchScore:2,suggestion:true},"amenity/fuel/Татнефть":{name:"Татнефть",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1616858"},addTags:{amenity:"fuel",brand:"Татнефть","brand:en":"Tatneft","brand:wikidata":"Q1616858","brand:wikipedia":"en:Tatneft",name:"Татнефть","name:en":"Tatneft"},removeTags:{amenity:"fuel",brand:"Татнефть","brand:en":"Tatneft","brand:wikidata":"Q1616858","brand:wikipedia":"en:Tatneft",name:"Татнефть","name:en":"Tatneft"},matchScore:2,suggestion:true},"amenity/fuel/Укрнафта":{name:"Укрнафта",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2447961"},addTags:{amenity:"fuel",brand:"Укрнафта","brand:en":"Ukrnafta","brand:wikidata":"Q2447961","brand:wikipedia":"en:Ukrnafta",name:"Укрнафта","name:en":"Ukrnafta"},removeTags:{amenity:"fuel",brand:"Укрнафта","brand:en":"Ukrnafta","brand:wikidata":"Q2447961","brand:wikipedia":"en:Ukrnafta",name:"Укрнафта","name:en":"Ukrnafta"},matchScore:2,suggestion:true},"amenity/fuel/סונול":{name:"סונול",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3701622"},addTags:{amenity:"fuel",brand:"סונול","brand:en":"Sonol","brand:wikidata":"Q3701622","brand:wikipedia":"en:Sonol",name:"סונול","name:en":"Sonol"},removeTags:{amenity:"fuel",brand:"סונול","brand:en":"Sonol","brand:wikidata":"Q3701622","brand:wikipedia":"en:Sonol",name:"סונול","name:en":"Sonol"},matchScore:2,suggestion:true},"amenity/fuel/เอสโซ่":{name:"เอสโซ่",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q867662"},addTags:{amenity:"fuel",brand:"เอสโซ่","brand:en":"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"เอสโซ่","name:en":"Esso"},removeTags:{amenity:"fuel",brand:"เอสโซ่","brand:en":"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"เอสโซ่","name:en":"Esso"},matchScore:2,suggestion:true},"amenity/fuel/エッソ":{name:"エッソ",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q867662"},addTags:{amenity:"fuel",brand:"エッソ","brand:en":"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"エッソ","name:en":"Esso"},removeTags:{amenity:"fuel",brand:"エッソ","brand:en":"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"エッソ","name:en":"Esso"},matchScore:2,suggestion:true},"amenity/fuel/エネオス":{name:"エネオス",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1640290"},addTags:{amenity:"fuel",brand:"エネオス","brand:en":"JXTG Nippon Oil & Energy","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"エネオス","name:en":"JXTG Nippon Oil & Energy"},removeTags:{amenity:"fuel",brand:"エネオス","brand:en":"JXTG Nippon Oil & Energy","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"エネオス","name:en":"JXTG Nippon Oil & Energy"},matchScore:2,suggestion:true},"amenity/fuel/コスモ石油":{name:"コスモ石油",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2498318"},addTags:{amenity:"fuel",brand:"コスモ石油","brand:en":"Cosmo Oil Company","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"コスモ石油","name:en":"Cosmo Oil Company"},removeTags:{amenity:"fuel",brand:"コスモ石油","brand:en":"Cosmo Oil Company","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"コスモ石油","name:en":"Cosmo Oil Company"},matchScore:2,suggestion:true},"amenity/fuel/中国石化":{name:"中国石化",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q831445"},addTags:{amenity:"fuel",brand:"中国石化","brand:en":"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"中国石化","name:en":"Sinopec"},removeTags:{amenity:"fuel",brand:"中国石化","brand:en":"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"中国石化","name:en":"Sinopec"},matchScore:2,suggestion:true},"amenity/fuel/中国石油":{name:"中国石油",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q503182"},addTags:{amenity:"fuel",brand:"中国石油","brand:en":"PetroChina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"中国石油","name:en":"PetroChina"},removeTags:{amenity:"fuel",brand:"中国石油","brand:en":"PetroChina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"中国石油","name:en":"PetroChina"},matchScore:2,suggestion:true},"amenity/fuel/出光":{name:"出光",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2216770"},addTags:{amenity:"fuel",brand:"出光","brand:en":"Idemitsu Kosan","brand:wikidata":"Q2216770","brand:wikipedia":"en:Idemitsu Kosan",name:"出光","name:en":"Idemitsu Kosan"},removeTags:{amenity:"fuel",brand:"出光","brand:en":"Idemitsu Kosan","brand:wikidata":"Q2216770","brand:wikipedia":"en:Idemitsu Kosan",name:"出光","name:en":"Idemitsu Kosan"},matchScore:2,suggestion:true},"amenity/fuel/台灣中油":{name:"台灣中油",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q21527177"},addTags:{amenity:"fuel",brand:"台灣中油","brand:en":"CPC Corporation, Taiwan","brand:wikidata":"Q21527177","brand:wikipedia":"en:CPC Corporation",name:"台灣中油","name:en":"CPC Corporation, Taiwan"},removeTags:{amenity:"fuel",brand:"台灣中油","brand:en":"CPC Corporation, Taiwan","brand:wikidata":"Q21527177","brand:wikipedia":"en:CPC Corporation",name:"台灣中油","name:en":"CPC Corporation, Taiwan"},matchScore:2,suggestion:true},"amenity/fuel/昭和シェル":{name:"昭和シェル",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q277115"},addTags:{amenity:"fuel",brand:"昭和シェル","brand:en":"Showa Shell Sekiyu","brand:wikidata":"Q277115","brand:wikipedia":"en:Showa Shell Sekiyu",name:"昭和シェル","name:en":"Showa Shell Sekiyu"},removeTags:{amenity:"fuel",brand:"昭和シェル","brand:en":"Showa Shell Sekiyu","brand:wikidata":"Q277115","brand:wikipedia":"en:Showa Shell Sekiyu",name:"昭和シェル","name:en":"Showa Shell Sekiyu"},matchScore:2,suggestion:true},"amenity/ice_cream/Baskin-Robbins":{name:"Baskin-Robbins",icon:"maki-ice-cream",fields:["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q584601"},addTags:{amenity:"ice_cream",brand:"Baskin-Robbins","brand:wikidata":"Q584601","brand:wikipedia":"en:Baskin-Robbins",cuisine:"ice_cream",name:"Baskin-Robbins"},removeTags:{amenity:"ice_cream",brand:"Baskin-Robbins","brand:wikidata":"Q584601","brand:wikipedia":"en:Baskin-Robbins",cuisine:"ice_cream",name:"Baskin-Robbins"},matchScore:2,suggestion:true},"amenity/ice_cream/Ben & Jerry's":{name:"Ben & Jerry's",icon:"maki-ice-cream",fields:["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q816412"},addTags:{amenity:"ice_cream",brand:"Ben & Jerry's","brand:wikidata":"Q816412","brand:wikipedia":"en:Ben & Jerry's",cuisine:"ice_cream",name:"Ben & Jerry's"},removeTags:{amenity:"ice_cream",brand:"Ben & Jerry's","brand:wikidata":"Q816412","brand:wikipedia":"en:Ben & Jerry's",cuisine:"ice_cream",name:"Ben & Jerry's"},matchScore:2,suggestion:true},"amenity/ice_cream/Cold Stone Creamery":{name:"Cold Stone Creamery",icon:"maki-ice-cream",fields:["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q1094923"},addTags:{amenity:"ice_cream",brand:"Cold Stone Creamery","brand:wikidata":"Q1094923","brand:wikipedia":"en:Cold Stone Creamery",cuisine:"ice_cream",name:"Cold Stone Creamery"},removeTags:{amenity:"ice_cream",brand:"Cold Stone Creamery","brand:wikidata":"Q1094923","brand:wikipedia":"en:Cold Stone Creamery",cuisine:"ice_cream",name:"Cold Stone Creamery"},matchScore:2,suggestion:true},"amenity/ice_cream/Freddo":{name:"Freddo",icon:"maki-ice-cream",fields:["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q28823999"},addTags:{amenity:"ice_cream",brand:"Freddo","brand:wikidata":"Q28823999","brand:wikipedia":"es:Freddo",cuisine:"ice_cream",name:"Freddo"},removeTags:{amenity:"ice_cream",brand:"Freddo","brand:wikidata":"Q28823999","brand:wikipedia":"es:Freddo",cuisine:"ice_cream",name:"Freddo"},matchScore:2,suggestion:true},"amenity/ice_cream/Grido":{name:"Grido",icon:"maki-ice-cream",fields:["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q5885724"},addTags:{amenity:"ice_cream",brand:"Grido","brand:wikidata":"Q5885724","brand:wikipedia":"es:Grido Helado",cuisine:"ice_cream",name:"Grido"},removeTags:{amenity:"ice_cream",brand:"Grido","brand:wikidata":"Q5885724","brand:wikipedia":"es:Grido Helado",cuisine:"ice_cream",name:"Grido"},matchScore:2,suggestion:true},"amenity/ice_cream/sweetFrog":{name:"sweetFrog",icon:"maki-ice-cream",fields:["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q16952110"},addTags:{amenity:"ice_cream",brand:"sweetFrog","brand:wikidata":"Q16952110","brand:wikipedia":"en:Sweet Frog",cuisine:"frozen_yogurt",name:"sweetFrog"},removeTags:{amenity:"ice_cream",brand:"sweetFrog","brand:wikidata":"Q16952110","brand:wikipedia":"en:Sweet Frog",cuisine:"frozen_yogurt",name:"sweetFrog"},matchScore:2,suggestion:true},"amenity/money_transfer/Express Union":{name:"Express Union",icon:"maki-bank",fields:["name","brand","address","building_area","opening_hours","currency_multi"],geometry:["point","area"],tags:{amenity:"money_transfer","brand:wikidata":"Q3062276"},addTags:{amenity:"money_transfer",brand:"Express Union","brand:wikidata":"Q3062276","brand:wikipedia":"fr:Express Union",name:"Express Union"},removeTags:{amenity:"money_transfer",brand:"Express Union","brand:wikidata":"Q3062276","brand:wikipedia":"fr:Express Union",name:"Express Union"},matchScore:2,suggestion:true},"amenity/money_transfer/Western Union":{name:"Western Union",icon:"maki-bank",fields:["name","brand","address","building_area","opening_hours","currency_multi"],geometry:["point","area"],tags:{amenity:"money_transfer","brand:wikidata":"Q861042"},addTags:{amenity:"money_transfer",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},removeTags:{amenity:"money_transfer",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},matchScore:2,suggestion:true},"amenity/payment_centre/Rapipago":{name:"Rapipago",icon:"maki-bank",fields:["name","brand","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"payment_centre","brand:wikidata":"Q6100413"},addTags:{amenity:"payment_centre",brand:"Rapipago","brand:wikidata":"Q6100413","brand:wikipedia":"es:Rapipago",name:"Rapipago"},removeTags:{amenity:"payment_centre",brand:"Rapipago","brand:wikidata":"Q6100413","brand:wikipedia":"es:Rapipago",name:"Rapipago"},matchScore:2,suggestion:true},"amenity/payment_terminal/Qiwi":{name:"Qiwi",icon:"maki-bank",fields:["name","brand","address","opening_hours","payment_multi"],geometry:["point"],tags:{amenity:"payment_terminal","brand:wikidata":"Q4047736"},addTags:{amenity:"payment_terminal",brand:"Qiwi","brand:wikidata":"Q4047736","brand:wikipedia":"en:Qiwi",name:"Qiwi"},removeTags:{amenity:"payment_terminal",brand:"Qiwi","brand:wikidata":"Q4047736","brand:wikipedia":"en:Qiwi",name:"Qiwi"},matchScore:2,suggestion:true},"amenity/pharmacy/Apotek Hjärtat":{name:"Apotek Hjärtat",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q10416114"},addTags:{amenity:"pharmacy",brand:"Apotek Hjärtat","brand:wikidata":"Q10416114","brand:wikipedia":"sv:Apotek Hjärtat",healthcare:"pharmacy",name:"Apotek Hjärtat"},removeTags:{amenity:"pharmacy",brand:"Apotek Hjärtat","brand:wikidata":"Q10416114","brand:wikipedia":"sv:Apotek Hjärtat",healthcare:"pharmacy",name:"Apotek Hjärtat"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Bartell Drugs":{name:"Bartell Drugs",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q4865152"},addTags:{amenity:"pharmacy",brand:"Bartell Drugs","brand:wikidata":"Q4865152","brand:wikipedia":"en:Bartell Drugs",healthcare:"pharmacy",name:"Bartell Drugs"},removeTags:{amenity:"pharmacy",brand:"Bartell Drugs","brand:wikidata":"Q4865152","brand:wikipedia":"en:Bartell Drugs",healthcare:"pharmacy",name:"Bartell Drugs"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Chemist Warehouse":{name:"Chemist Warehouse",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q48782120"},addTags:{amenity:"pharmacy",brand:"Chemist Warehouse","brand:wikidata":"Q48782120","brand:wikipedia":"en:Chemist Warehouse",healthcare:"pharmacy",name:"Chemist Warehouse"},removeTags:{amenity:"pharmacy",brand:"Chemist Warehouse","brand:wikidata":"Q48782120","brand:wikipedia":"en:Chemist Warehouse",healthcare:"pharmacy",name:"Chemist Warehouse"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Costco Pharmacy":{name:"Costco Pharmacy",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q715583"},addTags:{amenity:"pharmacy",healthcare:"pharmacy",brand:"Costco Pharmacy","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Pharmacy"},removeTags:{amenity:"pharmacy",healthcare:"pharmacy",brand:"Costco Pharmacy","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Drogaria São Paulo":{name:"Drogaria São Paulo",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5308184"},addTags:{amenity:"pharmacy",brand:"Drogaria São Paulo","brand:wikidata":"Q5308184","brand:wikipedia":"en:Grupo DPSP",healthcare:"pharmacy",name:"Drogaria São Paulo"},removeTags:{amenity:"pharmacy",brand:"Drogaria São Paulo","brand:wikidata":"Q5308184","brand:wikipedia":"en:Grupo DPSP",healthcare:"pharmacy",name:"Drogaria São Paulo"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Duane Reade":{name:"Duane Reade",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5310380"},addTags:{amenity:"pharmacy",brand:"Duane Reade","brand:wikidata":"Q5310380","brand:wikipedia":"en:Duane Reade",healthcare:"pharmacy",name:"Duane Reade"},removeTags:{amenity:"pharmacy",brand:"Duane Reade","brand:wikidata":"Q5310380","brand:wikipedia":"en:Duane Reade",healthcare:"pharmacy",name:"Duane Reade"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Eurovaistinė":{name:"Eurovaistinė",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q267205"},addTags:{amenity:"pharmacy",brand:"Eurovaistinė","brand:wikidata":"Q267205","brand:wikipedia":"en:Euroapotheca",healthcare:"pharmacy",name:"Eurovaistinė"},removeTags:{amenity:"pharmacy",brand:"Eurovaistinė","brand:wikidata":"Q267205","brand:wikipedia":"en:Euroapotheca",healthcare:"pharmacy",name:"Eurovaistinė"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Familiprix":{name:"Familiprix",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q3064881"},addTags:{amenity:"pharmacy",brand:"Familiprix","brand:wikidata":"Q3064881","brand:wikipedia":"en:Familiprix",healthcare:"pharmacy",name:"Familiprix"},removeTags:{amenity:"pharmacy",brand:"Familiprix","brand:wikidata":"Q3064881","brand:wikipedia":"en:Familiprix",healthcare:"pharmacy",name:"Familiprix"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacia Guadalajara":{name:"Farmacia Guadalajara",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5435609"},addTags:{amenity:"pharmacy",brand:"Farmacia Guadalajara","brand:wikidata":"Q5435609","brand:wikipedia":"en:Farmacias Guadalajara",healthcare:"pharmacy",name:"Farmacia Guadalajara"},removeTags:{amenity:"pharmacy",brand:"Farmacia Guadalajara","brand:wikidata":"Q5435609","brand:wikipedia":"en:Farmacias Guadalajara",healthcare:"pharmacy",name:"Farmacia Guadalajara"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Gintarinė vaistinė":{name:"Gintarinė vaistinė",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q15857801"},addTags:{amenity:"pharmacy",brand:"Gintarinė vaistinė","brand:wikidata":"Q15857801","brand:wikipedia":"lt:Gintarinė vaistinė",healthcare:"pharmacy",name:"Gintarinė vaistinė"},removeTags:{amenity:"pharmacy",brand:"Gintarinė vaistinė","brand:wikidata":"Q15857801","brand:wikipedia":"lt:Gintarinė vaistinė",healthcare:"pharmacy",name:"Gintarinė vaistinė"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Jean Coutu":{name:"Jean Coutu",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q3117457"},addTags:{amenity:"pharmacy",brand:"Jean Coutu","brand:wikidata":"Q3117457","brand:wikipedia":"en:Jean Coutu Group",healthcare:"pharmacy",name:"Jean Coutu"},removeTags:{amenity:"pharmacy",brand:"Jean Coutu","brand:wikidata":"Q3117457","brand:wikipedia":"en:Jean Coutu Group",healthcare:"pharmacy",name:"Jean Coutu"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Kimia Farma":{name:"Kimia Farma",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11264892"},addTags:{amenity:"pharmacy",brand:"Kimia Farma","brand:wikidata":"Q11264892","brand:wikipedia":"en:Kimia Farma",healthcare:"pharmacy",name:"Kimia Farma"},removeTags:{amenity:"pharmacy",brand:"Kimia Farma","brand:wikidata":"Q11264892","brand:wikipedia":"en:Kimia Farma",healthcare:"pharmacy",name:"Kimia Farma"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Kinney Drugs":{name:"Kinney Drugs",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q6414090"},addTags:{amenity:"pharmacy",brand:"Kinney Drugs","brand:wikidata":"Q6414090","brand:wikipedia":"en:Kinney Drugs",healthcare:"pharmacy",name:"Kinney Drugs"},removeTags:{amenity:"pharmacy",brand:"Kinney Drugs","brand:wikidata":"Q6414090","brand:wikipedia":"en:Kinney Drugs",healthcare:"pharmacy",name:"Kinney Drugs"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Lloyds Pharmacy":{name:"Lloyds Pharmacy",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q6662870"},addTags:{amenity:"pharmacy",brand:"Lloyds Pharmacy","brand:wikidata":"Q6662870","brand:wikipedia":"en:LloydsPharmacy",healthcare:"pharmacy",name:"Lloyds Pharmacy"},removeTags:{amenity:"pharmacy",brand:"Lloyds Pharmacy","brand:wikidata":"Q6662870","brand:wikipedia":"en:LloydsPharmacy",healthcare:"pharmacy",name:"Lloyds Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/London Drugs":{name:"London Drugs",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q3258955"},addTags:{amenity:"pharmacy",brand:"London Drugs","brand:wikidata":"Q3258955","brand:wikipedia":"en:London Drugs",healthcare:"pharmacy",name:"London Drugs"},removeTags:{amenity:"pharmacy",brand:"London Drugs","brand:wikidata":"Q3258955","brand:wikipedia":"en:London Drugs",healthcare:"pharmacy",name:"London Drugs"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Mercury Drug":{name:"Mercury Drug",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q6818610"},addTags:{amenity:"pharmacy",brand:"Mercury Drug","brand:wikidata":"Q6818610","brand:wikipedia":"en:Mercury Drug",healthcare:"pharmacy",name:"Mercury Drug"},removeTags:{amenity:"pharmacy",brand:"Mercury Drug","brand:wikidata":"Q6818610","brand:wikipedia":"en:Mercury Drug",healthcare:"pharmacy",name:"Mercury Drug"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Pague Menos":{name:"Pague Menos",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7124466"},addTags:{amenity:"pharmacy",brand:"Pague Menos","brand:wikidata":"Q7124466","brand:wikipedia":"pt:Pague Menos",healthcare:"pharmacy",name:"Pague Menos"},removeTags:{amenity:"pharmacy",brand:"Pague Menos","brand:wikidata":"Q7124466","brand:wikipedia":"pt:Pague Menos",healthcare:"pharmacy",name:"Pague Menos"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Pharmaprix":{name:"Pharmaprix",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1820137"},addTags:{amenity:"pharmacy",brand:"Pharmaprix","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Pharmaprix"},removeTags:{amenity:"pharmacy",brand:"Pharmaprix","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Pharmaprix"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Pharmasave":{name:"Pharmasave",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q17093822"},addTags:{amenity:"pharmacy",brand:"Pharmasave","brand:wikidata":"Q17093822","brand:wikipedia":"en:Pharmasave",healthcare:"pharmacy",name:"Pharmasave"},removeTags:{amenity:"pharmacy",brand:"Pharmasave","brand:wikidata":"Q17093822","brand:wikipedia":"en:Pharmasave",healthcare:"pharmacy",name:"Pharmasave"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Rexall":{name:"Rexall",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7319360"},addTags:{amenity:"pharmacy",brand:"Rexall","brand:wikidata":"Q7319360","brand:wikipedia":"en:Rexall",healthcare:"pharmacy",name:"Rexall"},removeTags:{amenity:"pharmacy",brand:"Rexall","brand:wikidata":"Q7319360","brand:wikipedia":"en:Rexall",healthcare:"pharmacy",name:"Rexall"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Shoppers Drug Mart":{name:"Shoppers Drug Mart",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1820137"},addTags:{amenity:"pharmacy",brand:"Shoppers Drug Mart","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Shoppers Drug Mart"},removeTags:{amenity:"pharmacy",brand:"Shoppers Drug Mart","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Shoppers Drug Mart"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/South Star Drug":{name:"South Star Drug",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7568544"},addTags:{amenity:"pharmacy",brand:"South Star Drug","brand:wikidata":"Q7568544","brand:wikipedia":"en:South Star Drug",healthcare:"pharmacy",name:"South Star Drug"},removeTags:{amenity:"pharmacy",brand:"South Star Drug","brand:wikidata":"Q7568544","brand:wikipedia":"en:South Star Drug",healthcare:"pharmacy",name:"South Star Drug"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Uniprix":{name:"Uniprix",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q683265"},addTags:{amenity:"pharmacy",brand:"Uniprix","brand:wikidata":"Q683265","brand:wikipedia":"en:Uniprix",healthcare:"pharmacy",name:"Uniprix"},removeTags:{amenity:"pharmacy",brand:"Uniprix","brand:wikidata":"Q683265","brand:wikipedia":"en:Uniprix",healthcare:"pharmacy",name:"Uniprix"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Walgreens":{name:"Walgreens",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1591889"},addTags:{amenity:"pharmacy",brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",healthcare:"pharmacy",name:"Walgreens"},removeTags:{amenity:"pharmacy",brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",healthcare:"pharmacy",name:"Walgreens"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Walmart Pharmacy":{name:"Walmart Pharmacy",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q483551"},addTags:{amenity:"pharmacy",brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",healthcare:"pharmacy",name:"Walmart Pharmacy",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},removeTags:{amenity:"pharmacy",brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",healthcare:"pharmacy",name:"Walmart Pharmacy",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Well Pharmacy":{name:"Well Pharmacy",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7726524"},addTags:{amenity:"pharmacy",brand:"Well Pharmacy","brand:wikidata":"Q7726524","brand:wikipedia":"en:Well Pharmacy",healthcare:"pharmacy",name:"Well Pharmacy"},removeTags:{amenity:"pharmacy",brand:"Well Pharmacy","brand:wikidata":"Q7726524","brand:wikipedia":"en:Well Pharmacy",healthcare:"pharmacy",name:"Well Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/post_box/Deutsche Post":{name:"Deutsche Post",icon:"maki-post",fields:["operator","collection_times","drive_through","ref"],geometry:["point","vertex"],tags:{amenity:"post_box","brand:wikidata":"Q157645"},addTags:{amenity:"post_box",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},removeTags:{amenity:"post_box",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},matchScore:2,suggestion:true},"amenity/post_box/USPS":{name:"USPS",icon:"maki-post",fields:["operator","collection_times","drive_through","ref"],geometry:["point","vertex"],tags:{amenity:"post_box","brand:wikidata":"Q668687"},addTags:{amenity:"post_box",brand:"USPS","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"USPS",operator:"USPS"},removeTags:{amenity:"post_box",brand:"USPS","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"USPS",operator:"USPS"},matchScore:2,suggestion:true},"amenity/post_office/Australia Post":{name:"Australia Post",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1142936"},addTags:{amenity:"post_office",brand:"Australia Post","brand:wikidata":"Q1142936","brand:wikipedia":"en:Australia Post",name:"Australia Post"},removeTags:{amenity:"post_office",brand:"Australia Post","brand:wikidata":"Q1142936","brand:wikipedia":"en:Australia Post",name:"Australia Post"},matchScore:2,suggestion:true},"amenity/post_office/CTT":{name:"CTT",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q909429"},addTags:{amenity:"post_office",brand:"CTT","brand:wikidata":"Q909429","brand:wikipedia":"en:CTT (Macau)",name:"CTT"},removeTags:{amenity:"post_office",brand:"CTT","brand:wikidata":"Q909429","brand:wikipedia":"en:CTT (Macau)",name:"CTT"},matchScore:2,suggestion:true},"amenity/post_office/Canada Post":{name:"Canada Post",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1032001"},addTags:{amenity:"post_office",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"},removeTags:{amenity:"post_office",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"},matchScore:2,suggestion:true},"amenity/post_office/Correios":{name:"Correios",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q3375004"},addTags:{amenity:"post_office",brand:"Correios","brand:wikidata":"Q3375004","brand:wikipedia":"en:Correios",name:"Correios"},removeTags:{amenity:"post_office",brand:"Correios","brand:wikidata":"Q3375004","brand:wikipedia":"en:Correios",name:"Correios"},matchScore:2,suggestion:true},"amenity/post_office/Correo Argentino":{name:"Correo Argentino",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q4036566"},addTags:{amenity:"post_office",brand:"Correo Argentino","brand:wikidata":"Q4036566","brand:wikipedia":"en:Correo Argentino",name:"Correo Argentino"},removeTags:{amenity:"post_office",brand:"Correo Argentino","brand:wikidata":"Q4036566","brand:wikipedia":"en:Correo Argentino",name:"Correo Argentino"},matchScore:2,suggestion:true},"amenity/post_office/Correos de Chile":{name:"Correos de Chile",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q5172893"},addTags:{amenity:"post_office",brand:"Correos de Chile","brand:wikidata":"Q5172893","brand:wikipedia":"en:Correos de Chile",name:"Correos de Chile"},removeTags:{amenity:"post_office",brand:"Correos de Chile","brand:wikidata":"Q5172893","brand:wikipedia":"en:Correos de Chile",name:"Correos de Chile"},matchScore:2,suggestion:true},"amenity/post_office/Correos de Costa Rica":{name:"Correos de Costa Rica",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q5172894"},addTags:{amenity:"post_office",brand:"Correos de Costa Rica","brand:wikidata":"Q5172894","brand:wikipedia":"en:Correos de Costa Rica",name:"Correos de Costa Rica"},removeTags:{amenity:"post_office",brand:"Correos de Costa Rica","brand:wikidata":"Q5172894","brand:wikipedia":"en:Correos de Costa Rica",name:"Correos de Costa Rica"},matchScore:2,suggestion:true},"amenity/post_office/DHL":{name:"DHL",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q489815"},addTags:{amenity:"post_office",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL",operator:"DHL"},removeTags:{amenity:"post_office",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL",operator:"DHL"},matchScore:2,suggestion:true},"amenity/post_office/DPD Paketshop":{name:"DPD Paketshop",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q541030"},addTags:{amenity:"post_office",brand:"DPD Paketshop","brand:wikidata":"Q541030","brand:wikipedia":"en:DPDgroup",name:"DPD Paketshop"},removeTags:{amenity:"post_office",brand:"DPD Paketshop","brand:wikidata":"Q541030","brand:wikipedia":"en:DPDgroup",name:"DPD Paketshop"},matchScore:2,suggestion:true},"amenity/post_office/Deutsche Post":{name:"Deutsche Post",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q157645"},addTags:{amenity:"post_office",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},removeTags:{amenity:"post_office",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},matchScore:2,suggestion:true},"amenity/post_office/Fancourier":{name:"Fancourier",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q12727984"},addTags:{amenity:"post_office",brand:"Fancourier","brand:wikidata":"Q12727984","brand:wikipedia":"ro:FAN Courier Express",name:"Fancourier"},removeTags:{amenity:"post_office",brand:"Fancourier","brand:wikidata":"Q12727984","brand:wikipedia":"ro:FAN Courier Express",name:"Fancourier"},matchScore:2,suggestion:true},"amenity/post_office/FedEx":{name:"FedEx",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q459477"},addTags:{amenity:"post_office",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"},removeTags:{amenity:"post_office",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"},matchScore:2,suggestion:true},"amenity/post_office/Hermes Paketshop":{name:"Hermes Paketshop",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1613532"},addTags:{amenity:"post_office",brand:"Hermes Paketshop","brand:wikidata":"Q1613532","brand:wikipedia":"en:Hermes Group",name:"Hermes Paketshop"},removeTags:{amenity:"post_office",brand:"Hermes Paketshop","brand:wikidata":"Q1613532","brand:wikipedia":"en:Hermes Group",name:"Hermes Paketshop"},matchScore:2,suggestion:true},"amenity/post_office/LBC":{name:"LBC",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q17075584"},addTags:{amenity:"post_office",brand:"LBC","brand:wikidata":"Q17075584","brand:wikipedia":"en:LBC Express",name:"LBC"},removeTags:{amenity:"post_office",brand:"LBC","brand:wikidata":"Q17075584","brand:wikipedia":"en:LBC Express",name:"LBC"},matchScore:2,suggestion:true},"amenity/post_office/La Poste":{name:"La Poste",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q373724"},addTags:{amenity:"post_office",brand:"La Poste","brand:wikidata":"Q373724","brand:wikipedia":"fr:La Poste (entreprise française)",name:"La Poste"},removeTags:{amenity:"post_office",brand:"La Poste","brand:wikidata":"Q373724","brand:wikipedia":"fr:La Poste (entreprise française)",name:"La Poste"},matchScore:2,suggestion:true},"amenity/post_office/MRW":{name:"MRW",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q23767821"},addTags:{amenity:"post_office",brand:"MRW","brand:wikidata":"Q23767821","brand:wikipedia":"es:MRW",name:"MRW"},removeTags:{amenity:"post_office",brand:"MRW","brand:wikidata":"Q23767821","brand:wikipedia":"es:MRW",name:"MRW"},matchScore:2,suggestion:true},"amenity/post_office/Oficina de Correos":{name:"Oficina de Correos",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q776605"},addTags:{amenity:"post_office",brand:"Oficina de Correos","brand:wikidata":"Q776605","brand:wikipedia":"es:Correos (España)",name:"Oficina de Correos"},removeTags:{amenity:"post_office",brand:"Oficina de Correos","brand:wikidata":"Q776605","brand:wikipedia":"es:Correos (España)",name:"Oficina de Correos"},matchScore:2,suggestion:true},"amenity/post_office/Poczta Polska":{name:"Poczta Polska",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q168833"},addTags:{amenity:"post_office",brand:"Poczta Polska","brand:wikidata":"Q168833","brand:wikipedia":"en:Poczta Polska",name:"Poczta Polska"},removeTags:{amenity:"post_office",brand:"Poczta Polska","brand:wikidata":"Q168833","brand:wikipedia":"en:Poczta Polska",name:"Poczta Polska"},matchScore:2,suggestion:true},"amenity/post_office/Poste Italiane":{name:"Poste Italiane",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q495026"},addTags:{amenity:"post_office",brand:"Poste Italiane","brand:wikidata":"Q495026","brand:wikipedia":"en:Poste italiane",name:"Poste Italiane"},removeTags:{amenity:"post_office",brand:"Poste Italiane","brand:wikidata":"Q495026","brand:wikipedia":"en:Poste italiane",name:"Poste Italiane"},matchScore:2,suggestion:true},"amenity/post_office/Slovenská pošta":{name:"Slovenská pošta",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1191849"},addTags:{amenity:"post_office",brand:"Slovenská pošta","brand:wikidata":"Q1191849","brand:wikipedia":"en:Slovenská pošta",name:"Slovenská pošta"},removeTags:{amenity:"post_office",brand:"Slovenská pošta","brand:wikidata":"Q1191849","brand:wikipedia":"en:Slovenská pošta",name:"Slovenská pošta"},matchScore:2,suggestion:true},"amenity/post_office/The UPS Store":{name:"The UPS Store",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q7771029"},addTags:{amenity:"post_office",brand:"The UPS Store","brand:wikidata":"Q7771029","brand:wikipedia":"en:The UPS Store",name:"The UPS Store"},removeTags:{amenity:"post_office",brand:"The UPS Store","brand:wikidata":"Q7771029","brand:wikipedia":"en:The UPS Store",name:"The UPS Store"},matchScore:2,suggestion:true},"amenity/post_office/US Post Office":{name:"US Post Office",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q668687"},addTags:{amenity:"post_office",brand:"US Post Office","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"US Post Office",operator:"USPS"},removeTags:{amenity:"post_office",brand:"US Post Office","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"US Post Office",operator:"USPS"},matchScore:2,suggestion:true},"amenity/post_office/ΕΛΤΑ":{name:"ΕΛΤΑ",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1275135"},addTags:{amenity:"post_office",brand:"ΕΛΤΑ","brand:wikidata":"Q1275135","brand:wikipedia":"el:Ελληνικά Ταχυδρομεία",name:"ΕΛΤΑ"},removeTags:{amenity:"post_office",brand:"ΕΛΤΑ","brand:wikidata":"Q1275135","brand:wikipedia":"el:Ελληνικά Ταχυδρομεία",name:"ΕΛΤΑ"},matchScore:2,suggestion:true},"amenity/post_office/中国邮政":{name:"中国邮政",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1066476"},addTags:{amenity:"post_office",brand:"中国邮政","brand:en":"China Post","brand:wikidata":"Q1066476","brand:wikipedia":"en:China Post",name:"中国邮政","name:en":"China Post"},removeTags:{amenity:"post_office",brand:"中国邮政","brand:en":"China Post","brand:wikidata":"Q1066476","brand:wikipedia":"en:China Post",name:"中国邮政","name:en":"China Post"},matchScore:2,suggestion:true},"amenity/public_bookcase/Little Free Library":{name:"Little Free Library",icon:"maki-library",fields:["name","operator","capacity","website"],geometry:["point","area"],tags:{amenity:"public_bookcase","brand:wikidata":"Q6650101"},addTags:{amenity:"public_bookcase",brand:"Little Free Library","brand:wikidata":"Q6650101","brand:wikipedia":"en:Little Free Library",name:"Little Free Library"},removeTags:{amenity:"public_bookcase",brand:"Little Free Library","brand:wikidata":"Q6650101","brand:wikipedia":"en:Little Free Library",name:"Little Free Library"},matchScore:2,suggestion:true},"amenity/restaurant/100 Montaditos":{name:"100 Montaditos",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q8355805"},addTags:{amenity:"restaurant",brand:"100 Montaditos","brand:wikidata":"Q8355805","brand:wikipedia":"en:Cervecería 100 Montaditos",name:"100 Montaditos"},removeTags:{amenity:"restaurant",brand:"100 Montaditos","brand:wikidata":"Q8355805","brand:wikipedia":"en:Cervecería 100 Montaditos",name:"100 Montaditos"},matchScore:2,suggestion:true},"amenity/restaurant/Applebee’s Neighborhood Grill & Bar":{name:"Applebee’s Neighborhood Grill & Bar",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q621532"},addTags:{amenity:"restaurant",brand:"Applebee’s Neighborhood Grill & Bar","brand:wikidata":"Q621532","brand:wikipedia":"en:Applebee's",cuisine:"american",name:"Applebee’s Neighborhood Grill & Bar"},removeTags:{amenity:"restaurant",brand:"Applebee’s Neighborhood Grill & Bar","brand:wikidata":"Q621532","brand:wikipedia":"en:Applebee's",cuisine:"american",name:"Applebee’s Neighborhood Grill & Bar"},matchScore:2,suggestion:true},"amenity/restaurant/Autogrill":{name:"Autogrill",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q786790"},addTags:{amenity:"restaurant",brand:"Autogrill","brand:wikidata":"Q786790","brand:wikipedia":"en:Autogrill",name:"Autogrill"},removeTags:{amenity:"restaurant",brand:"Autogrill","brand:wikidata":"Q786790","brand:wikipedia":"en:Autogrill",name:"Autogrill"},matchScore:2,suggestion:true},"amenity/restaurant/Bella Italia":{name:"Bella Italia",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4883362"},addTags:{amenity:"restaurant",brand:"Bella Italia","brand:wikidata":"Q4883362","brand:wikipedia":"en:Bella Italia",name:"Bella Italia"},removeTags:{amenity:"restaurant",brand:"Bella Italia","brand:wikidata":"Q4883362","brand:wikipedia":"en:Bella Italia",name:"Bella Italia"},matchScore:2,suggestion:true},"amenity/restaurant/Big Boy":{name:"Big Boy",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4386779"},addTags:{amenity:"restaurant",brand:"Big Boy","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",name:"Big Boy"},removeTags:{amenity:"restaurant",brand:"Big Boy","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",name:"Big Boy"},matchScore:2,suggestion:true},"amenity/restaurant/Black Bear Diner":{name:"Black Bear Diner",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4920343"},addTags:{amenity:"restaurant",brand:"Black Bear Diner","brand:wikidata":"Q4920343","brand:wikipedia":"en:Black Bear Diner",name:"Black Bear Diner"},removeTags:{amenity:"restaurant",brand:"Black Bear Diner","brand:wikidata":"Q4920343","brand:wikipedia":"en:Black Bear Diner",name:"Black Bear Diner"},matchScore:2,suggestion:true},"amenity/restaurant/Bob Evans":{name:"Bob Evans",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4932385"},addTags:{amenity:"restaurant",brand:"Bob Evans","brand:wikidata":"Q4932385","brand:wikipedia":"en:Bob Evans (restaurateur)",name:"Bob Evans"},removeTags:{amenity:"restaurant",brand:"Bob Evans","brand:wikidata":"Q4932385","brand:wikipedia":"en:Bob Evans (restaurateur)",name:"Bob Evans"},matchScore:2,suggestion:true},"amenity/restaurant/Bonefish Grill":{name:"Bonefish Grill",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4941599"},addTags:{amenity:"restaurant",brand:"Bonefish Grill","brand:wikidata":"Q4941599","brand:wikipedia":"en:Bonefish Grill",name:"Bonefish Grill"},removeTags:{amenity:"restaurant",brand:"Bonefish Grill","brand:wikidata":"Q4941599","brand:wikipedia":"en:Bonefish Grill",name:"Bonefish Grill"},matchScore:2,suggestion:true},"amenity/restaurant/Boston Pizza":{name:"Boston Pizza",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q894578"},addTags:{amenity:"restaurant",brand:"Boston Pizza","brand:wikidata":"Q894578","brand:wikipedia":"en:Boston Pizza",cuisine:"pizza",name:"Boston Pizza"},removeTags:{amenity:"restaurant",brand:"Boston Pizza","brand:wikidata":"Q894578","brand:wikipedia":"en:Boston Pizza",cuisine:"pizza",name:"Boston Pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Grill":{name:"Buffalo Grill",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q944655"},addTags:{amenity:"restaurant",brand:"Buffalo Grill","brand:wikidata":"Q944655","brand:wikipedia":"en:Buffalo Grill",name:"Buffalo Grill"},removeTags:{amenity:"restaurant",brand:"Buffalo Grill","brand:wikidata":"Q944655","brand:wikipedia":"en:Buffalo Grill",name:"Buffalo Grill"},matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Wild Wings":{name:"Buffalo Wild Wings",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q509255"},addTags:{amenity:"restaurant",brand:"Buffalo Wild Wings","brand:wikidata":"Q509255","brand:wikipedia":"en:Buffalo Wild Wings",name:"Buffalo Wild Wings"},removeTags:{amenity:"restaurant",brand:"Buffalo Wild Wings","brand:wikidata":"Q509255","brand:wikipedia":"en:Buffalo Wild Wings",name:"Buffalo Wild Wings"},matchScore:2,suggestion:true},"amenity/restaurant/Cafe Rio":{name:"Cafe Rio",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5017108"},addTags:{amenity:"restaurant",brand:"Cafe Rio","brand:wikidata":"Q5017108","brand:wikipedia":"en:Cafe Rio",name:"Cafe Rio"},removeTags:{amenity:"restaurant",brand:"Cafe Rio","brand:wikidata":"Q5017108","brand:wikipedia":"en:Cafe Rio",name:"Cafe Rio"},matchScore:2,suggestion:true},"amenity/restaurant/California Pizza Kitchen":{name:"California Pizza Kitchen",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q15109854"},addTags:{amenity:"restaurant",brand:"California Pizza Kitchen","brand:wikidata":"Q15109854","brand:wikipedia":"en:California Pizza Kitchen",cuisine:"pizza",name:"California Pizza Kitchen"},removeTags:{amenity:"restaurant",brand:"California Pizza Kitchen","brand:wikidata":"Q15109854","brand:wikipedia":"en:California Pizza Kitchen",cuisine:"pizza",name:"California Pizza Kitchen"},matchScore:2,suggestion:true},"amenity/restaurant/Carluccio's":{name:"Carluccio's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q25111797"},addTags:{amenity:"restaurant",brand:"Carluccio's","brand:wikidata":"Q25111797","brand:wikipedia":"en:Carluccio's Ltd",name:"Carluccio's"},removeTags:{amenity:"restaurant",brand:"Carluccio's","brand:wikidata":"Q25111797","brand:wikipedia":"en:Carluccio's Ltd",name:"Carluccio's"},matchScore:2,suggestion:true},"amenity/restaurant/Carrabba's Italian Grill":{name:"Carrabba's Italian Grill",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5045999"},addTags:{amenity:"restaurant",brand:"Carrabba's Italian Grill","brand:wikidata":"Q5045999","brand:wikipedia":"en:Carrabba's Italian Grill",name:"Carrabba's Italian Grill"},removeTags:{amenity:"restaurant",brand:"Carrabba's Italian Grill","brand:wikidata":"Q5045999","brand:wikipedia":"en:Carrabba's Italian Grill",name:"Carrabba's Italian Grill"},matchScore:2,suggestion:true},"amenity/restaurant/Cheesecake Factory":{name:"Cheesecake Factory",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1045842"},addTags:{amenity:"restaurant",brand:"Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",name:"Cheesecake Factory"},removeTags:{amenity:"restaurant",brand:"Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",name:"Cheesecake Factory"},matchScore:2,suggestion:true},"amenity/restaurant/Chili's":{name:"Chili's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1072948"},addTags:{amenity:"restaurant",brand:"Chili's","brand:wikidata":"Q1072948","brand:wikipedia":"en:Chili's",name:"Chili's"},removeTags:{amenity:"restaurant",brand:"Chili's","brand:wikidata":"Q1072948","brand:wikipedia":"en:Chili's",name:"Chili's"},matchScore:2,suggestion:true},"amenity/restaurant/Chiquito":{name:"Chiquito",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5101775"},addTags:{amenity:"restaurant",brand:"Chiquito","brand:wikidata":"Q5101775","brand:wikipedia":"en:Chiquito (restaurant)",name:"Chiquito"},removeTags:{amenity:"restaurant",brand:"Chiquito","brand:wikidata":"Q5101775","brand:wikipedia":"en:Chiquito (restaurant)",name:"Chiquito"},matchScore:2,suggestion:true},"amenity/restaurant/Chuck E. Cheese's":{name:"Chuck E. Cheese's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q2438391"},addTags:{amenity:"restaurant",brand:"Chuck E. Cheese's","brand:wikidata":"Q2438391","brand:wikipedia":"en:Chuck E. Cheese's",cuisine:"pizza",name:"Chuck E. Cheese's"},removeTags:{amenity:"restaurant",brand:"Chuck E. Cheese's","brand:wikidata":"Q2438391","brand:wikipedia":"en:Chuck E. Cheese's",cuisine:"pizza",name:"Chuck E. Cheese's"},matchScore:2,suggestion:true},"amenity/restaurant/Cici's Pizza":{name:"Cici's Pizza",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q2972189"},addTags:{amenity:"restaurant",brand:"Cici's Pizza","brand:wikidata":"Q2972189","brand:wikipedia":"en:Cicis",cuisine:"pizza",name:"Cici's Pizza"},removeTags:{amenity:"restaurant",brand:"Cici's Pizza","brand:wikidata":"Q2972189","brand:wikipedia":"en:Cicis",cuisine:"pizza",name:"Cici's Pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Cracker Barrel":{name:"Cracker Barrel",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4492609"},addTags:{amenity:"restaurant",brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",name:"Cracker Barrel"},removeTags:{amenity:"restaurant",brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",name:"Cracker Barrel"},matchScore:2,suggestion:true},"amenity/restaurant/Denny's":{name:"Denny's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1189695"},addTags:{amenity:"restaurant",brand:"Denny's","brand:wikidata":"Q1189695","brand:wikipedia":"en:Denny's",name:"Denny's"},removeTags:{amenity:"restaurant",brand:"Denny's","brand:wikidata":"Q1189695","brand:wikipedia":"en:Denny's",name:"Denny's"},matchScore:2,suggestion:true},"amenity/restaurant/Dickey's Barbecue Pit":{name:"Dickey's Barbecue Pit",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q19880747"},addTags:{amenity:"restaurant",brand:"Dickey's Barbecue Pit","brand:wikidata":"Q19880747","brand:wikipedia":"en:Dickey's Barbecue Pit",name:"Dickey's Barbecue Pit"},removeTags:{amenity:"restaurant",brand:"Dickey's Barbecue Pit","brand:wikidata":"Q19880747","brand:wikipedia":"en:Dickey's Barbecue Pit",name:"Dickey's Barbecue Pit"},matchScore:2,suggestion:true},"amenity/restaurant/East Side Mario's":{name:"East Side Mario's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5329375"},addTags:{amenity:"restaurant",brand:"East Side Mario's","brand:wikidata":"Q5329375","brand:wikipedia":"en:East Side Mario's",name:"East Side Mario's"},removeTags:{amenity:"restaurant",brand:"East Side Mario's","brand:wikidata":"Q5329375","brand:wikipedia":"en:East Side Mario's",name:"East Side Mario's"},matchScore:2,suggestion:true},"amenity/restaurant/Famous Dave's":{name:"Famous Dave's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5433448"},addTags:{amenity:"restaurant",brand:"Famous Dave's","brand:wikidata":"Q5433448","brand:wikipedia":"en:Famous Dave's",name:"Famous Dave's"},removeTags:{amenity:"restaurant",brand:"Famous Dave's","brand:wikidata":"Q5433448","brand:wikipedia":"en:Famous Dave's",name:"Famous Dave's"},matchScore:2,suggestion:true},"amenity/restaurant/Flunch":{name:"Flunch",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q629326"},addTags:{amenity:"restaurant",brand:"Flunch","brand:wikidata":"Q629326","brand:wikipedia":"en:Flunch",name:"Flunch"},removeTags:{amenity:"restaurant",brand:"Flunch","brand:wikidata":"Q629326","brand:wikipedia":"en:Flunch",name:"Flunch"},matchScore:2,suggestion:true},"amenity/restaurant/Foster's Hollywood":{name:"Foster's Hollywood",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5864366"},addTags:{amenity:"restaurant",brand:"Foster's Hollywood","brand:wikidata":"Q5864366","brand:wikipedia":"en:Foster's Hollywood",name:"Foster's Hollywood"},removeTags:{amenity:"restaurant",brand:"Foster's Hollywood","brand:wikidata":"Q5864366","brand:wikipedia":"en:Foster's Hollywood",name:"Foster's Hollywood"},matchScore:2,suggestion:true},"amenity/restaurant/Frankie & Benny's":{name:"Frankie & Benny's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5490892"},addTags:{amenity:"restaurant",brand:"Frankie & Benny's","brand:wikidata":"Q5490892","brand:wikipedia":"en:Frankie & Benny's",name:"Frankie & Benny's"},removeTags:{amenity:"restaurant",brand:"Frankie & Benny's","brand:wikidata":"Q5490892","brand:wikipedia":"en:Frankie & Benny's",name:"Frankie & Benny's"},matchScore:2,suggestion:true},"amenity/restaurant/Friendly's":{name:"Friendly's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1464513"},addTags:{amenity:"restaurant",brand:"Friendly's","brand:wikidata":"Q1464513","brand:wikipedia":"en:Friendly's",name:"Friendly's"},removeTags:{amenity:"restaurant",brand:"Friendly's","brand:wikidata":"Q1464513","brand:wikipedia":"en:Friendly's",name:"Friendly's"},matchScore:2,suggestion:true},"amenity/restaurant/Fuddruckers":{name:"Fuddruckers",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5507056"},addTags:{amenity:"restaurant",brand:"Fuddruckers","brand:wikidata":"Q5507056","brand:wikipedia":"en:Fuddruckers",name:"Fuddruckers"},removeTags:{amenity:"restaurant",brand:"Fuddruckers","brand:wikidata":"Q5507056","brand:wikipedia":"en:Fuddruckers",name:"Fuddruckers"},matchScore:2,suggestion:true},"amenity/restaurant/Golden Corral":{name:"Golden Corral",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4039560"},addTags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",name:"Golden Corral"},removeTags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",name:"Golden Corral"},matchScore:2,suggestion:true},"amenity/restaurant/Gourmet Burger Kitchen":{name:"Gourmet Burger Kitchen",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5588445"},addTags:{amenity:"restaurant",brand:"Gourmet Burger Kitchen","brand:wikidata":"Q5588445","brand:wikipedia":"en:Gourmet Burger Kitchen",name:"Gourmet Burger Kitchen"},removeTags:{amenity:"restaurant",brand:"Gourmet Burger Kitchen","brand:wikidata":"Q5588445","brand:wikipedia":"en:Gourmet Burger Kitchen",name:"Gourmet Burger Kitchen"},matchScore:2,suggestion:true},"amenity/restaurant/Hard Rock Cafe":{name:"Hard Rock Cafe",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q918151"},addTags:{amenity:"restaurant",brand:"Hard Rock Cafe","brand:wikidata":"Q918151","brand:wikipedia":"en:Hard Rock Cafe",name:"Hard Rock Cafe"},removeTags:{amenity:"restaurant",brand:"Hard Rock Cafe","brand:wikidata":"Q918151","brand:wikipedia":"en:Hard Rock Cafe",name:"Hard Rock Cafe"},matchScore:2,suggestion:true},"amenity/restaurant/Harvester":{name:"Harvester",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5676915"},addTags:{amenity:"restaurant",brand:"Harvester","brand:wikidata":"Q5676915","brand:wikipedia":"en:Harvester (restaurant)",name:"Harvester"},removeTags:{amenity:"restaurant",brand:"Harvester","brand:wikidata":"Q5676915","brand:wikipedia":"en:Harvester (restaurant)",name:"Harvester"},matchScore:2,suggestion:true},"amenity/restaurant/Hippopotamus":{name:"Hippopotamus",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3136174"},addTags:{amenity:"restaurant",brand:"Hippopotamus","brand:wikidata":"Q3136174","brand:wikipedia":"fr:Hippopotamus (restaurant)",name:"Hippopotamus"},removeTags:{amenity:"restaurant",brand:"Hippopotamus","brand:wikidata":"Q3136174","brand:wikipedia":"fr:Hippopotamus (restaurant)",name:"Hippopotamus"},matchScore:2,suggestion:true},"amenity/restaurant/Hooters":{name:"Hooters",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1025921"},addTags:{amenity:"restaurant",brand:"Hooters","brand:wikidata":"Q1025921","brand:wikipedia":"en:Hooters",name:"Hooters"},removeTags:{amenity:"restaurant",brand:"Hooters","brand:wikidata":"Q1025921","brand:wikipedia":"en:Hooters",name:"Hooters"},matchScore:2,suggestion:true},"amenity/restaurant/Huddle House":{name:"Huddle House",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5928324"},addTags:{amenity:"restaurant",brand:"Huddle House","brand:wikidata":"Q5928324","brand:wikipedia":"en:Huddle House",name:"Huddle House"},removeTags:{amenity:"restaurant",brand:"Huddle House","brand:wikidata":"Q5928324","brand:wikipedia":"en:Huddle House",name:"Huddle House"},matchScore:2,suggestion:true},"amenity/restaurant/IHOP":{name:"IHOP",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1185675"},addTags:{amenity:"restaurant",brand:"IHOP","brand:wikidata":"Q1185675","brand:wikipedia":"en:IHOP",name:"IHOP"},removeTags:{amenity:"restaurant",brand:"IHOP","brand:wikidata":"Q1185675","brand:wikipedia":"en:IHOP",name:"IHOP"},matchScore:2,suggestion:true},"amenity/restaurant/Jason's Deli":{name:"Jason's Deli",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q16997641"},addTags:{amenity:"restaurant",brand:"Jason's Deli","brand:wikidata":"Q16997641","brand:wikipedia":"en:Jason's Deli",name:"Jason's Deli"},removeTags:{amenity:"restaurant",brand:"Jason's Deli","brand:wikidata":"Q16997641","brand:wikipedia":"en:Jason's Deli",name:"Jason's Deli"},matchScore:2,suggestion:true},"amenity/restaurant/Jet's Pizza":{name:"Jet's Pizza",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q16997713"},addTags:{amenity:"restaurant",brand:"Jet's Pizza","brand:wikidata":"Q16997713","brand:wikipedia":"en:Jet's Pizza",cuisine:"pizza",name:"Jet's Pizza"},removeTags:{amenity:"restaurant",brand:"Jet's Pizza","brand:wikidata":"Q16997713","brand:wikipedia":"en:Jet's Pizza",cuisine:"pizza",name:"Jet's Pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Joe's Crab Shack":{name:"Joe's Crab Shack",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q6208210"},addTags:{amenity:"restaurant",brand:"Joe's Crab Shack","brand:wikidata":"Q6208210","brand:wikipedia":"en:Joe's Crab Shack",name:"Joe's Crab Shack"},removeTags:{amenity:"restaurant",brand:"Joe's Crab Shack","brand:wikidata":"Q6208210","brand:wikipedia":"en:Joe's Crab Shack",name:"Joe's Crab Shack"},matchScore:2,suggestion:true},"amenity/restaurant/Kelsey's":{name:"Kelsey's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q6386459"},addTags:{amenity:"restaurant",brand:"Kelsey's","brand:wikidata":"Q6386459","brand:wikipedia":"en:Kelseys Original Roadhouse",name:"Kelsey's"},removeTags:{amenity:"restaurant",brand:"Kelsey's","brand:wikidata":"Q6386459","brand:wikipedia":"en:Kelseys Original Roadhouse",name:"Kelsey's"},matchScore:2,suggestion:true},"amenity/restaurant/Logan's Roadhouse":{name:"Logan's Roadhouse",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q6666872"},addTags:{amenity:"restaurant",brand:"Logan's Roadhouse","brand:wikidata":"Q6666872","brand:wikipedia":"en:Logan's Roadhouse",name:"Logan's Roadhouse"},removeTags:{amenity:"restaurant",brand:"Logan's Roadhouse","brand:wikidata":"Q6666872","brand:wikipedia":"en:Logan's Roadhouse",name:"Logan's Roadhouse"},matchScore:2,suggestion:true},"amenity/restaurant/LongHorn Steakhouse":{name:"LongHorn Steakhouse",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3259007"},addTags:{amenity:"restaurant",brand:"LongHorn Steakhouse","brand:wikidata":"Q3259007","brand:wikipedia":"en:LongHorn Steakhouse",name:"LongHorn Steakhouse"},removeTags:{amenity:"restaurant",brand:"LongHorn Steakhouse","brand:wikidata":"Q3259007","brand:wikipedia":"en:LongHorn Steakhouse",name:"LongHorn Steakhouse"},matchScore:2,suggestion:true},"amenity/restaurant/Loving Hut":{name:"Loving Hut",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3491655"},addTags:{amenity:"restaurant",brand:"Loving Hut","brand:wikidata":"Q3491655","brand:wikipedia":"en:Loving Hut",name:"Loving Hut"},removeTags:{amenity:"restaurant",brand:"Loving Hut","brand:wikidata":"Q3491655","brand:wikipedia":"en:Loving Hut",name:"Loving Hut"},matchScore:2,suggestion:true},"amenity/restaurant/Léon de Bruxelles":{name:"Léon de Bruxelles",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q21041507"},addTags:{amenity:"restaurant",brand:"Léon de Bruxelles","brand:wikidata":"Q21041507","brand:wikipedia":"en:Léon de Bruxelles",name:"Léon de Bruxelles"},removeTags:{amenity:"restaurant",brand:"Léon de Bruxelles","brand:wikidata":"Q21041507","brand:wikipedia":"en:Léon de Bruxelles",name:"Léon de Bruxelles"},matchScore:2,suggestion:true},"amenity/restaurant/MOD Pizza":{name:"MOD Pizza",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q19903469"},addTags:{amenity:"restaurant",brand:"MOD Pizza","brand:wikidata":"Q19903469","brand:wikipedia":"en:MOD Pizza",cuisine:"pizza",name:"MOD Pizza"},removeTags:{amenity:"restaurant",brand:"MOD Pizza","brand:wikidata":"Q19903469","brand:wikipedia":"en:MOD Pizza",cuisine:"pizza",name:"MOD Pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Marco's Pizza":{name:"Marco's Pizza",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q6757382"},addTags:{amenity:"restaurant",brand:"Marco's Pizza","brand:wikidata":"Q6757382","brand:wikipedia":"en:Marco's Pizza",cuisine:"pizza",name:"Marco's Pizza"},removeTags:{amenity:"restaurant",brand:"Marco's Pizza","brand:wikidata":"Q6757382","brand:wikipedia":"en:Marco's Pizza",cuisine:"pizza",name:"Marco's Pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Max's Restaurant":{name:"Max's Restaurant",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q6794477"},addTags:{amenity:"restaurant",brand:"Max's Restaurant","brand:wikidata":"Q6794477","brand:wikipedia":"en:Max's of Manila",name:"Max's Restaurant"},removeTags:{amenity:"restaurant",brand:"Max's Restaurant","brand:wikidata":"Q6794477","brand:wikipedia":"en:Max's of Manila",name:"Max's Restaurant"},matchScore:2,suggestion:true},"amenity/restaurant/McAlister's Deli":{name:"McAlister's Deli",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q17020829"},addTags:{amenity:"restaurant",brand:"McAlister's Deli","brand:wikidata":"Q17020829","brand:wikipedia":"en:McAlister's Deli",name:"McAlister's Deli"},removeTags:{amenity:"restaurant",brand:"McAlister's Deli","brand:wikidata":"Q17020829","brand:wikipedia":"en:McAlister's Deli",name:"McAlister's Deli"},matchScore:2,suggestion:true},"amenity/restaurant/Mellow Mushroom":{name:"Mellow Mushroom",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q17021360"},addTags:{amenity:"restaurant",brand:"Mellow Mushroom","brand:wikidata":"Q17021360","brand:wikipedia":"en:Mellow Mushroom",name:"Mellow Mushroom"},removeTags:{amenity:"restaurant",brand:"Mellow Mushroom","brand:wikidata":"Q17021360","brand:wikipedia":"en:Mellow Mushroom",name:"Mellow Mushroom"},matchScore:2,suggestion:true},"amenity/restaurant/Nando's":{name:"Nando's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3472954"},addTags:{amenity:"restaurant",brand:"Nando's","brand:wikidata":"Q3472954","brand:wikipedia":"en:Nando's",name:"Nando's"},removeTags:{amenity:"restaurant",brand:"Nando's","brand:wikidata":"Q3472954","brand:wikipedia":"en:Nando's",name:"Nando's"},matchScore:2,suggestion:true},"amenity/restaurant/Noodles & Company":{name:"Noodles & Company",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7049673"},addTags:{amenity:"restaurant",brand:"Noodles & Company","brand:wikidata":"Q7049673","brand:wikipedia":"en:Noodles & Company",name:"Noodles & Company"},removeTags:{amenity:"restaurant",brand:"Noodles & Company","brand:wikidata":"Q7049673","brand:wikipedia":"en:Noodles & Company",name:"Noodles & Company"},matchScore:2,suggestion:true},"amenity/restaurant/O'Charley's":{name:"O'Charley's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7071703"},addTags:{amenity:"restaurant",brand:"O'Charley's","brand:wikidata":"Q7071703","brand:wikipedia":"en:O'Charley's",name:"O'Charley's"},removeTags:{amenity:"restaurant",brand:"O'Charley's","brand:wikidata":"Q7071703","brand:wikipedia":"en:O'Charley's",name:"O'Charley's"},matchScore:2,suggestion:true},"amenity/restaurant/Old Chicago":{name:"Old Chicago",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5180522"},addTags:{amenity:"restaurant",brand:"Old Chicago","brand:wikidata":"Q5180522","brand:wikipedia":"en:CraftWorks Restaurants & Breweries",name:"Old Chicago"},removeTags:{amenity:"restaurant",brand:"Old Chicago","brand:wikidata":"Q5180522","brand:wikipedia":"en:CraftWorks Restaurants & Breweries",name:"Old Chicago"},matchScore:2,suggestion:true},"amenity/restaurant/Old Wild West":{name:"Old Wild West",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q25402475"},addTags:{amenity:"restaurant",brand:"Old Wild West","brand:wikidata":"Q25402475","brand:wikipedia":"it:Old Wild West",name:"Old Wild West"},removeTags:{amenity:"restaurant",brand:"Old Wild West","brand:wikidata":"Q25402475","brand:wikipedia":"it:Old Wild West",name:"Old Wild West"},matchScore:2,suggestion:true},"amenity/restaurant/Olive Garden":{name:"Olive Garden",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3045312"},addTags:{amenity:"restaurant",brand:"Olive Garden","brand:wikidata":"Q3045312","brand:wikipedia":"en:Olive Garden",name:"Olive Garden"},removeTags:{amenity:"restaurant",brand:"Olive Garden","brand:wikidata":"Q3045312","brand:wikipedia":"en:Olive Garden",name:"Olive Garden"},matchScore:2,suggestion:true},"amenity/restaurant/Outback Steakhouse":{name:"Outback Steakhouse",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1064893"},addTags:{amenity:"restaurant",brand:"Outback Steakhouse","brand:wikidata":"Q1064893","brand:wikipedia":"en:Outback Steakhouse",name:"Outback Steakhouse"},removeTags:{amenity:"restaurant",brand:"Outback Steakhouse","brand:wikidata":"Q1064893","brand:wikipedia":"en:Outback Steakhouse",name:"Outback Steakhouse"},matchScore:2,suggestion:true},"amenity/restaurant/P.F. Chang's":{name:"P.F. Chang's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5360181"},addTags:{amenity:"restaurant",brand:"P.F. Chang's","brand:wikidata":"Q5360181","brand:wikipedia":"en:P. F. Chang's China Bistro",name:"P.F. Chang's"},removeTags:{amenity:"restaurant",brand:"P.F. Chang's","brand:wikidata":"Q5360181","brand:wikipedia":"en:P. F. Chang's China Bistro",name:"P.F. Chang's"},matchScore:2,suggestion:true},"amenity/restaurant/Pei Wei":{name:"Pei Wei",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7160898"},addTags:{amenity:"restaurant",brand:"Pei Wei","brand:wikidata":"Q7160898","brand:wikipedia":"en:Pei Wei Asian Diner",name:"Pei Wei"},removeTags:{amenity:"restaurant",brand:"Pei Wei","brand:wikidata":"Q7160898","brand:wikipedia":"en:Pei Wei Asian Diner",name:"Pei Wei"},matchScore:2,suggestion:true},"amenity/restaurant/Pizza Factory":{name:"Pizza Factory",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q39054369"},addTags:{amenity:"restaurant",brand:"Pizza Factory","brand:wikidata":"Q39054369","brand:wikipedia":"en:Pizza Factory",cuisine:"pizza",name:"Pizza Factory"},removeTags:{amenity:"restaurant",brand:"Pizza Factory","brand:wikidata":"Q39054369","brand:wikipedia":"en:Pizza Factory",cuisine:"pizza",name:"Pizza Factory"},matchScore:2,suggestion:true},"amenity/restaurant/Pizza Hut":{name:"Pizza Hut",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q191615"},addTags:{amenity:"restaurant",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut"},removeTags:{amenity:"restaurant",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut"},matchScore:2,suggestion:true},"amenity/restaurant/Pizza Ranch":{name:"Pizza Ranch",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7199978"},addTags:{amenity:"restaurant",brand:"Pizza Ranch","brand:wikidata":"Q7199978","brand:wikipedia":"en:Pizza Ranch",cuisine:"pizza",name:"Pizza Ranch"},removeTags:{amenity:"restaurant",brand:"Pizza Ranch","brand:wikidata":"Q7199978","brand:wikipedia":"en:Pizza Ranch",cuisine:"pizza",name:"Pizza Ranch"},matchScore:2,suggestion:true},"amenity/restaurant/PizzaExpress":{name:"PizzaExpress",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q662845"},addTags:{amenity:"restaurant",brand:"PizzaExpress","brand:wikipedia":"en:PizzaExpress","brand:wikidata":"Q662845",cuisine:"pizza",name:"PizzaExpress"},removeTags:{amenity:"restaurant",brand:"PizzaExpress","brand:wikipedia":"en:PizzaExpress","brand:wikidata":"Q662845",cuisine:"pizza",name:"PizzaExpress"},matchScore:2,suggestion:true},"amenity/restaurant/Prezzo":{name:"Prezzo",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7242489"},addTags:{amenity:"restaurant",brand:"Prezzo","brand:wikidata":"Q7242489","brand:wikipedia":"en:Prezzo (restaurant)",name:"Prezzo"},removeTags:{amenity:"restaurant",brand:"Prezzo","brand:wikidata":"Q7242489","brand:wikipedia":"en:Prezzo (restaurant)",name:"Prezzo"},matchScore:2,suggestion:true},"amenity/restaurant/Red Lobster":{name:"Red Lobster",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q846301"},addTags:{amenity:"restaurant",brand:"Red Lobster","brand:wikidata":"Q846301","brand:wikipedia":"en:Red Lobster",cuisine:"seafood",name:"Red Lobster"},removeTags:{amenity:"restaurant",brand:"Red Lobster","brand:wikidata":"Q846301","brand:wikipedia":"en:Red Lobster",cuisine:"seafood",name:"Red Lobster"},matchScore:2,suggestion:true},"amenity/restaurant/Red Robin":{name:"Red Robin",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7304886"},addTags:{amenity:"restaurant",brand:"Red Robin","brand:wikidata":"Q7304886","brand:wikipedia":"en:Red Robin",name:"Red Robin"},removeTags:{amenity:"restaurant",brand:"Red Robin","brand:wikidata":"Q7304886","brand:wikipedia":"en:Red Robin",name:"Red Robin"},matchScore:2,suggestion:true},"amenity/restaurant/Round Table Pizza":{name:"Round Table Pizza",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7371139"},addTags:{amenity:"restaurant",brand:"Round Table Pizza","brand:wikidata":"Q7371139","brand:wikipedia":"en:Round Table Pizza",cuisine:"pizza",name:"Round Table Pizza"},removeTags:{amenity:"restaurant",brand:"Round Table Pizza","brand:wikidata":"Q7371139","brand:wikipedia":"en:Round Table Pizza",cuisine:"pizza",name:"Round Table Pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Ruby Tuesday":{name:"Ruby Tuesday",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7376400"},addTags:{amenity:"restaurant",brand:"Ruby Tuesday","brand:wikidata":"Q7376400","brand:wikipedia":"en:Ruby Tuesday (restaurant)",name:"Ruby Tuesday"},removeTags:{amenity:"restaurant",brand:"Ruby Tuesday","brand:wikidata":"Q7376400","brand:wikipedia":"en:Ruby Tuesday (restaurant)",name:"Ruby Tuesday"},matchScore:2,suggestion:true},"amenity/restaurant/Shakey's":{name:"Shakey's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q6134929"},addTags:{amenity:"restaurant",brand:"Shakey's","brand:wikidata":"Q6134929","brand:wikipedia":"en:Shakey's Pizza",name:"Shakey's"},removeTags:{amenity:"restaurant",brand:"Shakey's","brand:wikidata":"Q6134929","brand:wikipedia":"en:Shakey's Pizza",name:"Shakey's"},matchScore:2,suggestion:true},"amenity/restaurant/Shari's":{name:"Shari's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7489612"},addTags:{amenity:"restaurant",brand:"Shari's","brand:wikidata":"Q7489612","brand:wikipedia":"en:Shari's Cafe & Pies",name:"Shari's"},removeTags:{amenity:"restaurant",brand:"Shari's","brand:wikidata":"Q7489612","brand:wikipedia":"en:Shari's Cafe & Pies",name:"Shari's"},matchScore:2,suggestion:true},"amenity/restaurant/Shoney's":{name:"Shoney's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7500392"},addTags:{amenity:"restaurant",brand:"Shoney's","brand:wikidata":"Q7500392","brand:wikipedia":"en:Shoney's",name:"Shoney's"},removeTags:{amenity:"restaurant",brand:"Shoney's","brand:wikidata":"Q7500392","brand:wikipedia":"en:Shoney's",name:"Shoney's"},matchScore:2,suggestion:true},"amenity/restaurant/Sizzler":{name:"Sizzler",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1848822"},addTags:{amenity:"restaurant",brand:"Sizzler","brand:wikidata":"Q1848822","brand:wikipedia":"en:Sizzler",name:"Sizzler"},removeTags:{amenity:"restaurant",brand:"Sizzler","brand:wikidata":"Q1848822","brand:wikipedia":"en:Sizzler",name:"Sizzler"},matchScore:2,suggestion:true},"amenity/restaurant/Skyline Chili":{name:"Skyline Chili",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q151224"},addTags:{amenity:"restaurant",brand:"Skyline Chili","brand:wikidata":"Q151224","brand:wikipedia":"en:Skyline Chili",name:"Skyline Chili"},removeTags:{amenity:"restaurant",brand:"Skyline Chili","brand:wikidata":"Q151224","brand:wikipedia":"en:Skyline Chili",name:"Skyline Chili"},matchScore:2,suggestion:true},"amenity/restaurant/Smitty's":{name:"Smitty's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7545728"},addTags:{amenity:"restaurant",brand:"Smitty's","brand:wikidata":"Q7545728","brand:wikipedia":"en:Smitty's",name:"Smitty's"},removeTags:{amenity:"restaurant",brand:"Smitty's","brand:wikidata":"Q7545728","brand:wikipedia":"en:Smitty's",name:"Smitty's"},matchScore:2,suggestion:true},"amenity/restaurant/Spur":{name:"Spur",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7581546"},addTags:{amenity:"restaurant",brand:"Spur","brand:wikidata":"Q7581546","brand:wikipedia":"en:Spur Steak Ranches",name:"Spur"},removeTags:{amenity:"restaurant",brand:"Spur","brand:wikidata":"Q7581546","brand:wikipedia":"en:Spur Steak Ranches",name:"Spur"},matchScore:2,suggestion:true},"amenity/restaurant/Steak 'n Shake":{name:"Steak 'n Shake",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7605233"},addTags:{amenity:"restaurant",brand:"Steak 'n Shake","brand:wikidata":"Q7605233","brand:wikipedia":"en:Steak 'n Shake",cuisine:"burger",name:"Steak 'n Shake"},removeTags:{amenity:"restaurant",brand:"Steak 'n Shake","brand:wikidata":"Q7605233","brand:wikipedia":"en:Steak 'n Shake",cuisine:"burger",name:"Steak 'n Shake"},matchScore:2,suggestion:true},"amenity/restaurant/Sunset Grill":{name:"Sunset Grill",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7641264"},addTags:{amenity:"restaurant",brand:"Sunset Grill","brand:wikidata":"Q7641264","brand:wikipedia":"en:Sunset Grill (restaurant)",name:"Sunset Grill"},removeTags:{amenity:"restaurant",brand:"Sunset Grill","brand:wikidata":"Q7641264","brand:wikipedia":"en:Sunset Grill (restaurant)",name:"Sunset Grill"},matchScore:2,suggestion:true},"amenity/restaurant/Swiss Chalet":{name:"Swiss Chalet",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q2372909"},addTags:{amenity:"restaurant",brand:"Swiss Chalet","brand:wikidata":"Q2372909","brand:wikipedia":"en:Swiss Chalet",name:"Swiss Chalet"},removeTags:{amenity:"restaurant",brand:"Swiss Chalet","brand:wikidata":"Q2372909","brand:wikipedia":"en:Swiss Chalet",name:"Swiss Chalet"},matchScore:2,suggestion:true},"amenity/restaurant/TGI Friday's":{name:"TGI Friday's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1524184"},addTags:{amenity:"restaurant",brand:"TGI Friday's","brand:wikidata":"Q1524184","brand:wikipedia":"en:TGI Fridays",name:"TGI Friday's"},removeTags:{amenity:"restaurant",brand:"TGI Friday's","brand:wikidata":"Q1524184","brand:wikipedia":"en:TGI Fridays",name:"TGI Friday's"},matchScore:2,suggestion:true},"amenity/restaurant/Texas Roadhouse":{name:"Texas Roadhouse",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7707945"},addTags:{amenity:"restaurant",brand:"Texas Roadhouse","brand:wikidata":"Q7707945","brand:wikipedia":"en:Texas Roadhouse",name:"Texas Roadhouse"},removeTags:{amenity:"restaurant",brand:"Texas Roadhouse","brand:wikidata":"Q7707945","brand:wikipedia":"en:Texas Roadhouse",name:"Texas Roadhouse"},matchScore:2,suggestion:true},"amenity/restaurant/The Cheesecake Factory":{name:"The Cheesecake Factory",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1045842"},addTags:{amenity:"restaurant",brand:"The Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",name:"The Cheesecake Factory"},removeTags:{amenity:"restaurant",brand:"The Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",name:"The Cheesecake Factory"},matchScore:2,suggestion:true},"amenity/restaurant/The Keg":{name:"The Keg",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7744066"},addTags:{amenity:"restaurant",brand:"The Keg","brand:wikidata":"Q7744066","brand:wikipedia":"en:The Keg",name:"The Keg"},removeTags:{amenity:"restaurant",brand:"The Keg","brand:wikidata":"Q7744066","brand:wikipedia":"en:The Keg",name:"The Keg"},matchScore:2,suggestion:true},"amenity/restaurant/Toby Carvery":{name:"Toby Carvery",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7811777"},addTags:{amenity:"restaurant",brand:"Toby Carvery","brand:wikidata":"Q7811777","brand:wikipedia":"en:Toby Carvery",name:"Toby Carvery"},removeTags:{amenity:"restaurant",brand:"Toby Carvery","brand:wikidata":"Q7811777","brand:wikipedia":"en:Toby Carvery",name:"Toby Carvery"},matchScore:2,suggestion:true},"amenity/restaurant/Toks":{name:"Toks",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q48835586"},addTags:{amenity:"restaurant",brand:"Toks","brand:wikidata":"Q48835586","brand:wikipedia":"en:Toks",name:"Toks"},removeTags:{amenity:"restaurant",brand:"Toks","brand:wikidata":"Q48835586","brand:wikipedia":"en:Toks",name:"Toks"},matchScore:2,suggestion:true},"amenity/restaurant/Tony Roma's":{name:"Tony Roma's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q2213883"},addTags:{amenity:"restaurant",brand:"Tony Roma's","brand:wikidata":"Q2213883","brand:wikipedia":"en:Tony Roma's",name:"Tony Roma's"},removeTags:{amenity:"restaurant",brand:"Tony Roma's","brand:wikidata":"Q2213883","brand:wikipedia":"en:Tony Roma's",name:"Tony Roma's"},matchScore:2,suggestion:true},"amenity/restaurant/Vapiano":{name:"Vapiano",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q506252"},addTags:{amenity:"restaurant",brand:"Vapiano","brand:wikidata":"Q506252","brand:wikipedia":"en:Vapiano",cuisine:"italian",name:"Vapiano"},removeTags:{amenity:"restaurant",brand:"Vapiano","brand:wikidata":"Q506252","brand:wikipedia":"en:Vapiano",cuisine:"italian",name:"Vapiano"},matchScore:2,suggestion:true},"amenity/restaurant/Village Inn":{name:"Village Inn",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7930659"},addTags:{amenity:"restaurant",brand:"Village Inn","brand:wikidata":"Q7930659","brand:wikipedia":"en:Village Inn",name:"Village Inn"},removeTags:{amenity:"restaurant",brand:"Village Inn","brand:wikidata":"Q7930659","brand:wikipedia":"en:Village Inn",name:"Village Inn"},matchScore:2,suggestion:true},"amenity/restaurant/Vips":{name:"Vips",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q12599540"},addTags:{amenity:"restaurant",brand:"Vips","brand:wikidata":"Q12599540","brand:wikipedia":"en:VIPS (restaurant)",name:"Vips"},removeTags:{amenity:"restaurant",brand:"Vips","brand:wikidata":"Q12599540","brand:wikipedia":"en:VIPS (restaurant)",name:"Vips"},matchScore:2,suggestion:true},"amenity/restaurant/Waffle House":{name:"Waffle House",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1701206"},addTags:{amenity:"restaurant",brand:"Waffle House","brand:wikidata":"Q1701206","brand:wikipedia":"en:Waffle House",name:"Waffle House"},removeTags:{amenity:"restaurant",brand:"Waffle House","brand:wikidata":"Q1701206","brand:wikipedia":"en:Waffle House",name:"Waffle House"},matchScore:2,suggestion:true},"amenity/restaurant/Wagamama":{name:"Wagamama",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q503715"},addTags:{amenity:"restaurant",brand:"Wagamama","brand:wikidata":"Q503715","brand:wikipedia":"en:Wagamama",name:"Wagamama"},removeTags:{amenity:"restaurant",brand:"Wagamama","brand:wikidata":"Q503715","brand:wikipedia":"en:Wagamama",name:"Wagamama"},matchScore:2,suggestion:true},"amenity/restaurant/Wasabi":{name:"Wasabi",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q23891278"},addTags:{amenity:"restaurant",brand:"Wasabi","brand:wikidata":"Q23891278","brand:wikipedia":"en:Wasabi (restaurant)",name:"Wasabi"},removeTags:{amenity:"restaurant",brand:"Wasabi","brand:wikidata":"Q23891278","brand:wikipedia":"en:Wasabi (restaurant)",name:"Wasabi"},matchScore:2,suggestion:true},"amenity/restaurant/White Spot":{name:"White Spot",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7995414"},addTags:{amenity:"restaurant",brand:"White Spot","brand:wikidata":"Q7995414","brand:wikipedia":"en:White Spot",name:"White Spot"},removeTags:{amenity:"restaurant",brand:"White Spot","brand:wikidata":"Q7995414","brand:wikipedia":"en:White Spot",name:"White Spot"},matchScore:2,suggestion:true},"amenity/restaurant/Wingstop":{name:"Wingstop",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q8025339"},addTags:{amenity:"restaurant",brand:"Wingstop","brand:wikidata":"Q8025339","brand:wikipedia":"en:Wingstop",name:"Wingstop"},removeTags:{amenity:"restaurant",brand:"Wingstop","brand:wikidata":"Q8025339","brand:wikipedia":"en:Wingstop",name:"Wingstop"},matchScore:2,suggestion:true},"amenity/restaurant/Zizzi":{name:"Zizzi",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q8072944"},addTags:{amenity:"restaurant",brand:"Zizzi","brand:wikidata":"Q8072944","brand:wikipedia":"en:Zizzi",name:"Zizzi"},removeTags:{amenity:"restaurant",brand:"Zizzi","brand:wikidata":"Q8072944","brand:wikipedia":"en:Zizzi",name:"Zizzi"},matchScore:2,suggestion:true},"amenity/restaurant/はなまるうどん":{name:"はなまるうどん",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11275674"},addTags:{amenity:"restaurant",brand:"はなまるうどん","brand:en":"Hanamarūdon","brand:wikidata":"Q11275674","brand:wikipedia":"ja:はなまるうどん",name:"はなまるうどん","name:en":"Hanamarūdon"},removeTags:{amenity:"restaurant",brand:"はなまるうどん","brand:en":"Hanamarūdon","brand:wikidata":"Q11275674","brand:wikipedia":"ja:はなまるうどん",name:"はなまるうどん","name:en":"Hanamarūdon"},matchScore:2,suggestion:true},"amenity/restaurant/びっくりドンキー":{name:"びっくりドンキー",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11276815"},addTags:{amenity:"restaurant",brand:"びっくりドンキー","brand:en":"Bikkuri Donkey","brand:wikidata":"Q11276815","brand:wikipedia":"ja:びっくりドンキー",name:"びっくりドンキー","name:en":"Bikkuri Donkey"},removeTags:{amenity:"restaurant",brand:"びっくりドンキー","brand:en":"Bikkuri Donkey","brand:wikidata":"Q11276815","brand:wikipedia":"ja:びっくりドンキー",name:"びっくりドンキー","name:en":"Bikkuri Donkey"},matchScore:2,suggestion:true},"amenity/restaurant/やよい軒":{name:"やよい軒",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11280577"},addTags:{amenity:"restaurant",brand:"やよい軒","brand:en":"YAYOI","brand:wikidata":"Q11280577","brand:wikipedia":"ja:やよい軒",name:"やよい軒","name:en":"YAYOI"},removeTags:{amenity:"restaurant",brand:"やよい軒","brand:en":"YAYOI","brand:wikidata":"Q11280577","brand:wikipedia":"ja:やよい軒",name:"やよい軒","name:en":"YAYOI"},matchScore:2,suggestion:true},"amenity/restaurant/ガスト":{name:"ガスト",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11253593"},addTags:{amenity:"restaurant",brand:"ガスト","brand:en":"Gusto","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",name:"ガスト","name:en":"Gusto"},removeTags:{amenity:"restaurant",brand:"ガスト","brand:en":"Gusto","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",name:"ガスト","name:en":"Gusto"},matchScore:2,suggestion:true},"amenity/restaurant/ココス":{name:"ココス",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11301951"},addTags:{amenity:"restaurant",brand:"ココス","brand:en":"Coco's","brand:wikidata":"Q11301951","brand:wikipedia":"ja:ココスジャパン",name:"ココス","name:en":"Coco's"},removeTags:{amenity:"restaurant",brand:"ココス","brand:en":"Coco's","brand:wikidata":"Q11301951","brand:wikipedia":"ja:ココスジャパン",name:"ココス","name:en":"Coco's"},matchScore:2,suggestion:true},"amenity/restaurant/サイゼリヤ":{name:"サイゼリヤ",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q886564"},addTags:{amenity:"restaurant",brand:"サイゼリヤ","brand:en":"Saizeriya","brand:wikidata":"Q886564","brand:wikipedia":"en:Saizeriya",name:"サイゼリヤ","name:en":"Saizeriya"},removeTags:{amenity:"restaurant",brand:"サイゼリヤ","brand:en":"Saizeriya","brand:wikidata":"Q886564","brand:wikipedia":"en:Saizeriya",name:"サイゼリヤ","name:en":"Saizeriya"},matchScore:2,suggestion:true},"amenity/restaurant/ジョイフル":{name:"ジョイフル",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11310517"},addTags:{amenity:"restaurant",brand:"ジョイフル","brand:en":"Joyfull","brand:wikidata":"Q11310517","brand:wikipedia":"ja:ジョイフル",name:"ジョイフル","name:en":"Joyfull"},removeTags:{amenity:"restaurant",brand:"ジョイフル","brand:en":"Joyfull","brand:wikidata":"Q11310517","brand:wikipedia":"ja:ジョイフル",name:"ジョイフル","name:en":"Joyfull"},matchScore:2,suggestion:true},"amenity/restaurant/ジョナサン":{name:"ジョナサン",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11310628"},addTags:{amenity:"restaurant",brand:"ジョナサン","brand:en":"Jonathan's","brand:wikidata":"Q11310628","brand:wikipedia":"ja:ジョナサン (ファミリーレストラン)",name:"ジョナサン","name:en":"Jonathan's"},removeTags:{amenity:"restaurant",brand:"ジョナサン","brand:en":"Jonathan's","brand:wikidata":"Q11310628","brand:wikipedia":"ja:ジョナサン (ファミリーレストラン)",name:"ジョナサン","name:en":"Jonathan's"},matchScore:2,suggestion:true},"amenity/restaurant/ジョリーパスタ":{name:"ジョリーパスタ",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q10852718"},addTags:{amenity:"restaurant",brand:"ジョリーパスタ","brand:en":"Jolly-Pasta","brand:wikidata":"Q10852718","brand:wikipedia":"ja:ジョリーパスタ",name:"ジョリーパスタ","name:en":"Jolly-Pasta"},removeTags:{amenity:"restaurant",brand:"ジョリーパスタ","brand:en":"Jolly-Pasta","brand:wikidata":"Q10852718","brand:wikipedia":"ja:ジョリーパスタ",name:"ジョリーパスタ","name:en":"Jolly-Pasta"},matchScore:2,suggestion:true},"amenity/restaurant/デニーズ":{name:"デニーズ",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11320661"},addTags:{amenity:"restaurant",brand:"デニーズ","brand:en":"Denny's","brand:wikidata":"Q11320661","brand:wikipedia":"ja:デニーズ (日本)",name:"デニーズ","name:en":"Denny's"},removeTags:{amenity:"restaurant",brand:"デニーズ","brand:en":"Denny's","brand:wikidata":"Q11320661","brand:wikipedia":"ja:デニーズ (日本)",name:"デニーズ","name:en":"Denny's"},matchScore:2,suggestion:true},"amenity/restaurant/バーミヤン":{name:"バーミヤン",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11328598"},addTags:{amenity:"restaurant",brand:"バーミヤン","brand:en":"Bamiyan","brand:wikidata":"Q11328598","brand:wikipedia":"ja:バーミヤン (レストランチェーン)",name:"バーミヤン","name:en":"Bamiyan"},removeTags:{amenity:"restaurant",brand:"バーミヤン","brand:en":"Bamiyan","brand:wikidata":"Q11328598","brand:wikipedia":"ja:バーミヤン (レストランチェーン)",name:"バーミヤン","name:en":"Bamiyan"},matchScore:2,suggestion:true},"amenity/restaurant/ビッグボーイ":{name:"ビッグボーイ",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4386779"},addTags:{amenity:"restaurant",brand:"ビッグボーイ","brand:en":"Big Boy Restaurants","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",name:"ビッグボーイ","name:en":"Big Boy Restaurants"},removeTags:{amenity:"restaurant",brand:"ビッグボーイ","brand:en":"Big Boy Restaurants","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",name:"ビッグボーイ","name:en":"Big Boy Restaurants"},matchScore:2,suggestion:true},"amenity/restaurant/リンガーハット":{name:"リンガーハット",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7334856"},addTags:{amenity:"restaurant",brand:"リンガーハット","brand:en":"Ringer Hut","brand:wikidata":"Q7334856","brand:wikipedia":"en:Ringer Hut",name:"リンガーハット","name:en":"Ringer Hut"},removeTags:{amenity:"restaurant",brand:"リンガーハット","brand:en":"Ringer Hut","brand:wikidata":"Q7334856","brand:wikipedia":"en:Ringer Hut",name:"リンガーハット","name:en":"Ringer Hut"},matchScore:2,suggestion:true},"amenity/restaurant/ロイヤルホスト":{name:"ロイヤルホスト",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11120884"},addTags:{amenity:"restaurant",brand:"ロイヤルホスト","brand:en":"Royal Host","brand:wikidata":"Q11120884","brand:wikipedia":"ja:ロイヤルホスト",name:"ロイヤルホスト","name:en":"Royal Host"},removeTags:{amenity:"restaurant",brand:"ロイヤルホスト","brand:en":"Royal Host","brand:wikidata":"Q11120884","brand:wikipedia":"ja:ロイヤルホスト",name:"ロイヤルホスト","name:en":"Royal Host"},matchScore:2,suggestion:true},"amenity/restaurant/丸亀製麺":{name:"丸亀製麺",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q10877253"},addTags:{amenity:"restaurant",brand:"丸亀製麺","brand:en":"Marugame Seimen","brand:wikidata":"Q10877253","brand:wikipedia":"ja:丸亀製麺",cuisine:"noodle",name:"丸亀製麺","name:en":"Marugame Seimen","name:ko":"마루가메 제면"},removeTags:{amenity:"restaurant",brand:"丸亀製麺","brand:en":"Marugame Seimen","brand:wikidata":"Q10877253","brand:wikipedia":"ja:丸亀製麺",cuisine:"noodle",name:"丸亀製麺","name:en":"Marugame Seimen","name:ko":"마루가메 제면"},matchScore:2,suggestion:true},"amenity/restaurant/和食さと":{name:"和食さと",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11304897"},addTags:{amenity:"restaurant",brand:"和食さと","brand:en":"Washoku Sato","brand:wikidata":"Q11304897","brand:wikipedia":"ja:SRSホールディングス",name:"和食さと","name:en":"Washoku Sato"},removeTags:{amenity:"restaurant",brand:"和食さと","brand:en":"Washoku Sato","brand:wikidata":"Q11304897","brand:wikipedia":"ja:SRSホールディングス",name:"和食さと","name:en":"Washoku Sato"},matchScore:2,suggestion:true},"amenity/restaurant/夢庵":{name:"夢庵",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11253593"},addTags:{amenity:"restaurant",brand:"夢庵","brand:en":"Yumean","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",name:"夢庵","name:en":"Yumean"},removeTags:{amenity:"restaurant",brand:"夢庵","brand:en":"Yumean","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",name:"夢庵","name:en":"Yumean"},matchScore:2,suggestion:true},"amenity/restaurant/大戸屋":{name:"大戸屋",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11435522"},addTags:{amenity:"restaurant",brand:"大戸屋","brand:en":"Ootoya","brand:wikidata":"Q11435522","brand:wikipedia":"ja:大戸屋ホールディングス",cuisine:"japanese",name:"大戸屋","name:en":"Ootoya"},removeTags:{amenity:"restaurant",brand:"大戸屋","brand:en":"Ootoya","brand:wikidata":"Q11435522","brand:wikipedia":"ja:大戸屋ホールディングス",cuisine:"japanese",name:"大戸屋","name:en":"Ootoya"},matchScore:2,suggestion:true},"amenity/restaurant/大阪王将":{name:"大阪王将",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q48743717"},addTags:{amenity:"restaurant",brand:"大阪王将","brand:en":"Osaka Ohsho","brand:wikidata":"Q48743717","brand:wikipedia":"ja:大阪王将",name:"大阪王将","name:en":"Osaka Ohsho"},removeTags:{amenity:"restaurant",brand:"大阪王将","brand:en":"Osaka Ohsho","brand:wikidata":"Q48743717","brand:wikipedia":"ja:大阪王将",name:"大阪王将","name:en":"Osaka Ohsho"},matchScore:2,suggestion:true},"amenity/restaurant/天下一品":{name:"天下一品",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11442172"},addTags:{amenity:"restaurant",brand:"天下一品","brand:en":"Tenkaippin","brand:wikidata":"Q11442172","brand:wikipedia":"en:Tenkaippin",name:"天下一品","name:en":"Tenkaippin"},removeTags:{amenity:"restaurant",brand:"天下一品","brand:en":"Tenkaippin","brand:wikidata":"Q11442172","brand:wikipedia":"en:Tenkaippin",name:"天下一品","name:en":"Tenkaippin"},matchScore:2,suggestion:true},"amenity/restaurant/安楽亭":{name:"安楽亭",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11450866"},addTags:{amenity:"restaurant",brand:"安楽亭","brand:en":"Anrakutei","brand:wikidata":"Q11450866","brand:wikipedia":"ja:安楽亭",cuisine:"barbecue",name:"安楽亭","name:en":"Anrakutei"},removeTags:{amenity:"restaurant",brand:"安楽亭","brand:en":"Anrakutei","brand:wikidata":"Q11450866","brand:wikipedia":"ja:安楽亭",cuisine:"barbecue",name:"安楽亭","name:en":"Anrakutei"},matchScore:2,suggestion:true},"amenity/restaurant/日高屋":{name:"日高屋",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11326050"},addTags:{amenity:"restaurant",brand:"日高屋","brand:en":"Hidakaya","brand:wikidata":"Q11326050","brand:wikipedia":"ja:ハイデイ日高",cuisine:"noodle",name:"日高屋","name:en":"Hidakaya"},removeTags:{amenity:"restaurant",brand:"日高屋","brand:en":"Hidakaya","brand:wikidata":"Q11326050","brand:wikipedia":"ja:ハイデイ日高",cuisine:"noodle",name:"日高屋","name:en":"Hidakaya"},matchScore:2,suggestion:true},"amenity/restaurant/牛角":{name:"牛角",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11349387"},addTags:{amenity:"restaurant",brand:"牛角","brand:en":"Gyū-Kaku","brand:wikidata":"Q11349387","brand:wikipedia":"en:Gyu-Kaku",cuisine:"barbecue",name:"牛角","name:en":"Gyū-Kaku"},removeTags:{amenity:"restaurant",brand:"牛角","brand:en":"Gyū-Kaku","brand:wikidata":"Q11349387","brand:wikipedia":"en:Gyu-Kaku",cuisine:"barbecue",name:"牛角","name:en":"Gyū-Kaku"},matchScore:2,suggestion:true},"amenity/restaurant/餃子の王将":{name:"餃子の王将",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11666805"},addTags:{amenity:"restaurant",brand:"餃子の王将","brand:en":"Gyoza no Ohsho","brand:wikidata":"Q11666805","brand:wikipedia":"en:Gyoza no Ohsho",name:"餃子の王将","name:en":"Gyoza no Ohsho"},removeTags:{amenity:"restaurant",brand:"餃子の王将","brand:en":"Gyoza no Ohsho","brand:wikidata":"Q11666805","brand:wikipedia":"en:Gyoza no Ohsho",name:"餃子の王将","name:en":"Gyoza no Ohsho"},matchScore:2,suggestion:true},"amenity/vending_machine/DHL Packstation":{name:"DHL Packstation",icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],tags:{amenity:"vending_machine","brand:wikidata":"Q489815"},addTags:{amenity:"vending_machine",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL Packstation",operator:"DHL",vending:"parcel_pickup;parcel_mail_in"},removeTags:{amenity:"vending_machine",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL Packstation",operator:"DHL",vending:"parcel_pickup;parcel_mail_in"},matchScore:2,suggestion:true},"amenity/vending_machine/KKM":{name:"KKM",icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],tags:{amenity:"vending_machine","brand:wikidata":"Q57515549"},addTags:{amenity:"vending_machine",brand:"KKM","brand:wikidata":"Q57515549",name:"KKM",vending:"public_transport_tickets"},removeTags:{amenity:"vending_machine",brand:"KKM","brand:wikidata":"Q57515549",name:"KKM",vending:"public_transport_tickets"},matchScore:2,suggestion:true},"amenity/vending_machine/Paczkomat InPost":{name:"Paczkomat InPost",icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],tags:{amenity:"vending_machine","brand:wikidata":"Q3182097"},addTags:{amenity:"vending_machine",brand:"InPost","brand:wikidata":"Q3182097","brand:wikipedia":"pl:InPost",name:"Paczkomat InPost",vending:"parcel_pickup;parcel_mail_in"},removeTags:{amenity:"vending_machine",brand:"InPost","brand:wikidata":"Q3182097","brand:wikipedia":"pl:InPost",name:"Paczkomat InPost",vending:"parcel_pickup;parcel_mail_in"},matchScore:2,suggestion:true},"amenity/vending_machine/Redbox":{name:"Redbox",icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],tags:{amenity:"vending_machine","brand:wikidata":"Q7305489"},addTags:{amenity:"vending_machine",brand:"Redbox","brand:wikidata":"Q7305489","brand:wikipedia":"en:Redbox",name:"Redbox"},removeTags:{amenity:"vending_machine",brand:"Redbox","brand:wikidata":"Q7305489","brand:wikipedia":"en:Redbox",name:"Redbox"},matchScore:2,suggestion:true},"amenity/veterinary/Banfield Pet Hospital":{name:"Banfield Pet Hospital",icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"veterinary","brand:wikidata":"Q2882416"},addTags:{amenity:"veterinary",brand:"Banfield Pet Hospital","brand:wikidata":"Q2882416","brand:wikipedia":"en:Banfield Pet Hospital",name:"Banfield Pet Hospital"},removeTags:{amenity:"veterinary",brand:"Banfield Pet Hospital","brand:wikidata":"Q2882416","brand:wikipedia":"en:Banfield Pet Hospital",name:"Banfield Pet Hospital"},matchScore:2,suggestion:true},"leisure/fitness_centre/24 Hour Fitness":{name:"24 Hour Fitness",icon:"fas-dumbbell",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q4631849"},addTags:{brand:"24 Hour Fitness","brand:wikidata":"Q4631849","brand:wikipedia":"en:24 Hour Fitness",leisure:"fitness_centre",name:"24 Hour Fitness"},removeTags:{brand:"24 Hour Fitness","brand:wikidata":"Q4631849","brand:wikipedia":"en:24 Hour Fitness",leisure:"fitness_centre",name:"24 Hour Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/Anytime Fitness":{name:"Anytime Fitness",icon:"fas-dumbbell",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q4778364"},addTags:{brand:"Anytime Fitness","brand:wikidata":"Q4778364","brand:wikipedia":"en:Anytime Fitness",leisure:"fitness_centre",name:"Anytime Fitness"},removeTags:{brand:"Anytime Fitness","brand:wikidata":"Q4778364","brand:wikipedia":"en:Anytime Fitness",leisure:"fitness_centre",name:"Anytime Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/Curves":{name:"Curves",icon:"fas-dumbbell",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q5196080"},addTags:{brand:"Curves","brand:wikidata":"Q5196080","brand:wikipedia":"en:Curves International",leisure:"fitness_centre",name:"Curves"},removeTags:{brand:"Curves","brand:wikidata":"Q5196080","brand:wikipedia":"en:Curves International",leisure:"fitness_centre",name:"Curves"},matchScore:2,suggestion:true},"leisure/fitness_centre/Gold's Gym":{name:"Gold's Gym",icon:"fas-dumbbell",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q1536234"},addTags:{brand:"Gold's Gym","brand:wikidata":"Q1536234","brand:wikipedia":"en:Gold's Gym",leisure:"fitness_centre",name:"Gold's Gym"},removeTags:{brand:"Gold's Gym","brand:wikidata":"Q1536234","brand:wikipedia":"en:Gold's Gym",leisure:"fitness_centre",name:"Gold's Gym"},matchScore:2,suggestion:true},"leisure/fitness_centre/LA Fitness":{name:"LA Fitness",icon:"fas-dumbbell",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q6457180"},addTags:{brand:"LA Fitness","brand:wikidata":"Q6457180","brand:wikipedia":"en:LA Fitness",leisure:"fitness_centre",name:"LA Fitness"},removeTags:{brand:"LA Fitness","brand:wikidata":"Q6457180","brand:wikipedia":"en:LA Fitness",leisure:"fitness_centre",name:"LA Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/Planet Fitness":{name:"Planet Fitness",icon:"fas-dumbbell",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q7201095"},addTags:{brand:"Planet Fitness","brand:wikidata":"Q7201095","brand:wikipedia":"en:Planet Fitness",leisure:"fitness_centre",name:"Planet Fitness"},removeTags:{brand:"Planet Fitness","brand:wikidata":"Q7201095","brand:wikipedia":"en:Planet Fitness",leisure:"fitness_centre",name:"Planet Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/Snap Fitness":{name:"Snap Fitness",icon:"fas-dumbbell",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q7547254"},addTags:{brand:"Snap Fitness","brand:wikidata":"Q7547254","brand:wikipedia":"en:Snap Fitness",leisure:"fitness_centre",name:"Snap Fitness"},removeTags:{brand:"Snap Fitness","brand:wikidata":"Q7547254","brand:wikipedia":"en:Snap Fitness",leisure:"fitness_centre",name:"Snap Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/YMCA":{name:"YMCA",icon:"fas-dumbbell",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q157169"},addTags:{brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",leisure:"fitness_centre",name:"YMCA"},removeTags:{brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",leisure:"fitness_centre",name:"YMCA"},matchScore:2,suggestion:true},"shop/alcohol/Alko":{name:"Alko",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q1849187"},addTags:{brand:"Alko","brand:wikidata":"Q1849187","brand:wikipedia":"en:Alko",name:"Alko",shop:"alcohol"},removeTags:{brand:"Alko","brand:wikidata":"Q1849187","brand:wikipedia":"en:Alko",name:"Alko",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/BC Liquor Store":{name:"BC Liquor Store",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q43079557"},addTags:{brand:"BC Liquor Store","brand:wikidata":"Q43079557","brand:wikipedia":"en:BC Liquor Stores",name:"BC Liquor Store",shop:"alcohol"},removeTags:{brand:"BC Liquor Store","brand:wikidata":"Q43079557","brand:wikipedia":"en:BC Liquor Stores",name:"BC Liquor Store",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/BWS":{name:"BWS",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q4836848"},addTags:{brand:"BWS","brand:wikidata":"Q4836848","brand:wikipedia":"en:BWS (liquor retailer)",name:"BWS",shop:"alcohol"},removeTags:{brand:"BWS","brand:wikidata":"Q4836848","brand:wikipedia":"en:BWS (liquor retailer)",name:"BWS",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Bargain Booze":{name:"Bargain Booze",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q16971315"},addTags:{brand:"Bargain Booze","brand:wikidata":"Q16971315","brand:wikipedia":"en:Bargain Booze",name:"Bargain Booze",shop:"alcohol"},removeTags:{brand:"Bargain Booze","brand:wikidata":"Q16971315","brand:wikipedia":"en:Bargain Booze",name:"Bargain Booze",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Dan Murphy's":{name:"Dan Murphy's",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q5214075"},addTags:{brand:"Dan Murphy's","brand:wikidata":"Q5214075","brand:wikipedia":"en:Dan Murphy's",name:"Dan Murphy's",shop:"alcohol"},removeTags:{brand:"Dan Murphy's","brand:wikidata":"Q5214075","brand:wikipedia":"en:Dan Murphy's",name:"Dan Murphy's",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/LCBO":{name:"LCBO",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q845263"},addTags:{brand:"LCBO","brand:wikidata":"Q845263","brand:wikipedia":"en:Liquor Control Board of Ontario",name:"LCBO",shop:"alcohol"},removeTags:{brand:"LCBO","brand:wikidata":"Q845263","brand:wikipedia":"en:Liquor Control Board of Ontario",name:"LCBO",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Liquorland":{name:"Liquorland",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q2283837"},addTags:{brand:"Liquorland","brand:wikidata":"Q2283837","brand:wikipedia":"en:Liquorland",name:"Liquorland",shop:"alcohol"},removeTags:{brand:"Liquorland","brand:wikidata":"Q2283837","brand:wikipedia":"en:Liquorland",name:"Liquorland",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Nicolas":{name:"Nicolas",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q3340012"},addTags:{brand:"Nicolas","brand:wikidata":"Q3340012","brand:wikipedia":"en:Nicolas (wine retailer)",name:"Nicolas",shop:"alcohol"},removeTags:{brand:"Nicolas","brand:wikidata":"Q3340012","brand:wikipedia":"en:Nicolas (wine retailer)",name:"Nicolas",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Systembolaget":{name:"Systembolaget",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q1476113"},addTags:{brand:"Systembolaget","brand:wikidata":"Q1476113","brand:wikipedia":"en:Systembolaget",name:"Systembolaget",shop:"alcohol"},removeTags:{brand:"Systembolaget","brand:wikidata":"Q1476113","brand:wikipedia":"en:Systembolaget",name:"Systembolaget",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/The Beer Store":{name:"The Beer Store",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q16243674"},addTags:{brand:"The Beer Store","brand:wikidata":"Q16243674","brand:wikipedia":"en:The Beer Store",name:"The Beer Store",shop:"alcohol"},removeTags:{brand:"The Beer Store","brand:wikidata":"Q16243674","brand:wikipedia":"en:The Beer Store",name:"The Beer Store",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Vinmonopolet":{name:"Vinmonopolet",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q1740534"},addTags:{brand:"Vinmonopolet","brand:wikidata":"Q1740534","brand:wikipedia":"en:Vinmonopolet",name:"Vinmonopolet",shop:"alcohol"},removeTags:{brand:"Vinmonopolet","brand:wikidata":"Q1740534","brand:wikipedia":"en:Vinmonopolet",name:"Vinmonopolet",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Красное & Белое":{name:"Красное & Белое",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q24933790"},addTags:{brand:"Красное & Белое","brand:en":"Red&White","brand:wikidata":"Q24933790","brand:wikipedia":"en:Red&White",name:"Красное & Белое","name:en":"Red&White",shop:"alcohol"},removeTags:{brand:"Красное & Белое","brand:en":"Red&White","brand:wikidata":"Q24933790","brand:wikipedia":"en:Red&White",name:"Красное & Белое","name:en":"Red&White",shop:"alcohol"},matchScore:2,suggestion:true},"shop/baby_goods/Babies R Us":{name:"Babies R Us",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"baby_goods","brand:wikidata":"Q696334"},addTags:{brand:"Babies R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Babies R Us",shop:"baby_goods"},removeTags:{brand:"Babies R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Babies R Us",shop:"baby_goods"},matchScore:2,suggestion:true},"shop/baby_goods/Mothercare":{name:"Mothercare",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"baby_goods","brand:wikidata":"Q136738"},addTags:{brand:"Mothercare","brand:wikidata":"Q136738","brand:wikipedia":"en:Mothercare",name:"Mothercare",shop:"baby_goods"},removeTags:{brand:"Mothercare","brand:wikidata":"Q136738","brand:wikipedia":"en:Mothercare",name:"Mothercare",shop:"baby_goods"},matchScore:2,suggestion:true},"shop/bakery/Bakers Delight":{name:"Bakers Delight",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q4849261"},addTags:{brand:"Bakers Delight","brand:wikidata":"Q4849261","brand:wikipedia":"en:Bakers Delight",name:"Bakers Delight",shop:"bakery"},removeTags:{brand:"Bakers Delight","brand:wikidata":"Q4849261","brand:wikipedia":"en:Bakers Delight",name:"Bakers Delight",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Cooplands":{name:"Cooplands",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q5167971"},addTags:{brand:"Cooplands","brand:wikidata":"Q5167971","brand:wikipedia":"en:Cooplands",name:"Cooplands",shop:"bakery"},removeTags:{brand:"Cooplands","brand:wikidata":"Q5167971","brand:wikipedia":"en:Cooplands",name:"Cooplands",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Der Beck":{name:"Der Beck",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1192443"},addTags:{brand:"Der Beck","brand:wikidata":"Q1192443","brand:wikipedia":"en:Der Beck",name:"Der Beck",shop:"bakery"},removeTags:{brand:"Der Beck","brand:wikidata":"Q1192443","brand:wikipedia":"en:Der Beck",name:"Der Beck",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Ditsch":{name:"Ditsch",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q911573"},addTags:{brand:"Ditsch","brand:wikidata":"Q911573","brand:wikipedia":"en:Ditsch",name:"Ditsch",shop:"bakery"},removeTags:{brand:"Ditsch","brand:wikidata":"Q911573","brand:wikipedia":"en:Ditsch",name:"Ditsch",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Greggs":{name:"Greggs",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3403981"},addTags:{brand:"Greggs","brand:wikidata":"Q3403981","brand:wikipedia":"en:Greggs",name:"Greggs",shop:"bakery"},removeTags:{brand:"Greggs","brand:wikidata":"Q3403981","brand:wikipedia":"en:Greggs",name:"Greggs",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Hofpfisterei":{name:"Hofpfisterei",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1623217"},addTags:{brand:"Hofpfisterei","brand:wikidata":"Q1623217","brand:wikipedia":"en:Hofpfisterei",name:"Hofpfisterei",shop:"bakery"},removeTags:{brand:"Hofpfisterei","brand:wikidata":"Q1623217","brand:wikipedia":"en:Hofpfisterei",name:"Hofpfisterei",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Kamps":{name:"Kamps",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1723381"},addTags:{brand:"Kamps","brand:wikidata":"Q1723381","brand:wikipedia":"de:Kamps (Unternehmen)",name:"Kamps",shop:"bakery"},removeTags:{brand:"Kamps","brand:wikidata":"Q1723381","brand:wikipedia":"de:Kamps (Unternehmen)",name:"Kamps",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/La Mie Câline":{name:"La Mie Câline",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3210704"},addTags:{brand:"La Mie Câline","brand:wikidata":"Q3210704","brand:wikipedia":"fr:La Mie câline",name:"La Mie Câline",shop:"bakery"},removeTags:{brand:"La Mie Câline","brand:wikidata":"Q3210704","brand:wikipedia":"fr:La Mie câline",name:"La Mie Câline",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Lila Bäcker":{name:"Lila Bäcker",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q57516591"},addTags:{brand:"Lila Bäcker","brand:wikidata":"Q57516591",name:"Lila Bäcker",shop:"bakery"},removeTags:{brand:"Lila Bäcker","brand:wikidata":"Q57516591",name:"Lila Bäcker",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Red Ribbon":{name:"Red Ribbon",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q7304789"},addTags:{brand:"Red Ribbon","brand:wikidata":"Q7304789","brand:wikipedia":"en:Red Ribbon Bakeshop",name:"Red Ribbon",shop:"bakery"},removeTags:{brand:"Red Ribbon","brand:wikidata":"Q7304789","brand:wikipedia":"en:Red Ribbon Bakeshop",name:"Red Ribbon",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Steinecke":{name:"Steinecke",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q57516278"},addTags:{brand:"Steinecke","brand:wikidata":"Q57516278",name:"Steinecke",shop:"bakery"},removeTags:{brand:"Steinecke","brand:wikidata":"Q57516278",name:"Steinecke",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/뚜레쥬르":{name:"뚜레쥬르",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3535609"},addTags:{brand:"뚜레쥬르","brand:en":"Tous Les Jours","brand:wikidata":"Q3535609","brand:wikipedia":"ko:뚜레쥬르",name:"뚜레쥬르","name:en":"Tous Les Jours",shop:"bakery"},removeTags:{brand:"뚜레쥬르","brand:en":"Tous Les Jours","brand:wikidata":"Q3535609","brand:wikipedia":"ko:뚜레쥬르",name:"뚜레쥬르","name:en":"Tous Les Jours",shop:"bakery"},matchScore:2,suggestion:true},"shop/beauty/Bath & Body Works":{name:"Bath & Body Works",icon:"maki-shop",fields:["name","operator","address","building_area","beauty","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beauty","brand:wikidata":"Q810773"},addTags:{brand:"Bath & Body Works","brand:wikidata":"Q810773","brand:wikipedia":"en:Bath & Body Works",name:"Bath & Body Works",shop:"beauty"},removeTags:{brand:"Bath & Body Works","brand:wikidata":"Q810773","brand:wikipedia":"en:Bath & Body Works",name:"Bath & Body Works",shop:"beauty"},matchScore:2,suggestion:true},"shop/beauty/European Wax Center":{name:"European Wax Center",icon:"maki-shop",fields:["name","operator","address","building_area","beauty","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beauty","brand:wikidata":"Q5413426"},addTags:{brand:"European Wax Center","brand:wikidata":"Q5413426","brand:wikipedia":"en:European Wax Center",name:"European Wax Center",shop:"beauty"},removeTags:{brand:"European Wax Center","brand:wikidata":"Q5413426","brand:wikipedia":"en:European Wax Center",name:"European Wax Center",shop:"beauty"},matchScore:2,suggestion:true},"shop/beauty/Ulta Beauty":{name:"Ulta Beauty",icon:"maki-shop",fields:["name","operator","address","building_area","beauty","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beauty","brand:wikidata":"Q7880076"},addTags:{brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"Ulta Beauty",shop:"beauty"},removeTags:{brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"Ulta Beauty",shop:"beauty"},matchScore:2,suggestion:true},"shop/beauty/Yves Rocher":{name:"Yves Rocher",icon:"maki-shop",fields:["name","operator","address","building_area","beauty","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beauty","brand:wikidata":"Q28496595"},addTags:{brand:"Yves Rocher","brand:wikidata":"Q28496595","brand:wikipedia":"fr:Yves Rocher (entreprise)",name:"Yves Rocher",shop:"beauty"},removeTags:{brand:"Yves Rocher","brand:wikidata":"Q28496595","brand:wikipedia":"fr:Yves Rocher (entreprise)",name:"Yves Rocher",shop:"beauty"},matchScore:2,suggestion:true},"shop/bed/Matratzen Concord":{name:"Matratzen Concord",icon:"maki-lodging",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q18629057"},addTags:{brand:"Matratzen Concord","brand:wikidata":"Q18629057","brand:wikipedia":"de:Matratzen Concord",name:"Matratzen Concord",shop:"bed"},removeTags:{brand:"Matratzen Concord","brand:wikidata":"Q18629057","brand:wikipedia":"de:Matratzen Concord",name:"Matratzen Concord",shop:"bed"},matchScore:2,suggestion:true},"shop/bed/Mattress Firm":{name:"Mattress Firm",icon:"maki-lodging",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q6791878"},addTags:{brand:"Mattress Firm","brand:wikidata":"Q6791878","brand:wikipedia":"en:Mattress Firm",name:"Mattress Firm",shop:"bed"},removeTags:{brand:"Mattress Firm","brand:wikidata":"Q6791878","brand:wikipedia":"en:Mattress Firm",name:"Mattress Firm",shop:"bed"},matchScore:2,suggestion:true},"shop/bed/Sleep Number":{name:"Sleep Number",icon:"maki-lodging",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q7447640"},addTags:{brand:"Sleep Number","brand:wikidata":"Q7447640","brand:wikipedia":"en:Sleep Number",name:"Sleep Number",shop:"bed"},removeTags:{brand:"Sleep Number","brand:wikidata":"Q7447640","brand:wikipedia":"en:Sleep Number",name:"Sleep Number",shop:"bed"},matchScore:2,suggestion:true},"shop/bed/Sleepy's":{name:"Sleepy's",icon:"maki-lodging",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q17088336"},addTags:{brand:"Sleepy's","brand:wikidata":"Q17088336","brand:wikipedia":"en:Sleepy's",name:"Sleepy's",shop:"bed"},removeTags:{brand:"Sleepy's","brand:wikidata":"Q17088336","brand:wikipedia":"en:Sleepy's",name:"Sleepy's",shop:"bed"},matchScore:2,suggestion:true},"shop/beverages/Edeka Getränkemarkt":{name:"Edeka Getränkemarkt",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q57450576"},addTags:{brand:"Edeka Getränkemarkt","brand:wikidata":"Q57450576",name:"Edeka Getränkemarkt",shop:"beverages"},removeTags:{brand:"Edeka Getränkemarkt","brand:wikidata":"Q57450576",name:"Edeka Getränkemarkt",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Hol'ab":{name:"Hol'ab",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q57557270"},addTags:{brand:"Hol'ab","brand:wikidata":"Q57557270",name:"Hol'ab",shop:"beverages"},removeTags:{brand:"Hol'ab","brand:wikidata":"Q57557270",name:"Hol'ab",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Rewe Getränkemarkt":{name:"Rewe Getränkemarkt",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q57519344"},addTags:{brand:"Rewe Getränkemarkt","brand:wikidata":"Q57519344",name:"Rewe Getränkemarkt",shop:"beverages"},removeTags:{brand:"Rewe Getränkemarkt","brand:wikidata":"Q57519344",name:"Rewe Getränkemarkt",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Trinkgut":{name:"Trinkgut",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q2453627"},addTags:{brand:"Trinkgut","brand:wikidata":"Q2453627","brand:wikipedia":"de:Trinkgut",name:"Trinkgut",shop:"beverages"},removeTags:{brand:"Trinkgut","brand:wikidata":"Q2453627","brand:wikipedia":"de:Trinkgut",name:"Trinkgut",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/清心福全":{name:"清心福全",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q10391229"},addTags:{brand:"清心福全","brand:wikidata":"Q10391229","brand:wikipedia":"zh:清心福全冷飲站",name:"清心福全",shop:"beverages"},removeTags:{brand:"清心福全","brand:wikidata":"Q10391229","brand:wikipedia":"zh:清心福全冷飲站",name:"清心福全",shop:"beverages"},matchScore:2,suggestion:true},"shop/bicycle/Evans Cycles":{name:"Evans Cycles",icon:"maki-bicycle",fields:["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bicycle","brand:wikidata":"Q5415901"},addTags:{brand:"Evans Cycles","brand:wikidata":"Q5415901","brand:wikipedia":"en:Evans Cycles",name:"Evans Cycles",shop:"bicycle"},removeTags:{brand:"Evans Cycles","brand:wikidata":"Q5415901","brand:wikipedia":"en:Evans Cycles",name:"Evans Cycles",shop:"bicycle"},matchScore:2,suggestion:true},"shop/bookmaker/Betfred":{name:"Betfred",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q4897425"},addTags:{brand:"Betfred","brand:wikidata":"Q4897425","brand:wikipedia":"en:Betfred",name:"Betfred",shop:"bookmaker"},removeTags:{brand:"Betfred","brand:wikidata":"Q4897425","brand:wikipedia":"en:Betfred",name:"Betfred",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Coral":{name:"Coral",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q54621344"},addTags:{brand:"Coral","brand:wikidata":"Q54621344","brand:wikipedia":"en:Coral (bookmaker)",name:"Coral",shop:"bookmaker"},removeTags:{brand:"Coral","brand:wikidata":"Q54621344","brand:wikipedia":"en:Coral (bookmaker)",name:"Coral",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Ladbrokes":{name:"Ladbrokes",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q1799875"},addTags:{brand:"Ladbrokes","brand:wikidata":"Q1799875","brand:wikipedia":"en:Ladbrokes Coral",name:"Ladbrokes",shop:"bookmaker"},removeTags:{brand:"Ladbrokes","brand:wikidata":"Q1799875","brand:wikipedia":"en:Ladbrokes Coral",name:"Ladbrokes",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Paddy Power":{name:"Paddy Power",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q3888718"},addTags:{brand:"Paddy Power","brand:wikidata":"Q3888718","brand:wikipedia":"en:Paddy Power",name:"Paddy Power",shop:"bookmaker"},removeTags:{brand:"Paddy Power","brand:wikidata":"Q3888718","brand:wikipedia":"en:Paddy Power",name:"Paddy Power",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Tipico":{name:"Tipico",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q15851003"},addTags:{brand:"Tipico","brand:wikidata":"Q15851003","brand:wikipedia":"en:Tipico",name:"Tipico",shop:"bookmaker"},removeTags:{brand:"Tipico","brand:wikidata":"Q15851003","brand:wikipedia":"en:Tipico",name:"Tipico",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/William Hill":{name:"William Hill",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q4053147"},addTags:{brand:"William Hill","brand:wikidata":"Q4053147","brand:wikipedia":"en:William Hill (bookmaker)",name:"William Hill",shop:"bookmaker"},removeTags:{brand:"William Hill","brand:wikidata":"Q4053147","brand:wikipedia":"en:William Hill (bookmaker)",name:"William Hill",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/ΟΠΑΠ":{name:"ΟΠΑΠ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q2007823"},addTags:{brand:"ΟΠΑΠ","brand:en":"OPAP","brand:wikidata":"Q2007823","brand:wikipedia":"en:OPAP",name:"ΟΠΑΠ","name:en":"OPAP",shop:"bookmaker"},removeTags:{brand:"ΟΠΑΠ","brand:en":"OPAP","brand:wikidata":"Q2007823","brand:wikipedia":"en:OPAP",name:"ΟΠΑΠ","name:en":"OPAP",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/books/Akademibokhandeln":{name:"Akademibokhandeln",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q10403918"},addTags:{brand:"Akademibokhandeln","brand:wikidata":"Q10403918","brand:wikipedia":"sv:Akademibokhandeln",name:"Akademibokhandeln",shop:"books"},removeTags:{brand:"Akademibokhandeln","brand:wikidata":"Q10403918","brand:wikipedia":"sv:Akademibokhandeln",name:"Akademibokhandeln",shop:"books"},matchScore:2,suggestion:true},"shop/books/Barnes & Noble":{name:"Barnes & Noble",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q795454"},addTags:{brand:"Barnes & Noble","brand:wikidata":"Q795454","brand:wikipedia":"en:Barnes & Noble",name:"Barnes & Noble",shop:"books"},removeTags:{brand:"Barnes & Noble","brand:wikidata":"Q795454","brand:wikipedia":"en:Barnes & Noble",name:"Barnes & Noble",shop:"books"},matchScore:2,suggestion:true},"shop/books/Chapters":{name:"Chapters",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q5073540"},addTags:{brand:"Chapters","brand:wikidata":"Q5073540","brand:wikipedia":"en:Chapters",name:"Chapters",shop:"books"},removeTags:{brand:"Chapters","brand:wikidata":"Q5073540","brand:wikipedia":"en:Chapters",name:"Chapters",shop:"books"},matchScore:2,suggestion:true},"shop/books/Empik":{name:"Empik",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q3045978"},addTags:{brand:"Empik","brand:wikidata":"Q3045978","brand:wikipedia":"en:Empik",name:"Empik",shop:"books"},removeTags:{brand:"Empik","brand:wikidata":"Q3045978","brand:wikipedia":"en:Empik",name:"Empik",shop:"books"},matchScore:2,suggestion:true},"shop/books/Fnac":{name:"Fnac",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q676585"},addTags:{brand:"Fnac","brand:wikidata":"Q676585","brand:wikipedia":"en:Fnac",name:"Fnac",shop:"books"},removeTags:{brand:"Fnac","brand:wikidata":"Q676585","brand:wikipedia":"en:Fnac",name:"Fnac",shop:"books"},matchScore:2,suggestion:true},"shop/books/Half Price Books":{name:"Half Price Books",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q5641744"},addTags:{brand:"Half Price Books","brand:wikidata":"Q5641744","brand:wikipedia":"en:Half Price Books",name:"Half Price Books",shop:"books"},removeTags:{brand:"Half Price Books","brand:wikidata":"Q5641744","brand:wikipedia":"en:Half Price Books",name:"Half Price Books",shop:"books"},matchScore:2,suggestion:true},"shop/books/Hugendubel":{name:"Hugendubel",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q1634142"},addTags:{brand:"Hugendubel","brand:wikidata":"Q1634142","brand:wikipedia":"en:Hugendubel",name:"Hugendubel",shop:"books"},removeTags:{brand:"Hugendubel","brand:wikidata":"Q1634142","brand:wikipedia":"en:Hugendubel",name:"Hugendubel",shop:"books"},matchScore:2,suggestion:true},"shop/books/National Book Store":{name:"National Book Store",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q6971094"},addTags:{brand:"National Book Store","brand:wikidata":"Q6971094","brand:wikipedia":"en:National Book Store",name:"National Book Store",shop:"books"},removeTags:{brand:"National Book Store","brand:wikidata":"Q6971094","brand:wikipedia":"en:National Book Store",name:"National Book Store",shop:"books"},matchScore:2,suggestion:true},"shop/books/TSUTAYA":{name:"TSUTAYA",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q5193457"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"books"},removeTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"books"},matchScore:2,suggestion:true},"shop/books/Thalia":{name:"Thalia",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q2408854"},addTags:{brand:"Thalia","brand:wikidata":"Q2408854","brand:wikipedia":"de:Thalia Bücher",name:"Thalia",shop:"books"},removeTags:{brand:"Thalia","brand:wikidata":"Q2408854","brand:wikipedia":"de:Thalia Bücher",name:"Thalia",shop:"books"},matchScore:2,suggestion:true},"shop/books/Waterstones":{name:"Waterstones",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q151779"},addTags:{brand:"Waterstones","brand:wikidata":"Q151779","brand:wikipedia":"en:Waterstones",name:"Waterstones",shop:"books"},removeTags:{brand:"Waterstones","brand:wikidata":"Q151779","brand:wikipedia":"en:Waterstones",name:"Waterstones",shop:"books"},matchScore:2,suggestion:true},"shop/books/Weltbild":{name:"Weltbild",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q883522"},addTags:{brand:"Weltbild","brand:wikidata":"Q883522","brand:wikipedia":"en:Weltbild Publishing Group",name:"Weltbild",shop:"books"},removeTags:{brand:"Weltbild","brand:wikidata":"Q883522","brand:wikipedia":"en:Weltbild Publishing Group",name:"Weltbild",shop:"books"},matchScore:2,suggestion:true},"shop/books/ブックオフ":{name:"ブックオフ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q893011"},addTags:{brand:"ブックオフ","brand:en":"Book Off","brand:wikidata":"Q893011","brand:wikipedia":"en:Book Off",name:"ブックオフ","name:en":"Book Off",shop:"books"},removeTags:{brand:"ブックオフ","brand:en":"Book Off","brand:wikidata":"Q893011","brand:wikipedia":"en:Book Off",name:"ブックオフ","name:en":"Book Off",shop:"books"},matchScore:2,suggestion:true},"shop/books/新华书店":{name:"新华书店",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q6124193"},addTags:{brand:"新华书店","brand:en":"Xinhua Bookstore","brand:wikidata":"Q6124193","brand:wikipedia":"en:Xinhua Bookstore",name:"新华书店","name:en":"Xinhua Bookstore",shop:"books"},removeTags:{brand:"新华书店","brand:en":"Xinhua Bookstore","brand:wikidata":"Q6124193","brand:wikipedia":"en:Xinhua Bookstore",name:"新华书店","name:en":"Xinhua Bookstore",shop:"books"},matchScore:2,suggestion:true},"shop/butcher/Родинна ковбаска":{name:"Родинна ковбаска",icon:"maki-slaughterhouse",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"butcher","brand:wikidata":"Q30969660"},addTags:{brand:"Родинна ковбаска","brand:en":"Rodynna-kovbaska","brand:wikidata":"Q30969660","brand:wikipedia":"uk:ТзОВ «Барком»",name:"Родинна ковбаска","name:en":"Rodynna-kovbaska",shop:"butcher"},removeTags:{brand:"Родинна ковбаска","brand:en":"Rodynna-kovbaska","brand:wikidata":"Q30969660","brand:wikipedia":"uk:ТзОВ «Барком»",name:"Родинна ковбаска","name:en":"Rodynna-kovbaska",shop:"butcher"},matchScore:2,suggestion:true},"shop/car_parts/Advance Auto Parts":{name:"Advance Auto Parts",icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q4686051"},addTags:{brand:"Advance Auto Parts","brand:wikidata":"Q4686051","brand:wikipedia":"en:Advance Auto Parts",name:"Advance Auto Parts",shop:"car_parts"},removeTags:{brand:"Advance Auto Parts","brand:wikidata":"Q4686051","brand:wikipedia":"en:Advance Auto Parts",name:"Advance Auto Parts",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/AutoZone":{name:"AutoZone",icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q4826087"},addTags:{brand:"AutoZone","brand:wikidata":"Q4826087","brand:wikipedia":"en:AutoZone",name:"AutoZone",shop:"car_parts"},removeTags:{brand:"AutoZone","brand:wikidata":"Q4826087","brand:wikipedia":"en:AutoZone",name:"AutoZone",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/Halfords":{name:"Halfords",icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q3398786"},addTags:{brand:"Halfords","brand:wikidata":"Q3398786","brand:wikipedia":"en:Halfords",name:"Halfords","service:bicycle:retail":"yes",shop:"car_parts"},removeTags:{brand:"Halfords","brand:wikidata":"Q3398786","brand:wikipedia":"en:Halfords",name:"Halfords","service:bicycle:retail":"yes",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/NAPA Auto Parts":{name:"NAPA Auto Parts",icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q6970842"},addTags:{brand:"NAPA Auto Parts","brand:wikidata":"Q6970842","brand:wikipedia":"en:National Automotive Parts Association",name:"NAPA Auto Parts",shop:"car_parts"},removeTags:{brand:"NAPA Auto Parts","brand:wikidata":"Q6970842","brand:wikipedia":"en:National Automotive Parts Association",name:"NAPA Auto Parts",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/O'Reilly Auto Parts":{name:"O'Reilly Auto Parts",icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q7071951"},addTags:{brand:"O'Reilly Auto Parts","brand:wikidata":"Q7071951","brand:wikipedia":"en:O'Reilly Auto Parts",name:"O'Reilly Auto Parts",shop:"car_parts"},removeTags:{brand:"O'Reilly Auto Parts","brand:wikidata":"Q7071951","brand:wikipedia":"en:O'Reilly Auto Parts",name:"O'Reilly Auto Parts",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/Repco":{name:"Repco",icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q173425"},addTags:{brand:"Repco","brand:wikidata":"Q173425","brand:wikipedia":"en:Repco",name:"Repco",shop:"car_parts"},removeTags:{brand:"Repco","brand:wikidata":"Q173425","brand:wikipedia":"en:Repco",name:"Repco",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/Supercheap Auto":{name:"Supercheap Auto",icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q7643119"},addTags:{brand:"Supercheap Auto","brand:wikidata":"Q7643119","brand:wikipedia":"en:Supercheap Auto",name:"Supercheap Auto",shop:"car_parts"},removeTags:{brand:"Supercheap Auto","brand:wikidata":"Q7643119","brand:wikipedia":"en:Supercheap Auto",name:"Supercheap Auto",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_repair/A.T.U":{name:"A.T.U",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q784721"},addTags:{brand:"A.T.U","brand:wikidata":"Q784721","brand:wikipedia":"de:Auto-Teile-Unger",name:"A.T.U",shop:"car_repair"},removeTags:{brand:"A.T.U","brand:wikidata":"Q784721","brand:wikipedia":"de:Auto-Teile-Unger",name:"A.T.U",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/ATS Euromaster":{name:"ATS Euromaster",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q4654920"},addTags:{brand:"ATS Euromaster","brand:wikidata":"Q4654920","brand:wikipedia":"en:ATS Euromaster",name:"ATS Euromaster",shop:"car_repair"},removeTags:{brand:"ATS Euromaster","brand:wikidata":"Q4654920","brand:wikipedia":"en:ATS Euromaster",name:"ATS Euromaster",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Bosch Car Service":{name:"Bosch Car Service",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q234021"},addTags:{brand:"Bosch Car Service","brand:wikidata":"Q234021","brand:wikipedia":"de:Robert Bosch GmbH",name:"Bosch Car Service",shop:"car_repair"},removeTags:{brand:"Bosch Car Service","brand:wikidata":"Q234021","brand:wikipedia":"de:Robert Bosch GmbH",name:"Bosch Car Service",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Carglass":{name:"Carglass",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q1035997"},addTags:{brand:"Carglass","brand:wikidata":"Q1035997","brand:wikipedia":"de:Carglass",name:"Carglass",shop:"car_repair"},removeTags:{brand:"Carglass","brand:wikidata":"Q1035997","brand:wikipedia":"de:Carglass",name:"Carglass",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Firestone":{name:"Firestone",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q420837"},addTags:{brand:"Firestone","brand:wikidata":"Q420837","brand:wikipedia":"en:Firestone Tire and Rubber Company",name:"Firestone",shop:"car_repair"},removeTags:{brand:"Firestone","brand:wikidata":"Q420837","brand:wikipedia":"en:Firestone Tire and Rubber Company",name:"Firestone",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Ford":{name:"Ford",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q44294"},addTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car_repair"},removeTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Goodyear":{name:"Goodyear",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q620875"},addTags:{brand:"Goodyear","brand:wikidata":"Q620875","brand:wikipedia":"en:Goodyear Tire and Rubber Company",name:"Goodyear",shop:"car_repair"},removeTags:{brand:"Goodyear","brand:wikidata":"Q620875","brand:wikipedia":"en:Goodyear Tire and Rubber Company",name:"Goodyear",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Grease Monkey":{name:"Grease Monkey",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q5598563"},addTags:{brand:"Grease Monkey","brand:wikidata":"Q5598563","brand:wikipedia":"en:Grease Monkey (business)",name:"Grease Monkey",shop:"car_repair"},removeTags:{brand:"Grease Monkey","brand:wikidata":"Q5598563","brand:wikipedia":"en:Grease Monkey (business)",name:"Grease Monkey",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Halfords Autocentre":{name:"Halfords Autocentre",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q5641894"},addTags:{brand:"Halfords Auocentre","brand:wikidata":"Q5641894","brand:wikipedia":"en:Halfords Autocentre",name:"Halfords Autocentre",shop:"car_repair"},removeTags:{brand:"Halfords Auocentre","brand:wikidata":"Q5641894","brand:wikipedia":"en:Halfords Autocentre",name:"Halfords Autocentre",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Jiffy Lube":{name:"Jiffy Lube",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q6192247"},addTags:{brand:"Jiffy Lube","brand:wikidata":"Q6192247","brand:wikipedia":"en:Jiffy Lube",name:"Jiffy Lube",shop:"car_repair"},removeTags:{brand:"Jiffy Lube","brand:wikidata":"Q6192247","brand:wikipedia":"en:Jiffy Lube",name:"Jiffy Lube",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Kwik Fit":{name:"Kwik Fit",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q958053"},addTags:{brand:"Kwik Fit","brand:wikidata":"Q958053","brand:wikipedia":"en:Kwik Fit",name:"Kwik Fit",shop:"car_repair"},removeTags:{brand:"Kwik Fit","brand:wikidata":"Q958053","brand:wikipedia":"en:Kwik Fit",name:"Kwik Fit",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Meineke":{name:"Meineke",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q6810159"},addTags:{brand:"Meineke","brand:wikidata":"Q6810159","brand:wikipedia":"en:Meineke Car Care Centers",name:"Meineke",shop:"car_repair"},removeTags:{brand:"Meineke","brand:wikidata":"Q6810159","brand:wikipedia":"en:Meineke Car Care Centers",name:"Meineke",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Midas":{name:"Midas",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3312613"},addTags:{brand:"Midas","brand:wikidata":"Q3312613","brand:wikipedia":"en:Midas (automotive service)",name:"Midas",shop:"car_repair"},removeTags:{brand:"Midas","brand:wikidata":"Q3312613","brand:wikipedia":"en:Midas (automotive service)",name:"Midas",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Mr. Lube":{name:"Mr. Lube",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q17104067"},addTags:{brand:"Mr. Lube","brand:wikidata":"Q17104067","brand:wikipedia":"en:Mr. Lube",name:"Mr. Lube",shop:"car_repair"},removeTags:{brand:"Mr. Lube","brand:wikidata":"Q17104067","brand:wikipedia":"en:Mr. Lube",name:"Mr. Lube",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Norauto":{name:"Norauto",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3317698"},addTags:{brand:"Norauto","brand:wikidata":"Q3317698","brand:wikipedia":"en:Mobivia Groupe",name:"Norauto",shop:"car_repair"},removeTags:{brand:"Norauto","brand:wikidata":"Q3317698","brand:wikipedia":"en:Mobivia Groupe",name:"Norauto",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Pep Boys":{name:"Pep Boys",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3375007"},addTags:{brand:"Pep Boys","brand:wikidata":"Q3375007","brand:wikipedia":"en:Pep Boys",name:"Pep Boys",shop:"car_repair"},removeTags:{brand:"Pep Boys","brand:wikidata":"Q3375007","brand:wikipedia":"en:Pep Boys",name:"Pep Boys",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Peugeot":{name:"Peugeot",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q6742"},addTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car_repair"},removeTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Renault":{name:"Renault",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q6686"},addTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car_repair"},removeTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Roady":{name:"Roady",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3434112"},addTags:{brand:"Roady","brand:wikidata":"Q3434112","brand:wikipedia":"en:Roady (Mousquetaires)",name:"Roady",shop:"car_repair"},removeTags:{brand:"Roady","brand:wikidata":"Q3434112","brand:wikipedia":"en:Roady (Mousquetaires)",name:"Roady",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Toyota":{name:"Toyota",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q53268"},addTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car_repair"},removeTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Valvoline":{name:"Valvoline",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q7912852"},addTags:{brand:"Valvoline","brand:wikidata":"Q7912852","brand:wikipedia":"en:Valvoline Instant Oil Change",name:"Valvoline",shop:"car_repair"},removeTags:{brand:"Valvoline","brand:wikidata":"Q7912852","brand:wikipedia":"en:Valvoline Instant Oil Change",name:"Valvoline",shop:"car_repair"},matchScore:2,suggestion:true},"shop/carpet/Carpetright":{name:"Carpetright",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"carpet","brand:wikidata":"Q5045782"},addTags:{brand:"Carpetright","brand:wikidata":"Q5045782","brand:wikipedia":"en:Carpetright",name:"Carpetright",shop:"carpet"},removeTags:{brand:"Carpetright","brand:wikidata":"Q5045782","brand:wikipedia":"en:Carpetright",name:"Carpetright",shop:"carpet"},matchScore:2,suggestion:true},"shop/car/Audi":{name:"Audi",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q23317"},addTags:{brand:"Audi","brand:wikidata":"Q23317","brand:wikipedia":"en:Audi",name:"Audi",shop:"car"},removeTags:{brand:"Audi","brand:wikidata":"Q23317","brand:wikipedia":"en:Audi",name:"Audi",shop:"car"},matchScore:2,suggestion:true},"shop/car/BMW":{name:"BMW",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q26678"},addTags:{brand:"BMW","brand:wikidata":"Q26678","brand:wikipedia":"en:BMW",name:"BMW",shop:"car"},removeTags:{brand:"BMW","brand:wikidata":"Q26678","brand:wikipedia":"en:BMW",name:"BMW",shop:"car"},matchScore:2,suggestion:true},"shop/car/Chevrolet":{name:"Chevrolet",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q29570"},addTags:{brand:"Chevrolet","brand:wikidata":"Q29570","brand:wikipedia":"en:Chevrolet",name:"Chevrolet",shop:"car"},removeTags:{brand:"Chevrolet","brand:wikidata":"Q29570","brand:wikipedia":"en:Chevrolet",name:"Chevrolet",shop:"car"},matchScore:2,suggestion:true},"shop/car/Dacia":{name:"Dacia",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q27460"},addTags:{brand:"Dacia","brand:wikidata":"Q27460","brand:wikipedia":"en:Automobile Dacia",name:"Dacia",shop:"car"},removeTags:{brand:"Dacia","brand:wikidata":"Q27460","brand:wikipedia":"en:Automobile Dacia",name:"Dacia",shop:"car"},matchScore:2,suggestion:true},"shop/car/Fiat":{name:"Fiat",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q27597"},addTags:{brand:"Fiat","brand:wikidata":"Q27597","brand:wikipedia":"en:Fiat Automobiles",name:"Fiat",shop:"car"},removeTags:{brand:"Fiat","brand:wikidata":"Q27597","brand:wikipedia":"en:Fiat Automobiles",name:"Fiat",shop:"car"},matchScore:2,suggestion:true},"shop/car/Ford":{name:"Ford",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q44294"},addTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car"},removeTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car"},matchScore:2,suggestion:true},"shop/car/Honda":{name:"Honda",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q9584"},addTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"car"},removeTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"car"},matchScore:2,suggestion:true},"shop/car/Hyundai":{name:"Hyundai",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q55931"},addTags:{brand:"Hyundai","brand:wikidata":"Q55931","brand:wikipedia":"en:Hyundai Motor Company",name:"Hyundai",shop:"car"},removeTags:{brand:"Hyundai","brand:wikidata":"Q55931","brand:wikipedia":"en:Hyundai Motor Company",name:"Hyundai",shop:"car"},matchScore:2,suggestion:true},"shop/car/Isuzu":{name:"Isuzu",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q29803"},addTags:{brand:"Isuzu","brand:wikidata":"Q29803","brand:wikipedia":"en:Isuzu Motors",name:"Isuzu",shop:"car"},removeTags:{brand:"Isuzu","brand:wikidata":"Q29803","brand:wikipedia":"en:Isuzu Motors",name:"Isuzu",shop:"car"},matchScore:2,suggestion:true},"shop/car/Kia":{name:"Kia",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q35349"},addTags:{brand:"Kia","brand:wikidata":"Q35349","brand:wikipedia":"en:Kia Motors",name:"Kia",shop:"car"},removeTags:{brand:"Kia","brand:wikidata":"Q35349","brand:wikipedia":"en:Kia Motors",name:"Kia",shop:"car"},matchScore:2,suggestion:true},"shop/car/Land Rover":{name:"Land Rover",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q35907"},addTags:{brand:"Land Rover","brand:wikidata":"Q35907","brand:wikipedia":"en:Land Rover",name:"Land Rover",shop:"car"},removeTags:{brand:"Land Rover","brand:wikidata":"Q35907","brand:wikipedia":"en:Land Rover",name:"Land Rover",shop:"car"},matchScore:2,suggestion:true},"shop/car/Lexus":{name:"Lexus",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q35919"},addTags:{brand:"Lexus","brand:wikidata":"Q35919","brand:wikipedia":"en:Lexus",name:"Lexus",shop:"car"},removeTags:{brand:"Lexus","brand:wikidata":"Q35919","brand:wikipedia":"en:Lexus",name:"Lexus",shop:"car"},matchScore:2,suggestion:true},"shop/car/Mazda":{name:"Mazda",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q35996"},addTags:{brand:"Mazda","brand:wikidata":"Q35996","brand:wikipedia":"en:Mazda",name:"Mazda",shop:"car"},removeTags:{brand:"Mazda","brand:wikidata":"Q35996","brand:wikipedia":"en:Mazda",name:"Mazda",shop:"car"},matchScore:2,suggestion:true},"shop/car/Mercedes-Benz":{name:"Mercedes-Benz",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q36008"},addTags:{brand:"Mercedes-Benz","brand:wikidata":"Q36008","brand:wikipedia":"en:Mercedes-Benz",name:"Mercedes-Benz",shop:"car"},removeTags:{brand:"Mercedes-Benz","brand:wikidata":"Q36008","brand:wikipedia":"en:Mercedes-Benz",name:"Mercedes-Benz",shop:"car"},matchScore:2,suggestion:true},"shop/car/Mitsubishi":{name:"Mitsubishi",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q36033"},addTags:{brand:"Mitsubishi","brand:wikidata":"Q36033","brand:wikipedia":"en:Mitsubishi Motors",name:"Mitsubishi",shop:"car"},removeTags:{brand:"Mitsubishi","brand:wikidata":"Q36033","brand:wikipedia":"en:Mitsubishi Motors",name:"Mitsubishi",shop:"car"},matchScore:2,suggestion:true},"shop/car/Netz":{name:"Netz",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q11325416"},addTags:{brand:"Netz","brand:wikidata":"Q11325416","brand:wikipedia":"ja:ネッツ店",name:"Netz",shop:"car"},removeTags:{brand:"Netz","brand:wikidata":"Q11325416","brand:wikipedia":"ja:ネッツ店",name:"Netz",shop:"car"},matchScore:2,suggestion:true},"shop/car/Nissan":{name:"Nissan",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q20165"},addTags:{brand:"Nissan","brand:wikidata":"Q20165","brand:wikipedia":"ja:日産自動車",name:"Nissan",shop:"car"},removeTags:{brand:"Nissan","brand:wikidata":"Q20165","brand:wikipedia":"ja:日産自動車",name:"Nissan",shop:"car"},matchScore:2,suggestion:true},"shop/car/Opel":{name:"Opel",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q40966"},addTags:{brand:"Opel","brand:wikidata":"Q40966","brand:wikipedia":"en:Opel",name:"Opel",shop:"car"},removeTags:{brand:"Opel","brand:wikidata":"Q40966","brand:wikipedia":"en:Opel",name:"Opel",shop:"car"},matchScore:2,suggestion:true},"shop/car/Peugeot":{name:"Peugeot",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q6742"},addTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car"},removeTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car"},matchScore:2,suggestion:true},"shop/car/Porsche":{name:"Porsche",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q40993"},addTags:{brand:"Porsche","brand:wikidata":"Q40993","brand:wikipedia":"en:Porsche",name:"Porsche",shop:"car"},removeTags:{brand:"Porsche","brand:wikidata":"Q40993","brand:wikipedia":"en:Porsche",name:"Porsche",shop:"car"},matchScore:2,suggestion:true},"shop/car/Renault":{name:"Renault",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q6686"},addTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car"},removeTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car"},matchScore:2,suggestion:true},"shop/car/Seat":{name:"Seat",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q188217"},addTags:{brand:"Seat","brand:wikidata":"Q188217","brand:wikipedia":"en:SEAT",name:"Seat",shop:"car"},removeTags:{brand:"Seat","brand:wikidata":"Q188217","brand:wikipedia":"en:SEAT",name:"Seat",shop:"car"},matchScore:2,suggestion:true},"shop/car/Skoda":{name:"Skoda",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q29637"},addTags:{brand:"Skoda","brand:wikidata":"Q29637","brand:wikipedia":"en:Škoda Auto",name:"Skoda",shop:"car"},removeTags:{brand:"Skoda","brand:wikidata":"Q29637","brand:wikipedia":"en:Škoda Auto",name:"Skoda",shop:"car"},matchScore:2,suggestion:true},"shop/car/Subaru":{name:"Subaru",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q172741"},addTags:{brand:"Subaru","brand:wikidata":"Q172741","brand:wikipedia":"en:Subaru",name:"Subaru",shop:"car"},removeTags:{brand:"Subaru","brand:wikidata":"Q172741","brand:wikipedia":"en:Subaru",name:"Subaru",shop:"car"},matchScore:2,suggestion:true},"shop/car/Suzuki":{name:"Suzuki",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q181642"},addTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"car"},removeTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"car"},matchScore:2,suggestion:true},"shop/car/Tesla":{name:"Tesla",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q478214"},addTags:{brand:"Tesla","brand:wikidata":"Q478214","brand:wikipedia":"en:Tesla, Inc.",name:"Tesla",shop:"car"},removeTags:{brand:"Tesla","brand:wikidata":"Q478214","brand:wikipedia":"en:Tesla, Inc.",name:"Tesla",shop:"car"},matchScore:2,suggestion:true},"shop/car/Toyota":{name:"Toyota",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q53268"},addTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car"},removeTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car"},matchScore:2,suggestion:true},"shop/car/Volkswagen":{name:"Volkswagen",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q246"},addTags:{brand:"Volkswagen","brand:wikidata":"Q246","brand:wikipedia":"en:Volkswagen",name:"Volkswagen",shop:"car"},removeTags:{brand:"Volkswagen","brand:wikidata":"Q246","brand:wikipedia":"en:Volkswagen",name:"Volkswagen",shop:"car"},matchScore:2,suggestion:true},"shop/car/Volvo":{name:"Volvo",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q215293"},addTags:{brand:"Volvo","brand:wikidata":"Q215293","brand:wikipedia":"en:Volvo Cars",name:"Volvo",shop:"car"},removeTags:{brand:"Volvo","brand:wikidata":"Q215293","brand:wikipedia":"en:Volvo Cars",name:"Volvo",shop:"car"},matchScore:2,suggestion:true},"shop/car/ホンダ":{name:"ホンダ",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q9584"},addTags:{brand:"ホンダ","brand:en":"Honda","brand:wikidata":"Q9584","brand:wikipedia":"ja:本田技研工業",name:"ホンダ","name:en":"Honda",shop:"car"},removeTags:{brand:"ホンダ","brand:en":"Honda","brand:wikidata":"Q9584","brand:wikipedia":"ja:本田技研工業",name:"ホンダ","name:en":"Honda",shop:"car"},matchScore:2,suggestion:true},"shop/catalogue/Argos":{name:"Argos",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"catalogue","brand:wikidata":"Q4789707"},addTags:{brand:"Argos","brand:wikidata":"Q4789707","brand:wikipedia":"en:Argos (retailer)",name:"Argos",shop:"catalogue"},removeTags:{brand:"Argos","brand:wikidata":"Q4789707","brand:wikipedia":"en:Argos (retailer)",name:"Argos",shop:"catalogue"},matchScore:2,suggestion:true},"shop/charity/Age UK":{name:"Age UK",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q4691850"},addTags:{brand:"Age UK","brand:wikidata":"Q4691850","brand:wikipedia":"en:Age UK",name:"Age UK",shop:"charity"},removeTags:{brand:"Age UK","brand:wikidata":"Q4691850","brand:wikipedia":"en:Age UK",name:"Age UK",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Barnardo's":{name:"Barnardo's",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q2884670"},addTags:{brand:"Barnardo's","brand:wikidata":"Q2884670","brand:wikipedia":"en:Barnardo's",name:"Barnardo's",shop:"charity"},removeTags:{brand:"Barnardo's","brand:wikidata":"Q2884670","brand:wikipedia":"en:Barnardo's",name:"Barnardo's",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/British Heart Foundation":{name:"British Heart Foundation",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q4970039"},addTags:{brand:"British Heart Foundation","brand:wikidata":"Q4970039","brand:wikipedia":"en:British Heart Foundation",name:"British Heart Foundation",shop:"charity"},removeTags:{brand:"British Heart Foundation","brand:wikidata":"Q4970039","brand:wikipedia":"en:British Heart Foundation",name:"British Heart Foundation",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/British Red Cross":{name:"British Red Cross",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q4970966"},addTags:{brand:"British Red Cross","brand:wikidata":"Q4970966","brand:wikipedia":"en:British Red Cross",name:"British Red Cross",shop:"charity"},removeTags:{brand:"British Red Cross","brand:wikidata":"Q4970966","brand:wikipedia":"en:British Red Cross",name:"British Red Cross",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Cancer Research UK":{name:"Cancer Research UK",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q326079"},addTags:{brand:"Cancer Research UK","brand:wikidata":"Q326079","brand:wikipedia":"en:Cancer Research UK",name:"Cancer Research UK",shop:"charity"},removeTags:{brand:"Cancer Research UK","brand:wikidata":"Q326079","brand:wikipedia":"en:Cancer Research UK",name:"Cancer Research UK",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Goodwill":{name:"Goodwill",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q5583655"},addTags:{brand:"Goodwill","brand:wikidata":"Q5583655","brand:wikipedia":"en:Goodwill Industries",name:"Goodwill",shop:"charity"},removeTags:{brand:"Goodwill","brand:wikidata":"Q5583655","brand:wikipedia":"en:Goodwill Industries",name:"Goodwill",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Mind":{name:"Mind",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q3314763"},addTags:{brand:"Mind","brand:wikidata":"Q3314763","brand:wikipedia":"en:Mind (charity)",name:"Mind",shop:"charity"},removeTags:{brand:"Mind","brand:wikidata":"Q3314763","brand:wikipedia":"en:Mind (charity)",name:"Mind",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Myrorna":{name:"Myrorna",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q10592609"},addTags:{brand:"Myrorna","brand:wikidata":"Q10592609","brand:wikipedia":"sv:Myrorna",name:"Myrorna",shop:"charity"},removeTags:{brand:"Myrorna","brand:wikidata":"Q10592609","brand:wikipedia":"sv:Myrorna",name:"Myrorna",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Oxfam":{name:"Oxfam",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q267941"},addTags:{brand:"Oxfam","brand:wikidata":"Q267941","brand:wikipedia":"en:Oxfam",name:"Oxfam",shop:"charity"},removeTags:{brand:"Oxfam","brand:wikidata":"Q267941","brand:wikipedia":"en:Oxfam",name:"Oxfam",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/RSPCA":{name:"RSPCA",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q584819"},addTags:{brand:"RSPCA","brand:wikidata":"Q584819","brand:wikipedia":"en:Royal Society for the Prevention of Cruelty to Animals",name:"RSPCA",shop:"charity"},removeTags:{brand:"RSPCA","brand:wikidata":"Q584819","brand:wikipedia":"en:Royal Society for the Prevention of Cruelty to Animals",name:"RSPCA",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Salvation Army":{name:"Salvation Army",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q188307"},addTags:{brand:"Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"Salvation Army",shop:"charity"},removeTags:{brand:"Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"Salvation Army",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Scope":{name:"Scope",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q7434435"},addTags:{brand:"Scope","brand:wikidata":"Q7434435","brand:wikipedia":"en:Scope (charity)",name:"Scope",shop:"charity"},removeTags:{brand:"Scope","brand:wikidata":"Q7434435","brand:wikipedia":"en:Scope (charity)",name:"Scope",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Sue Ryder":{name:"Sue Ryder",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q7634271"},addTags:{brand:"Sue Ryder","brand:wikidata":"Q7634271","brand:wikipedia":"en:Sue Ryder (charity)",name:"Sue Ryder",shop:"charity"},removeTags:{brand:"Sue Ryder","brand:wikidata":"Q7634271","brand:wikipedia":"en:Sue Ryder (charity)",name:"Sue Ryder",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/The Salvation Army":{name:"The Salvation Army",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q188307"},addTags:{brand:"The Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"The Salvation Army",shop:"charity"},removeTags:{brand:"The Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"The Salvation Army",shop:"charity"},matchScore:2,suggestion:true},"shop/chemist/Bipa":{name:"Bipa",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q864933"},addTags:{brand:"Bipa","brand:wikidata":"Q864933","brand:wikipedia":"de:Bipa",name:"Bipa",shop:"chemist"},removeTags:{brand:"Bipa","brand:wikidata":"Q864933","brand:wikipedia":"de:Bipa",name:"Bipa",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Budnikowsky":{name:"Budnikowsky",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q1001516"},addTags:{brand:"Budnikowsky","brand:wikidata":"Q1001516","brand:wikipedia":"de:Budnikowsky",name:"Budnikowsky",shop:"chemist"},removeTags:{brand:"Budnikowsky","brand:wikidata":"Q1001516","brand:wikipedia":"de:Budnikowsky",name:"Budnikowsky",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Drogeria Natura":{name:"Drogeria Natura",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q9212032"},addTags:{brand:"Drogeria Natura","brand:wikidata":"Q9212032","brand:wikipedia":"pl:Drogerie Natura",name:"Drogeria Natura",shop:"chemist"},removeTags:{brand:"Drogeria Natura","brand:wikidata":"Q9212032","brand:wikipedia":"pl:Drogerie Natura",name:"Drogeria Natura",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Kruidvat":{name:"Kruidvat",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q2226366"},addTags:{brand:"Kruidvat","brand:wikidata":"Q2226366","brand:wikipedia":"en:Kruidvat",name:"Kruidvat",shop:"chemist"},removeTags:{brand:"Kruidvat","brand:wikidata":"Q2226366","brand:wikipedia":"en:Kruidvat",name:"Kruidvat",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Matas":{name:"Matas",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q6786143"},addTags:{brand:"Matas","brand:wikidata":"Q6786143","brand:wikipedia":"en:Matas (drug store)",name:"Matas",shop:"chemist"},removeTags:{brand:"Matas","brand:wikidata":"Q6786143","brand:wikipedia":"en:Matas (drug store)",name:"Matas",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Rossmann":{name:"Rossmann",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q316004"},addTags:{brand:"Rossmann","brand:wikidata":"Q316004","brand:wikipedia":"de:Dirk Rossmann GmbH",name:"Rossmann",shop:"chemist"},removeTags:{brand:"Rossmann","brand:wikidata":"Q316004","brand:wikipedia":"de:Dirk Rossmann GmbH",name:"Rossmann",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/dm":{name:"dm",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q266572"},addTags:{brand:"dm","brand:wikidata":"Q266572","brand:wikipedia":"en:Dm-drogerie markt",name:"dm",shop:"chemist"},removeTags:{brand:"dm","brand:wikidata":"Q266572","brand:wikipedia":"en:Dm-drogerie markt",name:"dm",shop:"chemist"},matchScore:2,suggestion:true},"shop/chocolate/Cacau Show":{name:"Cacau Show",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chocolate","brand:wikidata":"Q9671713"},addTags:{brand:"Cacau Show","brand:wikidata":"Q9671713","brand:wikipedia":"en:Cacau show",name:"Cacau Show",shop:"chocolate"},removeTags:{brand:"Cacau Show","brand:wikidata":"Q9671713","brand:wikipedia":"en:Cacau show",name:"Cacau Show",shop:"chocolate"},matchScore:2,suggestion:true},"shop/chocolate/Leonidas":{name:"Leonidas",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chocolate","brand:wikidata":"Q80335"},addTags:{brand:"Leonidas","brand:wikidata":"Q80335","brand:wikipedia":"en:Leonidas (chocolate maker)",name:"Leonidas",shop:"chocolate"},removeTags:{brand:"Leonidas","brand:wikidata":"Q80335","brand:wikipedia":"en:Leonidas (chocolate maker)",name:"Leonidas",shop:"chocolate"},matchScore:2,suggestion:true},"shop/clothes/Abercrombie & Fitch":{name:"Abercrombie & Fitch",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q319344"},addTags:{brand:"Abercrombie & Fitch","brand:wikidata":"Q319344","brand:wikipedia":"en:Abercrombie & Fitch",name:"Abercrombie & Fitch",shop:"clothes"},removeTags:{brand:"Abercrombie & Fitch","brand:wikidata":"Q319344","brand:wikipedia":"en:Abercrombie & Fitch",name:"Abercrombie & Fitch",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Accessorize":{name:"Accessorize",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3069980"},addTags:{brand:"Accessorize","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Accessorize",shop:"clothes"},removeTags:{brand:"Accessorize","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Accessorize",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ackermans":{name:"Ackermans",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4674255"},addTags:{brand:"Ackermans","brand:wikidata":"Q4674255","brand:wikipedia":"en:Ackermans",name:"Ackermans",shop:"clothes"},removeTags:{brand:"Ackermans","brand:wikidata":"Q4674255","brand:wikipedia":"en:Ackermans",name:"Ackermans",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Aeropostale":{name:"Aeropostale",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q794565"},addTags:{brand:"Aeropostale","brand:wikidata":"Q794565","brand:wikipedia":"en:Aéropostale (clothing)",name:"Aeropostale",shop:"clothes"},removeTags:{brand:"Aeropostale","brand:wikidata":"Q794565","brand:wikipedia":"en:Aéropostale (clothing)",name:"Aeropostale",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/American Apparel":{name:"American Apparel",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q463378"},addTags:{brand:"American Apparel","brand:wikidata":"Q463378","brand:wikipedia":"en:American Apparel",name:"American Apparel",shop:"clothes"},removeTags:{brand:"American Apparel","brand:wikidata":"Q463378","brand:wikipedia":"en:American Apparel",name:"American Apparel",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/American Eagle Outfitters":{name:"American Eagle Outfitters",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2842931"},addTags:{brand:"American Eagle Outfitters","brand:wikidata":"Q2842931","brand:wikipedia":"en:American Eagle Outfitters",name:"American Eagle Outfitters",shop:"clothes"},removeTags:{brand:"American Eagle Outfitters","brand:wikidata":"Q2842931","brand:wikipedia":"en:American Eagle Outfitters",name:"American Eagle Outfitters",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Anthropologie":{name:"Anthropologie",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4773903"},addTags:{brand:"Anthropologie","brand:wikidata":"Q4773903","brand:wikipedia":"en:Anthropologie",name:"Anthropologie",shop:"clothes"},removeTags:{brand:"Anthropologie","brand:wikidata":"Q4773903","brand:wikipedia":"en:Anthropologie",name:"Anthropologie",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ardene":{name:"Ardene",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2860764"},addTags:{brand:"Ardene","brand:wikidata":"Q2860764","brand:wikipedia":"en:Ardene",name:"Ardene",shop:"clothes"},removeTags:{brand:"Ardene","brand:wikidata":"Q2860764","brand:wikipedia":"en:Ardene",name:"Ardene",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Banana Republic":{name:"Banana Republic",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q806085"},addTags:{brand:"Banana Republic","brand:wikidata":"Q806085","brand:wikipedia":"en:Banana Republic",name:"Banana Republic",shop:"clothes"},removeTags:{brand:"Banana Republic","brand:wikidata":"Q806085","brand:wikipedia":"en:Banana Republic",name:"Banana Republic",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Bershka":{name:"Bershka",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q827258"},addTags:{brand:"Bershka","brand:wikidata":"Q827258","brand:wikipedia":"en:Bershka",name:"Bershka",shop:"clothes"},removeTags:{brand:"Bershka","brand:wikidata":"Q827258","brand:wikipedia":"en:Bershka",name:"Bershka",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Brooks Brothers":{name:"Brooks Brothers",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q929722"},addTags:{brand:"Brooks Brothers","brand:wikidata":"Q929722","brand:wikipedia":"en:Brooks Brothers",name:"Brooks Brothers",shop:"clothes"},removeTags:{brand:"Brooks Brothers","brand:wikidata":"Q929722","brand:wikipedia":"en:Brooks Brothers",name:"Brooks Brothers",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Burberry":{name:"Burberry",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q390107"},addTags:{brand:"Burberry","brand:wikidata":"Q390107","brand:wikipedia":"en:Burberry",name:"Burberry",shop:"clothes"},removeTags:{brand:"Burberry","brand:wikidata":"Q390107","brand:wikipedia":"en:Burberry",name:"Burberry",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Burlington Coat Factory":{name:"Burlington Coat Factory",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4999220"},addTags:{brand:"Burlington Coat Factory","brand:wikidata":"Q4999220","brand:wikipedia":"en:Burlington (department store)",name:"Burlington Coat Factory",shop:"clothes"},removeTags:{brand:"Burlington Coat Factory","brand:wikidata":"Q4999220","brand:wikipedia":"en:Burlington (department store)",name:"Burlington Coat Factory",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Burton":{name:"Burton",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5000795"},addTags:{brand:"Burton","brand:wikidata":"Q5000795","brand:wikipedia":"en:Burton (retailer)",name:"Burton",shop:"clothes"},removeTags:{brand:"Burton","brand:wikidata":"Q5000795","brand:wikipedia":"en:Burton (retailer)",name:"Burton",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/C&A":{name:"C&A",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q701338"},addTags:{brand:"C&A","brand:wikidata":"Q701338","brand:wikipedia":"en:C&A",name:"C&A",shop:"clothes"},removeTags:{brand:"C&A","brand:wikidata":"Q701338","brand:wikipedia":"en:C&A",name:"C&A",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Calvin Klein":{name:"Calvin Klein",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1068628"},addTags:{brand:"Calvin Klein","brand:wikidata":"Q1068628","brand:wikipedia":"en:Calvin Klein",name:"Calvin Klein",shop:"clothes"},removeTags:{brand:"Calvin Klein","brand:wikidata":"Q1068628","brand:wikipedia":"en:Calvin Klein",name:"Calvin Klein",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Calzedonia":{name:"Calzedonia",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1027874"},addTags:{brand:"Calzedonia","brand:wikidata":"Q1027874","brand:wikipedia":"en:Calzedonia",name:"Calzedonia",shop:"clothes"},removeTags:{brand:"Calzedonia","brand:wikidata":"Q1027874","brand:wikipedia":"en:Calzedonia",name:"Calzedonia",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Camaïeu":{name:"Camaïeu",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2934647"},addTags:{brand:"Camaïeu","brand:wikidata":"Q2934647","brand:wikipedia":"en:Camaïeu (company)",name:"Camaïeu",shop:"clothes"},removeTags:{brand:"Camaïeu","brand:wikidata":"Q2934647","brand:wikipedia":"en:Camaïeu (company)",name:"Camaïeu",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Camp David":{name:"Camp David",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q50540636"},addTags:{brand:"Camp David","brand:wikidata":"Q50540636","brand:wikipedia":"en:Camp David (fashion)",name:"Camp David",shop:"clothes"},removeTags:{brand:"Camp David","brand:wikidata":"Q50540636","brand:wikipedia":"en:Camp David (fashion)",name:"Camp David",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Carter's":{name:"Carter's",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5047083"},addTags:{brand:"Carter's","brand:wikidata":"Q5047083","brand:wikipedia":"en:Carter's",name:"Carter's",shop:"clothes"},removeTags:{brand:"Carter's","brand:wikidata":"Q5047083","brand:wikipedia":"en:Carter's",name:"Carter's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Celio":{name:"Celio",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2672003"},addTags:{brand:"Celio","brand:wikidata":"Q2672003","brand:wikipedia":"en:Celio (retailer)",name:"Celio",shop:"clothes"},removeTags:{brand:"Celio","brand:wikidata":"Q2672003","brand:wikipedia":"en:Celio (retailer)",name:"Celio",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Charles Vögele":{name:"Charles Vögele",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1066326"},addTags:{brand:"Charles Vögele","brand:wikidata":"Q1066326","brand:wikipedia":"de:Charles Vögele Holding",name:"Charles Vögele",shop:"clothes"},removeTags:{brand:"Charles Vögele","brand:wikidata":"Q1066326","brand:wikipedia":"de:Charles Vögele Holding",name:"Charles Vögele",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Charlotte Russe":{name:"Charlotte Russe",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5086126"},addTags:{brand:"Charlotte Russe","brand:wikidata":"Q5086126","brand:wikipedia":"en:Charlotte Russe (clothing retailer)",name:"Charlotte Russe",shop:"clothes"},removeTags:{brand:"Charlotte Russe","brand:wikidata":"Q5086126","brand:wikipedia":"en:Charlotte Russe (clothing retailer)",name:"Charlotte Russe",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Chico's":{name:"Chico's",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5096393"},addTags:{brand:"Chico's","brand:wikidata":"Q5096393","brand:wikipedia":"en:Chico's (clothing retailer)",name:"Chico's",shop:"clothes"},removeTags:{brand:"Chico's","brand:wikidata":"Q5096393","brand:wikipedia":"en:Chico's (clothing retailer)",name:"Chico's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Christopher & Banks":{name:"Christopher & Banks",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5111816"},addTags:{brand:"Christopher & Banks","brand:wikidata":"Q5111816","brand:wikipedia":"en:Christopher & Banks",name:"Christopher & Banks",shop:"clothes"},removeTags:{brand:"Christopher & Banks","brand:wikidata":"Q5111816","brand:wikipedia":"en:Christopher & Banks",name:"Christopher & Banks",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Columbia":{name:"Columbia",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1112588"},addTags:{brand:"Columbia","brand:wikidata":"Q1112588","brand:wikipedia":"en:Columbia Sportswear",name:"Columbia",shop:"clothes"},removeTags:{brand:"Columbia","brand:wikidata":"Q1112588","brand:wikipedia":"en:Columbia Sportswear",name:"Columbia",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Cubus":{name:"Cubus",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3439593"},addTags:{brand:"Cubus","brand:wikidata":"Q3439593","brand:wikipedia":"no:Cubus",name:"Cubus",shop:"clothes"},removeTags:{brand:"Cubus","brand:wikidata":"Q3439593","brand:wikipedia":"no:Cubus",name:"Cubus",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/David's Bridal":{name:"David's Bridal",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5230388"},addTags:{brand:"David's Bridal","brand:wikidata":"Q5230388","brand:wikipedia":"en:David's Bridal",name:"David's Bridal",shop:"clothes"},removeTags:{brand:"David's Bridal","brand:wikidata":"Q5230388","brand:wikipedia":"en:David's Bridal",name:"David's Bridal",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Desigual":{name:"Desigual",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q83750"},addTags:{brand:"Desigual","brand:wikidata":"Q83750","brand:wikipedia":"en:Desigual",name:"Desigual",shop:"clothes"},removeTags:{brand:"Desigual","brand:wikidata":"Q83750","brand:wikipedia":"en:Desigual",name:"Desigual",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Diesel":{name:"Diesel",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q158285"},addTags:{brand:"Diesel","brand:wikidata":"Q158285","brand:wikipedia":"en:Diesel (brand)",name:"Diesel",shop:"clothes"},removeTags:{brand:"Diesel","brand:wikidata":"Q158285","brand:wikipedia":"en:Diesel (brand)",name:"Diesel",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Dorothy Perkins":{name:"Dorothy Perkins",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5298588"},addTags:{brand:"Dorothy Perkins","brand:wikidata":"Q5298588","brand:wikipedia":"en:Dorothy Perkins",name:"Dorothy Perkins",shop:"clothes"},removeTags:{brand:"Dorothy Perkins","brand:wikidata":"Q5298588","brand:wikipedia":"en:Dorothy Perkins",name:"Dorothy Perkins",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Dress Barn":{name:"Dress Barn",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5307031"},addTags:{brand:"Dress Barn","brand:wikidata":"Q5307031","brand:wikipedia":"en:Ascena Retail Group",name:"Dress Barn",shop:"clothes"},removeTags:{brand:"Dress Barn","brand:wikidata":"Q5307031","brand:wikipedia":"en:Ascena Retail Group",name:"Dress Barn",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Dressmann":{name:"Dressmann",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3357081"},addTags:{brand:"Dressmann","brand:wikidata":"Q3357081","brand:wikipedia":"en:Dressmann",name:"Dressmann",shop:"clothes"},removeTags:{brand:"Dressmann","brand:wikidata":"Q3357081","brand:wikipedia":"en:Dressmann",name:"Dressmann",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Eddie Bauer":{name:"Eddie Bauer",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q842174"},addTags:{brand:"Eddie Bauer","brand:wikidata":"Q842174","brand:wikipedia":"en:Eddie Bauer",name:"Eddie Bauer",shop:"clothes"},removeTags:{brand:"Eddie Bauer","brand:wikidata":"Q842174","brand:wikipedia":"en:Eddie Bauer",name:"Eddie Bauer",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Engbers":{name:"Engbers",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1290088"},addTags:{brand:"Engbers","brand:wikidata":"Q1290088","brand:wikipedia":"de:Engbers",name:"Engbers",shop:"clothes"},removeTags:{brand:"Engbers","brand:wikidata":"Q1290088","brand:wikipedia":"de:Engbers",name:"Engbers",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ernsting's family":{name:"Ernsting's family",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1361016"},addTags:{brand:"Ernsting's family","brand:wikidata":"Q1361016","brand:wikipedia":"de:Ernsting’s family",name:"Ernsting's family",shop:"clothes"},removeTags:{brand:"Ernsting's family","brand:wikidata":"Q1361016","brand:wikipedia":"de:Ernsting’s family",name:"Ernsting's family",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Esprit":{name:"Esprit",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q532746"},addTags:{brand:"Esprit","brand:wikidata":"Q532746","brand:wikipedia":"en:Esprit Holdings",name:"Esprit",shop:"clothes"},removeTags:{brand:"Esprit","brand:wikidata":"Q532746","brand:wikipedia":"en:Esprit Holdings",name:"Esprit",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Etam":{name:"Etam",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3059202"},addTags:{brand:"Etam","brand:wikidata":"Q3059202","brand:wikipedia":"en:Etam Développement",name:"Etam",shop:"clothes"},removeTags:{brand:"Etam","brand:wikidata":"Q3059202","brand:wikipedia":"en:Etam Développement",name:"Etam",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Fat Face":{name:"Fat Face",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5437186"},addTags:{brand:"Fat Face","brand:wikidata":"Q5437186","brand:wikipedia":"en:Fat Face",name:"Fat Face",shop:"clothes"},removeTags:{brand:"Fat Face","brand:wikidata":"Q5437186","brand:wikipedia":"en:Fat Face",name:"Fat Face",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Forever 21":{name:"Forever 21",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1060537"},addTags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"Forever 21",shop:"clothes"},removeTags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"Forever 21",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gant":{name:"Gant",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1493667"},addTags:{brand:"Gant","brand:wikidata":"Q1493667","brand:wikipedia":"en:Gant (retailer)",name:"Gant",shop:"clothes"},removeTags:{brand:"Gant","brand:wikidata":"Q1493667","brand:wikipedia":"en:Gant (retailer)",name:"Gant",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gap":{name:"Gap",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q420822"},addTags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap",shop:"clothes"},removeTags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gerry Weber":{name:"Gerry Weber",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q873447"},addTags:{brand:"Gerry Weber","brand:wikidata":"Q873447","brand:wikipedia":"en:Gerry Weber",name:"Gerry Weber",shop:"clothes"},removeTags:{brand:"Gerry Weber","brand:wikidata":"Q873447","brand:wikipedia":"en:Gerry Weber",name:"Gerry Weber",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gina Laura":{name:"Gina Laura",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2700576"},addTags:{brand:"Gina Laura","brand:wikidata":"Q2700576","brand:wikipedia":"de:Gina Laura",name:"Gina Laura",shop:"clothes"},removeTags:{brand:"Gina Laura","brand:wikidata":"Q2700576","brand:wikipedia":"de:Gina Laura",name:"Gina Laura",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gucci":{name:"Gucci",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q178516"},addTags:{brand:"Gucci","brand:wikidata":"Q178516","brand:wikipedia":"en:Gucci",name:"Gucci",shop:"clothes"},removeTags:{brand:"Gucci","brand:wikidata":"Q178516","brand:wikipedia":"en:Gucci",name:"Gucci",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Guess":{name:"Guess",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2470307"},addTags:{brand:"Guess","brand:wikidata":"Q2470307","brand:wikipedia":"en:Guess (clothing)",name:"Guess",shop:"clothes"},removeTags:{brand:"Guess","brand:wikidata":"Q2470307","brand:wikipedia":"en:Guess (clothing)",name:"Guess",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gymboree":{name:"Gymboree",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4039771"},addTags:{brand:"Gymboree","brand:wikidata":"Q4039771","brand:wikipedia":"en:Gymboree",name:"Gymboree",shop:"clothes"},removeTags:{brand:"Gymboree","brand:wikidata":"Q4039771","brand:wikipedia":"en:Gymboree",name:"Gymboree",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/H&M":{name:"H&M",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q188326"},addTags:{brand:"H&M","brand:wikidata":"Q188326","brand:wikipedia":"en:H&M",name:"H&M",shop:"clothes"},removeTags:{brand:"H&M","brand:wikidata":"Q188326","brand:wikipedia":"en:H&M",name:"H&M",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hallhuber":{name:"Hallhuber",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1571714"},addTags:{brand:"Hallhuber","brand:wikidata":"Q1571714","brand:wikipedia":"de:Hallhuber (Bekleidungshaus)",name:"Hallhuber",shop:"clothes"},removeTags:{brand:"Hallhuber","brand:wikidata":"Q1571714","brand:wikipedia":"de:Hallhuber (Bekleidungshaus)",name:"Hallhuber",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hollister":{name:"Hollister",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1257477"},addTags:{brand:"Hollister","brand:wikidata":"Q1257477","brand:wikipedia":"en:Hollister Co.",name:"Hollister",shop:"clothes"},removeTags:{brand:"Hollister","brand:wikidata":"Q1257477","brand:wikipedia":"en:Hollister Co.",name:"Hollister",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hot Topic":{name:"Hot Topic",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q9294032"},addTags:{brand:"Hot Topic","brand:wikidata":"Q9294032","brand:wikipedia":"en:Hot Topic",name:"Hot Topic",shop:"clothes"},removeTags:{brand:"Hot Topic","brand:wikidata":"Q9294032","brand:wikipedia":"en:Hot Topic",name:"Hot Topic",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hugo Boss":{name:"Hugo Boss",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q491627"},addTags:{brand:"Hugo Boss","brand:wikidata":"Q491627","brand:wikipedia":"en:Hugo Boss",name:"Hugo Boss",shop:"clothes"},removeTags:{brand:"Hugo Boss","brand:wikidata":"Q491627","brand:wikipedia":"en:Hugo Boss",name:"Hugo Boss",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hunkemöller":{name:"Hunkemöller",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2604175"},addTags:{brand:"Hunkemöller","brand:wikidata":"Q2604175","brand:wikipedia":"en:Hunkemöller",name:"Hunkemöller",shop:"clothes"},removeTags:{brand:"Hunkemöller","brand:wikidata":"Q2604175","brand:wikipedia":"en:Hunkemöller",name:"Hunkemöller",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Intimissimi":{name:"Intimissimi",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q305404"},addTags:{brand:"Intimissimi","brand:wikidata":"Q305404","brand:wikipedia":"en:Intimissimi",clothes:"underwear",name:"Intimissimi",shop:"clothes"},removeTags:{brand:"Intimissimi","brand:wikidata":"Q305404","brand:wikipedia":"en:Intimissimi",clothes:"underwear",name:"Intimissimi",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Jack & Jones":{name:"Jack & Jones",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6077665"},addTags:{brand:"Jack & Jones","brand:wikidata":"Q6077665","brand:wikipedia":"en:Jack & Jones",name:"Jack & Jones",shop:"clothes"},removeTags:{brand:"Jack & Jones","brand:wikidata":"Q6077665","brand:wikipedia":"en:Jack & Jones",name:"Jack & Jones",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Joules":{name:"Joules",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q25351738"},addTags:{brand:"Joules","brand:wikidata":"Q25351738","brand:wikipedia":"en:Joules (clothing)",name:"Joules",shop:"clothes"},removeTags:{brand:"Joules","brand:wikidata":"Q25351738","brand:wikipedia":"en:Joules (clothing)",name:"Joules",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/KiK":{name:"KiK",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q883965"},addTags:{brand:"KiK","brand:wikidata":"Q883965","brand:wikipedia":"en:KiK",name:"KiK",shop:"clothes"},removeTags:{brand:"KiK","brand:wikidata":"Q883965","brand:wikipedia":"en:KiK",name:"KiK",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/La Senza":{name:"La Senza",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3212802"},addTags:{brand:"La Senza","brand:wikidata":"Q3212802","brand:wikipedia":"en:La Senza",name:"La Senza",shop:"clothes"},removeTags:{brand:"La Senza","brand:wikidata":"Q3212802","brand:wikipedia":"en:La Senza",name:"La Senza",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Lacoste":{name:"Lacoste",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q309031"},addTags:{brand:"Lacoste","brand:wikidata":"Q309031","brand:wikipedia":"en:Lacoste",name:"Lacoste",shop:"clothes"},removeTags:{brand:"Lacoste","brand:wikidata":"Q309031","brand:wikipedia":"en:Lacoste",name:"Lacoste",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Lane Bryant":{name:"Lane Bryant",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6485350"},addTags:{brand:"Lane Bryant","brand:wikidata":"Q6485350","brand:wikipedia":"en:Lane Bryant",name:"Lane Bryant",shop:"clothes"},removeTags:{brand:"Lane Bryant","brand:wikidata":"Q6485350","brand:wikipedia":"en:Lane Bryant",name:"Lane Bryant",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Levi's":{name:"Levi's",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q127962"},addTags:{brand:"Levi's","brand:wikidata":"Q127962","brand:wikipedia":"en:Levi Strauss & Co.",name:"Levi's",shop:"clothes"},removeTags:{brand:"Levi's","brand:wikidata":"Q127962","brand:wikipedia":"en:Levi Strauss & Co.",name:"Levi's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Lindex":{name:"Lindex",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1786717"},addTags:{brand:"Lindex","brand:wikidata":"Q1786717","brand:wikipedia":"en:Lindex",name:"Lindex",shop:"clothes"},removeTags:{brand:"Lindex","brand:wikidata":"Q1786717","brand:wikipedia":"en:Lindex",name:"Lindex",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Louis Vuitton":{name:"Louis Vuitton",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q191485"},addTags:{brand:"Louis Vuitton","brand:wikidata":"Q191485","brand:wikipedia":"en:Louis Vuitton",name:"Louis Vuitton",shop:"clothes"},removeTags:{brand:"Louis Vuitton","brand:wikidata":"Q191485","brand:wikipedia":"en:Louis Vuitton",name:"Louis Vuitton",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/M&Co":{name:"M&Co",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6711808"},addTags:{brand:"M&Co","brand:wikidata":"Q6711808","brand:wikipedia":"en:M&Co.",name:"M&Co",shop:"clothes"},removeTags:{brand:"M&Co","brand:wikidata":"Q6711808","brand:wikipedia":"en:M&Co.",name:"M&Co",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Mango":{name:"Mango",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q136503"},addTags:{brand:"Mango","brand:wikidata":"Q136503","brand:wikipedia":"en:Mango (retailer)",name:"Mango",shop:"clothes"},removeTags:{brand:"Mango","brand:wikidata":"Q136503","brand:wikipedia":"en:Mango (retailer)",name:"Mango",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Marc O'Polo":{name:"Marc O'Polo",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1892752"},addTags:{brand:"Marc O'Polo","brand:wikidata":"Q1892752","brand:wikipedia":"en:Marc O'Polo",name:"Marc O'Polo",shop:"clothes"},removeTags:{brand:"Marc O'Polo","brand:wikidata":"Q1892752","brand:wikipedia":"en:Marc O'Polo",name:"Marc O'Polo",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Massimo Dutti":{name:"Massimo Dutti",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q788231"},addTags:{brand:"Massimo Dutti","brand:wikidata":"Q788231","brand:wikipedia":"en:Massimo Dutti",name:"Massimo Dutti",shop:"clothes"},removeTags:{brand:"Massimo Dutti","brand:wikidata":"Q788231","brand:wikipedia":"en:Massimo Dutti",name:"Massimo Dutti",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Matalan":{name:"Matalan",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q12061509"},addTags:{brand:"Matalan","brand:wikidata":"Q12061509","brand:wikipedia":"en:Matalan",name:"Matalan",shop:"clothes"},removeTags:{brand:"Matalan","brand:wikidata":"Q12061509","brand:wikipedia":"en:Matalan",name:"Matalan",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Maurices":{name:"Maurices",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6793571"},addTags:{brand:"Maurices","brand:wikidata":"Q6793571","brand:wikipedia":"en:Maurices",name:"Maurices",shop:"clothes"},removeTags:{brand:"Maurices","brand:wikidata":"Q6793571","brand:wikipedia":"en:Maurices",name:"Maurices",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Max Mara":{name:"Max Mara",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1151774"},addTags:{brand:"Max Mara","brand:wikidata":"Q1151774","brand:wikipedia":"en:Max Mara",name:"Max Mara",shop:"clothes"},removeTags:{brand:"Max Mara","brand:wikidata":"Q1151774","brand:wikipedia":"en:Max Mara",name:"Max Mara",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Men's Wearhouse":{name:"Men's Wearhouse",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q57405513"},addTags:{brand:"Men's Wearhouse","brand:wikidata":"Q57405513",name:"Men's Wearhouse",shop:"clothes"},removeTags:{brand:"Men's Wearhouse","brand:wikidata":"Q57405513",name:"Men's Wearhouse",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Mexx":{name:"Mexx",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1837290"},addTags:{brand:"Mexx","brand:wikidata":"Q1837290","brand:wikipedia":"en:Mexx",name:"Mexx",shop:"clothes"},removeTags:{brand:"Mexx","brand:wikidata":"Q1837290","brand:wikipedia":"en:Mexx",name:"Mexx",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Michael Kors":{name:"Michael Kors",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q19572998"},addTags:{brand:"Michael Kors","brand:wikidata":"Q19572998","brand:wikipedia":"en:Michael Kors (brand)",name:"Michael Kors",shop:"clothes"},removeTags:{brand:"Michael Kors","brand:wikidata":"Q19572998","brand:wikipedia":"en:Michael Kors (brand)",name:"Michael Kors",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Monsoon":{name:"Monsoon",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3069980"},addTags:{brand:"Monsoon","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Monsoon",shop:"clothes"},removeTags:{brand:"Monsoon","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Monsoon",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/NKD":{name:"NKD",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q927272"},addTags:{brand:"NKD","brand:wikidata":"Q927272","brand:wikipedia":"de:NKD",name:"NKD",shop:"clothes"},removeTags:{brand:"NKD","brand:wikidata":"Q927272","brand:wikipedia":"de:NKD",name:"NKD",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/New Look":{name:"New Look",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q12063852"},addTags:{brand:"New Look","brand:wikidata":"Q12063852","brand:wikipedia":"en:New Look (company)",name:"New Look",shop:"clothes"},removeTags:{brand:"New Look","brand:wikidata":"Q12063852","brand:wikipedia":"en:New Look (company)",name:"New Look",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/New Yorker":{name:"New Yorker",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q706421"},addTags:{brand:"New Yorker","brand:wikidata":"Q706421","brand:wikipedia":"en:NewYorker",name:"New Yorker",shop:"clothes"},removeTags:{brand:"New Yorker","brand:wikidata":"Q706421","brand:wikipedia":"en:NewYorker",name:"New Yorker",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Next":{name:"Next",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q246655"},addTags:{brand:"Next","brand:wikidata":"Q246655","brand:wikipedia":"en:Next plc",name:"Next",shop:"clothes"},removeTags:{brand:"Next","brand:wikidata":"Q246655","brand:wikipedia":"en:Next plc",name:"Next",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Nike":{name:"Nike",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q483915"},addTags:{brand:"Nike","brand:wikidata":"Q483915","brand:wikipedia":"en:Nike, Inc.",name:"Nike",shop:"clothes"},removeTags:{brand:"Nike","brand:wikidata":"Q483915","brand:wikipedia":"en:Nike, Inc.",name:"Nike",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Nordstrom Rack":{name:"Nordstrom Rack",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q21463374"},addTags:{brand:"Nordstrom Rack","brand:wikidata":"Q21463374","brand:wikipedia":"en:Nordstrom Rack",name:"Nordstrom Rack",shop:"clothes"},removeTags:{brand:"Nordstrom Rack","brand:wikidata":"Q21463374","brand:wikipedia":"en:Nordstrom Rack",name:"Nordstrom Rack",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/OVS":{name:"OVS",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2042514"},addTags:{brand:"OVS","brand:wikidata":"Q2042514","brand:wikipedia":"en:OVS (company)",name:"OVS",shop:"clothes"},removeTags:{brand:"OVS","brand:wikidata":"Q2042514","brand:wikipedia":"en:OVS (company)",name:"OVS",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Old Navy":{name:"Old Navy",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2735242"},addTags:{brand:"Old Navy","brand:wikidata":"Q2735242","brand:wikipedia":"en:Old Navy",name:"Old Navy",shop:"clothes"},removeTags:{brand:"Old Navy","brand:wikidata":"Q2735242","brand:wikipedia":"en:Old Navy",name:"Old Navy",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Outfit":{name:"Outfit",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7112061"},addTags:{brand:"Outfit","brand:wikidata":"Q7112061","brand:wikipedia":"en:Outfit (retailer)",name:"Outfit",shop:"clothes"},removeTags:{brand:"Outfit","brand:wikidata":"Q7112061","brand:wikipedia":"en:Outfit (retailer)",name:"Outfit",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Oysho":{name:"Oysho",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3327046"},addTags:{brand:"Oysho","brand:wikidata":"Q3327046","brand:wikipedia":"en:Oysho",name:"Oysho",shop:"clothes"},removeTags:{brand:"Oysho","brand:wikidata":"Q3327046","brand:wikipedia":"en:Oysho",name:"Oysho",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Peacocks":{name:"Peacocks",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7157762"},addTags:{brand:"Peacocks","brand:wikidata":"Q7157762","brand:wikipedia":"en:Peacocks (clothing)",name:"Peacocks",shop:"clothes"},removeTags:{brand:"Peacocks","brand:wikidata":"Q7157762","brand:wikipedia":"en:Peacocks (clothing)",name:"Peacocks",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Peek & Cloppenburg":{name:"Peek & Cloppenburg",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2066959"},addTags:{brand:"Peek & Cloppenburg","brand:wikidata":"Q2066959","brand:wikipedia":"en:Peek & Cloppenburg",name:"Peek & Cloppenburg",shop:"clothes"},removeTags:{brand:"Peek & Cloppenburg","brand:wikidata":"Q2066959","brand:wikipedia":"en:Peek & Cloppenburg",name:"Peek & Cloppenburg",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Pep":{name:"Pep",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7166182"},addTags:{brand:"Pep","brand:wikidata":"Q7166182","brand:wikipedia":"en:Pep (store)",name:"Pep",shop:"clothes"},removeTags:{brand:"Pep","brand:wikidata":"Q7166182","brand:wikipedia":"en:Pep (store)",name:"Pep",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Pepco":{name:"Pepco",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q11815580"},addTags:{brand:"Pepco","brand:wikidata":"Q11815580","brand:wikipedia":"pl:Pepco",name:"Pepco",shop:"clothes"},removeTags:{brand:"Pepco","brand:wikidata":"Q11815580","brand:wikipedia":"pl:Pepco",name:"Pepco",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Petit Bateau":{name:"Petit Bateau",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3377090"},addTags:{brand:"Petit Bateau","brand:wikidata":"Q3377090","brand:wikipedia":"en:Petit Bateau",name:"Petit Bateau",shop:"clothes"},removeTags:{brand:"Petit Bateau","brand:wikidata":"Q3377090","brand:wikipedia":"en:Petit Bateau",name:"Petit Bateau",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Phase Eight":{name:"Phase Eight",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q17020730"},addTags:{brand:"Phase Eight","brand:wikidata":"Q17020730","brand:wikipedia":"en:Phase Eight",name:"Phase Eight",shop:"clothes"},removeTags:{brand:"Phase Eight","brand:wikidata":"Q17020730","brand:wikipedia":"en:Phase Eight",name:"Phase Eight",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Pimkie":{name:"Pimkie",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1758066"},addTags:{brand:"Pimkie","brand:wikidata":"Q1758066","brand:wikipedia":"en:Pimkie",name:"Pimkie",shop:"clothes"},removeTags:{brand:"Pimkie","brand:wikidata":"Q1758066","brand:wikipedia":"en:Pimkie",name:"Pimkie",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Primark":{name:"Primark",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q137023"},addTags:{brand:"Primark","brand:wikidata":"Q137023","brand:wikipedia":"en:Primark",name:"Primark",shop:"clothes"},removeTags:{brand:"Primark","brand:wikidata":"Q137023","brand:wikipedia":"en:Primark",name:"Primark",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Promod":{name:"Promod",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3407429"},addTags:{brand:"Promod","brand:wikidata":"Q3407429","brand:wikipedia":"en:Promod",name:"Promod",shop:"clothes"},removeTags:{brand:"Promod","brand:wikidata":"Q3407429","brand:wikipedia":"en:Promod",name:"Promod",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Pull & Bear":{name:"Pull & Bear",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q691029"},addTags:{brand:"Pull & Bear","brand:wikidata":"Q691029","brand:wikipedia":"en:Pull&Bear",name:"Pull & Bear",shop:"clothes"},removeTags:{brand:"Pull & Bear","brand:wikidata":"Q691029","brand:wikipedia":"en:Pull&Bear",name:"Pull & Bear",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Reitmans":{name:"Reitmans",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7310506"},addTags:{brand:"Reitmans","brand:wikidata":"Q7310506","brand:wikipedia":"en:Reitmans",name:"Reitmans",shop:"clothes"},removeTags:{brand:"Reitmans","brand:wikidata":"Q7310506","brand:wikipedia":"en:Reitmans",name:"Reitmans",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Reserved":{name:"Reserved",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q21809354"},addTags:{brand:"Reserved","brand:wikidata":"Q21809354","brand:wikipedia":"en:Reserved (retail)",name:"Reserved",shop:"clothes"},removeTags:{brand:"Reserved","brand:wikidata":"Q21809354","brand:wikipedia":"en:Reserved (retail)",name:"Reserved",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/River Island":{name:"River Island",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2670328"},addTags:{brand:"River Island","brand:wikidata":"Q2670328","brand:wikipedia":"en:River Island",name:"River Island",shop:"clothes"},removeTags:{brand:"River Island","brand:wikidata":"Q2670328","brand:wikipedia":"en:River Island",name:"River Island",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ross":{name:"Ross",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3442791"},addTags:{brand:"Ross","brand:wikidata":"Q3442791","brand:wikipedia":"en:Ross Stores",name:"Ross",shop:"clothes"},removeTags:{brand:"Ross","brand:wikidata":"Q3442791","brand:wikipedia":"en:Ross Stores",name:"Ross",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Stradivarius":{name:"Stradivarius",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3322945"},addTags:{brand:"Stradivarius","brand:wikidata":"Q3322945","brand:wikipedia":"en:Stradivarius (clothing brand)",name:"Stradivarius",shop:"clothes"},removeTags:{brand:"Stradivarius","brand:wikidata":"Q3322945","brand:wikipedia":"en:Stradivarius (clothing brand)",name:"Stradivarius",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Suburbia":{name:"Suburbia",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6134992"},addTags:{brand:"Suburbia","brand:wikidata":"Q6134992","brand:wikipedia":"en:Suburbia (department store)",name:"Suburbia",shop:"clothes"},removeTags:{brand:"Suburbia","brand:wikidata":"Q6134992","brand:wikipedia":"en:Suburbia (department store)",name:"Suburbia",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Superdry":{name:"Superdry",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1684445"},addTags:{brand:"Superdry","brand:wikidata":"Q1684445","brand:wikipedia":"en:Superdry",name:"Superdry",shop:"clothes"},removeTags:{brand:"Superdry","brand:wikidata":"Q1684445","brand:wikipedia":"en:Superdry",name:"Superdry",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/TJ Maxx":{name:"TJ Maxx",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q10860683"},addTags:{brand:"TJ Maxx","brand:wikidata":"Q10860683","brand:wikipedia":"en:TJ Maxx",name:"TJ Maxx",shop:"clothes"},removeTags:{brand:"TJ Maxx","brand:wikidata":"Q10860683","brand:wikipedia":"en:TJ Maxx",name:"TJ Maxx",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/TK Maxx":{name:"TK Maxx",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q23823668"},addTags:{brand:"TK Maxx","brand:wikidata":"Q23823668","brand:wikipedia":"en:TK Maxx",name:"TK Maxx",shop:"clothes"},removeTags:{brand:"TK Maxx","brand:wikidata":"Q23823668","brand:wikipedia":"en:TK Maxx",name:"TK Maxx",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Takko":{name:"Takko",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1371302"},addTags:{brand:"Takko","brand:wikidata":"Q1371302","brand:wikipedia":"de:Takko",name:"Takko",shop:"clothes"},removeTags:{brand:"Takko","brand:wikidata":"Q1371302","brand:wikipedia":"de:Takko",name:"Takko",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Talbots":{name:"Talbots",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7679064"},addTags:{brand:"Talbots","brand:wikidata":"Q7679064","brand:wikipedia":"en:Talbots",name:"Talbots",shop:"clothes"},removeTags:{brand:"Talbots","brand:wikidata":"Q7679064","brand:wikipedia":"en:Talbots",name:"Talbots",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Tally Weijl":{name:"Tally Weijl",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q689695"},addTags:{brand:"Tally Weijl","brand:wikidata":"Q689695","brand:wikipedia":"en:Tally Weijl",name:"Tally Weijl",shop:"clothes"},removeTags:{brand:"Tally Weijl","brand:wikidata":"Q689695","brand:wikipedia":"en:Tally Weijl",name:"Tally Weijl",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/The Children's Place":{name:"The Children's Place",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3520257"},addTags:{brand:"The Children's Place","brand:wikidata":"Q3520257","brand:wikipedia":"en:The Children's Place",name:"The Children's Place",shop:"clothes"},removeTags:{brand:"The Children's Place","brand:wikidata":"Q3520257","brand:wikipedia":"en:The Children's Place",name:"The Children's Place",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/The North Face":{name:"The North Face",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q152784"},addTags:{brand:"The North Face","brand:wikidata":"Q152784","brand:wikipedia":"en:The North Face",name:"The North Face",shop:"clothes"},removeTags:{brand:"The North Face","brand:wikidata":"Q152784","brand:wikipedia":"en:The North Face",name:"The North Face",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Timberland":{name:"Timberland",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1539185"},addTags:{brand:"Timberland","brand:wikidata":"Q1539185","brand:wikipedia":"en:The Timberland Company",name:"Timberland",shop:"clothes"},removeTags:{brand:"Timberland","brand:wikidata":"Q1539185","brand:wikipedia":"en:The Timberland Company",name:"Timberland",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Tom Tailor":{name:"Tom Tailor",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q571206"},addTags:{brand:"Tom Tailor","brand:wikidata":"Q571206","brand:wikipedia":"en:Tom Tailor",name:"Tom Tailor",shop:"clothes"},removeTags:{brand:"Tom Tailor","brand:wikidata":"Q571206","brand:wikipedia":"en:Tom Tailor",name:"Tom Tailor",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Tommy Hilfiger":{name:"Tommy Hilfiger",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q634881"},addTags:{brand:"Tommy Hilfiger","brand:wikidata":"Q634881","brand:wikipedia":"en:Tommy Hilfiger (company)",name:"Tommy Hilfiger",shop:"clothes"},removeTags:{brand:"Tommy Hilfiger","brand:wikidata":"Q634881","brand:wikipedia":"en:Tommy Hilfiger (company)",name:"Tommy Hilfiger",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Topshop":{name:"Topshop",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1893576"},addTags:{brand:"Topshop","brand:wikidata":"Q1893576","brand:wikipedia":"en:Topshop",name:"Topshop",shop:"clothes"},removeTags:{brand:"Topshop","brand:wikidata":"Q1893576","brand:wikipedia":"en:Topshop",name:"Topshop",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Torrid":{name:"Torrid",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7827120"},addTags:{brand:"Torrid","brand:wikidata":"Q7827120","brand:wikipedia":"en:Torrid (clothing retailer)",name:"Torrid",shop:"clothes"},removeTags:{brand:"Torrid","brand:wikidata":"Q7827120","brand:wikipedia":"en:Torrid (clothing retailer)",name:"Torrid",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Truworths":{name:"Truworths",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q24233998"},addTags:{brand:"Truworths","brand:wikidata":"Q24233998","brand:wikipedia":"en:Truworths",name:"Truworths",shop:"clothes"},removeTags:{brand:"Truworths","brand:wikidata":"Q24233998","brand:wikipedia":"en:Truworths",name:"Truworths",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ulla Popken":{name:"Ulla Popken",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2475146"},addTags:{brand:"Ulla Popken","brand:wikidata":"Q2475146","brand:wikipedia":"en:Ulla Popken",name:"Ulla Popken",shop:"clothes"},removeTags:{brand:"Ulla Popken","brand:wikidata":"Q2475146","brand:wikipedia":"en:Ulla Popken",name:"Ulla Popken",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Uniqlo":{name:"Uniqlo",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q26070"},addTags:{brand:"Uniqlo","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"Uniqlo",shop:"clothes"},removeTags:{brand:"Uniqlo","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"Uniqlo",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/United Colors of Benetton":{name:"United Colors of Benetton",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q817139"},addTags:{brand:"United Colors of Benetton","brand:wikidata":"Q817139","brand:wikipedia":"en:Benetton Group",name:"United Colors of Benetton",shop:"clothes"},removeTags:{brand:"United Colors of Benetton","brand:wikidata":"Q817139","brand:wikipedia":"en:Benetton Group",name:"United Colors of Benetton",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Urban Outfitters":{name:"Urban Outfitters",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3552193"},addTags:{brand:"Urban Outfitters","brand:wikidata":"Q3552193","brand:wikipedia":"en:Urban Outfitters",name:"Urban Outfitters",shop:"clothes"},removeTags:{brand:"Urban Outfitters","brand:wikidata":"Q3552193","brand:wikipedia":"en:Urban Outfitters",name:"Urban Outfitters",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Victoria's Secret":{name:"Victoria's Secret",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q332477"},addTags:{brand:"Victoria's Secret","brand:wikidata":"Q332477","brand:wikipedia":"en:Victoria's Secret",name:"Victoria's Secret",shop:"clothes"},removeTags:{brand:"Victoria's Secret","brand:wikidata":"Q332477","brand:wikipedia":"en:Victoria's Secret",name:"Victoria's Secret",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/WE":{name:"WE",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1987861"},addTags:{brand:"WE","brand:wikidata":"Q1987861","brand:wikipedia":"en:WE (clothing)",name:"WE",shop:"clothes"},removeTags:{brand:"WE","brand:wikidata":"Q1987861","brand:wikipedia":"en:WE (clothing)",name:"WE",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/White House Black Market":{name:"White House Black Market",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7994858"},addTags:{brand:"White House Black Market","brand:wikidata":"Q7994858","brand:wikipedia":"en:White House Black Market",name:"White House Black Market",shop:"clothes"},removeTags:{brand:"White House Black Market","brand:wikidata":"Q7994858","brand:wikipedia":"en:White House Black Market",name:"White House Black Market",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/White Stuff":{name:"White Stuff",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7995442"},addTags:{brand:"White Stuff","brand:wikidata":"Q7995442","brand:wikipedia":"en:White Stuff Clothing",name:"White Stuff",shop:"clothes"},removeTags:{brand:"White Stuff","brand:wikidata":"Q7995442","brand:wikipedia":"en:White Stuff Clothing",name:"White Stuff",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Wibra":{name:"Wibra",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q943405"},addTags:{brand:"Wibra","brand:wikidata":"Q943405","brand:wikipedia":"en:Wibra",name:"Wibra",shop:"clothes"},removeTags:{brand:"Wibra","brand:wikidata":"Q943405","brand:wikipedia":"en:Wibra",name:"Wibra",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Winners":{name:"Winners",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q845257"},addTags:{brand:"Winners","brand:wikidata":"Q845257","brand:wikipedia":"en:Winners",name:"Winners",shop:"clothes"},removeTags:{brand:"Winners","brand:wikidata":"Q845257","brand:wikipedia":"en:Winners",name:"Winners",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Woolworths":{name:"Woolworths",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q8033997"},addTags:{brand:"Woolworths","brand:wikidata":"Q8033997","brand:wikipedia":"en:Woolworths (South Africa)",name:"Woolworths",shop:"clothes"},removeTags:{brand:"Woolworths","brand:wikidata":"Q8033997","brand:wikipedia":"en:Woolworths (South Africa)",name:"Woolworths",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Zara":{name:"Zara",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q147662"},addTags:{brand:"Zara","brand:wikidata":"Q147662","brand:wikipedia":"en:Zara (retailer)",name:"Zara",shop:"clothes"},removeTags:{brand:"Zara","brand:wikidata":"Q147662","brand:wikipedia":"en:Zara (retailer)",name:"Zara",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Zeeman":{name:"Zeeman",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q184399"},addTags:{brand:"Zeeman","brand:wikidata":"Q184399","brand:wikipedia":"en:Zeeman (store)",name:"Zeeman",shop:"clothes"},removeTags:{brand:"Zeeman","brand:wikidata":"Q184399","brand:wikipedia":"en:Zeeman (store)",name:"Zeeman",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Zumiez":{name:"Zumiez",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q8075252"},addTags:{brand:"Zumiez","brand:wikidata":"Q8075252","brand:wikipedia":"en:Zumiez",name:"Zumiez",shop:"clothes"},removeTags:{brand:"Zumiez","brand:wikidata":"Q8075252","brand:wikipedia":"en:Zumiez",name:"Zumiez",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/rue21":{name:"rue21",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7377762"},addTags:{brand:"rue21","brand:wikidata":"Q7377762","brand:wikipedia":"en:rue21",name:"rue21",shop:"clothes"},removeTags:{brand:"rue21","brand:wikidata":"Q7377762","brand:wikipedia":"en:rue21",name:"rue21",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/s.Oliver":{name:"s.Oliver",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q265056"},addTags:{brand:"s.Oliver","brand:wikidata":"Q265056","brand:wikipedia":"en:S.Oliver",name:"s.Oliver",shop:"clothes"},removeTags:{brand:"s.Oliver","brand:wikidata":"Q265056","brand:wikipedia":"en:S.Oliver",name:"s.Oliver",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/ユニクロ":{name:"ユニクロ",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q26070"},addTags:{brand:"ユニクロ","brand:en":"UNIQLO","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"ユニクロ","name:en":"UNIQLO",shop:"clothes"},removeTags:{brand:"ユニクロ","brand:en":"UNIQLO","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"ユニクロ","name:en":"UNIQLO",shop:"clothes"},matchScore:2,suggestion:true},"shop/coffee/Nespresso":{name:"Nespresso",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"coffee","brand:wikidata":"Q301301"},addTags:{brand:"Nespresso","brand:wikidata":"Q301301","brand:wikipedia":"en:Nespresso",name:"Nespresso",shop:"coffee"},removeTags:{brand:"Nespresso","brand:wikidata":"Q301301","brand:wikipedia":"en:Nespresso",name:"Nespresso",shop:"coffee"},matchScore:2,suggestion:true},"shop/coffee/Tchibo":{name:"Tchibo",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"coffee","brand:wikidata":"Q564213"},addTags:{brand:"Tchibo","brand:wikidata":"Q564213","brand:wikipedia":"de:Tchibo",name:"Tchibo",shop:"coffee"},removeTags:{brand:"Tchibo","brand:wikidata":"Q564213","brand:wikipedia":"de:Tchibo",name:"Tchibo",shop:"coffee"},matchScore:2,suggestion:true},"shop/computer/PC World":{name:"PC World",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"computer","brand:wikidata":"Q7118727"},addTags:{brand:"PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"PC World",shop:"computer"},removeTags:{brand:"PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"PC World",shop:"computer"},matchScore:2,suggestion:true},"shop/confectionery/Adyar Ananda Bhavan":{name:"Adyar Ananda Bhavan",icon:"maki-confectionary",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q15178238"},addTags:{shop:"confectionery",brand:"Adyar Ananda Bhavan","brand:wikidata":"Q15178238","brand:wikipedia":"en:Adyar Ananda Bhavan",name:"Adyar Ananda Bhavan"},removeTags:{shop:"confectionery",brand:"Adyar Ananda Bhavan","brand:wikidata":"Q15178238","brand:wikipedia":"en:Adyar Ananda Bhavan",name:"Adyar Ananda Bhavan"},matchScore:2,suggestion:true},"shop/confectionery/Thorntons":{name:"Thorntons",icon:"maki-confectionary",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q683102"},addTags:{brand:"Thorntons","brand:wikidata":"Q683102","brand:wikipedia":"en:Thorntons",name:"Thorntons",shop:"confectionery"},removeTags:{brand:"Thorntons","brand:wikidata":"Q683102","brand:wikipedia":"en:Thorntons",name:"Thorntons",shop:"confectionery"},matchScore:2,suggestion:true},"shop/convenience/8 à Huit":{name:"8 à Huit",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q2818601"},addTags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"en:8 à Huit",name:"8 à Huit",shop:"convenience"},removeTags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"en:8 à Huit",name:"8 à Huit",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ABC":{name:"ABC",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q4650251"},addTags:{brand:"ABC","brand:wikidata":"Q4650251","brand:wikipedia":"en:ABC Stores (Hawaii)",name:"ABC",shop:"convenience"},removeTags:{brand:"ABC","brand:wikidata":"Q4650251","brand:wikipedia":"en:ABC Stores (Hawaii)",name:"ABC",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/BP Shop":{name:"BP Shop",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q152057"},addTags:{brand:"BP Shop","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP Shop",shop:"convenience"},removeTags:{brand:"BP Shop","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP Shop",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/COOP Jednota":{name:"COOP Jednota",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q41629254"},addTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"convenience"},removeTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Co-op":{name:"Co-op",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5440676"},addTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"convenience"},removeTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/FamilyMart":{name:"FamilyMart",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1191685"},addTags:{brand:"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"FamilyMart",shop:"convenience"},removeTags:{brand:"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"FamilyMart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Hasty Market":{name:"Hasty Market",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q58022603"},addTags:{brand:"Hasty Market","brand:wikidata":"Q58022603",name:"Hasty Market",shop:"convenience"},removeTags:{brand:"Hasty Market","brand:wikidata":"Q58022603",name:"Hasty Market",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Intermarché Contact":{name:"Intermarché Contact",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3153200"},addTags:{brand:"Intermarché Contact",name:"Intermarché Contact","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",shop:"convenience"},removeTags:{brand:"Intermarché Contact",name:"Intermarché Contact","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Kwik Trip":{name:"Kwik Trip",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q6450420"},addTags:{brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip",shop:"convenience"},removeTags:{brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Lawson":{name:"Lawson",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1557223"},addTags:{brand:"Lawson","brand:wikidata":"Q1557223","brand:wikipedia":"en:Lawson (store)",name:"Lawson",shop:"convenience"},removeTags:{brand:"Lawson","brand:wikidata":"Q1557223","brand:wikipedia":"en:Lawson (store)",name:"Lawson",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Marathon":{name:"Marathon",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q458363"},addTags:{brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon",shop:"convenience"},removeTags:{brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Małpka Express":{name:"Małpka Express",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q18431946"},addTags:{brand:"Małpka Express","brand:wikidata":"Q18431946","brand:wikipedia":"en:Małpka Express",name:"Małpka Express",shop:"convenience"},removeTags:{brand:"Małpka Express","brand:wikidata":"Q18431946","brand:wikipedia":"en:Małpka Express",name:"Małpka Express",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/McColl's":{name:"McColl's",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q16997477"},addTags:{brand:"McColl's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"McColl's",shop:"convenience"},removeTags:{brand:"McColl's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"McColl's",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Ministop":{name:"Ministop",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1038929"},addTags:{brand:"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"en:Ministop",name:"Ministop",shop:"convenience"},removeTags:{brand:"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"en:Ministop",name:"Ministop",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Mobil Mart":{name:"Mobil Mart",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3088656"},addTags:{brand:"Mobil Mart","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil Mart",shop:"convenience"},removeTags:{brand:"Mobil Mart","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil Mart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/On the Run":{name:"On the Run",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q16931259"},addTags:{brand:"On the Run","brand:wikidata":"Q16931259","brand:wikipedia":"en:On the Run (convenience store)",name:"On the Run",shop:"convenience"},removeTags:{brand:"On the Run","brand:wikidata":"Q16931259","brand:wikipedia":"en:On the Run (convenience store)",name:"On the Run",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Oxxo":{name:"Oxxo",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1342538"},addTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",shop:"convenience"},removeTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Plaid Pantry":{name:"Plaid Pantry",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7200591"},addTags:{brand:"Plaid Pantry","brand:wikidata":"Q7200591","brand:wikipedia":"en:Plaid Pantry",name:"Plaid Pantry",shop:"convenience"},removeTags:{brand:"Plaid Pantry","brand:wikidata":"Q7200591","brand:wikipedia":"en:Plaid Pantry",name:"Plaid Pantry",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Sheetz":{name:"Sheetz",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7492551"},addTags:{brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz",shop:"convenience"},removeTags:{brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Shell Select":{name:"Shell Select",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q154950"},addTags:{brand:"Shell Select","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell Select",shop:"convenience"},removeTags:{brand:"Shell Select","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell Select",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Speedway":{name:"Speedway",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7575683"},addTags:{brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway",shop:"convenience"},removeTags:{brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/The Co-operative Food":{name:"The Co-operative Food",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3277439"},addTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"convenience"},removeTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Tiger Mart":{name:"Tiger Mart",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q57643977"},addTags:{brand:"Tiger Mart","brand:wikidata":"Q57643977",name:"Tiger Mart",shop:"convenience"},removeTags:{brand:"Tiger Mart","brand:wikidata":"Q57643977",name:"Tiger Mart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/United Dairy Farmers":{name:"United Dairy Farmers",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7887677"},addTags:{brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"United Dairy Farmers",shop:"convenience"},removeTags:{brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"United Dairy Farmers",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Utile":{name:"Utile",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q2529029"},addTags:{brand:"Utile","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Utile",shop:"convenience"},removeTags:{brand:"Utile","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Utile",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Wawa":{name:"Wawa",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5936320"},addTags:{brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa",shop:"convenience"},removeTags:{brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Woolworths Petrol":{name:"Woolworths Petrol",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5023980"},addTags:{brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol",shop:"convenience"},removeTags:{brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/abc":{name:"abc",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11683985"},addTags:{brand:"abc","brand:wikidata":"Q11683985","brand:wikipedia":"pl:abc (sieć handlowa)",name:"abc",shop:"convenience"},removeTags:{brand:"abc","brand:wikidata":"Q11683985","brand:wikipedia":"pl:abc (sieć handlowa)",name:"abc",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ampm":{name:"ampm",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q306960"},addTags:{brand:"ampm","brand:wikidata":"Q306960","brand:wikipedia":"en:Ampm",name:"ampm",shop:"convenience"},removeTags:{brand:"ampm","brand:wikidata":"Q306960","brand:wikipedia":"en:Ampm",name:"ampm",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Żabka":{name:"Żabka",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q2589061"},addTags:{brand:"Żabka","brand:wikidata":"Q2589061","brand:wikipedia":"en:Żabka (convenience store)",name:"Żabka",shop:"convenience"},removeTags:{brand:"Żabka","brand:wikidata":"Q2589061","brand:wikipedia":"en:Żabka (convenience store)",name:"Żabka",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Копейка":{name:"Копейка",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1783878"},addTags:{brand:"Копейка","brand:en":"Kopeyka","brand:wikidata":"Q1783878","brand:wikipedia":"en:Kopeyka (supermarket)",name:"Копейка","name:en":"Kopeyka",shop:"convenience"},removeTags:{brand:"Копейка","brand:en":"Kopeyka","brand:wikidata":"Q1783878","brand:wikipedia":"en:Kopeyka (supermarket)",name:"Копейка","name:en":"Kopeyka",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Магнит":{name:"Магнит",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q940518"},addTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"convenience"},removeTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/サークルK":{name:"サークルK",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3268010"},addTags:{brand:"サークルK","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"サークルK","name:en":"Circle K",shop:"convenience"},removeTags:{brand:"サークルK","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"サークルK","name:en":"Circle K",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/セイコーマート":{name:"セイコーマート",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11314123"},addTags:{brand:"セイコーマート","brand:en":"Seicomart","brand:wikidata":"Q11314123","brand:wikipedia":"ja:セイコーマート",name:"セイコーマート","name:en":"Seicomart",shop:"convenience"},removeTags:{brand:"セイコーマート","brand:en":"Seicomart","brand:wikidata":"Q11314123","brand:wikipedia":"ja:セイコーマート",name:"セイコーマート","name:en":"Seicomart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/セブン-イレブン":{name:"セブン-イレブン",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q259340"},addTags:{brand:"セブン-イレブン","brand:en":"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"セブン-イレブン","name:en":"7-Eleven",shop:"convenience"},removeTags:{brand:"セブン-イレブン","brand:en":"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"セブン-イレブン","name:en":"7-Eleven",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/セーブオン":{name:"セーブオン",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11314868"},addTags:{brand:"セーブオン","brand:en":"Save On","brand:wikidata":"Q11314868","brand:wikipedia":"ja:セーブオン",name:"セーブオン","name:en":"Save On",shop:"convenience"},removeTags:{brand:"セーブオン","brand:en":"Save On","brand:wikidata":"Q11314868","brand:wikipedia":"ja:セーブオン",name:"セーブオン","name:en":"Save On",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/デイリーヤマザキ":{name:"デイリーヤマザキ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5209392"},addTags:{brand:"デイリーヤマザキ","brand:en":"Daily Yamazaki","brand:wikidata":"Q5209392","brand:wikipedia":"en:Daily Yamazaki",name:"デイリーヤマザキ","name:en":"Daily Yamazaki",shop:"convenience"},removeTags:{brand:"デイリーヤマザキ","brand:en":"Daily Yamazaki","brand:wikidata":"Q5209392","brand:wikipedia":"en:Daily Yamazaki",name:"デイリーヤマザキ","name:en":"Daily Yamazaki",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ファミリーマート":{name:"ファミリーマート",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1191685"},addTags:{brand:"ファミリーマート","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"ファミリーマート","name:en":"FamilyMart",shop:"convenience"},removeTags:{brand:"ファミリーマート","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"ファミリーマート","name:en":"FamilyMart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ポプラ":{name:"ポプラ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7229380"},addTags:{brand:"ポプラ","brand:wikidata":"Q7229380","brand:wikipedia":"ja:ポプラ (コンビニエンスストア)",name:"ポプラ","name:en":"Poplar",shop:"convenience"},removeTags:{brand:"ポプラ","brand:wikidata":"Q7229380","brand:wikipedia":"ja:ポプラ (コンビニエンスストア)",name:"ポプラ","name:en":"Poplar",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ミニストップ":{name:"ミニストップ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1038929"},addTags:{brand:"ミニストップ","brand:en":"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"ja:ミニストップ",name:"ミニストップ","name:en":"Ministop",shop:"convenience"},removeTags:{brand:"ミニストップ","brand:en":"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"ja:ミニストップ",name:"ミニストップ","name:en":"Ministop",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ヤマザキショップ":{name:"ヤマザキショップ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11345131"},addTags:{brand:"ヤマザキショップ","brand:wikidata":"Q11345131","brand:wikipedia":"ja:ヤマザキショップ",name:"ヤマザキショップ","name:en":"Yamazaki Shop",shop:"convenience"},removeTags:{brand:"ヤマザキショップ","brand:wikidata":"Q11345131","brand:wikipedia":"ja:ヤマザキショップ",name:"ヤマザキショップ","name:en":"Yamazaki Shop",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ローソン":{name:"ローソン",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1557223"},addTags:{brand:"ローソン","brand:en":"LAWSON","brand:wikidata":"Q1557223","brand:wikipedia":"ja:ローソン",name:"ローソン","name:en":"Lawson",shop:"convenience"},removeTags:{brand:"ローソン","brand:en":"LAWSON","brand:wikidata":"Q1557223","brand:wikipedia":"ja:ローソン",name:"ローソン","name:en":"Lawson",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ローソンストア100":{name:"ローソンストア100",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11350960"},addTags:{brand:"ローソンストア100","brand:wikidata":"Q11350960","brand:wikipedia":"ja:ローソンストア100",name:"ローソンストア100",shop:"convenience"},removeTags:{brand:"ローソンストア100","brand:wikidata":"Q11350960","brand:wikipedia":"ja:ローソンストア100",name:"ローソンストア100",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/全家":{name:"全家",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1191685"},addTags:{brand:"全家","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"全家","name:en":"FamilyMart",shop:"convenience"},removeTags:{brand:"全家","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"全家","name:en":"FamilyMart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/세븐일레븐":{name:"세븐일레븐",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q259340"},addTags:{brand:"세븐일레븐","brand:en":"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"세븐일레븐","name:en":"7-Eleven",shop:"convenience"},removeTags:{brand:"세븐일레븐","brand:en":"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"세븐일레븐","name:en":"7-Eleven",shop:"convenience"},matchScore:2,suggestion:true},"shop/cosmetics/Lush":{name:"Lush",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q1585448"},addTags:{brand:"Lush","brand:wikidata":"Q1585448","brand:wikipedia":"en:Lush (company)",name:"Lush",shop:"cosmetics"},removeTags:{brand:"Lush","brand:wikidata":"Q1585448","brand:wikipedia":"en:Lush (company)",name:"Lush",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Sephora":{name:"Sephora",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q2408041"},addTags:{brand:"Sephora","brand:wikidata":"Q2408041","brand:wikipedia":"en:Sephora",name:"Sephora",shop:"cosmetics"},removeTags:{brand:"Sephora","brand:wikidata":"Q2408041","brand:wikipedia":"en:Sephora",name:"Sephora",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/The Body Shop":{name:"The Body Shop",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q837851"},addTags:{brand:"The Body Shop","brand:wikidata":"Q837851","brand:wikipedia":"en:The Body Shop",name:"The Body Shop",shop:"cosmetics"},removeTags:{brand:"The Body Shop","brand:wikidata":"Q837851","brand:wikipedia":"en:The Body Shop",name:"The Body Shop",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Л'Этуаль":{name:"Л'Этуаль",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q18400706"},addTags:{brand:"Л'Этуаль","brand:wikidata":"Q18400706","brand:wikipedia":"ru:Л’Этуаль",name:"Л'Этуаль",shop:"cosmetics"},removeTags:{brand:"Л'Этуаль","brand:wikidata":"Q18400706","brand:wikipedia":"ru:Л’Этуаль",name:"Л'Этуаль",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Магнит Косметик":{name:"Магнит Косметик",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q940518"},addTags:{brand:"Магнит Косметик","brand:en":"Magnit Cosmetics","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит Косметик","name:en":"Magnit Cosmetics",shop:"cosmetics"},removeTags:{brand:"Магнит Косметик","brand:en":"Magnit Cosmetics","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит Косметик","name:en":"Magnit Cosmetics",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/country_store/Rural King":{name:"Rural King",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"country_store","brand:wikidata":"Q7380525"},addTags:{brand:"Rural King","brand:wikidata":"Q7380525","brand:wikipedia":"en:Rural King",name:"Rural King",shop:"country_store"},removeTags:{brand:"Rural King","brand:wikidata":"Q7380525","brand:wikipedia":"en:Rural King",name:"Rural King",shop:"country_store"},matchScore:2,suggestion:true},"shop/country_store/Tractor Supply Company":{name:"Tractor Supply Company",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"country_store","brand:wikidata":"Q15109925"},addTags:{brand:"Tractor Supply Company","brand:wikidata":"Q15109925","brand:wikipedia":"en:Tractor Supply Company",name:"Tractor Supply Company",shop:"country_store"},removeTags:{brand:"Tractor Supply Company","brand:wikidata":"Q15109925","brand:wikipedia":"en:Tractor Supply Company",name:"Tractor Supply Company",shop:"country_store"},matchScore:2,suggestion:true},"shop/craft/Hobby Lobby":{name:"Hobby Lobby",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"craft","brand:wikidata":"Q5874938"},addTags:{brand:"Hobby Lobby","brand:wikidata":"Q5874938","brand:wikipedia":"en:Hobby Lobby",name:"Hobby Lobby",shop:"craft"},removeTags:{brand:"Hobby Lobby","brand:wikidata":"Q5874938","brand:wikipedia":"en:Hobby Lobby",name:"Hobby Lobby",shop:"craft"},matchScore:2,suggestion:true},"shop/craft/Michaels":{name:"Michaels",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"craft","brand:wikidata":"Q6835667"},addTags:{brand:"Michaels","brand:wikidata":"Q6835667","brand:wikipedia":"en:Michaels",name:"Michaels",shop:"craft"},removeTags:{brand:"Michaels","brand:wikidata":"Q6835667","brand:wikipedia":"en:Michaels",name:"Michaels",shop:"craft"},matchScore:2,suggestion:true},"shop/department_store/Belk":{name:"Belk",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q127428"},addTags:{brand:"Belk","brand:wikidata":"Q127428","brand:wikipedia":"en:Belk",name:"Belk",shop:"department_store"},removeTags:{brand:"Belk","brand:wikidata":"Q127428","brand:wikipedia":"en:Belk",name:"Belk",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Big Lots":{name:"Big Lots",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q4905973"},addTags:{brand:"Big Lots","brand:wikidata":"Q4905973","brand:wikipedia":"en:Big Lots",name:"Big Lots",shop:"department_store"},removeTags:{brand:"Big Lots","brand:wikidata":"Q4905973","brand:wikipedia":"en:Big Lots",name:"Big Lots",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Big W":{name:"Big W",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q4906646"},addTags:{brand:"Big W","brand:wikidata":"Q4906646","brand:wikipedia":"en:Big W",name:"Big W",shop:"department_store"},removeTags:{brand:"Big W","brand:wikidata":"Q4906646","brand:wikipedia":"en:Big W",name:"Big W",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Canadian Tire":{name:"Canadian Tire",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1032400"},addTags:{brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire",shop:"department_store"},removeTags:{brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Coppel":{name:"Coppel",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q2497795"},addTags:{brand:"Coppel","brand:wikidata":"Q2497795","brand:wikipedia":"en:Coppel",name:"Coppel",shop:"department_store"},removeTags:{brand:"Coppel","brand:wikidata":"Q2497795","brand:wikipedia":"en:Coppel",name:"Coppel",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Debenhams":{name:"Debenhams",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1181484"},addTags:{brand:"Debenhams","brand:wikidata":"Q1181484","brand:wikipedia":"en:Debenhams",name:"Debenhams",shop:"department_store"},removeTags:{brand:"Debenhams","brand:wikidata":"Q1181484","brand:wikipedia":"en:Debenhams",name:"Debenhams",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Dillard's":{name:"Dillard's",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q844805"},addTags:{brand:"Dillard's","brand:wikidata":"Q844805","brand:wikipedia":"en:Dillard's",name:"Dillard's",shop:"department_store"},removeTags:{brand:"Dillard's","brand:wikidata":"Q844805","brand:wikipedia":"en:Dillard's",name:"Dillard's",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/El Corte Inglés":{name:"El Corte Inglés",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q623133"},addTags:{brand:"El Corte Inglés","brand:wikidata":"Q623133","brand:wikipedia":"en:El Corte Inglés",name:"El Corte Inglés",shop:"department_store"},removeTags:{brand:"El Corte Inglés","brand:wikidata":"Q623133","brand:wikipedia":"en:El Corte Inglés",name:"El Corte Inglés",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Galeria Kaufhof":{name:"Galeria Kaufhof",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q322598"},addTags:{brand:"Galeria Kaufhof","brand:wikidata":"Q322598","brand:wikipedia":"en:Galeria Kaufhof",name:"Galeria Kaufhof",shop:"department_store"},removeTags:{brand:"Galeria Kaufhof","brand:wikidata":"Q322598","brand:wikipedia":"en:Galeria Kaufhof",name:"Galeria Kaufhof",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Giant Tiger":{name:"Giant Tiger",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q5558429"},addTags:{brand:"Giant Tiger","brand:wikidata":"Q5558429","brand:wikipedia":"en:Giant Tiger",name:"Giant Tiger",shop:"department_store"},removeTags:{brand:"Giant Tiger","brand:wikidata":"Q5558429","brand:wikipedia":"en:Giant Tiger",name:"Giant Tiger",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/HEMA":{name:"HEMA",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q903805"},addTags:{brand:"HEMA","brand:wikidata":"Q903805","brand:wikipedia":"en:HEMA (store)",name:"HEMA",shop:"department_store"},removeTags:{brand:"HEMA","brand:wikidata":"Q903805","brand:wikipedia":"en:HEMA (store)",name:"HEMA",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Harvey Norman":{name:"Harvey Norman",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q4040441"},addTags:{brand:"Harvey Norman","brand:wikidata":"Q4040441","brand:wikipedia":"en:Harvey Norman",name:"Harvey Norman",shop:"department_store"},removeTags:{brand:"Harvey Norman","brand:wikidata":"Q4040441","brand:wikipedia":"en:Harvey Norman",name:"Harvey Norman",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/JCPenney":{name:"JCPenney",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q920037"},addTags:{brand:"JCPenney","brand:wikidata":"Q920037","brand:wikipedia":"en:J. C. Penney",name:"JCPenney",shop:"department_store"},removeTags:{brand:"JCPenney","brand:wikidata":"Q920037","brand:wikipedia":"en:J. C. Penney",name:"JCPenney",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Karstadt":{name:"Karstadt",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q182910"},addTags:{brand:"Karstadt","brand:wikidata":"Q182910","brand:wikipedia":"en:Karstadt",name:"Karstadt",shop:"department_store"},removeTags:{brand:"Karstadt","brand:wikidata":"Q182910","brand:wikipedia":"en:Karstadt",name:"Karstadt",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Kmart":{name:"Kmart",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1753080"},addTags:{brand:"Kmart","brand:wikidata":"Q1753080","brand:wikipedia":"en:Kmart",name:"Kmart",shop:"department_store"},removeTags:{brand:"Kmart","brand:wikidata":"Q1753080","brand:wikipedia":"en:Kmart",name:"Kmart",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Kohl's":{name:"Kohl's",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q967265"},addTags:{brand:"Kohl's","brand:wikidata":"Q967265","brand:wikipedia":"en:Kohl's",name:"Kohl's",shop:"department_store"},removeTags:{brand:"Kohl's","brand:wikidata":"Q967265","brand:wikipedia":"en:Kohl's",name:"Kohl's",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Lojas Americanas":{name:"Lojas Americanas",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q3064093"},addTags:{brand:"Lojas Americanas","brand:wikidata":"Q3064093","brand:wikipedia":"en:Lojas Americanas",name:"Lojas Americanas",shop:"department_store"},removeTags:{brand:"Lojas Americanas","brand:wikidata":"Q3064093","brand:wikipedia":"en:Lojas Americanas",name:"Lojas Americanas",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Macy's":{name:"Macy's",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q629269"},addTags:{brand:"Macy's","brand:wikidata":"Q629269","brand:wikipedia":"en:Macy's",name:"Macy's",shop:"department_store"},removeTags:{brand:"Macy's","brand:wikidata":"Q629269","brand:wikipedia":"en:Macy's",name:"Macy's",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Marks & Spencer":{name:"Marks & Spencer",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q714491"},addTags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"department_store"},removeTags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Marshalls":{name:"Marshalls",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q15903261"},addTags:{brand:"Marshalls","brand:wikidata":"Q15903261","brand:wikipedia":"en:Marshalls",name:"Marshalls",shop:"department_store"},removeTags:{brand:"Marshalls","brand:wikidata":"Q15903261","brand:wikipedia":"en:Marshalls",name:"Marshalls",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Myer":{name:"Myer",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1110323"},addTags:{brand:"Myer","brand:wikidata":"Q1110323","brand:wikipedia":"en:Myer",name:"Myer",shop:"department_store"},removeTags:{brand:"Myer","brand:wikidata":"Q1110323","brand:wikipedia":"en:Myer",name:"Myer",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Nordstrom":{name:"Nordstrom",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q174310"},addTags:{brand:"Nordstrom","brand:wikidata":"Q174310","brand:wikipedia":"en:Nordstrom",name:"Nordstrom",shop:"department_store"},removeTags:{brand:"Nordstrom","brand:wikidata":"Q174310","brand:wikipedia":"en:Nordstrom",name:"Nordstrom",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Sears":{name:"Sears",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q6499202"},addTags:{brand:"Sears","brand:wikidata":"Q6499202","brand:wikipedia":"en:Sears",name:"Sears",shop:"department_store"},removeTags:{brand:"Sears","brand:wikidata":"Q6499202","brand:wikipedia":"en:Sears",name:"Sears",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Shopko":{name:"Shopko",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q7501155"},addTags:{brand:"Shopko","brand:wikidata":"Q7501155","brand:wikipedia":"en:Shopko",name:"Shopko",shop:"department_store"},removeTags:{brand:"Shopko","brand:wikidata":"Q7501155","brand:wikipedia":"en:Shopko",name:"Shopko",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Target (Australia)":{name:"Target (Australia)",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q7685854"},addTags:{brand:"Target","brand:wikidata":"Q7685854","brand:wikipedia":"en:Target Australia",name:"Target",shop:"department_store"},removeTags:{brand:"Target","brand:wikidata":"Q7685854","brand:wikipedia":"en:Target Australia",name:"Target",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Target (USA)":{name:"Target (USA)",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1046951"},addTags:{brand:"Target","brand:wikidata":"Q1046951","brand:wikipedia":"en:Target Corporation",name:"Target",shop:"department_store"},removeTags:{brand:"Target","brand:wikidata":"Q1046951","brand:wikipedia":"en:Target Corporation",name:"Target",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/The Warehouse":{name:"The Warehouse",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q3566291"},addTags:{brand:"The Warehouse","brand:wikidata":"Q3566291","brand:wikipedia":"en:The Warehouse Group",name:"The Warehouse",shop:"department_store"},removeTags:{brand:"The Warehouse","brand:wikidata":"Q3566291","brand:wikipedia":"en:The Warehouse Group",name:"The Warehouse",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Walmart":{name:"Walmart",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q483551"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"department_store"},removeTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Woolworth":{name:"Woolworth",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q183538"},addTags:{brand:"Woolworth","brand:wikidata":"Q183538","brand:wikipedia":"de:Woolworth Deutschland",name:"Woolworth",shop:"department_store"},removeTags:{brand:"Woolworth","brand:wikidata":"Q183538","brand:wikipedia":"de:Woolworth Deutschland",name:"Woolworth",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Åhléns":{name:"Åhléns",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q270851"},addTags:{brand:"Åhléns","brand:wikidata":"Q270851","brand:wikipedia":"sv:Åhléns",name:"Åhléns",shop:"department_store"},removeTags:{brand:"Åhléns","brand:wikidata":"Q270851","brand:wikipedia":"sv:Åhléns",name:"Åhléns",shop:"department_store"},matchScore:2,suggestion:true},"shop/doityourself/Ace Hardware":{name:"Ace Hardware",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q4672981"},addTags:{brand:"Ace Hardware","brand:wikidata":"Q4672981","brand:wikipedia":"en:Ace Hardware",name:"Ace Hardware",shop:"doityourself"},removeTags:{brand:"Ace Hardware","brand:wikidata":"Q4672981","brand:wikipedia":"en:Ace Hardware",name:"Ace Hardware",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/B&Q":{name:"B&Q",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q707602"},addTags:{brand:"B&Q","brand:wikidata":"Q707602","brand:wikipedia":"en:B&Q",name:"B&Q",shop:"doityourself"},removeTags:{brand:"B&Q","brand:wikidata":"Q707602","brand:wikipedia":"en:B&Q",name:"B&Q",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bauhaus":{name:"Bauhaus",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q672043"},addTags:{brand:"Bauhaus","brand:wikidata":"Q672043","brand:wikipedia":"en:Bauhaus (company)",name:"Bauhaus",shop:"doityourself"},removeTags:{brand:"Bauhaus","brand:wikidata":"Q672043","brand:wikipedia":"en:Bauhaus (company)",name:"Bauhaus",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Biltema":{name:"Biltema",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3355552"},addTags:{brand:"Biltema","brand:wikidata":"Q3355552","brand:wikipedia":"en:Biltema",name:"Biltema",shop:"doityourself"},removeTags:{brand:"Biltema","brand:wikidata":"Q3355552","brand:wikipedia":"en:Biltema",name:"Biltema",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Brico":{name:"Brico",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2510786"},addTags:{brand:"Brico","brand:wikidata":"Q2510786","brand:wikipedia":"en:Brico",name:"Brico",shop:"doityourself"},removeTags:{brand:"Brico","brand:wikidata":"Q2510786","brand:wikipedia":"en:Brico",name:"Brico",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Brico Dépôt":{name:"Brico Dépôt",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2889702"},addTags:{brand:"Brico Dépôt","brand:wikidata":"Q2889702","brand:wikipedia":"en:Brico Dépôt",name:"Brico Dépôt",shop:"doityourself"},removeTags:{brand:"Brico Dépôt","brand:wikidata":"Q2889702","brand:wikipedia":"en:Brico Dépôt",name:"Brico Dépôt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bricomarché":{name:"Bricomarché",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2925147"},addTags:{brand:"Bricomarché","brand:wikidata":"Q2925147","brand:wikipedia":"en:Bricomarché",name:"Bricomarché",shop:"doityourself"},removeTags:{brand:"Bricomarché","brand:wikidata":"Q2925147","brand:wikipedia":"en:Bricomarché",name:"Bricomarché",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bricorama":{name:"Bricorama",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2925146"},addTags:{brand:"Bricorama","brand:wikidata":"Q2925146","brand:wikipedia":"en:Bricorama",name:"Bricorama",shop:"doityourself"},removeTags:{brand:"Bricorama","brand:wikidata":"Q2925146","brand:wikipedia":"en:Bricorama",name:"Bricorama",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bunnings Warehouse":{name:"Bunnings Warehouse",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q4997829"},addTags:{brand:"Bunnings Warehouse","brand:wikidata":"Q4997829","brand:wikipedia":"en:Bunnings Warehouse",name:"Bunnings Warehouse",shop:"doityourself"},removeTags:{brand:"Bunnings Warehouse","brand:wikidata":"Q4997829","brand:wikipedia":"en:Bunnings Warehouse",name:"Bunnings Warehouse",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Castorama":{name:"Castorama",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q966971"},addTags:{brand:"Castorama","brand:wikidata":"Q966971","brand:wikipedia":"en:Castorama",name:"Castorama",shop:"doityourself"},removeTags:{brand:"Castorama","brand:wikidata":"Q966971","brand:wikipedia":"en:Castorama",name:"Castorama",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Clas Ohlson":{name:"Clas Ohlson",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3356220"},addTags:{brand:"Clas Ohlson","brand:wikidata":"Q3356220","brand:wikipedia":"en:Clas Ohlson",name:"Clas Ohlson",shop:"doityourself"},removeTags:{brand:"Clas Ohlson","brand:wikidata":"Q3356220","brand:wikipedia":"en:Clas Ohlson",name:"Clas Ohlson",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Gamma":{name:"Gamma",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2294120"},addTags:{brand:"Gamma","brand:wikidata":"Q2294120","brand:wikipedia":"en:Gamma (store)",name:"Gamma",shop:"doityourself"},removeTags:{brand:"Gamma","brand:wikidata":"Q2294120","brand:wikipedia":"en:Gamma (store)",name:"Gamma",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Globus Baumarkt":{name:"Globus Baumarkt",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q457503"},addTags:{brand:"Globus Baumarkt","brand:wikidata":"Q457503","brand:wikipedia":"de:Globus Holding",name:"Globus Baumarkt",shop:"doityourself"},removeTags:{brand:"Globus Baumarkt","brand:wikidata":"Q457503","brand:wikipedia":"de:Globus Holding",name:"Globus Baumarkt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hagebaumarkt":{name:"Hagebaumarkt",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q1568279"},addTags:{brand:"Hagebaumarkt","brand:wikidata":"Q1568279","brand:wikipedia":"de:Hagebau",name:"Hagebaumarkt",shop:"doityourself"},removeTags:{brand:"Hagebaumarkt","brand:wikidata":"Q1568279","brand:wikipedia":"de:Hagebau",name:"Hagebaumarkt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hammer":{name:"Hammer",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q52159668"},addTags:{brand:"Hammer","brand:wikidata":"Q52159668","brand:wikipedia":"de:Hammer (Fachmarktkette)",name:"Hammer",shop:"doityourself"},removeTags:{brand:"Hammer","brand:wikidata":"Q52159668","brand:wikipedia":"de:Hammer (Fachmarktkette)",name:"Hammer",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hellweg":{name:"Hellweg",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q1603084"},addTags:{brand:"Hellweg","brand:wikidata":"Q1603084","brand:wikipedia":"de:Hellweg (Baumarkt)",name:"Hellweg",shop:"doityourself"},removeTags:{brand:"Hellweg","brand:wikidata":"Q1603084","brand:wikipedia":"de:Hellweg (Baumarkt)",name:"Hellweg",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Home Depot":{name:"Home Depot",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q864407"},addTags:{brand:"Home Depot","brand:wikidata":"Q864407","brand:wikipedia":"en:The Home Depot",name:"Home Depot",shop:"doityourself"},removeTags:{brand:"Home Depot","brand:wikidata":"Q864407","brand:wikipedia":"en:The Home Depot",name:"Home Depot",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Homebase":{name:"Homebase",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q9293447"},addTags:{brand:"Homebase","brand:wikidata":"Q9293447","brand:wikipedia":"en:Homebase",name:"Homebase",shop:"doityourself"},removeTags:{brand:"Homebase","brand:wikidata":"Q9293447","brand:wikipedia":"en:Homebase",name:"Homebase",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hornbach":{name:"Hornbach",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q685926"},addTags:{brand:"Hornbach","brand:wikidata":"Q685926","brand:wikipedia":"en:Hornbach (retailer)",name:"Hornbach",shop:"doityourself"},removeTags:{brand:"Hornbach","brand:wikidata":"Q685926","brand:wikipedia":"en:Hornbach (retailer)",name:"Hornbach",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hubo":{name:"Hubo",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3142153"},addTags:{brand:"Hubo","brand:wikidata":"Q3142153","brand:wikipedia":"en:Hubo Belgium",name:"Hubo",shop:"doityourself"},removeTags:{brand:"Hubo","brand:wikidata":"Q3142153","brand:wikipedia":"en:Hubo Belgium",name:"Hubo",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Jewson":{name:"Jewson",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q6190226"},addTags:{brand:"Jewson","brand:wikidata":"Q6190226","brand:wikipedia":"en:Jewson",name:"Jewson",shop:"doityourself"},removeTags:{brand:"Jewson","brand:wikidata":"Q6190226","brand:wikipedia":"en:Jewson",name:"Jewson",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Karwei":{name:"Karwei",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2097480"},addTags:{brand:"Karwei","brand:wikidata":"Q2097480","brand:wikipedia":"en:Karwei",name:"Karwei",shop:"doityourself"},removeTags:{brand:"Karwei","brand:wikidata":"Q2097480","brand:wikipedia":"en:Karwei",name:"Karwei",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Leroy Merlin":{name:"Leroy Merlin",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q889624"},addTags:{brand:"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Leroy Merlin",shop:"doityourself"},removeTags:{brand:"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Leroy Merlin",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Lowe's":{name:"Lowe's",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q1373493"},addTags:{brand:"Lowe's","brand:wikidata":"Q1373493","brand:wikipedia":"en:Lowe's",name:"Lowe's",shop:"doityourself"},removeTags:{brand:"Lowe's","brand:wikidata":"Q1373493","brand:wikipedia":"en:Lowe's",name:"Lowe's",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Menards":{name:"Menards",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q1639897"},addTags:{brand:"Menards","brand:wikidata":"Q1639897","brand:wikipedia":"en:Menards",name:"Menards",shop:"doityourself"},removeTags:{brand:"Menards","brand:wikidata":"Q1639897","brand:wikipedia":"en:Menards",name:"Menards",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Mr.Bricolage":{name:"Mr.Bricolage",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3141657"},addTags:{brand:"Mr.Bricolage","brand:wikidata":"Q3141657","brand:wikipedia":"fr:Mr Bricolage",name:"Mr.Bricolage",shop:"doityourself"},removeTags:{brand:"Mr.Bricolage","brand:wikidata":"Q3141657","brand:wikipedia":"fr:Mr Bricolage",name:"Mr.Bricolage",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/OBI":{name:"OBI",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q300518"},addTags:{brand:"OBI","brand:wikidata":"Q300518","brand:wikipedia":"en:Obi (store)",name:"OBI",shop:"doityourself"},removeTags:{brand:"OBI","brand:wikidata":"Q300518","brand:wikipedia":"en:Obi (store)",name:"OBI",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Praktiker":{name:"Praktiker",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q680214"},addTags:{brand:"Praktiker","brand:wikidata":"Q680214","brand:wikipedia":"en:Praktiker",name:"Praktiker",shop:"doityourself"},removeTags:{brand:"Praktiker","brand:wikidata":"Q680214","brand:wikipedia":"en:Praktiker",name:"Praktiker",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Rona":{name:"Rona",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3415283"},addTags:{brand:"Rona","brand:wikidata":"Q3415283","brand:wikipedia":"en:Rona, Inc.",name:"Rona",shop:"doityourself"},removeTags:{brand:"Rona","brand:wikidata":"Q3415283","brand:wikipedia":"en:Rona, Inc.",name:"Rona",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Screwfix":{name:"Screwfix",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q7439115"},addTags:{brand:"Screwfix","brand:wikidata":"Q7439115","brand:wikipedia":"en:Screwfix",name:"Screwfix",shop:"doityourself"},removeTags:{brand:"Screwfix","brand:wikidata":"Q7439115","brand:wikipedia":"en:Screwfix",name:"Screwfix",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Toom Baumarkt":{name:"Toom Baumarkt",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2442970"},addTags:{brand:"Toom Baumarkt","brand:wikidata":"Q2442970","brand:wikipedia":"de:Toom Baumarkt",name:"Toom Baumarkt",shop:"doityourself"},removeTags:{brand:"Toom Baumarkt","brand:wikidata":"Q2442970","brand:wikipedia":"de:Toom Baumarkt",name:"Toom Baumarkt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Travis Perkins":{name:"Travis Perkins",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2450664"},addTags:{brand:"Travis Perkins","brand:wikidata":"Q2450664","brand:wikipedia":"en:Travis Perkins",name:"Travis Perkins",shop:"doityourself"},removeTags:{brand:"Travis Perkins","brand:wikidata":"Q2450664","brand:wikipedia":"en:Travis Perkins",name:"Travis Perkins",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Wickes":{name:"Wickes",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q7998350"},addTags:{brand:"Wickes","brand:wikidata":"Q7998350","brand:wikipedia":"en:Wickes",name:"Wickes",shop:"doityourself"},removeTags:{brand:"Wickes","brand:wikidata":"Q7998350","brand:wikipedia":"en:Wickes",name:"Wickes",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Леруа Мерлен":{name:"Леруа Мерлен",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q889624"},addTags:{brand:"Леруа Мерлен","brand:en":"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Леруа Мерлен","name:en":"Leroy Merlin",shop:"doityourself"},removeTags:{brand:"Леруа Мерлен","brand:en":"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Леруа Мерлен","name:en":"Leroy Merlin",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/コメリ":{name:"コメリ",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q11302690"},addTags:{brand:"コメリ","brand:wikidata":"Q11302690","brand:wikipedia":"ja:コメリ",name:"コメリ","name:en":"Komeri",shop:"doityourself"},removeTags:{brand:"コメリ","brand:wikidata":"Q11302690","brand:wikipedia":"ja:コメリ",name:"コメリ","name:en":"Komeri",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/コーナン":{name:"コーナン",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q11303403"},addTags:{brand:"コーナン","brand:wikidata":"Q11303403","brand:wikipedia":"ja:コーナン",name:"コーナン","name:en":"Kohnan",shop:"doityourself"},removeTags:{brand:"コーナン","brand:wikidata":"Q11303403","brand:wikipedia":"ja:コーナン",name:"コーナン","name:en":"Kohnan",shop:"doityourself"},matchScore:2,suggestion:true},"shop/electronics/Apple Store":{name:"Apple Store",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q421253"},addTags:{brand:"Apple Store","brand:wikidata":"Q421253","brand:wikipedia":"en:Apple Store",name:"Apple Store",shop:"electronics"},removeTags:{brand:"Apple Store","brand:wikidata":"Q421253","brand:wikipedia":"en:Apple Store",name:"Apple Store",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Batteries Plus Bulbs":{name:"Batteries Plus Bulbs",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q17005157"},addTags:{brand:"Batteries Plus Bulbs","brand:wikidata":"Q17005157",name:"Batteries Plus Bulbs",shop:"electronics"},removeTags:{brand:"Batteries Plus Bulbs","brand:wikidata":"Q17005157",name:"Batteries Plus Bulbs",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Best Buy":{name:"Best Buy",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q533415"},addTags:{brand:"Best Buy","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy",shop:"electronics"},removeTags:{brand:"Best Buy","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Boulanger":{name:"Boulanger",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q2921695"},addTags:{brand:"Boulanger","brand:wikidata":"Q2921695","brand:wikipedia":"fr:Boulanger (entreprise)",name:"Boulanger",shop:"electronics"},removeTags:{brand:"Boulanger","brand:wikidata":"Q2921695","brand:wikipedia":"fr:Boulanger (entreprise)",name:"Boulanger",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Currys":{name:"Currys",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3246464"},addTags:{brand:"Currys","brand:wikidata":"Q3246464","brand:wikipedia":"en:Currys",name:"Currys",shop:"electronics"},removeTags:{brand:"Currys","brand:wikidata":"Q3246464","brand:wikipedia":"en:Currys",name:"Currys",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Currys PC World":{name:"Currys PC World",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q7118727"},addTags:{brand:"Currys PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"Currys PC World",shop:"electronics"},removeTags:{brand:"Currys PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"Currys PC World",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Darty":{name:"Darty",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3117381"},addTags:{brand:"Darty","brand:wikidata":"Q3117381","brand:wikipedia":"en:Groupe Fnac Darty",name:"Darty",shop:"electronics"},removeTags:{brand:"Darty","brand:wikidata":"Q3117381","brand:wikipedia":"en:Groupe Fnac Darty",name:"Darty",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Elgiganten":{name:"Elgiganten",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q17050121"},addTags:{brand:"Elgiganten","brand:wikidata":"Q17050121","brand:wikipedia":"en:Elgiganten",name:"Elgiganten",shop:"electronics"},removeTags:{brand:"Elgiganten","brand:wikidata":"Q17050121","brand:wikipedia":"en:Elgiganten",name:"Elgiganten",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Euronics":{name:"Euronics",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q184860"},addTags:{brand:"Euronics","brand:wikidata":"Q184860","brand:wikipedia":"en:Euronics",name:"Euronics",shop:"electronics"},removeTags:{brand:"Euronics","brand:wikidata":"Q184860","brand:wikipedia":"en:Euronics",name:"Euronics",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Expert":{name:"Expert",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q680990"},addTags:{brand:"Expert","brand:wikidata":"Q680990","brand:wikipedia":"en:Expert (company)",name:"Expert",shop:"electronics"},removeTags:{brand:"Expert","brand:wikidata":"Q680990","brand:wikipedia":"en:Expert (company)",name:"Expert",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Hartlauer":{name:"Hartlauer",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q1587223"},addTags:{brand:"Hartlauer","brand:wikidata":"Q1587223","brand:wikipedia":"de:Hartlauer",name:"Hartlauer",shop:"electronics"},removeTags:{brand:"Hartlauer","brand:wikidata":"Q1587223","brand:wikipedia":"de:Hartlauer",name:"Hartlauer",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Interdiscount":{name:"Interdiscount",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q1665980"},addTags:{brand:"Interdiscount","brand:wikidata":"Q1665980","brand:wikipedia":"de:Interdiscount",name:"Interdiscount",shop:"electronics"},removeTags:{brand:"Interdiscount","brand:wikidata":"Q1665980","brand:wikipedia":"de:Interdiscount",name:"Interdiscount",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Kjell & Company":{name:"Kjell & Company",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6419332"},addTags:{brand:"Kjell & Company","brand:wikidata":"Q6419332","brand:wikipedia":"en:Kjell & Company",name:"Kjell & Company",shop:"electronics"},removeTags:{brand:"Kjell & Company","brand:wikidata":"Q6419332","brand:wikipedia":"en:Kjell & Company",name:"Kjell & Company",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Komputronik":{name:"Komputronik",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11742085"},addTags:{brand:"Komputronik","brand:wikidata":"Q11742085","brand:wikipedia":"pl:Komputronik",name:"Komputronik",shop:"electronics"},removeTags:{brand:"Komputronik","brand:wikidata":"Q11742085","brand:wikipedia":"pl:Komputronik",name:"Komputronik",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Maplin":{name:"Maplin",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6754124"},addTags:{brand:"Maplin","brand:wikidata":"Q6754124","brand:wikipedia":"en:Maplin (retailer)",name:"Maplin",shop:"electronics"},removeTags:{brand:"Maplin","brand:wikidata":"Q6754124","brand:wikipedia":"en:Maplin (retailer)",name:"Maplin",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Media Markt":{name:"Media Markt",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q2381223"},addTags:{brand:"Media Markt","brand:wikidata":"Q2381223","brand:wikipedia":"en:Media Markt",name:"Media Markt",shop:"electronics"},removeTags:{brand:"Media Markt","brand:wikidata":"Q2381223","brand:wikipedia":"en:Media Markt",name:"Media Markt",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Musimundo":{name:"Musimundo",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6034719"},addTags:{brand:"Musimundo","brand:wikidata":"Q6034719","brand:wikipedia":"es:Musimundo",name:"Musimundo",shop:"electronics"},removeTags:{brand:"Musimundo","brand:wikidata":"Q6034719","brand:wikipedia":"es:Musimundo",name:"Musimundo",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Neonet":{name:"Neonet",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11790622"},addTags:{brand:"Neonet","brand:wikidata":"Q11790622","brand:wikipedia":"pl:Neonet",name:"Neonet",shop:"electronics"},removeTags:{brand:"Neonet","brand:wikidata":"Q11790622","brand:wikipedia":"pl:Neonet",name:"Neonet",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/RTV Euro AGD":{name:"RTV Euro AGD",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q7277895"},addTags:{brand:"RTV Euro AGD","brand:wikidata":"Q7277895","brand:wikipedia":"en:RTV Euro AGD",name:"RTV Euro AGD",shop:"electronics"},removeTags:{brand:"RTV Euro AGD","brand:wikidata":"Q7277895","brand:wikipedia":"en:RTV Euro AGD",name:"RTV Euro AGD",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Radio Shack":{name:"Radio Shack",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q1195490"},addTags:{brand:"Radio Shack","brand:wikidata":"Q1195490","brand:wikipedia":"en:RadioShack",name:"Radio Shack",shop:"electronics"},removeTags:{brand:"Radio Shack","brand:wikidata":"Q1195490","brand:wikipedia":"en:RadioShack",name:"Radio Shack",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Samsung":{name:"Samsung",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q20718"},addTags:{brand:"Samsung","brand:wikidata":"Q20718","brand:wikipedia":"en:Samsung Electronics",name:"Samsung",shop:"electronics"},removeTags:{brand:"Samsung","brand:wikidata":"Q20718","brand:wikipedia":"en:Samsung Electronics",name:"Samsung",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Saturn":{name:"Saturn",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q2543504"},addTags:{brand:"Saturn","brand:wikidata":"Q2543504","brand:wikipedia":"en:Saturn (retailer)",name:"Saturn",shop:"electronics"},removeTags:{brand:"Saturn","brand:wikidata":"Q2543504","brand:wikipedia":"en:Saturn (retailer)",name:"Saturn",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Sony":{name:"Sony",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q41187"},addTags:{brand:"Sony","brand:wikidata":"Q41187","brand:wikipedia":"en:Sony",name:"Sony",shop:"electronics"},removeTags:{brand:"Sony","brand:wikidata":"Q41187","brand:wikipedia":"en:Sony",name:"Sony",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Teknikmagasinet":{name:"Teknikmagasinet",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3357520"},addTags:{brand:"Teknikmagasinet","brand:wikidata":"Q3357520","brand:wikipedia":"en:Teknikmagasinet",name:"Teknikmagasinet",shop:"electronics"},removeTags:{brand:"Teknikmagasinet","brand:wikidata":"Q3357520","brand:wikipedia":"en:Teknikmagasinet",name:"Teknikmagasinet",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Unieuro":{name:"Unieuro",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q4004687"},addTags:{brand:"Unieuro","brand:wikidata":"Q4004687","brand:wikipedia":"en:Unieuro",name:"Unieuro",shop:"electronics"},removeTags:{brand:"Unieuro","brand:wikidata":"Q4004687","brand:wikipedia":"en:Unieuro",name:"Unieuro",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Worten":{name:"Worten",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q10394039"},addTags:{brand:"Worten","brand:wikidata":"Q10394039","brand:wikipedia":"pt:Worten",name:"Worten",shop:"electronics"},removeTags:{brand:"Worten","brand:wikidata":"Q10394039","brand:wikipedia":"pt:Worten",name:"Worten",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/М.Видео":{name:"М.Видео",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6558800"},addTags:{brand:"М.Видео","brand:en":"M.video","brand:wikidata":"Q6558800","brand:wikipedia":"en:M.video",name:"М.Видео","name:en":"M.video",shop:"electronics"},removeTags:{brand:"М.Видео","brand:en":"M.video","brand:wikidata":"Q6558800","brand:wikipedia":"en:M.video",name:"М.Видео","name:en":"M.video",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/コジマ":{name:"コジマ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11302052"},addTags:{brand:"コジマ","brand:en":"Kojima","brand:wikidata":"Q11302052","brand:wikipedia":"ja:コジマ",name:"コジマ","name:en":"Kojima",shop:"electronics"},removeTags:{brand:"コジマ","brand:en":"Kojima","brand:wikidata":"Q11302052","brand:wikipedia":"ja:コジマ",name:"コジマ","name:en":"Kojima",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/ヤマダ電機":{name:"ヤマダ電機",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q1096390"},addTags:{brand:"ヤマダ電機","brand:en":"Yamada Denki","brand:wikidata":"Q1096390","brand:wikipedia":"en:Yamada Denki",name:"ヤマダ電機","name:en":"Yamada Denki",shop:"electronics"},removeTags:{brand:"ヤマダ電機","brand:en":"Yamada Denki","brand:wikidata":"Q1096390","brand:wikipedia":"en:Yamada Denki",name:"ヤマダ電機","name:en":"Yamada Denki",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/全國電子":{name:"全國電子",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q10891540"},addTags:{brand:"全國電子","brand:en":"E-life Mall","brand:wikidata":"Q10891540","brand:wikipedia":"zh:全國電子",name:"全國電子","name:en":"E-life Mall",shop:"electronics"},removeTags:{brand:"全國電子","brand:en":"E-life Mall","brand:wikidata":"Q10891540","brand:wikipedia":"zh:全國電子",name:"全國電子","name:en":"E-life Mall",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/燦坤3C":{name:"燦坤3C",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11569285"},addTags:{brand:"燦坤3C","brand:en":"Tsannkuen 3C","brand:wikidata":"Q11569285","brand:wikipedia":"zh:燦坤",name:"燦坤3C","name:en":"Tsannkuen 3C",shop:"electronics"},removeTags:{brand:"燦坤3C","brand:en":"Tsannkuen 3C","brand:wikidata":"Q11569285","brand:wikipedia":"zh:燦坤",name:"燦坤3C","name:en":"Tsannkuen 3C",shop:"electronics"},matchScore:2,suggestion:true},"shop/erotic/Orion":{name:"Orion",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"erotic","brand:wikidata":"Q1609577"},addTags:{brand:"Orion","brand:wikidata":"Q1609577","brand:wikipedia":"de:Orion (Erotik)",name:"Orion",shop:"erotic"},removeTags:{brand:"Orion","brand:wikidata":"Q1609577","brand:wikipedia":"de:Orion (Erotik)",name:"Orion",shop:"erotic"},matchScore:2,suggestion:true},"shop/fabric/Mondial Tissus":{name:"Mondial Tissus",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"fabric","brand:wikidata":"Q17635288"},addTags:{brand:"Mondial Tissus","brand:wikidata":"Q17635288","brand:wikipedia":"fr:Mondial Tissus",name:"Mondial Tissus",shop:"fabric"},removeTags:{brand:"Mondial Tissus","brand:wikidata":"Q17635288","brand:wikipedia":"fr:Mondial Tissus",name:"Mondial Tissus",shop:"fabric"},matchScore:2,suggestion:true},"shop/florist/Blume 2000":{name:"Blume 2000",icon:"maki-florist",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"florist","brand:wikidata":"Q886166"},addTags:{brand:"Blume 2000","brand:wikidata":"Q886166","brand:wikipedia":"de:Blume 2000",name:"Blume 2000",shop:"florist"},removeTags:{brand:"Blume 2000","brand:wikidata":"Q886166","brand:wikipedia":"de:Blume 2000",name:"Blume 2000",shop:"florist"},matchScore:2,suggestion:true},"shop/florist/Blumen Risse":{name:"Blumen Risse",icon:"maki-florist",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"florist","brand:wikidata":"Q886177"},addTags:{brand:"Blumen Risse","brand:wikidata":"Q886177","brand:wikipedia":"de:Blumen Risse",name:"Blumen Risse",shop:"florist"},removeTags:{brand:"Blumen Risse","brand:wikidata":"Q886177","brand:wikipedia":"de:Blumen Risse",name:"Blumen Risse",shop:"florist"},matchScore:2,suggestion:true},"shop/florist/Interflora":{name:"Interflora",icon:"maki-florist",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"florist","brand:wikidata":"Q692179"},addTags:{brand:"Interflora","brand:wikidata":"Q692179","brand:wikipedia":"en:Interflora",name:"Interflora",shop:"florist"},removeTags:{brand:"Interflora","brand:wikidata":"Q692179","brand:wikipedia":"en:Interflora",name:"Interflora",shop:"florist"},matchScore:2,suggestion:true},"shop/funeral_directors/The Co-operative Funeralcare":{name:"The Co-operative Funeralcare",icon:"maki-cemetery",fields:["name","operator","address","building_area","religion","denomination"],geometry:["point","area"],tags:{shop:"funeral_directors","brand:wikidata":"Q7726521"},addTags:{brand:"The Co-operative Funeralcare","brand:wikidata":"Q7726521","brand:wikipedia":"en:Co-op Funeralcare",name:"The Co-operative Funeralcare",shop:"funeral_directors"},removeTags:{brand:"The Co-operative Funeralcare","brand:wikidata":"Q7726521","brand:wikipedia":"en:Co-op Funeralcare",name:"The Co-operative Funeralcare",shop:"funeral_directors"},matchScore:2,suggestion:true},"shop/furniture/Black Red White":{name:"Black Red White",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q4921546"},addTags:{brand:"Black Red White","brand:wikidata":"Q4921546","brand:wikipedia":"en:Black Red White",name:"Black Red White",shop:"furniture"},removeTags:{brand:"Black Red White","brand:wikidata":"Q4921546","brand:wikipedia":"en:Black Red White",name:"Black Red White",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Bodzio":{name:"Bodzio",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q20034845"},addTags:{brand:"Bodzio","brand:wikidata":"Q20034845","brand:wikipedia":"pl:Fabryka Mebli Bodzio",name:"Bodzio",shop:"furniture"},removeTags:{brand:"Bodzio","brand:wikidata":"Q20034845","brand:wikipedia":"pl:Fabryka Mebli Bodzio",name:"Bodzio",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/But":{name:"But",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q18720442"},addTags:{brand:"But","brand:wikidata":"Q18720442","brand:wikipedia":"en:BUT (retailer)",name:"But",shop:"furniture"},removeTags:{brand:"But","brand:wikidata":"Q18720442","brand:wikipedia":"en:BUT (retailer)",name:"But",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Conforama":{name:"Conforama",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q541134"},addTags:{brand:"Conforama","brand:wikidata":"Q541134","brand:wikipedia":"en:Conforama",name:"Conforama",shop:"furniture"},removeTags:{brand:"Conforama","brand:wikidata":"Q541134","brand:wikipedia":"en:Conforama",name:"Conforama",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/DFS":{name:"DFS",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q5204927"},addTags:{brand:"DFS","brand:wikidata":"Q5204927","brand:wikipedia":"en:DFS Furniture",name:"DFS",shop:"furniture"},removeTags:{brand:"DFS","brand:wikidata":"Q5204927","brand:wikipedia":"en:DFS Furniture",name:"DFS",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Dänisches Bettenlager":{name:"Dänisches Bettenlager",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q138913"},addTags:{brand:"Dänisches Bettenlager","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"Dänisches Bettenlager",shop:"furniture"},removeTags:{brand:"Dänisches Bettenlager","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"Dänisches Bettenlager",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Ethan Allen":{name:"Ethan Allen",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q5402870"},addTags:{brand:"Ethan Allen","brand:wikidata":"Q5402870","brand:wikipedia":"en:Ethan Allen (furniture company)",name:"Ethan Allen",shop:"furniture"},removeTags:{brand:"Ethan Allen","brand:wikidata":"Q5402870","brand:wikipedia":"en:Ethan Allen (furniture company)",name:"Ethan Allen",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Harveys":{name:"Harveys",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q5677754"},addTags:{brand:"Harveys","brand:wikidata":"Q5677754","brand:wikipedia":"en:Harveys Furniture",name:"Harveys",shop:"furniture"},removeTags:{brand:"Harveys","brand:wikidata":"Q5677754","brand:wikipedia":"en:Harveys Furniture",name:"Harveys",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/IKEA":{name:"IKEA",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q54078"},addTags:{brand:"IKEA","brand:wikidata":"Q54078","brand:wikipedia":"en:IKEA",name:"IKEA",shop:"furniture"},removeTags:{brand:"IKEA","brand:wikidata":"Q54078","brand:wikipedia":"en:IKEA",name:"IKEA",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/JYSK":{name:"JYSK",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q138913"},addTags:{brand:"JYSK","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"JYSK",shop:"furniture"},removeTags:{brand:"JYSK","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"JYSK",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Rent-A-Center":{name:"Rent-A-Center",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q7313497"},addTags:{brand:"Rent-A-Center","brand:wikidata":"Q7313497","brand:wikipedia":"en:Rent-A-Center",name:"Rent-A-Center",shop:"furniture"},removeTags:{brand:"Rent-A-Center","brand:wikidata":"Q7313497","brand:wikipedia":"en:Rent-A-Center",name:"Rent-A-Center",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/The Brick":{name:"The Brick",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q7720000"},addTags:{brand:"The Brick","brand:wikidata":"Q7720000","brand:wikipedia":"en:The Brick",name:"The Brick",shop:"furniture"},removeTags:{brand:"The Brick","brand:wikidata":"Q7720000","brand:wikipedia":"en:The Brick",name:"The Brick",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/ニトリ":{name:"ニトリ",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q10801453"},addTags:{brand:"ニトリ","brand:en":"Nitori","brand:wikidata":"Q10801453","brand:wikipedia":"en:Nitori",name:"ニトリ","name:en":"Nitori",shop:"furniture"},removeTags:{brand:"ニトリ","brand:en":"Nitori","brand:wikidata":"Q10801453","brand:wikipedia":"en:Nitori",name:"ニトリ","name:en":"Nitori",shop:"furniture"},matchScore:2,suggestion:true},"shop/garden_centre/Gamm Vert":{name:"Gamm Vert",icon:"maki-garden-center",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"garden_centre","brand:wikidata":"Q3095006"},addTags:{brand:"Gamm Vert","brand:wikidata":"Q3095006","brand:wikipedia":"fr:Gamm Vert",name:"Gamm Vert",shop:"garden_centre"},removeTags:{brand:"Gamm Vert","brand:wikidata":"Q3095006","brand:wikipedia":"fr:Gamm Vert",name:"Gamm Vert",shop:"garden_centre"},matchScore:2,suggestion:true},"shop/garden_centre/Jardiland":{name:"Jardiland",icon:"maki-garden-center",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"garden_centre","brand:wikidata":"Q3162276"},addTags:{brand:"Jardiland","brand:wikidata":"Q3162276","brand:wikipedia":"fr:Jardiland",name:"Jardiland",shop:"garden_centre"},removeTags:{brand:"Jardiland","brand:wikidata":"Q3162276","brand:wikipedia":"fr:Jardiland",name:"Jardiland",shop:"garden_centre"},matchScore:2,suggestion:true},"shop/garden_centre/Point Vert":{name:"Point Vert",icon:"maki-garden-center",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"garden_centre","brand:wikidata":"Q16661975"},addTags:{brand:"Point Vert","brand:wikidata":"Q16661975","brand:wikipedia":"fr:Magasin vert",name:"Point Vert",shop:"garden_centre"},removeTags:{brand:"Point Vert","brand:wikidata":"Q16661975","brand:wikipedia":"fr:Magasin vert",name:"Point Vert",shop:"garden_centre"},matchScore:2,suggestion:true},"shop/gift/Card Factory":{name:"Card Factory",icon:"maki-gift",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"gift","brand:wikidata":"Q5038192"},addTags:{brand:"Card Factory","brand:wikidata":"Q5038192","brand:wikipedia":"en:Card Factory",name:"Card Factory",shop:"gift"},removeTags:{brand:"Card Factory","brand:wikidata":"Q5038192","brand:wikipedia":"en:Card Factory",name:"Card Factory",shop:"gift"},matchScore:2,suggestion:true},"shop/gift/Hallmark":{name:"Hallmark",icon:"maki-gift",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"gift","brand:wikidata":"Q1521910"},addTags:{brand:"Hallmark","brand:wikidata":"Q1521910","brand:wikipedia":"en:Hallmark Cards",name:"Hallmark",shop:"gift"},removeTags:{brand:"Hallmark","brand:wikidata":"Q1521910","brand:wikipedia":"en:Hallmark Cards",name:"Hallmark",shop:"gift"},matchScore:2,suggestion:true},"shop/gift/Nanu-Nana":{name:"Nanu-Nana",icon:"maki-gift",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"gift","brand:wikidata":"Q1720245"},addTags:{brand:"Nanu-Nana","brand:wikidata":"Q1720245","brand:wikipedia":"de:Nanu-Nana",name:"Nanu-Nana",shop:"gift"},removeTags:{brand:"Nanu-Nana","brand:wikidata":"Q1720245","brand:wikipedia":"de:Nanu-Nana",name:"Nanu-Nana",shop:"gift"},matchScore:2,suggestion:true},"shop/hairdresser_supply/Sally Beauty Supply":{name:"Sally Beauty Supply",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser_supply","brand:wikidata":"Q7405065"},addTags:{brand:"Sally Beauty Supply","brand:wikidata":"Q7405065","brand:wikipedia":"en:Sally Beauty Holdings",name:"Sally Beauty Supply",shop:"hairdresser_supply"},removeTags:{brand:"Sally Beauty Supply","brand:wikidata":"Q7405065","brand:wikipedia":"en:Sally Beauty Holdings",name:"Sally Beauty Supply",shop:"hairdresser_supply"},matchScore:2,suggestion:true},"shop/hairdresser/Fantastic Sams":{name:"Fantastic Sams",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q5434222"},addTags:{brand:"Fantastic Sams","brand:wikidata":"Q5434222","brand:wikipedia":"en:Fantastic Sams",name:"Fantastic Sams",shop:"hairdresser"},removeTags:{brand:"Fantastic Sams","brand:wikidata":"Q5434222","brand:wikipedia":"en:Fantastic Sams",name:"Fantastic Sams",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/First Choice Haircutters":{name:"First Choice Haircutters",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q5452622"},addTags:{brand:"First Choice Haircutters","brand:wikidata":"Q5452622","brand:wikipedia":"en:First Choice Haircutters",name:"First Choice Haircutters",shop:"hairdresser"},removeTags:{brand:"First Choice Haircutters","brand:wikidata":"Q5452622","brand:wikipedia":"en:First Choice Haircutters",name:"First Choice Haircutters",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Great Clips":{name:"Great Clips",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q5598967"},addTags:{brand:"Great Clips","brand:wikidata":"Q5598967","brand:wikipedia":"en:Great Clips",name:"Great Clips",shop:"hairdresser"},removeTags:{brand:"Great Clips","brand:wikidata":"Q5598967","brand:wikipedia":"en:Great Clips",name:"Great Clips",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Hair Cuttery":{name:"Hair Cuttery",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q5639484"},addTags:{brand:"Hair Cuttery","brand:wikidata":"Q5639484","brand:wikipedia":"en:Hair Cuttery",name:"Hair Cuttery",shop:"hairdresser"},removeTags:{brand:"Hair Cuttery","brand:wikidata":"Q5639484","brand:wikipedia":"en:Hair Cuttery",name:"Hair Cuttery",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Hair Express":{name:"Hair Express",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q57550814"},addTags:{brand:"Hair Express","brand:wikidata":"Q57550814",name:"Hair Express",shop:"hairdresser"},removeTags:{brand:"Hair Express","brand:wikidata":"Q57550814",name:"Hair Express",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Hairkiller":{name:"Hairkiller",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q58305998"},addTags:{brand:"Hairkiller","brand:wikidata":"Q58305998",name:"Hairkiller",shop:"hairdresser"},removeTags:{brand:"Hairkiller","brand:wikidata":"Q58305998",name:"Hairkiller",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Klier":{name:"Klier",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q1465159"},addTags:{brand:"Klier","brand:wikidata":"Q1465159","brand:wikipedia":"de:Frisör Klier",name:"Klier",shop:"hairdresser"},removeTags:{brand:"Klier","brand:wikidata":"Q1465159","brand:wikipedia":"de:Frisör Klier",name:"Klier",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Supercuts":{name:"Supercuts",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q7643239"},addTags:{brand:"Supercuts","brand:wikidata":"Q7643239","brand:wikipedia":"en:Supercuts",name:"Supercuts",shop:"hairdresser"},removeTags:{brand:"Supercuts","brand:wikidata":"Q7643239","brand:wikipedia":"en:Supercuts",name:"Supercuts",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Toni & Guy":{name:"Toni & Guy",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q324784"},addTags:{brand:"Toni & Guy","brand:wikidata":"Q324784","brand:wikipedia":"en:Toni & Guy",name:"Toni & Guy",shop:"hairdresser"},removeTags:{brand:"Toni & Guy","brand:wikidata":"Q324784","brand:wikipedia":"en:Toni & Guy",name:"Toni & Guy",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hardware/Harbor Freight Tools":{name:"Harbor Freight Tools",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hardware","brand:wikidata":"Q5654601"},addTags:{brand:"Harbor Freight Tools","brand:wikidata":"Q5654601","brand:wikipedia":"en:Harbor Freight Tools",name:"Harbor Freight Tools",shop:"hardware"},removeTags:{brand:"Harbor Freight Tools","brand:wikidata":"Q5654601","brand:wikipedia":"en:Harbor Freight Tools",name:"Harbor Freight Tools",shop:"hardware"},matchScore:2,suggestion:true},"shop/hardware/True Value":{name:"True Value",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hardware","brand:wikidata":"Q7847545"},addTags:{brand:"True Value","brand:wikidata":"Q7847545","brand:wikipedia":"en:True Value",name:"True Value",shop:"hardware"},removeTags:{brand:"True Value","brand:wikidata":"Q7847545","brand:wikipedia":"en:True Value",name:"True Value",shop:"hardware"},matchScore:2,suggestion:true},"shop/health_food/Holland & Barrett":{name:"Holland & Barrett",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"health_food","brand:wikidata":"Q5880870"},addTags:{brand:"Holland & Barrett","brand:wikidata":"Q5880870","brand:wikipedia":"en:Holland & Barrett",name:"Holland & Barrett",shop:"health_food"},removeTags:{brand:"Holland & Barrett","brand:wikidata":"Q5880870","brand:wikipedia":"en:Holland & Barrett",name:"Holland & Barrett",shop:"health_food"},matchScore:2,suggestion:true},"shop/hearing_aids/Amplifon":{name:"Amplifon",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q477222"},addTags:{brand:"Amplifon","brand:wikidata":"Q477222","brand:wikipedia":"en:Amplifon",name:"Amplifon",shop:"hearing_aids"},removeTags:{brand:"Amplifon","brand:wikidata":"Q477222","brand:wikipedia":"en:Amplifon",name:"Amplifon",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hearing_aids/Geers":{name:"Geers",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q1497707"},addTags:{brand:"Geers","brand:wikidata":"Q1497707","brand:wikipedia":"de:Geers Hörakustik",name:"Geers",shop:"hearing_aids"},removeTags:{brand:"Geers","brand:wikidata":"Q1497707","brand:wikipedia":"de:Geers Hörakustik",name:"Geers",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hearing_aids/Kind Hörgeräte":{name:"Kind Hörgeräte",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q43598590"},addTags:{brand:"Kind Hörgeräte","brand:wikidata":"Q43598590","brand:wikipedia":"de:Kind Hörgeräte",name:"Kind Hörgeräte",shop:"hearing_aids"},removeTags:{brand:"Kind Hörgeräte","brand:wikidata":"Q43598590","brand:wikipedia":"de:Kind Hörgeräte",name:"Kind Hörgeräte",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hifi/Bang & Olufsen":{name:"Bang & Olufsen",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hifi","brand:wikidata":"Q790020"},addTags:{brand:"Bang & Olufsen","brand:wikidata":"Q790020","brand:wikipedia":"en:Bang & Olufsen",name:"Bang & Olufsen",shop:"hifi"},removeTags:{brand:"Bang & Olufsen","brand:wikidata":"Q790020","brand:wikipedia":"en:Bang & Olufsen",name:"Bang & Olufsen",shop:"hifi"},matchScore:2,suggestion:true},"shop/houseware/Bed Bath & Beyond":{name:"Bed Bath & Beyond",icon:"fas-blender",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q813782"},addTags:{brand:"Bed Bath & Beyond","brand:wikidata":"Q813782","brand:wikipedia":"en:Bed Bath & Beyond",name:"Bed Bath & Beyond",shop:"houseware"},removeTags:{brand:"Bed Bath & Beyond","brand:wikidata":"Q813782","brand:wikipedia":"en:Bed Bath & Beyond",name:"Bed Bath & Beyond",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Blokker":{name:"Blokker",icon:"fas-blender",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q884934"},addTags:{brand:"Blokker","brand:wikidata":"Q884934","brand:wikipedia":"en:Blokker Holding",name:"Blokker",shop:"houseware"},removeTags:{brand:"Blokker","brand:wikidata":"Q884934","brand:wikipedia":"en:Blokker Holding",name:"Blokker",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Cervera":{name:"Cervera",icon:"fas-blender",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q10447179"},addTags:{brand:"Cervera","brand:wikidata":"Q10447179","brand:wikipedia":"sv:Cervera (företag)",name:"Cervera",shop:"houseware"},removeTags:{brand:"Cervera","brand:wikidata":"Q10447179","brand:wikipedia":"sv:Cervera (företag)",name:"Cervera",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/HomeGoods":{name:"HomeGoods",icon:"fas-blender",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q5887941"},addTags:{brand:"HomeGoods","brand:wikidata":"Q5887941","brand:wikipedia":"en:HomeGoods",name:"HomeGoods",shop:"houseware"},removeTags:{brand:"HomeGoods","brand:wikidata":"Q5887941","brand:wikipedia":"en:HomeGoods",name:"HomeGoods",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/WMF":{name:"WMF",icon:"fas-blender",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q451423"},addTags:{brand:"WMF","brand:wikidata":"Q451423","brand:wikipedia":"en:WMF Group",name:"WMF",shop:"houseware"},removeTags:{brand:"WMF","brand:wikidata":"Q451423","brand:wikipedia":"en:WMF Group",name:"WMF",shop:"houseware"},matchScore:2,suggestion:true},"shop/interior_decoration/Depot":{name:"Depot",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"interior_decoration","brand:wikidata":"Q1191740"},addTags:{brand:"Depot","brand:wikidata":"Q1191740","brand:wikipedia":"de:Gries Deco Holding",name:"Depot",shop:"interior_decoration"},removeTags:{brand:"Depot","brand:wikidata":"Q1191740","brand:wikipedia":"de:Gries Deco Holding",name:"Depot",shop:"interior_decoration"},matchScore:2,suggestion:true},"shop/interior_decoration/Hemtex":{name:"Hemtex",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"interior_decoration","brand:wikidata":"Q10521868"},addTags:{brand:"Hemtex",name:"Hemtex","brand:wikidata":"Q10521868","brand:wikipedia":"sv:Hemtex",shop:"interior_decoration"},removeTags:{brand:"Hemtex",name:"Hemtex","brand:wikidata":"Q10521868","brand:wikipedia":"sv:Hemtex",shop:"interior_decoration"},matchScore:2,suggestion:true},"shop/interior_decoration/Pier 1 Imports":{name:"Pier 1 Imports",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"interior_decoration","brand:wikidata":"Q7191691"},addTags:{brand:"Pier 1 Imports","brand:wikidata":"Q7191691","brand:wikipedia":"en:Pier 1 Imports",name:"Pier 1 Imports",shop:"interior_decoration"},removeTags:{brand:"Pier 1 Imports","brand:wikidata":"Q7191691","brand:wikipedia":"en:Pier 1 Imports",name:"Pier 1 Imports",shop:"interior_decoration"},matchScore:2,suggestion:true},"shop/jewelry/Apart":{name:"Apart",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q11686561"},addTags:{brand:"Apart","brand:wikidata":"Q11686561","brand:wikipedia":"pl:Apart",name:"Apart",shop:"jewelry"},removeTags:{brand:"Apart","brand:wikidata":"Q11686561","brand:wikipedia":"pl:Apart",name:"Apart",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Bijou Brigitte":{name:"Bijou Brigitte",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q599545"},addTags:{brand:"Bijou Brigitte","brand:wikidata":"Q599545","brand:wikipedia":"de:Bijou Brigitte",name:"Bijou Brigitte",shop:"jewelry"},removeTags:{brand:"Bijou Brigitte","brand:wikidata":"Q599545","brand:wikipedia":"de:Bijou Brigitte",name:"Bijou Brigitte",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Cartier":{name:"Cartier",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q538587"},addTags:{brand:"Cartier","brand:wikidata":"Q538587","brand:wikipedia":"en:Cartier (jeweler)",name:"Cartier",shop:"jewelry"},removeTags:{brand:"Cartier","brand:wikidata":"Q538587","brand:wikipedia":"en:Cartier (jeweler)",name:"Cartier",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Ernest Jones":{name:"Ernest Jones",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q5393358"},addTags:{brand:"Ernest Jones","brand:wikidata":"Q5393358","brand:wikipedia":"en:Ernest Jones (retailer)",name:"Ernest Jones",shop:"jewelry"},removeTags:{brand:"Ernest Jones","brand:wikidata":"Q5393358","brand:wikipedia":"en:Ernest Jones (retailer)",name:"Ernest Jones",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Guldfynd":{name:"Guldfynd",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q49099223"},addTags:{brand:"Guldfynd","brand:wikidata":"Q49099223","brand:wikipedia":"sv:Guldfynd",name:"Guldfynd",shop:"jewelry"},removeTags:{brand:"Guldfynd","brand:wikidata":"Q49099223","brand:wikipedia":"sv:Guldfynd",name:"Guldfynd",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/James Avery Jewelry":{name:"James Avery Jewelry",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q6129024"},addTags:{brand:"James Avery Jewelry","brand:wikidata":"Q6129024","brand:wikipedia":"en:James Avery Artisan Jewelry",name:"James Avery Jewelry",shop:"jewelry"},removeTags:{brand:"James Avery Jewelry","brand:wikidata":"Q6129024","brand:wikipedia":"en:James Avery Artisan Jewelry",name:"James Avery Jewelry",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Kay Jewelers":{name:"Kay Jewelers",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q7611434"},addTags:{brand:"Kay Jewelers","brand:wikidata":"Q7611434","brand:wikipedia":"en:Sterling Jewelers",name:"Kay Jewelers",shop:"jewelry"},removeTags:{brand:"Kay Jewelers","brand:wikidata":"Q7611434","brand:wikipedia":"en:Sterling Jewelers",name:"Kay Jewelers",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Pandora":{name:"Pandora",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q2241604"},addTags:{brand:"Pandora","brand:wikidata":"Q2241604","brand:wikipedia":"en:Pandora (jewelry)",name:"Pandora",shop:"jewelry"},removeTags:{brand:"Pandora","brand:wikidata":"Q2241604","brand:wikipedia":"en:Pandora (jewelry)",name:"Pandora",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Swarovski":{name:"Swarovski",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q611115"},addTags:{brand:"Swarovski","brand:wikidata":"Q611115","brand:wikipedia":"en:Swarovski",name:"Swarovski",shop:"jewelry"},removeTags:{brand:"Swarovski","brand:wikidata":"Q611115","brand:wikipedia":"en:Swarovski",name:"Swarovski",shop:"jewelry"},matchScore:2,suggestion:true},"shop/kiosk/K Kiosk":{name:"K Kiosk",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q665504"},addTags:{brand:"K Kiosk","brand:wikidata":"Q665504","brand:wikipedia":"it:K Kiosk",name:"K Kiosk",shop:"kiosk"},removeTags:{brand:"K Kiosk","brand:wikidata":"Q665504","brand:wikipedia":"it:K Kiosk",name:"K Kiosk",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/Kolporter":{name:"Kolporter",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q6427874"},addTags:{brand:"Kolporter","brand:wikidata":"Q6427874","brand:wikipedia":"pl:Kolporter (przedsiębiorstwo)",name:"Kolporter",shop:"kiosk"},removeTags:{brand:"Kolporter","brand:wikidata":"Q6427874","brand:wikipedia":"pl:Kolporter (przedsiębiorstwo)",name:"Kolporter",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/Narvesen":{name:"Narvesen",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q6514414"},addTags:{brand:"Narvesen","brand:wikidata":"Q6514414","brand:wikipedia":"en:Narvesen",name:"Narvesen",shop:"kiosk"},removeTags:{brand:"Narvesen","brand:wikidata":"Q6514414","brand:wikipedia":"en:Narvesen",name:"Narvesen",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/Pressbyrån":{name:"Pressbyrån",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q2489072"},addTags:{brand:"Pressbyrån","brand:wikidata":"Q2489072","brand:wikipedia":"en:Pressbyrån",name:"Pressbyrån",shop:"kiosk"},removeTags:{brand:"Pressbyrån","brand:wikidata":"Q2489072","brand:wikipedia":"en:Pressbyrån",name:"Pressbyrån",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/R-Kioski":{name:"R-Kioski",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q1571400"},addTags:{brand:"R-Kioski","brand:wikidata":"Q1571400","brand:wikipedia":"en:R-kioski",name:"R-Kioski",shop:"kiosk"},removeTags:{brand:"R-Kioski","brand:wikidata":"Q1571400","brand:wikipedia":"en:R-kioski",name:"R-Kioski",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/Ruch":{name:"Ruch",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q1260314"},addTags:{brand:"Ruch","brand:wikidata":"Q1260314","brand:wikipedia":"pl:Ruch (przedsiębiorstwo)",name:"Ruch",shop:"kiosk"},removeTags:{brand:"Ruch","brand:wikidata":"Q1260314","brand:wikipedia":"pl:Ruch (przedsiębiorstwo)",name:"Ruch",shop:"kiosk"},matchScore:2,suggestion:true},"shop/massage/Massage Envy":{name:"Massage Envy",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"massage","brand:wikidata":"Q22922899"},addTags:{brand:"Massage Envy","brand:wikidata":"Q22922899","brand:wikipedia":"en:Massage Envy",name:"Massage Envy",shop:"massage"},removeTags:{brand:"Massage Envy","brand:wikidata":"Q22922899","brand:wikipedia":"en:Massage Envy",name:"Massage Envy",shop:"massage"},matchScore:2,suggestion:true},"shop/mobile_phone/AT&T":{name:"AT&T",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q298594"},addTags:{brand:"AT&T","brand:wikidata":"Q298594","brand:wikipedia":"en:AT&T Mobility",name:"AT&T",shop:"mobile_phone"},removeTags:{brand:"AT&T","brand:wikidata":"Q298594","brand:wikipedia":"en:AT&T Mobility",name:"AT&T",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Bell":{name:"Bell",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2894594"},addTags:{brand:"Bell","brand:wikidata":"Q2894594","brand:wikipedia":"en:Bell Mobility",name:"Bell",shop:"mobile_phone"},removeTags:{brand:"Bell","brand:wikidata":"Q2894594","brand:wikipedia":"en:Bell Mobility",name:"Bell",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Boost Mobile":{name:"Boost Mobile",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q4943790"},addTags:{brand:"Boost Mobile","brand:wikidata":"Q4943790","brand:wikipedia":"en:Boost Mobile",name:"Boost Mobile",shop:"mobile_phone"},removeTags:{brand:"Boost Mobile","brand:wikidata":"Q4943790","brand:wikipedia":"en:Boost Mobile",name:"Boost Mobile",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Carphone Warehouse":{name:"Carphone Warehouse",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q118046"},addTags:{brand:"Carphone Warehouse","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Carphone Warehouse",shop:"mobile_phone"},removeTags:{brand:"Carphone Warehouse","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Carphone Warehouse",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Cricket Wireless":{name:"Cricket Wireless",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q5184987"},addTags:{brand:"Cricket Wireless","brand:wikidata":"Q5184987","brand:wikipedia":"en:Cricket Wireless",name:"Cricket Wireless",shop:"mobile_phone"},removeTags:{brand:"Cricket Wireless","brand:wikidata":"Q5184987","brand:wikipedia":"en:Cricket Wireless",name:"Cricket Wireless",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Digicel":{name:"Digicel",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2117506"},addTags:{brand:"Digicel","brand:wikidata":"Q2117506","brand:wikipedia":"en:Digicel",name:"Digicel",shop:"mobile_phone"},removeTags:{brand:"Digicel","brand:wikidata":"Q2117506","brand:wikipedia":"en:Digicel",name:"Digicel",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/EE":{name:"EE",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q5322942"},addTags:{brand:"EE","brand:wikidata":"Q5322942","brand:wikipedia":"en:EE Limited",name:"EE",shop:"mobile_phone"},removeTags:{brand:"EE","brand:wikidata":"Q5322942","brand:wikipedia":"en:EE Limited",name:"EE",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Entel":{name:"Entel",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q5323742"},addTags:{brand:"Entel","brand:wikidata":"Q5323742","brand:wikipedia":"en:ENTel",name:"Entel",shop:"mobile_phone"},removeTags:{brand:"Entel","brand:wikidata":"Q5323742","brand:wikipedia":"en:ENTel",name:"Entel",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/MetroPCS":{name:"MetroPCS",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1925685"},addTags:{brand:"MetroPCS","brand:wikidata":"Q1925685","brand:wikipedia":"en:Metro by T-Mobile",name:"MetroPCS",shop:"mobile_phone"},removeTags:{brand:"MetroPCS","brand:wikidata":"Q1925685","brand:wikipedia":"en:Metro by T-Mobile",name:"MetroPCS",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Mobilcom Debitel":{name:"Mobilcom Debitel",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q344744"},addTags:{brand:"Mobilcom Debitel","brand:wikidata":"Q344744","brand:wikipedia":"en:Debitel",name:"Mobilcom Debitel",shop:"mobile_phone"},removeTags:{brand:"Mobilcom Debitel","brand:wikidata":"Q344744","brand:wikipedia":"en:Debitel",name:"Mobilcom Debitel",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/O2":{name:"O2",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q7072246"},addTags:{brand:"O2","brand:wikidata":"Q7072246","brand:wikipedia":"en:O2 (Ireland)",name:"O2",shop:"mobile_phone"},removeTags:{brand:"O2","brand:wikidata":"Q7072246","brand:wikipedia":"en:O2 (Ireland)",name:"O2",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Phone House":{name:"Phone House",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q118046"},addTags:{brand:"Phone House","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Phone House",shop:"mobile_phone"},removeTags:{brand:"Phone House","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Phone House",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Play":{name:"Play",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q7202998"},addTags:{brand:"Play","brand:wikidata":"Q7202998","brand:wikipedia":"en:Play (telecommunications)",name:"Play",shop:"mobile_phone"},removeTags:{brand:"Play","brand:wikidata":"Q7202998","brand:wikipedia":"en:Play (telecommunications)",name:"Play",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Plus":{name:"Plus",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q7205598"},addTags:{brand:"Plus","brand:wikidata":"Q7205598","brand:wikipedia":"pl:Plus (sieć telefonii komórkowej)",name:"Plus",shop:"mobile_phone"},removeTags:{brand:"Plus","brand:wikidata":"Q7205598","brand:wikipedia":"pl:Plus (sieć telefonii komórkowej)",name:"Plus",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Rogers":{name:"Rogers",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q3439663"},addTags:{brand:"Rogers","brand:wikidata":"Q3439663","brand:wikipedia":"en:Rogers Wireless",name:"Rogers",shop:"mobile_phone"},removeTags:{brand:"Rogers","brand:wikidata":"Q3439663","brand:wikipedia":"en:Rogers Wireless",name:"Rogers",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/SFR":{name:"SFR",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q218765"},addTags:{brand:"SFR","brand:wikidata":"Q218765","brand:wikipedia":"en:SFR",name:"SFR",shop:"mobile_phone"},removeTags:{brand:"SFR","brand:wikidata":"Q218765","brand:wikipedia":"en:SFR",name:"SFR",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Sprint":{name:"Sprint",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q301965"},addTags:{brand:"Sprint","brand:wikidata":"Q301965","brand:wikipedia":"en:Sprint Corporation",name:"Sprint",shop:"mobile_phone"},removeTags:{brand:"Sprint","brand:wikidata":"Q301965","brand:wikipedia":"en:Sprint Corporation",name:"Sprint",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/T-Mobile":{name:"T-Mobile",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q327634"},addTags:{brand:"T-Mobile","brand:wikidata":"Q327634","brand:wikipedia":"en:T-Mobile",name:"T-Mobile",shop:"mobile_phone"},removeTags:{brand:"T-Mobile","brand:wikidata":"Q327634","brand:wikipedia":"en:T-Mobile",name:"T-Mobile",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/TIM":{name:"TIM",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q144617"},addTags:{brand:"TIM","brand:wikidata":"Q144617","brand:wikipedia":"en:Telecom Italia",name:"TIM",shop:"mobile_phone"},removeTags:{brand:"TIM","brand:wikidata":"Q144617","brand:wikipedia":"en:Telecom Italia",name:"TIM",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telcel":{name:"Telcel",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q3517255"},addTags:{brand:"Telcel","brand:wikidata":"Q3517255","brand:wikipedia":"en:Telcel",name:"Telcel",shop:"mobile_phone"},removeTags:{brand:"Telcel","brand:wikidata":"Q3517255","brand:wikipedia":"en:Telcel",name:"Telcel",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Tele2":{name:"Tele2",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q309865"},addTags:{brand:"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Tele2",shop:"mobile_phone"},removeTags:{brand:"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Tele2",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telekom":{name:"Telekom",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q9396"},addTags:{brand:"Telekom","brand:wikidata":"Q9396","brand:wikipedia":"en:Deutsche Telekom",name:"Telekom",shop:"mobile_phone"},removeTags:{brand:"Telekom","brand:wikidata":"Q9396","brand:wikipedia":"en:Deutsche Telekom",name:"Telekom",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telenor":{name:"Telenor",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q845632"},addTags:{brand:"Telenor","brand:wikidata":"Q845632","brand:wikipedia":"en:Telenor",name:"Telenor",shop:"mobile_phone"},removeTags:{brand:"Telenor","brand:wikidata":"Q845632","brand:wikipedia":"en:Telenor",name:"Telenor",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telus":{name:"Telus",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q165858"},addTags:{brand:"Telus","brand:wikidata":"Q165858","brand:wikipedia":"en:Telus",name:"Telus",shop:"mobile_phone"},removeTags:{brand:"Telus","brand:wikidata":"Q165858","brand:wikipedia":"en:Telus",name:"Telus",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Turkcell":{name:"Turkcell",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q283852"},addTags:{brand:"Turkcell","brand:wikidata":"Q283852","brand:wikipedia":"en:Turkcell",name:"Turkcell",shop:"mobile_phone"},removeTags:{brand:"Turkcell","brand:wikidata":"Q283852","brand:wikipedia":"en:Turkcell",name:"Turkcell",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Télécentre":{name:"Télécentre",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q180034"},addTags:{brand:"Télécentre","brand:wikidata":"Q180034","brand:wikipedia":"en:Telecentre",name:"Télécentre",shop:"mobile_phone"},removeTags:{brand:"Télécentre","brand:wikidata":"Q180034","brand:wikipedia":"en:Telecentre",name:"Télécentre",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Verizon Wireless":{name:"Verizon Wireless",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q919641"},addTags:{brand:"Verizon Wireless","brand:wikidata":"Q919641","brand:wikipedia":"en:Verizon Wireless",name:"Verizon Wireless",shop:"mobile_phone"},removeTags:{brand:"Verizon Wireless","brand:wikidata":"Q919641","brand:wikipedia":"en:Verizon Wireless",name:"Verizon Wireless",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Vodafone":{name:"Vodafone",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q122141"},addTags:{brand:"Vodafone","brand:wikidata":"Q122141","brand:wikipedia":"en:Vodafone",name:"Vodafone",shop:"mobile_phone"},removeTags:{brand:"Vodafone","brand:wikidata":"Q122141","brand:wikipedia":"en:Vodafone",name:"Vodafone",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/WIFI_ETECSA":{name:"WIFI_ETECSA",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q490323"},addTags:{brand:"WIFI_ETECSA","brand:wikidata":"Q490323","brand:wikipedia":"es:Empresa de Telecomunicaciones de Cuba",name:"WIFI_ETECSA",shop:"mobile_phone"},removeTags:{brand:"WIFI_ETECSA","brand:wikidata":"Q490323","brand:wikipedia":"es:Empresa de Telecomunicaciones de Cuba",name:"WIFI_ETECSA",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Yoigo":{name:"Yoigo",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2630989"},addTags:{brand:"Yoigo","brand:wikidata":"Q2630989","brand:wikipedia":"en:Yoigo",name:"Yoigo",shop:"mobile_phone"},removeTags:{brand:"Yoigo","brand:wikidata":"Q2630989","brand:wikipedia":"en:Yoigo",name:"Yoigo",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/auショップ":{name:"auショップ",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q11190521"},addTags:{brand:"au","brand:wikidata":"Q11190521","brand:wikipedia":"ja:au (通信)",name:"auショップ",shop:"mobile_phone"},removeTags:{brand:"au","brand:wikidata":"Q11190521","brand:wikipedia":"ja:au (通信)",name:"auショップ",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Билайн":{name:"Билайн",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q402880"},addTags:{brand:"Билайн","brand:en":"Beeline","brand:wikidata":"Q402880","brand:wikipedia":"en:Beeline (brand)",name:"Билайн","name:en":"Beeline",shop:"mobile_phone"},removeTags:{brand:"Билайн","brand:en":"Beeline","brand:wikidata":"Q402880","brand:wikipedia":"en:Beeline (brand)",name:"Билайн","name:en":"Beeline",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Евросеть":{name:"Евросеть",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q65310"},addTags:{brand:"Евросеть","brand:en":"Euroset","brand:wikidata":"Q65310","brand:wikipedia":"en:Euroset",name:"Евросеть","name:en":"Euroset",shop:"mobile_phone"},removeTags:{brand:"Евросеть","brand:en":"Euroset","brand:wikidata":"Q65310","brand:wikipedia":"en:Euroset",name:"Евросеть","name:en":"Euroset",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Київстар":{name:"Київстар",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2288463"},addTags:{brand:"Київстар","brand:en":"Kyivstar","brand:wikidata":"Q2288463","brand:wikipedia":"en:Kyivstar",name:"Київстар","name:en":"Kyivstar",shop:"mobile_phone"},removeTags:{brand:"Київстар","brand:en":"Kyivstar","brand:wikidata":"Q2288463","brand:wikipedia":"en:Kyivstar",name:"Київстар","name:en":"Kyivstar",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/МТС":{name:"МТС",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1368919"},addTags:{brand:"МТС","brand:en":"MTS","brand:wikidata":"Q1368919","brand:wikipedia":"en:MTS (network provider)",name:"МТС","name:en":"MTS",shop:"mobile_phone"},removeTags:{brand:"МТС","brand:en":"MTS","brand:wikidata":"Q1368919","brand:wikipedia":"en:MTS (network provider)",name:"МТС","name:en":"MTS",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Мегафон":{name:"Мегафон",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1720713"},addTags:{brand:"Мегафон","brand:en":"MegaFon","brand:wikidata":"Q1720713","brand:wikipedia":"en:MegaFon",name:"Мегафон","name:en":"MegaFon",shop:"mobile_phone"},removeTags:{brand:"Мегафон","brand:en":"MegaFon","brand:wikidata":"Q1720713","brand:wikipedia":"en:MegaFon",name:"Мегафон","name:en":"MegaFon",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Связной":{name:"Связной",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q65371"},addTags:{brand:"Связной","brand:en":"Svyaznoy","brand:wikidata":"Q65371","brand:wikipedia":"en:Svyaznoy",name:"Связной","name:en":"Svyaznoy",shop:"mobile_phone"},removeTags:{brand:"Связной","brand:en":"Svyaznoy","brand:wikidata":"Q65371","brand:wikipedia":"en:Svyaznoy",name:"Связной","name:en":"Svyaznoy",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Теле2":{name:"Теле2",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q309865"},addTags:{brand:"Теле2","brand:en":"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Теле2","name:en":"Tele2",shop:"mobile_phone"},removeTags:{brand:"Теле2","brand:en":"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Теле2","name:en":"Tele2",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/ソフトバンク":{name:"ソフトバンク",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q7553832"},addTags:{brand:"ソフトバンク","brand:en":"SoftBank Telecom","brand:wikidata":"Q7553832","brand:wikipedia":"en:SoftBank Telecom",name:"ソフトバンク","name:en":"SoftBank Telecom",shop:"mobile_phone"},removeTags:{brand:"ソフトバンク","brand:en":"SoftBank Telecom","brand:wikidata":"Q7553832","brand:wikipedia":"en:SoftBank Telecom",name:"ソフトバンク","name:en":"SoftBank Telecom",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/ソフトバンクショップ":{name:"ソフトバンクショップ",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q11315281"},addTags:{brand:"ソフトバンクショップ","brand:en":"SoftBankShop","brand:wikidata":"Q11315281","brand:wikipedia":"ja:ソフトバンクショップ",name:"ソフトバンクショップ","name:en":"SoftBankShop",shop:"mobile_phone"},removeTags:{brand:"ソフトバンクショップ","brand:en":"SoftBankShop","brand:wikidata":"Q11315281","brand:wikipedia":"ja:ソフトバンクショップ",name:"ソフトバンクショップ","name:en":"SoftBankShop",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/money_lender/Money Mart":{name:"Money Mart",icon:"maki-bank",fields:["name","operator","address","building_area","opening_hours","currency_multi"],geometry:["point","area"],tags:{shop:"money_lender","brand:wikidata":"Q6899166"},addTags:{brand:"Money Mart","brand:wikidata":"Q6899166","brand:wikipedia":"en:Money Mart",name:"Money Mart",shop:"money_lender"},removeTags:{brand:"Money Mart","brand:wikidata":"Q6899166","brand:wikipedia":"en:Money Mart",name:"Money Mart",shop:"money_lender"},matchScore:2,suggestion:true},"shop/motorcycle/Harley Davidson":{name:"Harley Davidson",icon:"fas-motorcycle",fields:["name","brand","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q192814"},addTags:{brand:"Harley Davidson","brand:wikidata":"Q192814","brand:wikipedia":"en:Harley-Davidson",name:"Harley Davidson",shop:"motorcycle"},removeTags:{brand:"Harley Davidson","brand:wikidata":"Q192814","brand:wikipedia":"en:Harley-Davidson",name:"Harley Davidson",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Honda":{name:"Honda",icon:"fas-motorcycle",fields:["name","brand","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q9584"},addTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"motorcycle"},removeTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Kawasaki":{name:"Kawasaki",icon:"fas-motorcycle",fields:["name","brand","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q6379855"},addTags:{brand:"Kawasaki","brand:wikidata":"Q6379855","brand:wikipedia":"en:Kawasaki motorcycles",name:"Kawasaki",shop:"motorcycle"},removeTags:{brand:"Kawasaki","brand:wikidata":"Q6379855","brand:wikipedia":"en:Kawasaki motorcycles",name:"Kawasaki",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Motortrade":{name:"Motortrade",icon:"fas-motorcycle",fields:["name","brand","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q48803162"},addTags:{brand:"Motortrade","brand:wikidata":"Q48803162","brand:wikipedia":"en:Motortrade",name:"Motortrade",shop:"motorcycle"},removeTags:{brand:"Motortrade","brand:wikidata":"Q48803162","brand:wikipedia":"en:Motortrade",name:"Motortrade",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Suzuki":{name:"Suzuki",icon:"fas-motorcycle",fields:["name","brand","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q181642"},addTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"motorcycle"},removeTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Yamaha":{name:"Yamaha",icon:"fas-motorcycle",fields:["name","brand","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q158888"},addTags:{brand:"Yamaha","brand:wikidata":"Q158888","brand:wikipedia":"en:Yamaha Motor Company",name:"Yamaha",shop:"motorcycle"},removeTags:{brand:"Yamaha","brand:wikidata":"Q158888","brand:wikipedia":"en:Yamaha Motor Company",name:"Yamaha",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/musical_instrument/Guitar Center":{name:"Guitar Center",icon:"maki-music",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"musical_instrument","brand:wikidata":"Q3622794"},addTags:{brand:"Guitar Center","brand:wikidata":"Q3622794","brand:wikipedia":"en:Guitar Center",name:"Guitar Center",shop:"musical_instrument"},removeTags:{brand:"Guitar Center","brand:wikidata":"Q3622794","brand:wikipedia":"en:Guitar Center",name:"Guitar Center",shop:"musical_instrument"},matchScore:2,suggestion:true},"shop/music/HMV":{name:"HMV",icon:"maki-music",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"music","brand:wikidata":"Q10854572"},addTags:{brand:"HMV","brand:wikidata":"Q10854572","brand:wikipedia":"en:HMV",name:"HMV",shop:"music"},removeTags:{brand:"HMV","brand:wikidata":"Q10854572","brand:wikipedia":"en:HMV",name:"HMV",shop:"music"},matchScore:2,suggestion:true},"shop/music/TSUTAYA":{name:"TSUTAYA",icon:"maki-music",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"music","brand:wikidata":"Q5193457"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"music"},removeTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"music"},matchScore:2,suggestion:true},"shop/newsagent/読売新聞":{name:"読売新聞",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"newsagent","brand:wikidata":"Q645218"},addTags:{brand:"読売新聞","brand:en":"Yomiuri Shimbun","brand:wikidata":"Q645218","brand:wikipedia":"en:Yomiuri Shimbun",name:"読売新聞","name:en":"Yomiuri Shimbun",shop:"newsagent"},removeTags:{brand:"読売新聞","brand:en":"Yomiuri Shimbun","brand:wikidata":"Q645218","brand:wikipedia":"en:Yomiuri Shimbun",name:"読売新聞","name:en":"Yomiuri Shimbun",shop:"newsagent"},matchScore:2,suggestion:true},"shop/nutrition_supplements/GNC":{name:"GNC",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"nutrition_supplements","brand:wikidata":"Q4808595"},addTags:{brand:"GNC","brand:wikidata":"Q4808595","brand:wikipedia":"en:GNC (store)",name:"GNC",shop:"nutrition_supplements"},removeTags:{brand:"GNC","brand:wikidata":"Q4808595","brand:wikipedia":"en:GNC (store)",name:"GNC",shop:"nutrition_supplements"},matchScore:2,suggestion:true},"shop/optician/Alain Afflelou":{name:"Alain Afflelou",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2829511"},addTags:{brand:"Alain Afflelou","brand:wikidata":"Q2829511","brand:wikipedia":"fr:Alain Afflelou (entreprise)",name:"Alain Afflelou",shop:"optician"},removeTags:{brand:"Alain Afflelou","brand:wikidata":"Q2829511","brand:wikipedia":"fr:Alain Afflelou (entreprise)",name:"Alain Afflelou",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Apollo":{name:"Apollo",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q618940"},addTags:{brand:"Apollo","brand:wikidata":"Q618940","brand:wikipedia":"de:Apollo-Optik",name:"Apollo",shop:"optician"},removeTags:{brand:"Apollo","brand:wikidata":"Q618940","brand:wikipedia":"de:Apollo-Optik",name:"Apollo",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Atol":{name:"Atol",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2869542"},addTags:{brand:"Atol","brand:wikidata":"Q2869542","brand:wikipedia":"fr:Atol (opticien)",name:"Atol",shop:"optician"},removeTags:{brand:"Atol","brand:wikidata":"Q2869542","brand:wikipedia":"fr:Atol (opticien)",name:"Atol",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Boots Opticians":{name:"Boots Opticians",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q4944037"},addTags:{brand:"Boots Opticians","brand:wikidata":"Q4944037","brand:wikipedia":"en:Boots Opticians",name:"Boots Opticians",shop:"optician"},removeTags:{brand:"Boots Opticians","brand:wikidata":"Q4944037","brand:wikipedia":"en:Boots Opticians",name:"Boots Opticians",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Fielmann":{name:"Fielmann",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q457822"},addTags:{brand:"Fielmann","brand:wikidata":"Q457822","brand:wikipedia":"en:Fielmann",name:"Fielmann",shop:"optician"},removeTags:{brand:"Fielmann","brand:wikidata":"Q457822","brand:wikipedia":"en:Fielmann",name:"Fielmann",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Hakim Optical":{name:"Hakim Optical",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q28232761"},addTags:{brand:"Hakim Optical","brand:wikidata":"Q28232761","brand:wikipedia":"en:Hakim Optical",name:"Hakim Optical",shop:"optician"},removeTags:{brand:"Hakim Optical","brand:wikidata":"Q28232761","brand:wikipedia":"en:Hakim Optical",name:"Hakim Optical",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/LensCrafters":{name:"LensCrafters",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q6523209"},addTags:{brand:"LensCrafters","brand:wikidata":"Q6523209","brand:wikipedia":"en:LensCrafters",name:"LensCrafters",shop:"optician"},removeTags:{brand:"LensCrafters","brand:wikidata":"Q6523209","brand:wikipedia":"en:LensCrafters",name:"LensCrafters",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Les Opticiens Mutualistes":{name:"Les Opticiens Mutualistes",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q18414551"},addTags:{brand:"Les Opticiens Mutualistes","brand:wikidata":"Q18414551","brand:wikipedia":"fr:Les Opticiens Mutualistes",name:"Les Opticiens Mutualistes",shop:"optician"},removeTags:{brand:"Les Opticiens Mutualistes","brand:wikidata":"Q18414551","brand:wikipedia":"fr:Les Opticiens Mutualistes",name:"Les Opticiens Mutualistes",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Optic 2000":{name:"Optic 2000",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q3354445"},addTags:{brand:"Optic 2000","brand:wikidata":"Q3354445","brand:wikipedia":"fr:Optic 2000",name:"Optic 2000",shop:"optician"},removeTags:{brand:"Optic 2000","brand:wikidata":"Q3354445","brand:wikipedia":"fr:Optic 2000",name:"Optic 2000",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Pearle":{name:"Pearle",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2231148"},addTags:{brand:"Pearle","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle",shop:"optician"},removeTags:{brand:"Pearle","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Pearle Vision":{name:"Pearle Vision",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2231148"},addTags:{brand:"Pearle Vision","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle Vision",shop:"optician"},removeTags:{brand:"Pearle Vision","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle Vision",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Specsavers":{name:"Specsavers",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2000610"},addTags:{brand:"Specsavers","brand:wikidata":"Q2000610","brand:wikipedia":"en:Specsavers",name:"Specsavers",shop:"optician"},removeTags:{brand:"Specsavers","brand:wikidata":"Q2000610","brand:wikipedia":"en:Specsavers",name:"Specsavers",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Sunglass Hut":{name:"Sunglass Hut",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q136311"},addTags:{brand:"Sunglass Hut","brand:wikidata":"Q136311","brand:wikipedia":"en:Sunglass Hut",name:"Sunglass Hut",shop:"optician"},removeTags:{brand:"Sunglass Hut","brand:wikidata":"Q136311","brand:wikipedia":"en:Sunglass Hut",name:"Sunglass Hut",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Synoptik":{name:"Synoptik",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q10687541"},addTags:{brand:"Synoptik","brand:wikidata":"Q10687541","brand:wikipedia":"sv:Synoptik",name:"Synoptik",shop:"optician"},removeTags:{brand:"Synoptik","brand:wikidata":"Q10687541","brand:wikipedia":"sv:Synoptik",name:"Synoptik",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Synsam":{name:"Synsam",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q12004589"},addTags:{brand:"Synsam","brand:wikidata":"Q12004589","brand:wikipedia":"sv:Synsam",name:"Synsam",shop:"optician"},removeTags:{brand:"Synsam","brand:wikidata":"Q12004589","brand:wikipedia":"sv:Synsam",name:"Synsam",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Vision Express":{name:"Vision Express",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q7936150"},addTags:{brand:"Vision Express","brand:wikidata":"Q7936150","brand:wikipedia":"en:Vision Express",name:"Vision Express",shop:"optician"},removeTags:{brand:"Vision Express","brand:wikidata":"Q7936150","brand:wikipedia":"en:Vision Express",name:"Vision Express",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Visionworks":{name:"Visionworks",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q5422607"},addTags:{brand:"Visionworks","brand:wikidata":"Q5422607","brand:wikipedia":"en:Visionworks",name:"Visionworks",shop:"optician"},removeTags:{brand:"Visionworks","brand:wikidata":"Q5422607","brand:wikipedia":"en:Visionworks",name:"Visionworks",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/メガネスーパー":{name:"メガネスーパー",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q11343504"},addTags:{brand:"メガネスーパー","brand:wikidata":"Q11343504","brand:wikipedia":"ja:メガネスーパー",name:"メガネスーパー",shop:"optician"},removeTags:{brand:"メガネスーパー","brand:wikidata":"Q11343504","brand:wikipedia":"ja:メガネスーパー",name:"メガネスーパー",shop:"optician"},matchScore:2,suggestion:true},"shop/outdoor/Jack Wolfskin":{name:"Jack Wolfskin",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q536133"},addTags:{brand:"Jack Wolfskin","brand:wikidata":"Q536133","brand:wikipedia":"en:Jack Wolfskin",name:"Jack Wolfskin",shop:"outdoor"},removeTags:{brand:"Jack Wolfskin","brand:wikidata":"Q536133","brand:wikipedia":"en:Jack Wolfskin",name:"Jack Wolfskin",shop:"outdoor"},matchScore:2,suggestion:true},"shop/outdoor/Mountain Warehouse":{name:"Mountain Warehouse",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q6925414"},addTags:{brand:"Mountain Warehouse","brand:wikidata":"Q6925414","brand:wikipedia":"en:Mountain Warehouse",name:"Mountain Warehouse",shop:"outdoor"},removeTags:{brand:"Mountain Warehouse","brand:wikidata":"Q6925414","brand:wikipedia":"en:Mountain Warehouse",name:"Mountain Warehouse",shop:"outdoor"},matchScore:2,suggestion:true},"shop/outdoor/REI":{name:"REI",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q3414933"},addTags:{brand:"REI","brand:wikidata":"Q3414933","brand:wikipedia":"en:Recreational Equipment, Inc.",name:"REI",shop:"outdoor"},removeTags:{brand:"REI","brand:wikidata":"Q3414933","brand:wikipedia":"en:Recreational Equipment, Inc.",name:"REI",shop:"outdoor"},matchScore:2,suggestion:true},"shop/outdoor/Trespass":{name:"Trespass",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q17035733"},addTags:{brand:"Trespass","brand:wikidata":"Q17035733","brand:wikipedia":"en:Trespass (clothing)",name:"Trespass",shop:"outdoor"},removeTags:{brand:"Trespass","brand:wikidata":"Q17035733","brand:wikipedia":"en:Trespass (clothing)",name:"Trespass",shop:"outdoor"},matchScore:2,suggestion:true},"shop/paint/Benjamin Moore":{name:"Benjamin Moore",icon:"fas-paint-roller",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"paint","brand:wikidata":"Q4889038"},addTags:{brand:"Benjamin Moore","brand:wikidata":"Q4889038","brand:wikipedia":"en:Benjamin Moore & Co.",name:"Benjamin Moore",shop:"paint"},removeTags:{brand:"Benjamin Moore","brand:wikidata":"Q4889038","brand:wikipedia":"en:Benjamin Moore & Co.",name:"Benjamin Moore",shop:"paint"},matchScore:2,suggestion:true},"shop/paint/Comex":{name:"Comex",icon:"fas-paint-roller",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"paint","brand:wikidata":"Q5151654"},addTags:{brand:"Comex","brand:wikidata":"Q5151654","brand:wikipedia":"en:Comex Group",name:"Comex",shop:"paint"},removeTags:{brand:"Comex","brand:wikidata":"Q5151654","brand:wikipedia":"en:Comex Group",name:"Comex",shop:"paint"},matchScore:2,suggestion:true},"shop/paint/Jotun":{name:"Jotun",icon:"fas-paint-roller",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"paint","brand:wikidata":"Q1778870"},addTags:{brand:"Jotun","brand:wikidata":"Q1778870","brand:wikipedia":"en:Jotun (company)",name:"Jotun",shop:"paint"},removeTags:{brand:"Jotun","brand:wikidata":"Q1778870","brand:wikipedia":"en:Jotun (company)",name:"Jotun",shop:"paint"},matchScore:2,suggestion:true},"shop/paint/Sherwin Williams":{name:"Sherwin Williams",icon:"fas-paint-roller",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"paint","brand:wikidata":"Q48881"},addTags:{brand:"Sherwin Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams",name:"Sherwin Williams",shop:"paint"},removeTags:{brand:"Sherwin Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams",name:"Sherwin Williams",shop:"paint"},matchScore:2,suggestion:true},"shop/party/Party City":{name:"Party City",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"party","brand:wikidata":"Q7140896"},addTags:{brand:"Party City","brand:wikidata":"Q7140896","brand:wikipedia":"en:Party City",name:"Party City",shop:"party"},removeTags:{brand:"Party City","brand:wikidata":"Q7140896","brand:wikipedia":"en:Party City",name:"Party City",shop:"party"},matchScore:2,suggestion:true},"shop/pawnbroker/Cash Converters":{name:"Cash Converters",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pawnbroker","brand:wikidata":"Q5048645"},addTags:{brand:"Cash Converters","brand:wikidata":"Q5048645","brand:wikipedia":"en:Cash Converters",name:"Cash Converters",shop:"pawnbroker"},removeTags:{brand:"Cash Converters","brand:wikidata":"Q5048645","brand:wikipedia":"en:Cash Converters",name:"Cash Converters",shop:"pawnbroker"},matchScore:2,suggestion:true},"shop/pawnbroker/Cebuana Lhuillier":{name:"Cebuana Lhuillier",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pawnbroker","brand:wikidata":"Q17064661"},addTags:{brand:"Cebuana Lhuillier","brand:wikidata":"Q17064661","brand:wikipedia":"en:Cebuana Lhuillier",name:"Cebuana Lhuillier",shop:"pawnbroker"},removeTags:{brand:"Cebuana Lhuillier","brand:wikidata":"Q17064661","brand:wikipedia":"en:Cebuana Lhuillier",name:"Cebuana Lhuillier",shop:"pawnbroker"},matchScore:2,suggestion:true},"shop/perfumery/Douglas":{name:"Douglas",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"perfumery","brand:wikidata":"Q2052213"},addTags:{brand:"Douglas","brand:wikidata":"Q2052213","brand:wikipedia":"de:Parfümerie Douglas",name:"Douglas",shop:"perfumery"},removeTags:{brand:"Douglas","brand:wikidata":"Q2052213","brand:wikipedia":"de:Parfümerie Douglas",name:"Douglas",shop:"perfumery"},matchScore:2,suggestion:true},"shop/perfumery/ICI PARIS XL":{name:"ICI PARIS XL",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"perfumery","brand:wikidata":"Q769749"},addTags:{brand:"ICI PARIS XL","brand:wikidata":"Q769749","brand:wikipedia":"en:ICI Paris XL",name:"ICI PARIS XL",shop:"perfumery"},removeTags:{brand:"ICI PARIS XL","brand:wikidata":"Q769749","brand:wikipedia":"en:ICI Paris XL",name:"ICI PARIS XL",shop:"perfumery"},matchScore:2,suggestion:true},"shop/perfumery/Marionnaud":{name:"Marionnaud",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"perfumery","brand:wikidata":"Q1129073"},addTags:{brand:"Marionnaud","brand:wikidata":"Q1129073","brand:wikipedia":"fr:Marionnaud Parfumeries",name:"Marionnaud",shop:"perfumery"},removeTags:{brand:"Marionnaud","brand:wikidata":"Q1129073","brand:wikipedia":"fr:Marionnaud Parfumeries",name:"Marionnaud",shop:"perfumery"},matchScore:2,suggestion:true},"shop/perfumery/O Boticário":{name:"O Boticário",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"perfumery","brand:wikidata":"Q7073219"},addTags:{brand:"O Boticário","brand:wikidata":"Q7073219","brand:wikipedia":"en:O Boticário",name:"O Boticário",shop:"perfumery"},removeTags:{brand:"O Boticário","brand:wikidata":"Q7073219","brand:wikipedia":"en:O Boticário",name:"O Boticário",shop:"perfumery"},matchScore:2,suggestion:true},"shop/pet/Das Futterhaus":{name:"Das Futterhaus",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q1167914"},addTags:{brand:"Das Futterhaus","brand:wikidata":"Q1167914","brand:wikipedia":"de:Das Futterhaus",name:"Das Futterhaus",shop:"pet"},removeTags:{brand:"Das Futterhaus","brand:wikidata":"Q1167914","brand:wikipedia":"de:Das Futterhaus",name:"Das Futterhaus",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Fressnapf":{name:"Fressnapf",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q875796"},addTags:{brand:"Fressnapf","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Fressnapf",shop:"pet"},removeTags:{brand:"Fressnapf","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Fressnapf",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Global Pet Foods":{name:"Global Pet Foods",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q57985699"},addTags:{brand:"Global Pet Foods","brand:wikidata":"Q57985699",name:"Global Pet Foods",shop:"pet"},removeTags:{brand:"Global Pet Foods","brand:wikidata":"Q57985699",name:"Global Pet Foods",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Maxi Zoo":{name:"Maxi Zoo",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q875796"},addTags:{brand:"Maxi Zoo","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Maxi Zoo",shop:"pet"},removeTags:{brand:"Maxi Zoo","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Maxi Zoo",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Pet Supplies Plus":{name:"Pet Supplies Plus",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q7171563"},addTags:{brand:"Pet Supplies Plus","brand:wikidata":"Q7171563","brand:wikipedia":"en:Pet Supplies Plus",name:"Pet Supplies Plus",shop:"pet"},removeTags:{brand:"Pet Supplies Plus","brand:wikidata":"Q7171563","brand:wikipedia":"en:Pet Supplies Plus",name:"Pet Supplies Plus",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Pet Valu":{name:"Pet Valu",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q58009635"},addTags:{brand:"Pet Valu","brand:wikidata":"Q58009635",name:"Pet Valu",shop:"pet"},removeTags:{brand:"Pet Valu","brand:wikidata":"Q58009635",name:"Pet Valu",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/PetSmart":{name:"PetSmart",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q3307147"},addTags:{brand:"PetSmart","brand:wikidata":"Q3307147","brand:wikipedia":"en:PetSmart",name:"PetSmart",shop:"pet"},removeTags:{brand:"PetSmart","brand:wikidata":"Q3307147","brand:wikipedia":"en:PetSmart",name:"PetSmart",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Petco":{name:"Petco",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q7171798"},addTags:{brand:"Petco","brand:wikidata":"Q7171798","brand:wikipedia":"en:Petco",name:"Petco",shop:"pet"},removeTags:{brand:"Petco","brand:wikidata":"Q7171798","brand:wikipedia":"en:Petco",name:"Petco",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Pets at Home":{name:"Pets at Home",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q7179258"},addTags:{brand:"Pets at Home","brand:wikidata":"Q7179258","brand:wikipedia":"en:Pets at Home",name:"Pets at Home",shop:"pet"},removeTags:{brand:"Pets at Home","brand:wikidata":"Q7179258","brand:wikipedia":"en:Pets at Home",name:"Pets at Home",shop:"pet"},matchScore:2,suggestion:true},"shop/photo/Kodak Express":{name:"Kodak Express",icon:"maki-attraction",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"photo","brand:wikidata":"Q6425126"},addTags:{brand:"Kodak Express","brand:wikidata":"Q6425126","brand:wikipedia":"en:Kodak Express",name:"Kodak Express",shop:"photo"},removeTags:{brand:"Kodak Express","brand:wikidata":"Q6425126","brand:wikipedia":"en:Kodak Express",name:"Kodak Express",shop:"photo"},matchScore:2,suggestion:true},"shop/shoes/Aldo":{name:"Aldo",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2832297"},addTags:{brand:"Aldo","brand:wikidata":"Q2832297","brand:wikipedia":"en:Aldo Group",name:"Aldo",shop:"shoes"},removeTags:{brand:"Aldo","brand:wikidata":"Q2832297","brand:wikipedia":"en:Aldo Group",name:"Aldo",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/André":{name:"André",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2847114"},addTags:{brand:"André","brand:wikidata":"Q2847114","brand:wikipedia":"fr:André (chaussure)",name:"André",shop:"shoes"},removeTags:{brand:"André","brand:wikidata":"Q2847114","brand:wikipedia":"fr:André (chaussure)",name:"André",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Bata":{name:"Bata",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q688082"},addTags:{brand:"Bata","brand:wikidata":"Q688082","brand:wikipedia":"en:Bata (company)",name:"Bata",shop:"shoes"},removeTags:{brand:"Bata","brand:wikidata":"Q688082","brand:wikipedia":"en:Bata (company)",name:"Bata",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Besson Chaussures":{name:"Besson Chaussures",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2899930"},addTags:{brand:"Besson Chaussures","brand:wikidata":"Q2899930","brand:wikipedia":"fr:Besson Chaussures",name:"Besson Chaussures",shop:"shoes"},removeTags:{brand:"Besson Chaussures","brand:wikidata":"Q2899930","brand:wikipedia":"fr:Besson Chaussures",name:"Besson Chaussures",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Birkenstock":{name:"Birkenstock",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q648458"},addTags:{brand:"Birkenstock","brand:wikidata":"Q648458","brand:wikipedia":"en:Birkenstock",name:"Birkenstock",shop:"shoes"},removeTags:{brand:"Birkenstock","brand:wikidata":"Q648458","brand:wikipedia":"en:Birkenstock",name:"Birkenstock",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Brantano":{name:"Brantano",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q4957616"},addTags:{brand:"Brantano","brand:wikidata":"Q4957616","brand:wikipedia":"en:Brantano Footwear",name:"Brantano",shop:"shoes"},removeTags:{brand:"Brantano","brand:wikidata":"Q4957616","brand:wikipedia":"en:Brantano Footwear",name:"Brantano",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/CCC":{name:"CCC",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q11788344"},addTags:{brand:"CCC","brand:wikidata":"Q11788344","brand:wikipedia":"de:CCC (Unternehmen)",name:"CCC",shop:"shoes"},removeTags:{brand:"CCC","brand:wikidata":"Q11788344","brand:wikipedia":"de:CCC (Unternehmen)",name:"CCC",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Camper":{name:"Camper",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1030922"},addTags:{brand:"Camper","brand:wikidata":"Q1030922","brand:wikipedia":"en:Camper (company)",name:"Camper",shop:"shoes"},removeTags:{brand:"Camper","brand:wikidata":"Q1030922","brand:wikipedia":"en:Camper (company)",name:"Camper",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Clarks":{name:"Clarks",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1095857"},addTags:{brand:"Clarks","brand:wikidata":"Q1095857","brand:wikipedia":"en:C. & J. Clark",name:"Clarks",shop:"shoes"},removeTags:{brand:"Clarks","brand:wikidata":"Q1095857","brand:wikipedia":"en:C. & J. Clark",name:"Clarks",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Converse":{name:"Converse",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q319515"},addTags:{brand:"Converse","brand:wikidata":"Q319515","brand:wikipedia":"en:Converse (shoe company)",name:"Converse",shop:"shoes"},removeTags:{brand:"Converse","brand:wikidata":"Q319515","brand:wikipedia":"en:Converse (shoe company)",name:"Converse",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Crocs":{name:"Crocs",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q926699"},addTags:{brand:"Crocs","brand:wikidata":"Q926699","brand:wikipedia":"en:Crocs",name:"Crocs",shop:"shoes"},removeTags:{brand:"Crocs","brand:wikidata":"Q926699","brand:wikipedia":"en:Crocs",name:"Crocs",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/DSW":{name:"DSW",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q5206207"},addTags:{brand:"DSW","brand:wikidata":"Q5206207","brand:wikipedia":"en:DSW, Inc.",name:"DSW",shop:"shoes"},removeTags:{brand:"DSW","brand:wikidata":"Q5206207","brand:wikipedia":"en:DSW, Inc.",name:"DSW",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Deichmann":{name:"Deichmann",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q664543"},addTags:{brand:"Deichmann","brand:wikidata":"Q664543","brand:wikipedia":"en:Deichmann SE",name:"Deichmann",shop:"shoes"},removeTags:{brand:"Deichmann","brand:wikidata":"Q664543","brand:wikipedia":"en:Deichmann SE",name:"Deichmann",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Din sko":{name:"Din sko",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q10472869"},addTags:{brand:"Din sko","brand:wikidata":"Q10472869","brand:wikipedia":"sv:Din sko",name:"Din sko",shop:"shoes"},removeTags:{brand:"Din sko","brand:wikidata":"Q10472869","brand:wikipedia":"sv:Din sko",name:"Din sko",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Ecco":{name:"Ecco",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1280255"},addTags:{brand:"Ecco","brand:wikidata":"Q1280255","brand:wikipedia":"en:ECCO",name:"Ecco",shop:"shoes"},removeTags:{brand:"Ecco","brand:wikidata":"Q1280255","brand:wikipedia":"en:ECCO",name:"Ecco",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Famous Footwear":{name:"Famous Footwear",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q5433457"},addTags:{brand:"Famous Footwear","brand:wikidata":"Q5433457","brand:wikipedia":"en:Famous Footwear",name:"Famous Footwear",shop:"shoes"},removeTags:{brand:"Famous Footwear","brand:wikidata":"Q5433457","brand:wikipedia":"en:Famous Footwear",name:"Famous Footwear",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Foot Locker":{name:"Foot Locker",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q63335"},addTags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Foot Locker",shop:"shoes"},removeTags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Foot Locker",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Geox":{name:"Geox",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q588001"},addTags:{brand:"Geox","brand:wikidata":"Q588001","brand:wikipedia":"en:Geox",name:"Geox",shop:"shoes"},removeTags:{brand:"Geox","brand:wikidata":"Q588001","brand:wikipedia":"en:Geox",name:"Geox",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Humanic":{name:"Humanic",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1636668"},addTags:{brand:"Humanic","brand:wikidata":"Q1636668","brand:wikipedia":"en:Humanic",name:"Humanic",shop:"shoes"},removeTags:{brand:"Humanic","brand:wikidata":"Q1636668","brand:wikipedia":"en:Humanic",name:"Humanic",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Journeys":{name:"Journeys",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q5532704"},addTags:{brand:"Journeys","brand:wikidata":"Q5532704","brand:wikipedia":"en:Genesco",name:"Journeys",shop:"shoes"},removeTags:{brand:"Journeys","brand:wikidata":"Q5532704","brand:wikipedia":"en:Genesco",name:"Journeys",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Mephisto":{name:"Mephisto",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q822975"},addTags:{brand:"Mephisto","brand:wikidata":"Q822975","brand:wikipedia":"fr:Mephisto (chaussure)",name:"Mephisto",shop:"shoes"},removeTags:{brand:"Mephisto","brand:wikidata":"Q822975","brand:wikipedia":"fr:Mephisto (chaussure)",name:"Mephisto",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/New Balance":{name:"New Balance",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q742988"},addTags:{brand:"New Balance","brand:wikidata":"Q742988","brand:wikipedia":"en:New Balance",name:"New Balance",shop:"shoes"},removeTags:{brand:"New Balance","brand:wikidata":"Q742988","brand:wikipedia":"en:New Balance",name:"New Balance",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Payless ShoeSource":{name:"Payless ShoeSource",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q7156755"},addTags:{brand:"Payless ShoeSource","brand:wikidata":"Q7156755","brand:wikipedia":"en:Payless ShoeSource",name:"Payless ShoeSource",shop:"shoes"},removeTags:{brand:"Payless ShoeSource","brand:wikidata":"Q7156755","brand:wikipedia":"en:Payless ShoeSource",name:"Payless ShoeSource",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Quick Schuh":{name:"Quick Schuh",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2123069"},addTags:{brand:"Quick Schuh","brand:wikidata":"Q2123069","brand:wikipedia":"de:Quick Schuh",name:"Quick Schuh",shop:"shoes"},removeTags:{brand:"Quick Schuh","brand:wikidata":"Q2123069","brand:wikipedia":"de:Quick Schuh",name:"Quick Schuh",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Rack Room Shoes":{name:"Rack Room Shoes",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q17109937"},addTags:{brand:"Rack Room Shoes","brand:wikidata":"Q17109937","brand:wikipedia":"en:Rack Room Shoes",name:"Rack Room Shoes",shop:"shoes"},removeTags:{brand:"Rack Room Shoes","brand:wikidata":"Q17109937","brand:wikipedia":"en:Rack Room Shoes",name:"Rack Room Shoes",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Reno":{name:"Reno",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2144204"},addTags:{brand:"Reno","brand:wikidata":"Q2144204","brand:wikipedia":"de:Reno (Schuhhandel)",name:"Reno",shop:"shoes"},removeTags:{brand:"Reno","brand:wikidata":"Q2144204","brand:wikipedia":"de:Reno (Schuhhandel)",name:"Reno",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Rieker":{name:"Rieker",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2152193"},addTags:{brand:"Rieker","brand:wikidata":"Q2152193","brand:wikipedia":"en:Rieker Shoes",name:"Rieker",shop:"shoes"},removeTags:{brand:"Rieker","brand:wikidata":"Q2152193","brand:wikipedia":"en:Rieker Shoes",name:"Rieker",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Salamander":{name:"Salamander",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q878354"},addTags:{brand:"Salamander","brand:wikidata":"Q878354","brand:wikipedia":"de:Salamander (Schuhe)",name:"Salamander",shop:"shoes"},removeTags:{brand:"Salamander","brand:wikidata":"Q878354","brand:wikipedia":"de:Salamander (Schuhe)",name:"Salamander",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Scapino":{name:"Scapino",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2298792"},addTags:{brand:"Scapino","brand:wikidata":"Q2298792","brand:wikipedia":"nl:Scapino (winkelketen)",name:"Scapino",shop:"shoes"},removeTags:{brand:"Scapino","brand:wikidata":"Q2298792","brand:wikipedia":"nl:Scapino (winkelketen)",name:"Scapino",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Schuh":{name:"Schuh",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q7432952"},addTags:{brand:"Schuh","brand:wikidata":"Q7432952","brand:wikipedia":"en:Schuh",name:"Schuh",shop:"shoes"},removeTags:{brand:"Schuh","brand:wikidata":"Q7432952","brand:wikipedia":"en:Schuh",name:"Schuh",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Shoe Carnival":{name:"Shoe Carnival",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q7500007"},addTags:{brand:"Shoe Carnival","brand:wikidata":"Q7500007","brand:wikipedia":"en:Shoe Carnival",name:"Shoe Carnival",shop:"shoes"},removeTags:{brand:"Shoe Carnival","brand:wikidata":"Q7500007","brand:wikipedia":"en:Shoe Carnival",name:"Shoe Carnival",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Shoe Zone":{name:"Shoe Zone",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q7500016"},addTags:{brand:"Shoe Zone","brand:wikidata":"Q7500016","brand:wikipedia":"en:Shoe Zone",name:"Shoe Zone",shop:"shoes"},removeTags:{brand:"Shoe Zone","brand:wikidata":"Q7500016","brand:wikipedia":"en:Shoe Zone",name:"Shoe Zone",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Siemes Schuhcenter":{name:"Siemes Schuhcenter",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2800720"},addTags:{brand:"Siemes Schuhcenter","brand:wikidata":"Q2800720","brand:wikipedia":"de:Siemes (Unternehmen)",name:"Siemes Schuhcenter",shop:"shoes"},removeTags:{brand:"Siemes Schuhcenter","brand:wikidata":"Q2800720","brand:wikipedia":"de:Siemes (Unternehmen)",name:"Siemes Schuhcenter",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Skechers":{name:"Skechers",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2945643"},addTags:{brand:"Skechers","brand:wikidata":"Q2945643","brand:wikipedia":"en:Skechers",name:"Skechers",shop:"shoes"},removeTags:{brand:"Skechers","brand:wikidata":"Q2945643","brand:wikipedia":"en:Skechers",name:"Skechers",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Vans":{name:"Vans",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1135366"},addTags:{brand:"Vans","brand:wikidata":"Q1135366","brand:wikipedia":"en:Vans",name:"Vans",shop:"shoes"},removeTags:{brand:"Vans","brand:wikidata":"Q1135366","brand:wikipedia":"en:Vans",name:"Vans",shop:"shoes"},matchScore:2,suggestion:true},"shop/sports/Adidas":{name:"Adidas",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q3895"},addTags:{brand:"Adidas","brand:wikidata":"Q3895","brand:wikipedia":"en:Adidas",name:"Adidas",shop:"sports"},removeTags:{brand:"Adidas","brand:wikidata":"Q3895","brand:wikipedia":"en:Adidas",name:"Adidas",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Aktiesport":{name:"Aktiesport",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q57546889"},addTags:{brand:"Aktiesport","brand:wikidata":"Q57546889",name:"Aktiesport",shop:"sports"},removeTags:{brand:"Aktiesport","brand:wikidata":"Q57546889",name:"Aktiesport",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Big 5 Sporting Goods":{name:"Big 5 Sporting Goods",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q4904902"},addTags:{brand:"Big 5 Sporting Goods","brand:wikidata":"Q4904902","brand:wikipedia":"en:Big 5 Sporting Goods",name:"Big 5 Sporting Goods",shop:"sports"},removeTags:{brand:"Big 5 Sporting Goods","brand:wikidata":"Q4904902","brand:wikipedia":"en:Big 5 Sporting Goods",name:"Big 5 Sporting Goods",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Decathlon":{name:"Decathlon",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q509349"},addTags:{brand:"Decathlon","brand:wikidata":"Q509349","brand:wikipedia":"en:Decathlon Group",name:"Decathlon",shop:"sports"},removeTags:{brand:"Decathlon","brand:wikidata":"Q509349","brand:wikipedia":"en:Decathlon Group",name:"Decathlon",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Dick's Sporting Goods":{name:"Dick's Sporting Goods",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q5272601"},addTags:{brand:"Dick's Sporting Goods","brand:wikidata":"Q5272601","brand:wikipedia":"en:Dick's Sporting Goods",name:"Dick's Sporting Goods",shop:"sports"},removeTags:{brand:"Dick's Sporting Goods","brand:wikidata":"Q5272601","brand:wikipedia":"en:Dick's Sporting Goods",name:"Dick's Sporting Goods",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Hervis":{name:"Hervis",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q1614816"},addTags:{brand:"Hervis","brand:wikidata":"Q1614816","brand:wikipedia":"de:Hervis",name:"Hervis",shop:"sports"},removeTags:{brand:"Hervis","brand:wikidata":"Q1614816","brand:wikipedia":"de:Hervis",name:"Hervis",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Hibbett Sports":{name:"Hibbett Sports",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q5750671"},addTags:{brand:"Hibbett Sports","brand:wikidata":"Q5750671","brand:wikipedia":"en:Hibbett Sports",name:"Hibbett Sports",shop:"sports"},removeTags:{brand:"Hibbett Sports","brand:wikidata":"Q5750671","brand:wikipedia":"en:Hibbett Sports",name:"Hibbett Sports",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Intersport":{name:"Intersport",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q666888"},addTags:{brand:"Intersport","brand:wikidata":"Q666888","brand:wikipedia":"en:Intersport",name:"Intersport",shop:"sports"},removeTags:{brand:"Intersport","brand:wikidata":"Q666888","brand:wikipedia":"en:Intersport",name:"Intersport",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/JD Sports":{name:"JD Sports",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q6108019"},addTags:{brand:"JD Sports","brand:wikidata":"Q6108019","brand:wikipedia":"en:JD Sports",name:"JD Sports",shop:"sports"},removeTags:{brand:"JD Sports","brand:wikidata":"Q6108019","brand:wikipedia":"en:JD Sports",name:"JD Sports",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Play It Again Sports":{name:"Play It Again Sports",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q7203029"},addTags:{brand:"Play It Again Sports","brand:wikidata":"Q7203029","brand:wikipedia":"en:Play It Again Sports",name:"Play It Again Sports",shop:"sports"},removeTags:{brand:"Play It Again Sports","brand:wikidata":"Q7203029","brand:wikipedia":"en:Play It Again Sports",name:"Play It Again Sports",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Sport 2000":{name:"Sport 2000",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q262394"},addTags:{brand:"Sport 2000","brand:wikidata":"Q262394","brand:wikipedia":"de:Sport 2000",name:"Sport 2000",shop:"sports"},removeTags:{brand:"Sport 2000","brand:wikidata":"Q262394","brand:wikipedia":"de:Sport 2000",name:"Sport 2000",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Sportisimo":{name:"Sportisimo",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q54974273"},addTags:{brand:"Sportisimo","brand:wikidata":"Q54974273",name:"Sportisimo",shop:"sports"},removeTags:{brand:"Sportisimo","brand:wikidata":"Q54974273",name:"Sportisimo",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Sports Authority":{name:"Sports Authority",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q7579688"},addTags:{brand:"Sports Authority","brand:wikidata":"Q7579688","brand:wikipedia":"en:Sports Authority",name:"Sports Authority",shop:"sports"},removeTags:{brand:"Sports Authority","brand:wikidata":"Q7579688","brand:wikipedia":"en:Sports Authority",name:"Sports Authority",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Sports Direct":{name:"Sports Direct",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q2913554"},addTags:{brand:"Sports Direct","brand:wikidata":"Q2913554","brand:wikipedia":"en:Sports Direct",name:"Sports Direct",shop:"sports"},removeTags:{brand:"Sports Direct","brand:wikidata":"Q2913554","brand:wikipedia":"en:Sports Direct",name:"Sports Direct",shop:"sports"},matchScore:2,suggestion:true},"shop/stationery/McPaper":{name:"McPaper",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q1915329"},addTags:{brand:"McPaper","brand:wikidata":"Q1915329","brand:wikipedia":"de:McPaper",name:"McPaper",shop:"stationery"},removeTags:{brand:"McPaper","brand:wikidata":"Q1915329","brand:wikipedia":"de:McPaper",name:"McPaper",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Office Depot":{name:"Office Depot",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q1337797"},addTags:{brand:"Office Depot","brand:wikidata":"Q1337797","brand:wikipedia":"en:Office Depot",name:"Office Depot",shop:"stationery"},removeTags:{brand:"Office Depot","brand:wikidata":"Q1337797","brand:wikipedia":"en:Office Depot",name:"Office Depot",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/OfficeMax":{name:"OfficeMax",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q7079111"},addTags:{brand:"OfficeMax","brand:wikidata":"Q7079111","brand:wikipedia":"en:OfficeMax",name:"OfficeMax",shop:"stationery"},removeTags:{brand:"OfficeMax","brand:wikidata":"Q7079111","brand:wikipedia":"en:OfficeMax",name:"OfficeMax",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Officeworks":{name:"Officeworks",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q7079486"},addTags:{brand:"Officeworks","brand:wikidata":"Q7079486","brand:wikipedia":"en:Officeworks",name:"Officeworks",shop:"stationery"},removeTags:{brand:"Officeworks","brand:wikidata":"Q7079486","brand:wikipedia":"en:Officeworks",name:"Officeworks",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Pagro":{name:"Pagro",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q57550022"},addTags:{brand:"Pagro","brand:wikidata":"Q57550022",name:"Pagro",shop:"stationery"},removeTags:{brand:"Pagro","brand:wikidata":"Q57550022",name:"Pagro",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Paperchase":{name:"Paperchase",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q7132739"},addTags:{brand:"Paperchase","brand:wikidata":"Q7132739","brand:wikipedia":"en:Paperchase",name:"Paperchase",shop:"stationery"},removeTags:{brand:"Paperchase","brand:wikidata":"Q7132739","brand:wikipedia":"en:Paperchase",name:"Paperchase",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Ryman":{name:"Ryman",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q7385188"},addTags:{brand:"Ryman","brand:wikidata":"Q7385188","brand:wikipedia":"en:Ryman",name:"Ryman",shop:"stationery"},removeTags:{brand:"Ryman","brand:wikidata":"Q7385188","brand:wikipedia":"en:Ryman",name:"Ryman",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Staples":{name:"Staples",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q785943"},addTags:{brand:"Staples","brand:wikidata":"Q785943","brand:wikipedia":"en:Staples Inc.",name:"Staples",shop:"stationery"},removeTags:{brand:"Staples","brand:wikidata":"Q785943","brand:wikipedia":"en:Staples Inc.",name:"Staples",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Комус":{name:"Комус",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q4230314"},addTags:{brand:"Комус","brand:en":"Komus","brand:wikidata":"Q4230314","brand:wikipedia":"en:Komus (company)",name:"Комус","name:en":"Komus",shop:"stationery"},removeTags:{brand:"Комус","brand:en":"Komus","brand:wikidata":"Q4230314","brand:wikipedia":"en:Komus (company)",name:"Комус","name:en":"Komus",shop:"stationery"},matchScore:2,suggestion:true},"shop/storage_rental/Public Storage":{name:"Public Storage",icon:"fas-warehouse",fields:["name","operator","address","building","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"storage_rental","brand:wikidata":"Q1156045"},addTags:{brand:"Public Storage","brand:wikidata":"Q1156045","brand:wikipedia":"en:Public Storage",name:"Public Storage",shop:"storage_rental"},removeTags:{brand:"Public Storage","brand:wikidata":"Q1156045","brand:wikipedia":"en:Public Storage",name:"Public Storage",shop:"storage_rental"},matchScore:2,suggestion:true},"shop/supermarket/A&O":{name:"A&O",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3600279"},addTags:{brand:"A&O","brand:wikidata":"Q3600279","brand:wikipedia":"it:A&O",name:"A&O",shop:"supermarket"},removeTags:{brand:"A&O","brand:wikidata":"Q3600279","brand:wikipedia":"it:A&O",name:"A&O",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/A101":{name:"A101",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6034496"},addTags:{brand:"A101","brand:wikidata":"Q6034496","brand:wikipedia":"tr:A101",name:"A101",shop:"supermarket"},removeTags:{brand:"A101","brand:wikidata":"Q6034496","brand:wikipedia":"tr:A101",name:"A101",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ADEG":{name:"ADEG",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q290211"},addTags:{brand:"ADEG","brand:wikidata":"Q290211","brand:wikipedia":"de:ADEG Österreich",name:"ADEG",shop:"supermarket"},removeTags:{brand:"ADEG","brand:wikidata":"Q290211","brand:wikipedia":"de:ADEG Österreich",name:"ADEG",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ahorramás":{name:"Ahorramás",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58221883"},addTags:{brand:"Ahorramás","brand:wikidata":"Q58221883",name:"Ahorramás",shop:"supermarket"},removeTags:{brand:"Ahorramás","brand:wikidata":"Q58221883",name:"Ahorramás",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Albert":{name:"Albert",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q9144241"},addTags:{brand:"Albert","brand:wikidata":"Q9144241","brand:wikipedia":"cs:Albert (obchodní řetězec)",name:"Albert",shop:"supermarket"},removeTags:{brand:"Albert","brand:wikidata":"Q9144241","brand:wikipedia":"cs:Albert (obchodní řetězec)",name:"Albert",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Albert Heijn":{name:"Albert Heijn",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1653985"},addTags:{brand:"Albert Heijn","brand:wikidata":"Q1653985","brand:wikipedia":"nl:Albert Heijn (supermarkt)",name:"Albert Heijn",shop:"supermarket"},removeTags:{brand:"Albert Heijn","brand:wikidata":"Q1653985","brand:wikipedia":"nl:Albert Heijn (supermarkt)",name:"Albert Heijn",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Albertsons":{name:"Albertsons",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4712282"},addTags:{brand:"Albertsons","brand:wikidata":"Q4712282","brand:wikipedia":"en:Albertsons",name:"Albertsons",shop:"supermarket"},removeTags:{brand:"Albertsons","brand:wikidata":"Q4712282","brand:wikipedia":"en:Albertsons",name:"Albertsons",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Aldi":{name:"Aldi",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q125054"},addTags:{brand:"Aldi","brand:wikidata":"Q125054","brand:wikipedia":"en:Aldi",name:"Aldi",shop:"supermarket"},removeTags:{brand:"Aldi","brand:wikidata":"Q125054","brand:wikipedia":"en:Aldi",name:"Aldi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Aldi Nord":{name:"Aldi Nord",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q41171373"},addTags:{brand:"Aldi Nord","brand:wikidata":"Q41171373","brand:wikipedia":"en:Aldi",name:"Aldi Nord",shop:"supermarket"},removeTags:{brand:"Aldi Nord","brand:wikidata":"Q41171373","brand:wikipedia":"en:Aldi",name:"Aldi Nord",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Aldi Süd":{name:"Aldi Süd",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q41171672"},addTags:{brand:"Aldi Süd","brand:wikidata":"Q41171672","brand:wikipedia":"en:Aldi",name:"Aldi Süd",shop:"supermarket"},removeTags:{brand:"Aldi Süd","brand:wikidata":"Q41171672","brand:wikipedia":"en:Aldi",name:"Aldi Süd",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Alimerka":{name:"Alimerka",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16482738"},addTags:{brand:"Alimerka","brand:wikidata":"Q16482738","brand:wikipedia":"es:Alimerka",name:"Alimerka",shop:"supermarket"},removeTags:{brand:"Alimerka","brand:wikidata":"Q16482738","brand:wikipedia":"es:Alimerka",name:"Alimerka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Alnatura":{name:"Alnatura",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q876811"},addTags:{brand:"Alnatura","brand:wikidata":"Q876811","brand:wikipedia":"en:Alnatura",name:"Alnatura",shop:"supermarket"},removeTags:{brand:"Alnatura","brand:wikidata":"Q876811","brand:wikipedia":"en:Alnatura",name:"Alnatura",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Atacadão":{name:"Atacadão",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2868739"},addTags:{brand:"Atacadão","brand:wikidata":"Q2868739","brand:wikipedia":"en:Atacadão",name:"Atacadão",shop:"supermarket"},removeTags:{brand:"Atacadão","brand:wikidata":"Q2868739","brand:wikipedia":"en:Atacadão",name:"Atacadão",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Auchan":{name:"Auchan",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q758603"},addTags:{brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan",shop:"supermarket"},removeTags:{brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Bi-Lo":{name:"Bi-Lo",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4835622"},addTags:{brand:"Bi-Lo","brand:wikidata":"Q4835622","brand:wikipedia":"en:BI-LO (Australia)",name:"Bi-Lo",shop:"supermarket"},removeTags:{brand:"Bi-Lo","brand:wikidata":"Q4835622","brand:wikipedia":"en:BI-LO (Australia)",name:"Bi-Lo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Biedronka":{name:"Biedronka",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q857182"},addTags:{brand:"Biedronka","brand:wikidata":"Q857182","brand:wikipedia":"en:Biedronka",name:"Biedronka",shop:"supermarket"},removeTags:{brand:"Biedronka","brand:wikidata":"Q857182","brand:wikipedia":"en:Biedronka",name:"Biedronka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Big C":{name:"Big C",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q858665"},addTags:{brand:"Big C","brand:wikidata":"Q858665","brand:wikipedia":"en:Big C",name:"Big C",shop:"supermarket"},removeTags:{brand:"Big C","brand:wikidata":"Q858665","brand:wikipedia":"en:Big C",name:"Big C",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Billa":{name:"Billa",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q537781"},addTags:{brand:"Billa","brand:wikidata":"Q537781","brand:wikipedia":"en:Billa (supermarket)",name:"Billa",shop:"supermarket"},removeTags:{brand:"Billa","brand:wikidata":"Q537781","brand:wikipedia":"en:Billa (supermarket)",name:"Billa",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Bingo":{name:"Bingo",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16842066"},addTags:{brand:"Bingo","brand:wikidata":"Q16842066","brand:wikipedia":"bs:Bingo (kompanija)",name:"Bingo",shop:"supermarket"},removeTags:{brand:"Bingo","brand:wikidata":"Q16842066","brand:wikipedia":"bs:Bingo (kompanija)",name:"Bingo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Biocoop":{name:"Biocoop",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2904039"},addTags:{brand:"Biocoop","brand:wikidata":"Q2904039","brand:wikipedia":"fr:Biocoop",name:"Biocoop",shop:"supermarket"},removeTags:{brand:"Biocoop","brand:wikidata":"Q2904039","brand:wikipedia":"fr:Biocoop",name:"Biocoop",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Brookshire Brothers":{name:"Brookshire Brothers",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4975084"},addTags:{brand:"Brookshire Brothers","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",name:"Brookshire Brothers",shop:"supermarket"},removeTags:{brand:"Brookshire Brothers","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",name:"Brookshire Brothers",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Budgens":{name:"Budgens",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4985016"},addTags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"supermarket"},removeTags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Bulk Barn":{name:"Bulk Barn",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4996466"},addTags:{brand:"Bulk Barn","brand:wikidata":"Q4996466",name:"Bulk Barn",shop:"supermarket"},removeTags:{brand:"Bulk Barn","brand:wikidata":"Q4996466",name:"Bulk Barn",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Bunnpris":{name:"Bunnpris",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1774634"},addTags:{brand:"Bunnpris","brand:wikidata":"Q1774634","brand:wikipedia":"en:Bunnpris",name:"Bunnpris",shop:"supermarket"},removeTags:{brand:"Bunnpris","brand:wikidata":"Q1774634","brand:wikipedia":"en:Bunnpris",name:"Bunnpris",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/COOP Jednota":{name:"COOP Jednota",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q41629254"},addTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"supermarket"},removeTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Caprabo":{name:"Caprabo",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1980781"},addTags:{brand:"Caprabo","brand:wikidata":"Q1980781","brand:wikipedia":"en:Caprabo",name:"Caprabo",shop:"supermarket"},removeTags:{brand:"Caprabo","brand:wikidata":"Q1980781","brand:wikipedia":"en:Caprabo",name:"Caprabo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Cargills Food City":{name:"Cargills Food City",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58353955"},addTags:{brand:"Cargills Food City","brand:wikidata":"Q58353955",name:"Cargills Food City","operator:wikidata":"Q5039260","operator:wikipedia":"en:Cargills (Ceylon)",shop:"supermarket"},removeTags:{brand:"Cargills Food City","brand:wikidata":"Q58353955",name:"Cargills Food City","operator:wikidata":"Q5039260","operator:wikipedia":"en:Cargills (Ceylon)",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour":{name:"Carrefour",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q217599"},addTags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour City":{name:"Carrefour City",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2940187"},addTags:{brand:"Carrefour City","brand:wikidata":"Q2940187","brand:wikipedia":"fr:Carrefour City",name:"Carrefour City",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour City","brand:wikidata":"Q2940187","brand:wikipedia":"fr:Carrefour City",name:"Carrefour City",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour Contact":{name:"Carrefour Contact",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2940188"},addTags:{brand:"Carrefour Contact","brand:wikidata":"Q2940188","brand:wikipedia":"fr:Carrefour Contact",name:"Carrefour Contact",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour Contact","brand:wikidata":"Q2940188","brand:wikipedia":"fr:Carrefour Contact",name:"Carrefour Contact",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour Express":{name:"Carrefour Express",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2940190"},addTags:{brand:"Carrefour Express","brand:wikidata":"Q2940190","brand:wikipedia":"fr:Carrefour Express",name:"Carrefour Express",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour Express","brand:wikidata":"Q2940190","brand:wikipedia":"fr:Carrefour Express",name:"Carrefour Express",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour Market":{name:"Carrefour Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2689639"},addTags:{brand:"Carrefour Market","brand:wikidata":"Q2689639","brand:wikipedia":"fr:Carrefour Market",name:"Carrefour Market",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour Market","brand:wikidata":"Q2689639","brand:wikipedia":"fr:Carrefour Market",name:"Carrefour Market",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carulla":{name:"Carulla",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5047480"},addTags:{brand:"Carulla","brand:wikidata":"Q5047480","brand:wikipedia":"en:Carulla",name:"Carulla",shop:"supermarket"},removeTags:{brand:"Carulla","brand:wikidata":"Q5047480","brand:wikipedia":"en:Carulla",name:"Carulla",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Checkers":{name:"Checkers",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5089126"},addTags:{brand:"Checkers","brand:wikidata":"Q5089126","brand:wikipedia":"en:Checkers (supermarket chain)",name:"Checkers",shop:"supermarket"},removeTags:{brand:"Checkers","brand:wikidata":"Q5089126","brand:wikipedia":"en:Checkers (supermarket chain)",name:"Checkers",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Chedraui":{name:"Chedraui",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2961952"},addTags:{brand:"Chedraui","brand:wikidata":"Q2961952","brand:wikipedia":"en:Chedraui",name:"Chedraui",shop:"supermarket"},removeTags:{brand:"Chedraui","brand:wikidata":"Q2961952","brand:wikipedia":"en:Chedraui",name:"Chedraui",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/City Market":{name:"City Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5123299"},addTags:{brand:"City Market","brand:wikidata":"Q5123299","brand:wikipedia":"en:City Market (US grocery store chain)",name:"City Market",shop:"supermarket"},removeTags:{brand:"City Market","brand:wikidata":"Q5123299","brand:wikipedia":"en:City Market (US grocery store chain)",name:"City Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Co-op":{name:"Co-op",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5440676"},addTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"supermarket"},removeTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Colruyt":{name:"Colruyt",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2363991"},addTags:{brand:"Colruyt","brand:wikidata":"Q2363991","brand:wikipedia":"en:Colruyt (supermarket)",name:"Colruyt",shop:"supermarket"},removeTags:{brand:"Colruyt","brand:wikidata":"Q2363991","brand:wikipedia":"en:Colruyt (supermarket)",name:"Colruyt",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Combi":{name:"Combi",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1113618"},addTags:{brand:"Combi","brand:wikidata":"Q1113618","brand:wikipedia":"de:Combi (Einkaufsmarkt)",name:"Combi",shop:"supermarket"},removeTags:{brand:"Combi","brand:wikidata":"Q1113618","brand:wikipedia":"de:Combi (Einkaufsmarkt)",name:"Combi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Comercial Mexicana":{name:"Comercial Mexicana",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2985173"},addTags:{brand:"Comercial Mexicana","brand:wikidata":"Q2985173","brand:wikipedia":"en:Comercial Mexicana",name:"Comercial Mexicana",shop:"supermarket"},removeTags:{brand:"Comercial Mexicana","brand:wikidata":"Q2985173","brand:wikipedia":"en:Comercial Mexicana",name:"Comercial Mexicana",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Conad":{name:"Conad",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q639075"},addTags:{brand:"Conad","brand:wikidata":"Q639075","brand:wikipedia":"it:Conad",name:"Conad",shop:"supermarket"},removeTags:{brand:"Conad","brand:wikidata":"Q639075","brand:wikipedia":"it:Conad",name:"Conad",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Conad City":{name:"Conad City",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57543102"},addTags:{brand:"Conad City","brand:wikidata":"Q57543102",name:"Conad City",shop:"supermarket"},removeTags:{brand:"Conad City","brand:wikidata":"Q57543102",name:"Conad City",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Condis":{name:"Condis",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57417581"},addTags:{brand:"Condis","brand:wikidata":"Q57417581",name:"Condis",shop:"supermarket"},removeTags:{brand:"Condis","brand:wikidata":"Q57417581",name:"Condis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Consum":{name:"Consum",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q8350308"},addTags:{brand:"Consum","brand:wikidata":"Q8350308","brand:wikipedia":"es:Consum",name:"Consum",shop:"supermarket"},removeTags:{brand:"Consum","brand:wikidata":"Q8350308","brand:wikipedia":"es:Consum",name:"Consum",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Continente":{name:"Continente",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2995683"},addTags:{brand:"Continente","brand:wikidata":"Q2995683","brand:wikipedia":"en:Continente (Supermarket)",name:"Continente",shop:"supermarket"},removeTags:{brand:"Continente","brand:wikidata":"Q2995683","brand:wikipedia":"en:Continente (Supermarket)",name:"Continente",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Coop Prix":{name:"Coop Prix",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5167705"},addTags:{brand:"Coop Prix","brand:wikidata":"Q5167705","brand:wikipedia":"no:Coop Prix",name:"Coop Prix",shop:"supermarket"},removeTags:{brand:"Coop Prix","brand:wikidata":"Q5167705","brand:wikipedia":"no:Coop Prix",name:"Coop Prix",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Cora":{name:"Cora",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q686643"},addTags:{brand:"Cora","brand:wikidata":"Q686643","brand:wikipedia":"en:Cora (hypermarket)",name:"Cora",shop:"supermarket"},removeTags:{brand:"Cora","brand:wikidata":"Q686643","brand:wikipedia":"en:Cora (hypermarket)",name:"Cora",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Costcutter":{name:"Costcutter",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5175072"},addTags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"supermarket"},removeTags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Coto":{name:"Coto",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5175411"},addTags:{brand:"Coto","brand:wikidata":"Q5175411","brand:wikipedia":"es:Coto (supermercado)",name:"Coto",shop:"supermarket"},removeTags:{brand:"Coto","brand:wikidata":"Q5175411","brand:wikipedia":"es:Coto (supermercado)",name:"Coto",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Countdown":{name:"Countdown",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5176845"},addTags:{brand:"Countdown","brand:wikidata":"Q5176845","brand:wikipedia":"en:Countdown (supermarket)",name:"Countdown",shop:"supermarket"},removeTags:{brand:"Countdown","brand:wikidata":"Q5176845","brand:wikipedia":"en:Countdown (supermarket)",name:"Countdown",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Cub Foods":{name:"Cub Foods",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5191916"},addTags:{brand:"Cub Foods","brand:wikidata":"Q5191916","brand:wikipedia":"en:Cub Foods",name:"Cub Foods",shop:"supermarket"},removeTags:{brand:"Cub Foods","brand:wikidata":"Q5191916","brand:wikipedia":"en:Cub Foods",name:"Cub Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/D1":{name:"D1",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q43403418"},addTags:{brand:"D1","brand:wikidata":"Q43403418","brand:wikipedia":"es:Tiendas D1",name:"D1",shop:"supermarket"},removeTags:{brand:"D1","brand:wikidata":"Q43403418","brand:wikipedia":"es:Tiendas D1",name:"D1",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dagli'Brugsen":{name:"Dagli'Brugsen",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12307017"},addTags:{brand:"Dagli'Brugsen","brand:wikidata":"Q12307017","brand:wikipedia":"en:Dagli'Brugsen",name:"Dagli'Brugsen",shop:"supermarket"},removeTags:{brand:"Dagli'Brugsen","brand:wikidata":"Q12307017","brand:wikipedia":"en:Dagli'Brugsen",name:"Dagli'Brugsen",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Deen":{name:"Deen",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q13571727"},addTags:{brand:"Deen","brand:wikidata":"Q13571727","brand:wikipedia":"nl:Deen (supermarkt)",name:"Deen",shop:"supermarket"},removeTags:{brand:"Deen","brand:wikidata":"Q13571727","brand:wikipedia":"nl:Deen (supermarkt)",name:"Deen",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Delhaize":{name:"Delhaize",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1184173"},addTags:{brand:"Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"Delhaize",shop:"supermarket"},removeTags:{brand:"Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"Delhaize",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Delikatesy Centrum":{name:"Delikatesy Centrum",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11693824"},addTags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"supermarket"},removeTags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Denner":{name:"Denner",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q379911"},addTags:{brand:"Denner","brand:wikidata":"Q379911","brand:wikipedia":"en:Denner (supermarkets)",name:"Denner",shop:"supermarket"},removeTags:{brand:"Denner","brand:wikidata":"Q379911","brand:wikipedia":"en:Denner (supermarkets)",name:"Denner",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dia":{name:"Dia",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q925132"},addTags:{brand:"Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Dia",shop:"supermarket"},removeTags:{brand:"Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Dia",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dia Market":{name:"Dia Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q925132"},addTags:{brand:"Dia Market","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Dia Market",shop:"supermarket"},removeTags:{brand:"Dia Market","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Dia Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dino":{name:"Dino",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11694239"},addTags:{brand:"Dino","brand:wikidata":"Q11694239","brand:wikipedia":"pl:Dino Polska",name:"Dino",shop:"supermarket"},removeTags:{brand:"Dino","brand:wikidata":"Q11694239","brand:wikipedia":"pl:Dino Polska",name:"Dino",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dirk van den Broek":{name:"Dirk van den Broek",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q17502722"},addTags:{brand:"Dirk van den Broek","brand:wikidata":"Q17502722","brand:wikipedia":"en:Dirk (supermarket)",name:"Dirk van den Broek",shop:"supermarket"},removeTags:{brand:"Dirk van den Broek","brand:wikidata":"Q17502722","brand:wikipedia":"en:Dirk (supermarket)",name:"Dirk van den Broek",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dunnes Stores":{name:"Dunnes Stores",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1266203"},addTags:{brand:"Dunnes Stores","brand:wikidata":"Q1266203","brand:wikipedia":"en:Dunnes Stores",name:"Dunnes Stores",shop:"supermarket"},removeTags:{brand:"Dunnes Stores","brand:wikidata":"Q1266203","brand:wikipedia":"en:Dunnes Stores",name:"Dunnes Stores",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/E. Leclerc":{name:"E. Leclerc",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1273376"},addTags:{brand:"E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"en:E.Leclerc",name:"E. Leclerc",shop:"supermarket"},removeTags:{brand:"E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"en:E.Leclerc",name:"E. Leclerc",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/EMTÉ":{name:"EMTÉ",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3119122"},addTags:{brand:"EMTÉ","brand:wikidata":"Q3119122","brand:wikipedia":"en:EMTÉ",name:"EMTÉ",shop:"supermarket"},removeTags:{brand:"EMTÉ","brand:wikidata":"Q3119122","brand:wikipedia":"en:EMTÉ",name:"EMTÉ",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Edeka":{name:"Edeka",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q701755"},addTags:{brand:"Edeka","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"Edeka",shop:"supermarket"},removeTags:{brand:"Edeka","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"Edeka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Eko":{name:"Eko",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q9251859"},addTags:{brand:"Eko","brand:wikidata":"Q9251859","brand:wikipedia":"pl:Eko Holding",name:"Eko",shop:"supermarket"},removeTags:{brand:"Eko","brand:wikidata":"Q9251859","brand:wikipedia":"pl:Eko Holding",name:"Eko",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ekono":{name:"Ekono",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2842729"},addTags:{brand:"Ekono","brand:wikidata":"Q2842729","brand:wikipedia":"es:Ekono",name:"Ekono",shop:"supermarket"},removeTags:{brand:"Ekono","brand:wikidata":"Q2842729","brand:wikipedia":"es:Ekono",name:"Ekono",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Eroski":{name:"Eroski",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1361349"},addTags:{brand:"Eroski","brand:wikidata":"Q1361349","brand:wikipedia":"en:Eroski",name:"Eroski",shop:"supermarket"},removeTags:{brand:"Eroski","brand:wikidata":"Q1361349","brand:wikipedia":"en:Eroski",name:"Eroski",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Esselunga":{name:"Esselunga",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1059636"},addTags:{brand:"Esselunga","brand:wikidata":"Q1059636","brand:wikipedia":"en:Esselunga",name:"Esselunga",shop:"supermarket"},removeTags:{brand:"Esselunga","brand:wikidata":"Q1059636","brand:wikipedia":"en:Esselunga",name:"Esselunga",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/EuroSpin":{name:"EuroSpin",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1374674"},addTags:{brand:"EuroSpin","brand:wikidata":"Q1374674","brand:wikipedia":"it:EuroSpin",name:"EuroSpin",shop:"supermarket"},removeTags:{brand:"EuroSpin","brand:wikidata":"Q1374674","brand:wikipedia":"it:EuroSpin",name:"EuroSpin",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Eurospar":{name:"Eurospar",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12309283"},addTags:{brand:"Eurospar","brand:wikidata":"Q12309283","brand:wikipedia":"da:Eurospar",name:"Eurospar",shop:"supermarket"},removeTags:{brand:"Eurospar","brand:wikidata":"Q12309283","brand:wikipedia":"da:Eurospar",name:"Eurospar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Extra":{name:"Extra",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11964085"},addTags:{brand:"Extra","brand:wikidata":"Q11964085","brand:wikipedia":"no:Extra (Coop)",name:"Extra",shop:"supermarket"},removeTags:{brand:"Extra","brand:wikidata":"Q11964085","brand:wikipedia":"no:Extra (Coop)",name:"Extra",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Famila":{name:"Famila",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1395108"},addTags:{brand:"Famila","brand:wikidata":"Q1395108","brand:wikipedia":"de:Famila",name:"Famila",shop:"supermarket"},removeTags:{brand:"Famila","brand:wikidata":"Q1395108","brand:wikipedia":"de:Famila",name:"Famila",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Fareway":{name:"Fareway",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5434998"},addTags:{brand:"Fareway","brand:wikidata":"Q5434998","brand:wikipedia":"en:Fareway",name:"Fareway",shop:"supermarket"},removeTags:{brand:"Fareway","brand:wikidata":"Q5434998","brand:wikipedia":"en:Fareway",name:"Fareway",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Farmfoods":{name:"Farmfoods",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5435841"},addTags:{brand:"Farmfoods","brand:wikidata":"Q5435841","brand:wikipedia":"en:Farmfoods",name:"Farmfoods",shop:"supermarket"},removeTags:{brand:"Farmfoods","brand:wikidata":"Q5435841","brand:wikipedia":"en:Farmfoods",name:"Farmfoods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Feneberg":{name:"Feneberg",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5345378"},addTags:{brand:"Feneberg","brand:wikidata":"Q5345378","brand:wikipedia":"de:Feneberg Lebensmittel",name:"Feneberg",shop:"supermarket"},removeTags:{brand:"Feneberg","brand:wikidata":"Q5345378","brand:wikipedia":"de:Feneberg Lebensmittel",name:"Feneberg",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Food 4 Less":{name:"Food 4 Less",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5465282"},addTags:{brand:"Food 4 Less","brand:wikidata":"Q5465282","brand:wikipedia":"en:Food 4 Less",name:"Food 4 Less",shop:"supermarket"},removeTags:{brand:"Food 4 Less","brand:wikidata":"Q5465282","brand:wikipedia":"en:Food 4 Less",name:"Food 4 Less",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Food Basics":{name:"Food Basics",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5465300"},addTags:{brand:"Food Basics","brand:wikidata":"Q5465300","brand:wikipedia":"en:Food Basics",name:"Food Basics",shop:"supermarket"},removeTags:{brand:"Food Basics","brand:wikidata":"Q5465300","brand:wikipedia":"en:Food Basics",name:"Food Basics",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Food City":{name:"Food City",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5465306"},addTags:{brand:"Food City","brand:wikidata":"Q5465306","brand:wikipedia":"en:Food City (Canada)",name:"Food City",shop:"supermarket"},removeTags:{brand:"Food City","brand:wikidata":"Q5465306","brand:wikipedia":"en:Food City (Canada)",name:"Food City",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Food Lion":{name:"Food Lion",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1435950"},addTags:{brand:"Food Lion","brand:wikidata":"Q1435950","brand:wikipedia":"en:Food Lion",name:"Food Lion",shop:"supermarket"},removeTags:{brand:"Food Lion","brand:wikidata":"Q1435950","brand:wikipedia":"en:Food Lion",name:"Food Lion",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Foodworks":{name:"Foodworks",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5465579"},addTags:{brand:"Foodworks","brand:wikidata":"Q5465579","brand:wikipedia":"en:Foodworks",name:"Foodworks",shop:"supermarket"},removeTags:{brand:"Foodworks","brand:wikidata":"Q5465579","brand:wikipedia":"en:Foodworks",name:"Foodworks",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Fred Meyer":{name:"Fred Meyer",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5495932"},addTags:{brand:"Fred Meyer","brand:wikidata":"Q5495932","brand:wikipedia":"en:Fred Meyer",name:"Fred Meyer",shop:"supermarket"},removeTags:{brand:"Fred Meyer","brand:wikidata":"Q5495932","brand:wikipedia":"en:Fred Meyer",name:"Fred Meyer",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/FreshCo":{name:"FreshCo",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5502915"},addTags:{brand:"FreshCo","brand:wikidata":"Q5502915","brand:wikipedia":"en:FreshCo",name:"FreshCo",shop:"supermarket"},removeTags:{brand:"FreshCo","brand:wikidata":"Q5502915","brand:wikipedia":"en:FreshCo",name:"FreshCo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Froiz":{name:"Froiz",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q17070775"},addTags:{brand:"Froiz","brand:wikidata":"Q17070775","brand:wikipedia":"en:Froiz",name:"Froiz",shop:"supermarket"},removeTags:{brand:"Froiz","brand:wikidata":"Q17070775","brand:wikipedia":"en:Froiz",name:"Froiz",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Føtex":{name:"Føtex",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1480395"},addTags:{brand:"Føtex","brand:wikidata":"Q1480395","brand:wikipedia":"en:Føtex",name:"Føtex",shop:"supermarket"},removeTags:{brand:"Føtex","brand:wikidata":"Q1480395","brand:wikipedia":"en:Føtex",name:"Føtex",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/G20":{name:"G20",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3504731"},addTags:{brand:"G20","brand:wikidata":"Q3504731","brand:wikipedia":"fr:Supermarchés G20",name:"G20",shop:"supermarket"},removeTags:{brand:"G20","brand:wikidata":"Q3504731","brand:wikipedia":"fr:Supermarchés G20",name:"G20",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Giant Eagle":{name:"Giant Eagle",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1522721"},addTags:{brand:"Giant Eagle","brand:wikidata":"Q1522721","brand:wikipedia":"en:Giant Eagle",name:"Giant Eagle",shop:"supermarket"},removeTags:{brand:"Giant Eagle","brand:wikidata":"Q1522721","brand:wikipedia":"en:Giant Eagle",name:"Giant Eagle",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Globus":{name:"Globus",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q457503"},addTags:{brand:"Globus","brand:wikidata":"Q457503","brand:wikipedia":"en:Globus (hypermarket)",name:"Globus",shop:"supermarket"},removeTags:{brand:"Globus","brand:wikidata":"Q457503","brand:wikipedia":"en:Globus (hypermarket)",name:"Globus",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Grand Frais":{name:"Grand Frais",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3114675"},addTags:{brand:"Grand Frais","brand:wikidata":"Q3114675","brand:wikipedia":"fr:Grand Frais",name:"Grand Frais",shop:"supermarket"},removeTags:{brand:"Grand Frais","brand:wikidata":"Q3114675","brand:wikipedia":"fr:Grand Frais",name:"Grand Frais",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Grocery Outlet":{name:"Grocery Outlet",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5609934"},addTags:{brand:"Grocery Outlet","brand:wikidata":"Q5609934","brand:wikipedia":"en:Grocery Outlet",name:"Grocery Outlet",shop:"supermarket"},removeTags:{brand:"Grocery Outlet","brand:wikidata":"Q5609934","brand:wikipedia":"en:Grocery Outlet",name:"Grocery Outlet",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Géant Casino":{name:"Géant Casino",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1380537"},addTags:{brand:"Géant Casino","brand:wikidata":"Q1380537","brand:wikipedia":"en:Géant Casino",name:"Géant Casino",shop:"supermarket"},removeTags:{brand:"Géant Casino","brand:wikidata":"Q1380537","brand:wikipedia":"en:Géant Casino",name:"Géant Casino",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hannaford":{name:"Hannaford",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5648760"},addTags:{brand:"Hannaford","brand:wikidata":"Q5648760","brand:wikipedia":"en:Hannaford Brothers Company",name:"Hannaford",shop:"supermarket"},removeTags:{brand:"Hannaford","brand:wikidata":"Q5648760","brand:wikipedia":"en:Hannaford Brothers Company",name:"Hannaford",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Harris Teeter":{name:"Harris Teeter",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5665067"},addTags:{brand:"Harris Teeter","brand:wikidata":"Q5665067","brand:wikipedia":"en:Harris Teeter",name:"Harris Teeter",shop:"supermarket"},removeTags:{brand:"Harris Teeter","brand:wikidata":"Q5665067","brand:wikipedia":"en:Harris Teeter",name:"Harris Teeter",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hemköp":{name:"Hemköp",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q10521746"},addTags:{brand:"Hemköp","brand:wikidata":"Q10521746","brand:wikipedia":"sv:Hemköp",name:"Hemköp",shop:"supermarket"},removeTags:{brand:"Hemköp","brand:wikidata":"Q10521746","brand:wikipedia":"sv:Hemköp",name:"Hemköp",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Heron Foods":{name:"Heron Foods",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5743472"},addTags:{brand:"Heron Foods","brand:wikidata":"Q5743472","brand:wikipedia":"en:Heron Foods",name:"Heron Foods",shop:"supermarket"},removeTags:{brand:"Heron Foods","brand:wikidata":"Q5743472","brand:wikipedia":"en:Heron Foods",name:"Heron Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hofer":{name:"Hofer",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q15815751"},addTags:{brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer",shop:"supermarket"},removeTags:{brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hoogvliet":{name:"Hoogvliet",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1642179"},addTags:{brand:"Hoogvliet","brand:wikidata":"Q1642179","brand:wikipedia":"nl:Hoogvliet (supermarkt)",name:"Hoogvliet",shop:"supermarket"},removeTags:{brand:"Hoogvliet","brand:wikidata":"Q1642179","brand:wikipedia":"nl:Hoogvliet (supermarkt)",name:"Hoogvliet",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hy-Vee":{name:"Hy-Vee",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1639719"},addTags:{brand:"Hy-Vee","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",name:"Hy-Vee",shop:"supermarket"},removeTags:{brand:"Hy-Vee","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",name:"Hy-Vee",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hyper U":{name:"Hyper U",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2529029"},addTags:{brand:"Hyper U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Hyper U",shop:"supermarket"},removeTags:{brand:"Hyper U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Hyper U",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ICA":{name:"ICA",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1663776"},addTags:{brand:"ICA","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA",shop:"supermarket"},removeTags:{brand:"ICA","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ICA Kvantum":{name:"ICA Kvantum",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1663776"},addTags:{brand:"ICA Kvantum","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Kvantum",shop:"supermarket"},removeTags:{brand:"ICA Kvantum","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Kvantum",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ICA Maxi":{name:"ICA Maxi",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1663776"},addTags:{brand:"ICA Maxi","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Maxi",shop:"supermarket"},removeTags:{brand:"ICA Maxi","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Maxi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/IGA":{name:"IGA",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3146662"},addTags:{brand:"IGA","brand:wikidata":"Q3146662","brand:wikipedia":"en:IGA (supermarkets)",name:"IGA",shop:"supermarket"},removeTags:{brand:"IGA","brand:wikidata":"Q3146662","brand:wikipedia":"en:IGA (supermarkets)",name:"IGA",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Iceland":{name:"Iceland",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q721810"},addTags:{brand:"Iceland","brand:wikidata":"Q721810","brand:wikipedia":"en:Iceland (supermarket)",name:"Iceland",shop:"supermarket"},removeTags:{brand:"Iceland","brand:wikidata":"Q721810","brand:wikipedia":"en:Iceland (supermarket)",name:"Iceland",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ingles":{name:"Ingles",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6032595"},addTags:{brand:"Ingles","brand:wikidata":"Q6032595","brand:wikipedia":"en:Ingles",name:"Ingles",shop:"supermarket"},removeTags:{brand:"Ingles","brand:wikidata":"Q6032595","brand:wikipedia":"en:Ingles",name:"Ingles",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Intermarché":{name:"Intermarché",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3153200"},addTags:{brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché",shop:"supermarket"},removeTags:{brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Intermarché Super":{name:"Intermarché Super",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3153200"},addTags:{brand:"Intermarché Super","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Super",shop:"supermarket"},removeTags:{brand:"Intermarché Super","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Super",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Irma":{name:"Irma",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q797150"},addTags:{brand:"Irma","brand:wikidata":"Q797150","brand:wikipedia":"en:Irma (supermarket)",name:"Irma",shop:"supermarket"},removeTags:{brand:"Irma","brand:wikidata":"Q797150","brand:wikipedia":"en:Irma (supermarket)",name:"Irma",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Jewel-Osco":{name:"Jewel-Osco",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3178470"},addTags:{brand:"Jewel-Osco","brand:wikidata":"Q3178470","brand:wikipedia":"en:Jewel (supermarket)",name:"Jewel-Osco",shop:"supermarket"},removeTags:{brand:"Jewel-Osco","brand:wikidata":"Q3178470","brand:wikipedia":"en:Jewel (supermarket)",name:"Jewel-Osco",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Jumbo":{name:"Jumbo",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2262314"},addTags:{brand:"Jumbo","brand:wikidata":"Q2262314","brand:wikipedia":"en:Jumbo (supermarket)",name:"Jumbo",shop:"supermarket"},removeTags:{brand:"Jumbo","brand:wikidata":"Q2262314","brand:wikipedia":"en:Jumbo (supermarket)",name:"Jumbo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Kaufland":{name:"Kaufland",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q685967"},addTags:{brand:"Kaufland","brand:wikidata":"Q685967","brand:wikipedia":"en:Kaufland",name:"Kaufland",shop:"supermarket"},removeTags:{brand:"Kaufland","brand:wikidata":"Q685967","brand:wikipedia":"en:Kaufland",name:"Kaufland",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/King Soopers":{name:"King Soopers",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6412065"},addTags:{brand:"King Soopers","brand:wikidata":"Q6412065","brand:wikipedia":"en:King Soopers",name:"King Soopers",shop:"supermarket"},removeTags:{brand:"King Soopers","brand:wikidata":"Q6412065","brand:wikipedia":"en:King Soopers",name:"King Soopers",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Kiwi":{name:"Kiwi",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1613639"},addTags:{brand:"Kiwi","brand:wikidata":"Q1613639","brand:wikipedia":"en:Kiwi (store)",name:"Kiwi",shop:"supermarket"},removeTags:{brand:"Kiwi","brand:wikidata":"Q1613639","brand:wikipedia":"en:Kiwi (store)",name:"Kiwi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Kroger":{name:"Kroger",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q153417"},addTags:{brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger",shop:"supermarket"},removeTags:{brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Kvickly":{name:"Kvickly",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7061148"},addTags:{brand:"Kvickly","brand:wikidata":"Q7061148","brand:wikipedia":"en:Kvickly",name:"Kvickly",shop:"supermarket"},removeTags:{brand:"Kvickly","brand:wikidata":"Q7061148","brand:wikipedia":"en:Kvickly",name:"Kvickly",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/La Plaza de DIA":{name:"La Plaza de DIA",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58904673"},addTags:{brand:"La Plaza de DIA","brand:wikidata":"Q58904673",name:"La Plaza de DIA","operator:wikidata":"Q925132","operator:wikipedia":"es:Supermercados Dia",shop:"supermarket"},removeTags:{brand:"La Plaza de DIA","brand:wikidata":"Q58904673",name:"La Plaza de DIA","operator:wikidata":"Q925132","operator:wikipedia":"es:Supermercados Dia",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/La Vie Claire":{name:"La Vie Claire",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3213589"},addTags:{brand:"La Vie Claire","brand:wikidata":"Q3213589","brand:wikipedia":"en:La Vie Claire (company)",name:"La Vie Claire",shop:"supermarket"},removeTags:{brand:"La Vie Claire","brand:wikidata":"Q3213589","brand:wikipedia":"en:La Vie Claire (company)",name:"La Vie Claire",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Leader Price":{name:"Leader Price",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2181426"},addTags:{brand:"Leader Price","brand:wikidata":"Q2181426","brand:wikipedia":"en:Leader Price",name:"Leader Price",shop:"supermarket"},removeTags:{brand:"Leader Price","brand:wikidata":"Q2181426","brand:wikipedia":"en:Leader Price",name:"Leader Price",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lider":{name:"Lider",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6711261"},addTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider",shop:"supermarket"},removeTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lider Express":{name:"Lider Express",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6711261"},addTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider Express",shop:"supermarket"},removeTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider Express",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lidl":{name:"Lidl",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q151954"},addTags:{brand:"Lidl","brand:wikidata":"Q151954","brand:wikipedia":"en:Lidl",name:"Lidl",shop:"supermarket"},removeTags:{brand:"Lidl","brand:wikidata":"Q151954","brand:wikipedia":"en:Lidl",name:"Lidl",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lowe's Market":{name:"Lowe's Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6693107"},addTags:{brand:"Lowe's Market","brand:wikidata":"Q6693107","brand:wikipedia":"en:Lowe's Market",name:"Lowe's Market",shop:"supermarket"},removeTags:{brand:"Lowe's Market","brand:wikidata":"Q6693107","brand:wikipedia":"en:Lowe's Market",name:"Lowe's Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lowes Foods":{name:"Lowes Foods",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6693991"},addTags:{brand:"Lowes Foods","brand:wikidata":"Q6693991","brand:wikipedia":"en:Lowes Foods",name:"Lowes Foods",shop:"supermarket"},removeTags:{brand:"Lowes Foods","brand:wikidata":"Q6693991","brand:wikipedia":"en:Lowes Foods",name:"Lowes Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lupa":{name:"Lupa",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58044048"},addTags:{brand:"Lupa","brand:wikidata":"Q58044048",name:"Lupa",shop:"supermarket"},removeTags:{brand:"Lupa","brand:wikidata":"Q58044048",name:"Lupa",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/MD":{name:"MD",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3841263"},addTags:{brand:"MD","brand:wikidata":"Q3841263","brand:wikipedia":"en:MD Discount",name:"MD",shop:"supermarket"},removeTags:{brand:"MD","brand:wikidata":"Q3841263","brand:wikipedia":"en:MD Discount",name:"MD",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/MPREIS":{name:"MPREIS",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q873491"},addTags:{brand:"MPREIS","brand:wikidata":"Q873491","brand:wikipedia":"de:MPreis",name:"MPREIS",shop:"supermarket"},removeTags:{brand:"MPREIS","brand:wikidata":"Q873491","brand:wikipedia":"de:MPreis",name:"MPREIS",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Markant":{name:"Markant",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57523365"},addTags:{brand:"Markant","brand:wikidata":"Q57523365",name:"Markant",shop:"supermarket"},removeTags:{brand:"Markant","brand:wikidata":"Q57523365",name:"Markant",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Market Basket":{name:"Market Basket",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2079198"},addTags:{brand:"Market Basket","brand:wikidata":"Q2079198","brand:wikipedia":"en:Market Basket (New England)",name:"Market Basket",shop:"supermarket"},removeTags:{brand:"Market Basket","brand:wikidata":"Q2079198","brand:wikipedia":"en:Market Basket (New England)",name:"Market Basket",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Marktkauf":{name:"Marktkauf",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1533254"},addTags:{brand:"Marktkauf","brand:wikidata":"Q1533254","brand:wikipedia":"de:Marktkauf Holding",name:"Marktkauf",shop:"supermarket"},removeTags:{brand:"Marktkauf","brand:wikidata":"Q1533254","brand:wikipedia":"de:Marktkauf Holding",name:"Marktkauf",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Match":{name:"Match",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q513977"},addTags:{brand:"Match","brand:wikidata":"Q513977","brand:wikipedia":"en:Match (supermarket)",name:"Match",shop:"supermarket"},removeTags:{brand:"Match","brand:wikidata":"Q513977","brand:wikipedia":"en:Match (supermarket)",name:"Match",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxi Dia":{name:"Maxi Dia",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q925132"},addTags:{brand:"Maxi Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Maxi Dia",shop:"supermarket"},removeTags:{brand:"Maxi Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Maxi Dia",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxima X":{name:"Maxima X",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1881222"},addTags:{brand:"Maxima X","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima X",shop:"supermarket"},removeTags:{brand:"Maxima X","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima X",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxima XX":{name:"Maxima XX",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1881222"},addTags:{brand:"Maxima XX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XX",shop:"supermarket"},removeTags:{brand:"Maxima XX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XX",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxima XXX":{name:"Maxima XXX",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1881222"},addTags:{brand:"Maxima XXX",name:"Maxima XXX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",shop:"supermarket"},removeTags:{brand:"Maxima XXX",name:"Maxima XXX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxi (Canada)":{name:"Maxi (Canada)",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3302441"},addTags:{brand:"Maxi","brand:wikidata":"Q3302441","brand:wikipedia":"en:Maxi (Canadian supermarket)",name:"Maxi",shop:"supermarket"},removeTags:{brand:"Maxi","brand:wikidata":"Q3302441","brand:wikipedia":"en:Maxi (Canadian supermarket)",name:"Maxi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxi (Serbia)":{name:"Maxi (Serbia)",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6795490"},addTags:{brand:"Maxi","brand:wikidata":"Q6795490","brand:wikipedia":"en:Maxi (supermarkets)",name:"Maxi",shop:"supermarket"},removeTags:{brand:"Maxi","brand:wikidata":"Q6795490","brand:wikipedia":"en:Maxi (supermarkets)",name:"Maxi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mega Image":{name:"Mega Image",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6808085"},addTags:{brand:"Mega Image","brand:wikidata":"Q6808085","brand:wikipedia":"en:Mega Image",name:"Mega Image",shop:"supermarket"},removeTags:{brand:"Mega Image","brand:wikidata":"Q6808085","brand:wikipedia":"en:Mega Image",name:"Mega Image",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mego":{name:"Mego",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16363314"},addTags:{brand:"Mego","brand:wikidata":"Q16363314","brand:wikipedia":"lv:Mego",name:"Mego",shop:"supermarket"},removeTags:{brand:"Mego","brand:wikidata":"Q16363314","brand:wikipedia":"lv:Mego",name:"Mego",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Meijer":{name:"Meijer",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1917753"},addTags:{brand:"Meijer","brand:wikidata":"Q1917753","brand:wikipedia":"en:Meijer",name:"Meijer",shop:"supermarket"},removeTags:{brand:"Meijer","brand:wikidata":"Q1917753","brand:wikipedia":"en:Meijer",name:"Meijer",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Meny":{name:"Meny",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q10581720"},addTags:{brand:"Meny","brand:wikidata":"Q10581720","brand:wikipedia":"en:Meny",name:"Meny",shop:"supermarket"},removeTags:{brand:"Meny","brand:wikidata":"Q10581720","brand:wikipedia":"en:Meny",name:"Meny",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mercadona":{name:"Mercadona",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q377705"},addTags:{brand:"Mercadona","brand:wikidata":"Q377705","brand:wikipedia":"en:Mercadona",name:"Mercadona",shop:"supermarket"},removeTags:{brand:"Mercadona","brand:wikidata":"Q377705","brand:wikipedia":"en:Mercadona",name:"Mercadona",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Merkur":{name:"Merkur",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1921857"},addTags:{brand:"Merkur","brand:wikidata":"Q1921857","brand:wikipedia":"de:Merkur (Österreich)",name:"Merkur",shop:"supermarket"},removeTags:{brand:"Merkur","brand:wikidata":"Q1921857","brand:wikipedia":"de:Merkur (Österreich)",name:"Merkur",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Migros":{name:"Migros",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q680727"},addTags:{brand:"Migros","brand:wikidata":"Q680727","brand:wikipedia":"en:Migros",name:"Migros",shop:"supermarket"},removeTags:{brand:"Migros","brand:wikidata":"Q680727","brand:wikipedia":"en:Migros",name:"Migros",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mila":{name:"Mila",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q48844636"},addTags:{brand:"Mila","brand:wikidata":"Q48844636","brand:wikipedia":"pl:Mila (sieć sklepów)",name:"Mila",shop:"supermarket"},removeTags:{brand:"Mila","brand:wikidata":"Q48844636","brand:wikipedia":"pl:Mila (sieć sklepów)",name:"Mila",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Minipreço":{name:"Minipreço",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3042224"},addTags:{brand:"Minipreço","brand:wikidata":"Q3042224","brand:wikipedia":"en:Minipreço",name:"Minipreço",shop:"supermarket"},removeTags:{brand:"Minipreço","brand:wikidata":"Q3042224","brand:wikipedia":"en:Minipreço",name:"Minipreço",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Monoprix":{name:"Monoprix",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3321241"},addTags:{brand:"Monoprix","brand:wikidata":"Q3321241","brand:wikipedia":"en:Monoprix",name:"Monoprix",shop:"supermarket"},removeTags:{brand:"Monoprix","brand:wikidata":"Q3321241","brand:wikipedia":"en:Monoprix",name:"Monoprix",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Nah & Frisch":{name:"Nah & Frisch",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1963643"},addTags:{brand:"Nah & Frisch","brand:wikidata":"Q1963643","brand:wikipedia":"de:Nah & Frisch",name:"Nah & Frisch",shop:"supermarket"},removeTags:{brand:"Nah & Frisch","brand:wikidata":"Q1963643","brand:wikipedia":"de:Nah & Frisch",name:"Nah & Frisch",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Nahkauf":{name:"Nahkauf",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57515238"},addTags:{brand:"Nahkauf","brand:wikidata":"Q57515238",name:"Nahkauf",shop:"supermarket"},removeTags:{brand:"Nahkauf","brand:wikidata":"Q57515238",name:"Nahkauf",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Naturalia":{name:"Naturalia",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3337081"},addTags:{brand:"Naturalia","brand:wikidata":"Q3337081","brand:wikipedia":"fr:Naturalia",name:"Naturalia",shop:"supermarket"},removeTags:{brand:"Naturalia","brand:wikidata":"Q3337081","brand:wikipedia":"fr:Naturalia",name:"Naturalia",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Netto":{name:"Netto",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q552652"},addTags:{brand:"Netto","brand:wikidata":"Q552652","brand:wikipedia":"en:Netto (store)",name:"Netto",shop:"supermarket"},removeTags:{brand:"Netto","brand:wikidata":"Q552652","brand:wikipedia":"en:Netto (store)",name:"Netto",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Netto Marken-Discount":{name:"Netto Marken-Discount",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q879858"},addTags:{brand:"Netto Marken-Discount","brand:wikidata":"Q879858","brand:wikipedia":"en:Netto Marken-Discount",name:"Netto Marken-Discount",shop:"supermarket"},removeTags:{brand:"Netto Marken-Discount","brand:wikidata":"Q879858","brand:wikipedia":"en:Netto Marken-Discount",name:"Netto Marken-Discount",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/New World":{name:"New World",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7012488"},addTags:{brand:"New World","brand:wikidata":"Q7012488","brand:wikipedia":"en:New World (supermarket)",name:"New World",shop:"supermarket"},removeTags:{brand:"New World","brand:wikidata":"Q7012488","brand:wikipedia":"en:New World (supermarket)",name:"New World",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/No Frills":{name:"No Frills",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3342407"},addTags:{brand:"No Frills","brand:wikidata":"Q3342407","brand:wikipedia":"en:No Frills (grocery store)",name:"No Frills",shop:"supermarket"},removeTags:{brand:"No Frills","brand:wikidata":"Q3342407","brand:wikipedia":"en:No Frills (grocery store)",name:"No Frills",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Norfa XL":{name:"Norfa XL",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1998983"},addTags:{brand:"Norfa XL","brand:wikidata":"Q1998983","brand:wikipedia":"lt:Norfa",name:"Norfa XL",shop:"supermarket"},removeTags:{brand:"Norfa XL","brand:wikidata":"Q1998983","brand:wikipedia":"lt:Norfa",name:"Norfa XL",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Norma":{name:"Norma",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q450180"},addTags:{brand:"Norma","brand:wikidata":"Q450180","brand:wikipedia":"de:Norma (Handelskette)",name:"Norma",shop:"supermarket"},removeTags:{brand:"Norma","brand:wikidata":"Q450180","brand:wikipedia":"de:Norma (Handelskette)",name:"Norma",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Okay":{name:"Okay",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2159701"},addTags:{brand:"Okay","brand:wikidata":"Q2159701","brand:wikipedia":"fr:OKay",name:"Okay",shop:"supermarket"},removeTags:{brand:"Okay","brand:wikidata":"Q2159701","brand:wikipedia":"fr:OKay",name:"Okay",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Olímpica":{name:"Olímpica",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q24749847"},addTags:{brand:"Olímpica","brand:wikidata":"Q24749847","brand:wikipedia":"es:Olímpica (supermercado)",name:"Olímpica",shop:"supermarket"},removeTags:{brand:"Olímpica","brand:wikidata":"Q24749847","brand:wikipedia":"es:Olímpica (supermercado)",name:"Olímpica",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/PLUS":{name:"PLUS",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1978981"},addTags:{brand:"PLUS","brand:wikidata":"Q1978981","brand:wikipedia":"nl:PLUS (Nederlandse supermarkt)",name:"PLUS",shop:"supermarket"},removeTags:{brand:"PLUS","brand:wikidata":"Q1978981","brand:wikipedia":"nl:PLUS (Nederlandse supermarkt)",name:"PLUS",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/POLOmarket":{name:"POLOmarket",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11821937"},addTags:{brand:"POLOmarket","brand:wikidata":"Q11821937","brand:wikipedia":"en:Polomarket",name:"POLOmarket",shop:"supermarket"},removeTags:{brand:"POLOmarket","brand:wikidata":"Q11821937","brand:wikipedia":"en:Polomarket",name:"POLOmarket",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Palí":{name:"Palí",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1064887"},addTags:{brand:"Palí","brand:wikidata":"Q1064887","brand:wikipedia":"es:Walmart de México y Centroamérica",name:"Palí",shop:"supermarket"},removeTags:{brand:"Palí","brand:wikidata":"Q1064887","brand:wikipedia":"es:Walmart de México y Centroamérica",name:"Palí",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Penny":{name:"Penny",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q284688"},addTags:{brand:"Penny","brand:wikidata":"Q284688","brand:wikipedia":"en:Penny (supermarket)",name:"Penny",shop:"supermarket"},removeTags:{brand:"Penny","brand:wikidata":"Q284688","brand:wikipedia":"en:Penny (supermarket)",name:"Penny",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pick n Pay":{name:"Pick n Pay",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7190735"},addTags:{brand:"Pick n Pay","brand:wikidata":"Q7190735","brand:wikipedia":"en:Pick n Pay Stores",name:"Pick n Pay",shop:"supermarket"},removeTags:{brand:"Pick n Pay","brand:wikidata":"Q7190735","brand:wikipedia":"en:Pick n Pay Stores",name:"Pick n Pay",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Piggly Wiggly":{name:"Piggly Wiggly",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3388303"},addTags:{brand:"Piggly Wiggly","brand:wikidata":"Q3388303","brand:wikipedia":"en:Piggly Wiggly",name:"Piggly Wiggly",shop:"supermarket"},removeTags:{brand:"Piggly Wiggly","brand:wikidata":"Q3388303","brand:wikipedia":"en:Piggly Wiggly",name:"Piggly Wiggly",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pingo Doce":{name:"Pingo Doce",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1575057"},addTags:{brand:"Pingo Doce","brand:wikidata":"Q1575057","brand:wikipedia":"en:Pingo Doce",name:"Pingo Doce",shop:"supermarket"},removeTags:{brand:"Pingo Doce","brand:wikidata":"Q1575057","brand:wikipedia":"en:Pingo Doce",name:"Pingo Doce",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Piotr i Paweł":{name:"Piotr i Paweł",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2096356"},addTags:{brand:"Piotr i Paweł","brand:wikidata":"Q2096356","brand:wikipedia":"en:Piotr i Paweł",name:"Piotr i Paweł",shop:"supermarket"},removeTags:{brand:"Piotr i Paweł","brand:wikidata":"Q2096356","brand:wikipedia":"en:Piotr i Paweł",name:"Piotr i Paweł",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Plaza Vea":{name:"Plaza Vea",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7203672"},addTags:{brand:"Plaza Vea","brand:wikidata":"Q7203672","brand:wikipedia":"en:Plaza Vea",name:"Plaza Vea",shop:"supermarket"},removeTags:{brand:"Plaza Vea","brand:wikidata":"Q7203672","brand:wikipedia":"en:Plaza Vea",name:"Plaza Vea",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Plodine":{name:"Plodine",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58040098"},addTags:{brand:"Plodine","brand:wikidata":"Q58040098",name:"Plodine",shop:"supermarket"},removeTags:{brand:"Plodine","brand:wikidata":"Q58040098",name:"Plodine",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Poiesz":{name:"Poiesz",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2521700"},addTags:{brand:"Poiesz","brand:wikidata":"Q2521700","brand:wikipedia":"nl:Poiesz Supermarkten",name:"Poiesz",shop:"supermarket"},removeTags:{brand:"Poiesz","brand:wikidata":"Q2521700","brand:wikipedia":"nl:Poiesz Supermarkten",name:"Poiesz",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Price Chopper (Kansas City)":{name:"Price Chopper (Kansas City)",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7242572"},addTags:{brand:"Price Chopper","brand:wikidata":"Q7242572","brand:wikipedia":"en:Price Chopper (supermarket)",name:"Price Chopper",shop:"supermarket"},removeTags:{brand:"Price Chopper","brand:wikidata":"Q7242572","brand:wikipedia":"en:Price Chopper (supermarket)",name:"Price Chopper",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Price Chopper (New York)":{name:"Price Chopper (New York)",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7242574"},addTags:{brand:"Price Chopper","brand:wikidata":"Q7242574","brand:wikipedia":"en:Price Chopper Supermarkets",name:"Price Chopper",shop:"supermarket"},removeTags:{brand:"Price Chopper","brand:wikidata":"Q7242574","brand:wikipedia":"en:Price Chopper Supermarkets",name:"Price Chopper",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Profi":{name:"Profi",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q956664"},addTags:{brand:"Profi","brand:wikidata":"Q956664","brand:wikipedia":"en:Profi",name:"Profi",shop:"supermarket"},removeTags:{brand:"Profi","brand:wikidata":"Q956664","brand:wikipedia":"en:Profi",name:"Profi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Provigo":{name:"Provigo",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3408306"},addTags:{brand:"Provigo","brand:wikidata":"Q3408306","brand:wikipedia":"en:Provigo",name:"Provigo",shop:"supermarket"},removeTags:{brand:"Provigo","brand:wikidata":"Q3408306","brand:wikipedia":"en:Provigo",name:"Provigo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Proxi":{name:"Proxi",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3408522"},addTags:{brand:"Proxi","brand:wikidata":"Q3408522","brand:wikipedia":"fr:Proxi",name:"Proxi",shop:"supermarket"},removeTags:{brand:"Proxi","brand:wikidata":"Q3408522","brand:wikipedia":"fr:Proxi",name:"Proxi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Publix":{name:"Publix",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q672170"},addTags:{brand:"Publix","brand:wikidata":"Q672170","brand:wikipedia":"en:Publix",name:"Publix",shop:"supermarket"},removeTags:{brand:"Publix","brand:wikidata":"Q672170","brand:wikipedia":"en:Publix",name:"Publix",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Punto Simply":{name:"Punto Simply",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3484790"},addTags:{brand:"Punto Simply","brand:wikidata":"Q3484790","brand:wikipedia":"it:Simply Market",name:"Punto Simply",shop:"supermarket"},removeTags:{brand:"Punto Simply","brand:wikidata":"Q3484790","brand:wikipedia":"it:Simply Market",name:"Punto Simply",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Puregold":{name:"Puregold",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7261170"},addTags:{brand:"Puregold","brand:wikidata":"Q7261170","brand:wikipedia":"en:Puregold",name:"Puregold",shop:"supermarket"},removeTags:{brand:"Puregold","brand:wikidata":"Q7261170","brand:wikipedia":"en:Puregold",name:"Puregold",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pão de Açúcar":{name:"Pão de Açúcar",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3411543"},addTags:{brand:"Pão de Açúcar","brand:wikidata":"Q3411543","brand:wikipedia":"pt:Pão de Açúcar (supermercado brasileiro)",name:"Pão de Açúcar",shop:"supermarket"},removeTags:{brand:"Pão de Açúcar","brand:wikidata":"Q3411543","brand:wikipedia":"pt:Pão de Açúcar (supermercado brasileiro)",name:"Pão de Açúcar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/QFC":{name:"QFC",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7265425"},addTags:{brand:"QFC","brand:wikidata":"Q7265425","brand:wikipedia":"en:QFC",name:"QFC",shop:"supermarket"},removeTags:{brand:"QFC","brand:wikidata":"Q7265425","brand:wikipedia":"en:QFC",name:"QFC",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ralphs":{name:"Ralphs",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3929820"},addTags:{brand:"Ralphs","brand:wikidata":"Q3929820","brand:wikipedia":"en:Ralphs",name:"Ralphs",shop:"supermarket"},removeTags:{brand:"Ralphs","brand:wikidata":"Q3929820","brand:wikipedia":"en:Ralphs",name:"Ralphs",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Real":{name:"Real",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q698473"},addTags:{brand:"Real","brand:wikidata":"Q698473","brand:wikipedia":"en:Real (hypermarket)",name:"Real",shop:"supermarket"},removeTags:{brand:"Real","brand:wikidata":"Q698473","brand:wikipedia":"en:Real (hypermarket)",name:"Real",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Real Canadian Superstore":{name:"Real Canadian Superstore",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7300856"},addTags:{brand:"Real Canadian Superstore","brand:wikidata":"Q7300856","brand:wikipedia":"en:Real Canadian Superstore",name:"Real Canadian Superstore",shop:"supermarket"},removeTags:{brand:"Real Canadian Superstore","brand:wikidata":"Q7300856","brand:wikipedia":"en:Real Canadian Superstore",name:"Real Canadian Superstore",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Reliance Fresh":{name:"Reliance Fresh",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7311014"},addTags:{brand:"Reliance Fresh","brand:wikidata":"Q7311014","brand:wikipedia":"en:Reliance Fresh",name:"Reliance Fresh",shop:"supermarket"},removeTags:{brand:"Reliance Fresh","brand:wikidata":"Q7311014","brand:wikipedia":"en:Reliance Fresh",name:"Reliance Fresh",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Rema 1000":{name:"Rema 1000",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q28459"},addTags:{brand:"Rema 1000","brand:wikidata":"Q28459","brand:wikipedia":"en:REMA 1000",name:"Rema 1000",shop:"supermarket"},removeTags:{brand:"Rema 1000","brand:wikidata":"Q28459","brand:wikipedia":"en:REMA 1000",name:"Rema 1000",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Rewe":{name:"Rewe",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16968817"},addTags:{brand:"Rewe","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe",shop:"supermarket"},removeTags:{brand:"Rewe","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Rewe City":{name:"Rewe City",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16968817"},addTags:{brand:"Rewe City","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe City",shop:"supermarket"},removeTags:{brand:"Rewe City","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe City",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Rimi":{name:"Rimi",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7334456"},addTags:{brand:"Rimi","brand:wikidata":"Q7334456","brand:wikipedia":"en:Rimi (Norway)",name:"Rimi",shop:"supermarket"},removeTags:{brand:"Rimi","brand:wikidata":"Q7334456","brand:wikipedia":"en:Rimi (Norway)",name:"Rimi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/S-Market":{name:"S-Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11891613"},addTags:{brand:"S-Market","brand:wikidata":"Q11891613","brand:wikipedia":"fi:S-market",name:"S-Market",shop:"supermarket"},removeTags:{brand:"S-Market","brand:wikidata":"Q11891613","brand:wikipedia":"fi:S-market",name:"S-Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Safeway":{name:"Safeway",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1508234"},addTags:{brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway",shop:"supermarket"},removeTags:{brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Santa Isabel":{name:"Santa Isabel",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7419620"},addTags:{brand:"Santa Isabel","brand:wikidata":"Q7419620","brand:wikipedia":"es:Santa Isabel (supermercado)",name:"Santa Isabel",shop:"supermarket"},removeTags:{brand:"Santa Isabel","brand:wikidata":"Q7419620","brand:wikipedia":"es:Santa Isabel (supermercado)",name:"Santa Isabel",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Save-A-Lot":{name:"Save-A-Lot",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7427972"},addTags:{brand:"Save-A-Lot","brand:wikidata":"Q7427972","brand:wikipedia":"en:Save-A-Lot",name:"Save-A-Lot",shop:"supermarket"},removeTags:{brand:"Save-A-Lot","brand:wikidata":"Q7427972","brand:wikipedia":"en:Save-A-Lot",name:"Save-A-Lot",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Schnucks":{name:"Schnucks",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7431920"},addTags:{brand:"Schnucks","brand:wikidata":"Q7431920","brand:wikipedia":"en:Schnucks",name:"Schnucks",shop:"supermarket"},removeTags:{brand:"Schnucks","brand:wikidata":"Q7431920","brand:wikipedia":"en:Schnucks",name:"Schnucks",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Shaw's":{name:"Shaw's",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q578387"},addTags:{brand:"Shaw's","brand:wikidata":"Q578387","brand:wikipedia":"en:Shaw's and Star Market",name:"Shaw's",shop:"supermarket"},removeTags:{brand:"Shaw's","brand:wikidata":"Q578387","brand:wikipedia":"en:Shaw's and Star Market",name:"Shaw's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ShopRite":{name:"ShopRite",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7501097"},addTags:{brand:"ShopRite","brand:wikidata":"Q7501097","brand:wikipedia":"en:ShopRite (United States)",name:"ShopRite",shop:"supermarket"},removeTags:{brand:"ShopRite","brand:wikidata":"Q7501097","brand:wikipedia":"en:ShopRite (United States)",name:"ShopRite",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Shoprite":{name:"Shoprite",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1857639"},addTags:{brand:"Shoprite","brand:wikidata":"Q1857639","brand:wikipedia":"en:ShopRite (South Africa)",name:"Shoprite",shop:"supermarket"},removeTags:{brand:"Shoprite","brand:wikidata":"Q1857639","brand:wikipedia":"en:ShopRite (South Africa)",name:"Shoprite",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sigma":{name:"Sigma",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3977979"},addTags:{brand:"Sigma","brand:wikidata":"Q3977979","brand:wikipedia":"it:Supermercati Sigma",name:"Sigma",shop:"supermarket"},removeTags:{brand:"Sigma","brand:wikidata":"Q3977979","brand:wikipedia":"it:Supermercati Sigma",name:"Sigma",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Simply Market":{name:"Simply Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3484790"},addTags:{brand:"Simply Market","brand:wikidata":"Q3484790","brand:wikipedia":"en:Simply Market",name:"Simply Market",shop:"supermarket"},removeTags:{brand:"Simply Market","brand:wikidata":"Q3484790","brand:wikipedia":"en:Simply Market",name:"Simply Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sky":{name:"Sky",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1129779"},addTags:{name:"Sky",brand:"Sky","brand:wikipedia":"de:Coop eG","brand:wikidata":"Q1129779",shop:"supermarket"},removeTags:{name:"Sky",brand:"Sky","brand:wikipedia":"de:Coop eG","brand:wikidata":"Q1129779",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Smith's":{name:"Smith's",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7544856"},addTags:{brand:"Smith's","brand:wikidata":"Q7544856","brand:wikipedia":"en:Smith's Food and Drug",name:"Smith's",shop:"supermarket"},removeTags:{brand:"Smith's","brand:wikidata":"Q7544856","brand:wikipedia":"en:Smith's Food and Drug",name:"Smith's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sobeys":{name:"Sobeys",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1143340"},addTags:{brand:"Sobeys","brand:wikidata":"Q1143340","brand:wikipedia":"en:Sobeys",name:"Sobeys",shop:"supermarket"},removeTags:{brand:"Sobeys","brand:wikidata":"Q1143340","brand:wikipedia":"en:Sobeys",name:"Sobeys",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Soriana":{name:"Soriana",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q735562"},addTags:{brand:"Soriana","brand:wikidata":"Q735562","brand:wikipedia":"en:Soriana",name:"Soriana",shop:"supermarket"},removeTags:{brand:"Soriana","brand:wikidata":"Q735562","brand:wikipedia":"en:Soriana",name:"Soriana",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sprouts Farmers Market":{name:"Sprouts Farmers Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7581369"},addTags:{brand:"Sprouts Farmers Market","brand:wikidata":"Q7581369","brand:wikipedia":"en:Sprouts Farmers Market",name:"Sprouts Farmers Market",shop:"supermarket"},removeTags:{brand:"Sprouts Farmers Market","brand:wikidata":"Q7581369","brand:wikipedia":"en:Sprouts Farmers Market",name:"Sprouts Farmers Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Stater Bros.":{name:"Stater Bros.",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7604016"},addTags:{brand:"Stater Bros.","brand:wikidata":"Q7604016","brand:wikipedia":"en:Stater Bros.",name:"Stater Bros.",shop:"supermarket"},removeTags:{brand:"Stater Bros.","brand:wikidata":"Q7604016","brand:wikipedia":"en:Stater Bros.",name:"Stater Bros.",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Stokrotka":{name:"Stokrotka",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q9345945"},addTags:{brand:"Stokrotka","brand:wikidata":"Q9345945","brand:wikipedia":"en:Stokrotka",name:"Stokrotka",shop:"supermarket"},removeTags:{brand:"Stokrotka","brand:wikidata":"Q9345945","brand:wikipedia":"en:Stokrotka",name:"Stokrotka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Stop & Shop":{name:"Stop & Shop",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3658429"},addTags:{brand:"Stop & Shop","brand:wikidata":"Q3658429","brand:wikipedia":"en:Stop & Shop",name:"Stop & Shop",shop:"supermarket"},removeTags:{brand:"Stop & Shop","brand:wikidata":"Q3658429","brand:wikipedia":"en:Stop & Shop",name:"Stop & Shop",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Suma":{name:"Suma",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58012362"},addTags:{brand:"Suma","brand:wikidata":"Q58012362",name:"Suma",shop:"supermarket"},removeTags:{brand:"Suma","brand:wikidata":"Q58012362",name:"Suma",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Super C":{name:"Super C",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3504127"},addTags:{brand:"Super C","brand:wikidata":"Q3504127","brand:wikipedia":"en:Super C (supermarket)",name:"Super C",shop:"supermarket"},removeTags:{brand:"Super C","brand:wikidata":"Q3504127","brand:wikipedia":"en:Super C (supermarket)",name:"Super C",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Super U":{name:"Super U",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2529029"},addTags:{brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U",shop:"supermarket"},removeTags:{brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/SuperBrugsen":{name:"SuperBrugsen",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12337746"},addTags:{brand:"SuperBrugsen","brand:wikidata":"Q12337746","brand:wikipedia":"en:SuperBrugsen",name:"SuperBrugsen",shop:"supermarket"},removeTags:{brand:"SuperBrugsen","brand:wikidata":"Q12337746","brand:wikipedia":"en:SuperBrugsen",name:"SuperBrugsen",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/SuperValu":{name:"SuperValu",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7642081"},addTags:{brand:"SuperValu","brand:wikidata":"Q7642081","brand:wikipedia":"en:SuperValu (Ireland)`",name:"SuperValu",shop:"supermarket"},removeTags:{brand:"SuperValu","brand:wikidata":"Q7642081","brand:wikipedia":"en:SuperValu (Ireland)`",name:"SuperValu",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Superama":{name:"Superama",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6135762"},addTags:{brand:"Superama","brand:wikidata":"Q6135762","brand:wikipedia":"es:Superama",name:"Superama",shop:"supermarket"},removeTags:{brand:"Superama","brand:wikidata":"Q6135762","brand:wikipedia":"es:Superama",name:"Superama",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Superspar":{name:"Superspar",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q610492"},addTags:{brand:"Superspar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Superspar",shop:"supermarket"},removeTags:{brand:"Superspar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Superspar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tegut":{name:"Tegut",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1547993"},addTags:{brand:"Tegut","brand:wikidata":"Q1547993","brand:wikipedia":"en:Tegut",name:"Tegut",shop:"supermarket"},removeTags:{brand:"Tegut","brand:wikidata":"Q1547993","brand:wikipedia":"en:Tegut",name:"Tegut",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tesco":{name:"Tesco",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q487494"},addTags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"supermarket"},removeTags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tesco Express":{name:"Tesco Express",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q487494"},addTags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"supermarket"},removeTags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tesco Extra":{name:"Tesco Extra",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q25172225"},addTags:{brand:"Tesco Extra","brand:wikidata":"Q25172225","brand:wikipedia":"en:Tesco Extra",name:"Tesco Extra",shop:"supermarket"},removeTags:{brand:"Tesco Extra","brand:wikidata":"Q25172225","brand:wikipedia":"en:Tesco Extra",name:"Tesco Extra",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tesco Metro":{name:"Tesco Metro",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57551648"},addTags:{brand:"Tesco Metro","brand:wikidata":"Q57551648",name:"Tesco Metro",shop:"supermarket"},removeTags:{brand:"Tesco Metro","brand:wikidata":"Q57551648",name:"Tesco Metro",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/The Co-operative Food":{name:"The Co-operative Food",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3277439"},addTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"supermarket"},removeTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/The Fresh Market":{name:"The Fresh Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7735265"},addTags:{brand:"The Fresh Market","brand:wikidata":"Q7735265","brand:wikipedia":"en:The Fresh Market",name:"The Fresh Market",shop:"supermarket"},removeTags:{brand:"The Fresh Market","brand:wikidata":"Q7735265","brand:wikipedia":"en:The Fresh Market",name:"The Fresh Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Todis":{name:"Todis",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3992174"},addTags:{brand:"Todis","brand:wikidata":"Q3992174","brand:wikipedia":"it:Todis",name:"Todis",shop:"supermarket"},removeTags:{brand:"Todis","brand:wikidata":"Q3992174","brand:wikipedia":"it:Todis",name:"Todis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tommy":{name:"Tommy",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12643718"},addTags:{brand:"Tommy","brand:wikidata":"Q12643718","brand:wikipedia":"hr:Tommy",name:"Tommy",shop:"supermarket"},removeTags:{brand:"Tommy","brand:wikidata":"Q12643718","brand:wikipedia":"hr:Tommy",name:"Tommy",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tops":{name:"Tops",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7825137"},addTags:{brand:"Tops","brand:wikidata":"Q7825137","brand:wikipedia":"en:Tops Friendly Markets",name:"Tops",shop:"supermarket"},removeTags:{brand:"Tops","brand:wikidata":"Q7825137","brand:wikipedia":"en:Tops Friendly Markets",name:"Tops",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tottus":{name:"Tottus",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7828510"},addTags:{brand:"Tottus","brand:wikidata":"Q7828510","brand:wikipedia":"en:Tottus",name:"Tottus",shop:"supermarket"},removeTags:{brand:"Tottus","brand:wikidata":"Q7828510","brand:wikipedia":"en:Tottus",name:"Tottus",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Trader Joe's":{name:"Trader Joe's",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q688825"},addTags:{brand:"Trader Joe's","brand:wikidata":"Q688825","brand:wikipedia":"en:Trader Joe's",name:"Trader Joe's",shop:"supermarket"},removeTags:{brand:"Trader Joe's","brand:wikidata":"Q688825","brand:wikipedia":"en:Trader Joe's",name:"Trader Joe's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Treff 3000":{name:"Treff 3000",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q701755"},addTags:{brand:"Treff 3000","brand:wikidata":"Q701755","brand:wikipedia":"de:Edeka",name:"Treff 3000",shop:"supermarket"},removeTags:{brand:"Treff 3000","brand:wikidata":"Q701755","brand:wikipedia":"de:Edeka",name:"Treff 3000",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/U Express":{name:"U Express",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2529029"},addTags:{brand:"U Express","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"U Express",shop:"supermarket"},removeTags:{brand:"U Express","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"U Express",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Unimarc":{name:"Unimarc",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6156244"},addTags:{brand:"Unimarc","brand:wikidata":"Q6156244","brand:wikipedia":"es:Unimarc",name:"Unimarc",shop:"supermarket"},removeTags:{brand:"Unimarc","brand:wikidata":"Q6156244","brand:wikipedia":"es:Unimarc",name:"Unimarc",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Unimarkt":{name:"Unimarkt",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1169599"},addTags:{brand:"Unimarkt","brand:wikidata":"Q1169599","brand:wikipedia":"de:Unimarkt",name:"Unimarkt",shop:"supermarket"},removeTags:{brand:"Unimarkt","brand:wikidata":"Q1169599","brand:wikipedia":"de:Unimarkt",name:"Unimarkt",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Vea":{name:"Vea",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5858167"},addTags:{brand:"Vea","brand:wikidata":"Q5858167","brand:wikipedia":"es:Vea (supermercado)",name:"Vea",shop:"supermarket"},removeTags:{brand:"Vea","brand:wikidata":"Q5858167","brand:wikipedia":"es:Vea (supermercado)",name:"Vea",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Waitrose":{name:"Waitrose",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q771734"},addTags:{brand:"Waitrose","brand:wikidata":"Q771734","brand:wikipedia":"en:Waitrose",name:"Waitrose",shop:"supermarket"},removeTags:{brand:"Waitrose","brand:wikidata":"Q771734","brand:wikipedia":"en:Waitrose",name:"Waitrose",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Walmart Neighborhood Market":{name:"Walmart Neighborhood Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q483551"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Neighborhood Market",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},removeTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Neighborhood Market",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Walmart Supercenter":{name:"Walmart Supercenter",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q483551"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Supercenter",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},removeTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Supercenter",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Wasgau":{name:"Wasgau",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2536857"},addTags:{brand:"Wasgau","brand:wikidata":"Q2536857","brand:wikipedia":"de:Wasgau (Unternehmen)",name:"Wasgau",shop:"supermarket"},removeTags:{brand:"Wasgau","brand:wikidata":"Q2536857","brand:wikipedia":"de:Wasgau (Unternehmen)",name:"Wasgau",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Wegmans":{name:"Wegmans",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11288478"},addTags:{brand:"Wegmans","brand:wikidata":"Q11288478","brand:wikipedia":"en:Wegmans",name:"Wegmans",shop:"supermarket"},removeTags:{brand:"Wegmans","brand:wikidata":"Q11288478","brand:wikipedia":"en:Wegmans",name:"Wegmans",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Weis":{name:"Weis",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7980370"},addTags:{brand:"Weis","brand:wikidata":"Q7980370","brand:wikipedia":"en:Weis Markets",name:"Weis",shop:"supermarket"},removeTags:{brand:"Weis","brand:wikidata":"Q7980370","brand:wikipedia":"en:Weis Markets",name:"Weis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Whole Foods Market":{name:"Whole Foods Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1809448"},addTags:{brand:"Whole Foods Market","brand:wikidata":"Q1809448","brand:wikipedia":"en:Whole Foods Market",name:"Whole Foods Market",shop:"supermarket"},removeTags:{brand:"Whole Foods Market","brand:wikidata":"Q1809448","brand:wikipedia":"en:Whole Foods Market",name:"Whole Foods Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Willys":{name:"Willys",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q10720214"},addTags:{brand:"Willys","brand:wikidata":"Q10720214","brand:wikipedia":"sv:Willys",name:"Willys",shop:"supermarket"},removeTags:{brand:"Willys","brand:wikidata":"Q10720214","brand:wikipedia":"sv:Willys",name:"Willys",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/WinCo Foods":{name:"WinCo Foods",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q8023592"},addTags:{brand:"WinCo Foods","brand:wikidata":"Q8023592","brand:wikipedia":"en:WinCo Foods",name:"WinCo Foods",shop:"supermarket"},removeTags:{brand:"WinCo Foods","brand:wikidata":"Q8023592","brand:wikipedia":"en:WinCo Foods",name:"WinCo Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Winn Dixie":{name:"Winn Dixie",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1264366"},addTags:{brand:"Winn Dixie","brand:wikidata":"Q1264366","brand:wikipedia":"en:Winn-Dixie",name:"Winn Dixie",shop:"supermarket"},removeTags:{brand:"Winn Dixie","brand:wikidata":"Q1264366","brand:wikipedia":"en:Winn-Dixie",name:"Winn Dixie",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Woolworths":{name:"Woolworths",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3249145"},addTags:{brand:"Woolworths","brand:wikidata":"Q3249145","brand:wikipedia":"en:Woolworths Supermarkets",name:"Woolworths",shop:"supermarket"},removeTags:{brand:"Woolworths","brand:wikidata":"Q3249145","brand:wikipedia":"en:Woolworths Supermarkets",name:"Woolworths",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/denn's Biomarkt":{name:"denn's Biomarkt",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q48883773"},addTags:{brand:"denn's Biomarkt","brand:wikidata":"Q48883773","brand:wikipedia":"de:Dennree",name:"denn's Biomarkt",shop:"supermarket"},removeTags:{brand:"denn's Biomarkt","brand:wikidata":"Q48883773","brand:wikipedia":"de:Dennree",name:"denn's Biomarkt",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/fakta":{name:"fakta",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3172238"},addTags:{brand:"fakta","brand:wikidata":"Q3172238","brand:wikipedia":"en:Fakta",name:"fakta",shop:"supermarket"},removeTags:{brand:"fakta","brand:wikidata":"Q3172238","brand:wikipedia":"en:Fakta",name:"fakta",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Şok":{name:"Şok",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q19613992"},addTags:{brand:"Şok","brand:wikidata":"Q19613992","brand:wikipedia":"tr:Şok (market)",name:"Şok",shop:"supermarket"},removeTags:{brand:"Şok","brand:wikidata":"Q19613992","brand:wikipedia":"tr:Şok (market)",name:"Şok",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ΑΒ Βασιλόπουλος":{name:"ΑΒ Βασιλόπουλος",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4721807"},addTags:{brand:"ΑΒ Βασιλόπουλος","brand:en":"AB Vassilopoulos","brand:wikidata":"Q4721807","brand:wikipedia":"el:Άλφα Βήτα Βασιλόπουλος",name:"ΑΒ Βασιλόπουλος","name:en":"AB Vassilopoulos",shop:"supermarket"},removeTags:{brand:"ΑΒ Βασιλόπουλος","brand:en":"AB Vassilopoulos","brand:wikidata":"Q4721807","brand:wikipedia":"el:Άλφα Βήτα Βασιλόπουλος",name:"ΑΒ Βασιλόπουλος","name:en":"AB Vassilopoulos",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Γαλαξίας":{name:"Γαλαξίας",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5518063"},addTags:{brand:"Γαλαξίας","brand:en":"Galaxias","brand:wikidata":"Q5518063","brand:wikipedia":"el:Γαλαξίας (σούπερ μάρκετ)",name:"Γαλαξίας","name:en":"Galaxias",shop:"supermarket"},removeTags:{brand:"Γαλαξίας","brand:en":"Galaxias","brand:wikidata":"Q5518063","brand:wikipedia":"el:Γαλαξίας (σούπερ μάρκετ)",name:"Γαλαξίας","name:en":"Galaxias",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Μασούτης":{name:"Μασούτης",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6783887"},addTags:{brand:"Μασούτης","brand:en":"Masoutis","brand:wikidata":"Q6783887","brand:wikipedia":"en:Masoutis",name:"Μασούτης","name:en":"Masoutis",shop:"supermarket"},removeTags:{brand:"Μασούτης","brand:en":"Masoutis","brand:wikidata":"Q6783887","brand:wikipedia":"en:Masoutis",name:"Μασούτης","name:en":"Masoutis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Σκλαβενίτης":{name:"Σκλαβενίτης",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7536037"},addTags:{brand:"Σκλαβενίτης","brand:en":"Sklavenitis","brand:wikidata":"Q7536037","brand:wikipedia":"el:Σκλαβενίτης",name:"Σκλαβενίτης","name:en":"Sklavenitis",shop:"supermarket"},removeTags:{brand:"Σκλαβενίτης","brand:en":"Sklavenitis","brand:wikidata":"Q7536037","brand:wikipedia":"el:Σκλαβενίτης",name:"Σκλαβενίτης","name:en":"Sklavenitis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Азбука Вкуса":{name:"Азбука Вкуса",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4058209"},addTags:{brand:"Азбука Вкуса","brand:en":"Azbuka Vkusa","brand:wikidata":"Q4058209","brand:wikipedia":"en:Azbuka Vkusa",name:"Азбука Вкуса","name:en":"Azbuka Vkusa",shop:"supermarket"},removeTags:{brand:"Азбука Вкуса","brand:en":"Azbuka Vkusa","brand:wikidata":"Q4058209","brand:wikipedia":"en:Azbuka Vkusa",name:"Азбука Вкуса","name:en":"Azbuka Vkusa",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Атак":{name:"Атак",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2868738"},addTags:{brand:"Атак","brand:en":"Atac","brand:wikidata":"Q2868738","brand:wikipedia":"ru:Atac",name:"Атак","name:en":"Atac",shop:"supermarket"},removeTags:{brand:"Атак","brand:en":"Atac","brand:wikidata":"Q2868738","brand:wikipedia":"ru:Atac",name:"Атак","name:en":"Atac",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ашан":{name:"Ашан",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q758603"},addTags:{brand:"Ашан","brand:en":"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"ru:Auchan",name:"Ашан","name:en":"Auchan",shop:"supermarket"},removeTags:{brand:"Ашан","brand:en":"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"ru:Auchan",name:"Ашан","name:en":"Auchan",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Брусничка":{name:"Брусничка",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q21656645"},addTags:{brand:"Брусничка","brand:en":"Brusnichka","brand:wikidata":"Q21656645","brand:wikipedia":"uk:Брусничка (торгова мережа)",name:"Брусничка","name:en":"Brusnichka",shop:"supermarket"},removeTags:{brand:"Брусничка","brand:en":"Brusnichka","brand:wikidata":"Q21656645","brand:wikipedia":"uk:Брусничка (торгова мережа)",name:"Брусничка","name:en":"Brusnichka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Виктория":{name:"Виктория",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4111046"},addTags:{brand:"Виктория","brand:wikidata":"Q4111046","brand:wikipedia":"ru:Виктория (сеть магазинов)",name:"Виктория",shop:"supermarket"},removeTags:{brand:"Виктория","brand:wikidata":"Q4111046","brand:wikipedia":"ru:Виктория (сеть магазинов)",name:"Виктория",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Вопак":{name:"Вопак",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q30966107"},addTags:{brand:"Вопак","brand:en":"Vopak","brand:wikidata":"Q30966107","brand:wikipedia":"uk:Вопак",name:"Вопак","name:en":"Vopak",shop:"supermarket"},removeTags:{brand:"Вопак","brand:en":"Vopak","brand:wikidata":"Q30966107","brand:wikipedia":"uk:Вопак",name:"Вопак","name:en":"Vopak",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Гулливер":{name:"Гулливер",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58003470"},addTags:{brand:"Гулливер","brand:wikidata":"Q58003470",name:"Гулливер",shop:"supermarket"},removeTags:{brand:"Гулливер","brand:wikidata":"Q58003470",name:"Гулливер",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Дикси":{name:"Дикси",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4161561"},addTags:{brand:"Дикси","brand:en":"Dixy","brand:wikidata":"Q4161561","brand:wikipedia":"ru:Дикси (сеть магазинов)",name:"Дикси",shop:"supermarket"},removeTags:{brand:"Дикси","brand:en":"Dixy","brand:wikidata":"Q4161561","brand:wikipedia":"ru:Дикси (сеть магазинов)",name:"Дикси",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Карусель":{name:"Карусель",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4216307"},addTags:{brand:"Карусель","brand:en":"Karusel","brand:wikidata":"Q4216307","brand:wikipedia":"ru:Карусель (сеть магазинов)",name:"Карусель","name:en":"Karusel",shop:"supermarket"},removeTags:{brand:"Карусель","brand:en":"Karusel","brand:wikidata":"Q4216307","brand:wikipedia":"ru:Карусель (сеть магазинов)",name:"Карусель","name:en":"Karusel",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Лента":{name:"Лента",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4258608"},addTags:{brand:"Лента","brand:en":"Lenta","brand:wikidata":"Q4258608","brand:wikipedia":"ru:Лента (сеть магазинов)",name:"Лента","name:en":"Lenta",shop:"supermarket"},removeTags:{brand:"Лента","brand:en":"Lenta","brand:wikidata":"Q4258608","brand:wikipedia":"ru:Лента (сеть магазинов)",name:"Лента","name:en":"Lenta",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Магнит":{name:"Магнит",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q940518"},addTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"supermarket"},removeTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Мария-Ра":{name:"Мария-Ра",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4281631"},addTags:{brand:"Мария-Ра","brand:en":"Maria-ra","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра","name:en":"Maria-ra",shop:"supermarket"},removeTags:{brand:"Мария-Ра","brand:en":"Maria-ra","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра","name:en":"Maria-ra",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Монетка":{name:"Монетка",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4301704"},addTags:{brand:"Монетка","brand:en":"Monetka","brand:wikidata":"Q4301704","brand:wikipedia":"ru:Монетка (сеть магазинов)",name:"Монетка","name:en":"Monetka",shop:"supermarket"},removeTags:{brand:"Монетка","brand:en":"Monetka","brand:wikidata":"Q4301704","brand:wikipedia":"ru:Монетка (сеть магазинов)",name:"Монетка","name:en":"Monetka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Народная 7Я семьЯ":{name:"Народная 7Я семьЯ",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4032436"},addTags:{brand:"Народная 7Я семьЯ","brand:en":"People's 7th Family","brand:wikidata":"Q4032436","brand:wikipedia":"ru:Народная 7Я семья",name:"Народная 7Я семьЯ","name:en":"People's 7th Family",shop:"supermarket"},removeTags:{brand:"Народная 7Я семьЯ","brand:en":"People's 7th Family","brand:wikidata":"Q4032436","brand:wikipedia":"ru:Народная 7Я семья",name:"Народная 7Я семьЯ","name:en":"People's 7th Family",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Перекрёсток":{name:"Перекрёсток",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1684639"},addTags:{brand:"Перекрёсток","brand:en":"Perekryostok","brand:wikidata":"Q1684639","brand:wikipedia":"en:Perekrestok (supermarket chain)",name:"Перекрёсток",shop:"supermarket"},removeTags:{brand:"Перекрёсток","brand:en":"Perekryostok","brand:wikidata":"Q1684639","brand:wikipedia":"en:Perekrestok (supermarket chain)",name:"Перекрёсток",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Покупочка":{name:"Покупочка",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58003270"},addTags:{brand:"Покупочка","brand:wikidata":"Q58003270",name:"Покупочка",shop:"supermarket"},removeTags:{brand:"Покупочка","brand:wikidata":"Q58003270",name:"Покупочка",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Полушка":{name:"Полушка",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4371080"},addTags:{brand:"Полушка","brand:en":"Polushka","brand:wikidata":"Q4371080","brand:wikipedia":"ru:Полушка (сеть магазинов)",name:"Полушка","name:en":"Polushka",shop:"supermarket"},removeTags:{brand:"Полушка","brand:en":"Polushka","brand:wikidata":"Q4371080","brand:wikipedia":"ru:Полушка (сеть магазинов)",name:"Полушка","name:en":"Polushka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Пятёрочка":{name:"Пятёрочка",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1768969"},addTags:{brand:"Пятёрочка","brand:en":"Pyaterochka","brand:wikidata":"Q1768969","brand:wikipedia":"ru:Пятёрочка",name:"Пятёрочка","name:en":"Pyaterochka",shop:"supermarket"},removeTags:{brand:"Пятёрочка","brand:en":"Pyaterochka","brand:wikidata":"Q1768969","brand:wikipedia":"ru:Пятёрочка",name:"Пятёрочка","name:en":"Pyaterochka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Радеж":{name:"Радеж",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4387165"},addTags:{brand:"Радеж","brand:en":"Radezh","brand:wikidata":"Q4387165","brand:wikipedia":"ru:Радеж (торговая сеть)",name:"Радеж","name:en":"Radezh",shop:"supermarket"},removeTags:{brand:"Радеж","brand:en":"Radezh","brand:wikidata":"Q4387165","brand:wikipedia":"ru:Радеж (торговая сеть)",name:"Радеж","name:en":"Radezh",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Рукавичка":{name:"Рукавичка",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q20092568"},addTags:{brand:"Рукавичка","brand:en":"Rukavychka","brand:wikidata":"Q20092568","brand:wikipedia":"uk:Рукавичка (торгова мережа)",name:"Рукавичка","name:en":"Rukavychka",shop:"supermarket"},removeTags:{brand:"Рукавичка","brand:en":"Rukavychka","brand:wikidata":"Q20092568","brand:wikipedia":"uk:Рукавичка (торгова мережа)",name:"Рукавичка","name:en":"Rukavychka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Семишагофф":{name:"Семишагофф",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58003374"},addTags:{brand:"Семишагофф","brand:wikidata":"Q58003374",name:"Семишагофф",shop:"supermarket"},removeTags:{brand:"Семишагофф","brand:wikidata":"Q58003374",name:"Семишагофф",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Сільпо":{name:"Сільпо",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4419434"},addTags:{brand:"Сільпо","brand:en":"Silpo","brand:wikidata":"Q4419434","brand:wikipedia":"en:Silpo",name:"Сільпо","name:en":"Silpo",shop:"supermarket"},removeTags:{brand:"Сільпо","brand:en":"Silpo","brand:wikidata":"Q4419434","brand:wikipedia":"en:Silpo",name:"Сільпо","name:en":"Silpo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Фора":{name:"Фора",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12165977"},addTags:{brand:"Фора","brand:en":"Fora","brand:wikidata":"Q12165977","brand:wikipedia":"uk:Фора (мережа магазинів)",name:"Фора","name:en":"Fora",shop:"supermarket"},removeTags:{brand:"Фора","brand:en":"Fora","brand:wikidata":"Q12165977","brand:wikipedia":"uk:Фора (мережа магазинів)",name:"Фора","name:en":"Fora",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Фуршет":{name:"Фуршет",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4493564"},addTags:{brand:"Фуршет","brand:en":"Furshet","brand:wikidata":"Q4493564","brand:wikipedia":"uk:Фуршет (мережа супермаркетів)",name:"Фуршет","name:en":"Furshet",shop:"supermarket"},removeTags:{brand:"Фуршет","brand:en":"Furshet","brand:wikidata":"Q4493564","brand:wikipedia":"uk:Фуршет (мережа супермаркетів)",name:"Фуршет","name:en":"Furshet",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Эдельвейс":{name:"Эдельвейс",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57979368"},addTags:{brand:"Эдельвейс","brand:en":"Edelveis","brand:wikidata":"Q57979368",name:"Эдельвейс","name:en":"Edelveis",shop:"supermarket"},removeTags:{brand:"Эдельвейс","brand:en":"Edelveis","brand:wikidata":"Q57979368",name:"Эдельвейс","name:en":"Edelveis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/いなげや":{name:"いなげや",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q17193392"},addTags:{brand:"いなげや","brand:en":"Inageya","brand:wikidata":"Q17193392","brand:wikipedia":"ja:いなげや",name:"いなげや","name:en":"Inageya",shop:"supermarket"},removeTags:{brand:"いなげや","brand:en":"Inageya","brand:wikidata":"Q17193392","brand:wikipedia":"ja:いなげや",name:"いなげや","name:en":"Inageya",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/まいばすけっと":{name:"まいばすけっと",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11278154"},addTags:{brand:"まいばすけっと","brand:en":"My Basket","brand:wikidata":"Q11278154","brand:wikipedia":"ja:まいばすけっと",name:"まいばすけっと","name:en":"My Basket",shop:"supermarket"},removeTags:{brand:"まいばすけっと","brand:en":"My Basket","brand:wikidata":"Q11278154","brand:wikipedia":"ja:まいばすけっと",name:"まいばすけっと","name:en":"My Basket",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/イオン":{name:"イオン",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11285951"},addTags:{brand:"イオン","brand:en":"AEON","brand:wikidata":"Q11285951","brand:wikipedia":"ja:イオン (店舗ブランド)",name:"イオン","name:en":"AEON",shop:"supermarket"},removeTags:{brand:"イオン","brand:en":"AEON","brand:wikidata":"Q11285951","brand:wikipedia":"ja:イオン (店舗ブランド)",name:"イオン","name:en":"AEON",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/イトーヨーカドー":{name:"イトーヨーカドー",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3088746"},addTags:{brand:"イトーヨーカドー","brand:en":"Ito-Yokado","brand:wikidata":"Q3088746","brand:wikipedia":"en:Ito-Yokado",name:"イトーヨーカドー","name:en":"Ito-Yokado",shop:"supermarket"},removeTags:{brand:"イトーヨーカドー","brand:en":"Ito-Yokado","brand:wikidata":"Q3088746","brand:wikipedia":"en:Ito-Yokado",name:"イトーヨーカドー","name:en":"Ito-Yokado",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/カスミ":{name:"カスミ",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11294160"},addTags:{brand:"カスミ","brand:en":"Kasumi","brand:wikidata":"Q11294160","brand:wikipedia":"ja:カスミ",name:"カスミ","name:en":"Kasumi",shop:"supermarket"},removeTags:{brand:"カスミ","brand:en":"Kasumi","brand:wikidata":"Q11294160","brand:wikipedia":"ja:カスミ",name:"カスミ","name:en":"Kasumi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/バロー":{name:"バロー",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11328346"},addTags:{brand:"バロー","brand:en":"Valor","brand:wikidata":"Q11328346","brand:wikipedia":"ja:バロー (チェーンストア)",name:"バロー","name:en":"Valor",shop:"supermarket"},removeTags:{brand:"バロー","brand:en":"Valor","brand:wikidata":"Q11328346","brand:wikipedia":"ja:バロー (チェーンストア)",name:"バロー","name:en":"Valor",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/マックスバリュ":{name:"マックスバリュ",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1960109"},addTags:{brand:"マックスバリュ","brand:en":"Maxvalu Tokai","brand:wikidata":"Q1960109","brand:wikipedia":"en:MaxValu",name:"マックスバリュ","name:en":"Maxvalu Tokai",shop:"supermarket"},removeTags:{brand:"マックスバリュ","brand:en":"Maxvalu Tokai","brand:wikidata":"Q1960109","brand:wikipedia":"en:MaxValu",name:"マックスバリュ","name:en":"Maxvalu Tokai",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/マルエツ":{name:"マルエツ",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11341197"},addTags:{brand:"マルエツ","brand:en":"Maruetsu","brand:wikidata":"Q11341197","brand:wikipedia":"ja:マルエツ",name:"マルエツ","name:en":"Maruetsu",shop:"supermarket"},removeTags:{brand:"マルエツ","brand:en":"Maruetsu","brand:wikidata":"Q11341197","brand:wikipedia":"ja:マルエツ",name:"マルエツ","name:en":"Maruetsu",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ヤオコー":{name:"ヤオコー",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11344967"},addTags:{brand:"ヤオコー","brand:en":"Yaoko","brand:wikidata":"Q11344967","brand:wikipedia":"ja:ヤオコー",name:"ヤオコー","name:en":"Yaoko",shop:"supermarket"},removeTags:{brand:"ヤオコー","brand:en":"Yaoko","brand:wikidata":"Q11344967","brand:wikipedia":"ja:ヤオコー",name:"ヤオコー","name:en":"Yaoko",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ヨークベニマル":{name:"ヨークベニマル",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11346199"},addTags:{brand:"ヨークベニマル","brand:en":"York Benimaru","brand:wikidata":"Q11346199","brand:wikipedia":"ja:ヨークベニマル",name:"ヨークベニマル","name:en":"York Benimaru",shop:"supermarket"},removeTags:{brand:"ヨークベニマル","brand:en":"York Benimaru","brand:wikidata":"Q11346199","brand:wikipedia":"ja:ヨークベニマル",name:"ヨークベニマル","name:en":"York Benimaru",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ライフ":{name:"ライフ",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11346476"},addTags:{brand:"ライフ","brand:en":"Life","brand:wikidata":"Q11346476","brand:wikipedia":"ja:ライフコーポレーション",name:"ライフ","name:en":"Life",shop:"supermarket"},removeTags:{brand:"ライフ","brand:en":"Life","brand:wikidata":"Q11346476","brand:wikipedia":"ja:ライフコーポレーション",name:"ライフ","name:en":"Life",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/全聯":{name:"全聯",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7262792"},addTags:{brand:"全聯","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯","name:en":"Pxmart",shop:"supermarket"},removeTags:{brand:"全聯","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯","name:en":"Pxmart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/全聯福利中心":{name:"全聯福利中心",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7262792"},addTags:{brand:"全聯福利中心","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯福利中心","name:en":"Pxmart",shop:"supermarket"},removeTags:{brand:"全聯福利中心","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯福利中心","name:en":"Pxmart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/惠康 Wellcome":{name:"惠康 Wellcome",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q706247"},addTags:{brand:"惠康 Wellcome","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"zh:惠康",name:"惠康 Wellcome","name:en":"Wellcome",shop:"supermarket"},removeTags:{brand:"惠康 Wellcome","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"zh:惠康",name:"惠康 Wellcome","name:en":"Wellcome",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/業務スーパー":{name:"業務スーパー",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11590183"},addTags:{brand:"業務スーパー","brand:en":"Gyōmu sūpā","brand:wikidata":"Q11590183","brand:wikipedia":"ja:業務スーパー",name:"業務スーパー","name:en":"Gyōmu sūpā",shop:"supermarket"},removeTags:{brand:"業務スーパー","brand:en":"Gyōmu sūpā","brand:wikidata":"Q11590183","brand:wikipedia":"ja:業務スーパー",name:"業務スーパー","name:en":"Gyōmu sūpā",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/美廉社":{name:"美廉社",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q15914017"},addTags:{brand:"美廉社","brand:en":"Simple Mart","brand:wikidata":"Q15914017","brand:wikipedia":"zh:美廉社",name:"美廉社","name:en":"Simple Mart",shop:"supermarket"},removeTags:{brand:"美廉社","brand:en":"Simple Mart","brand:wikidata":"Q15914017","brand:wikipedia":"zh:美廉社",name:"美廉社","name:en":"Simple Mart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/西友":{name:"西友",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3108542"},addTags:{brand:"西友","brand:en":"Seiyu Group","brand:wikidata":"Q3108542","brand:wikipedia":"en:Seiyu Group",name:"西友","name:en":"Seiyu Group",shop:"supermarket"},removeTags:{brand:"西友","brand:en":"Seiyu Group","brand:wikidata":"Q3108542","brand:wikipedia":"en:Seiyu Group",name:"西友","name:en":"Seiyu Group",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/頂好":{name:"頂好",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q706247"},addTags:{brand:"頂好","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好","name:en":"Wellcome",shop:"supermarket"},removeTags:{brand:"頂好","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好","name:en":"Wellcome",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/頂好超市":{name:"頂好超市",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q706247"},addTags:{brand:"頂好超市","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好超市","name:en":"Wellcome",shop:"supermarket"},removeTags:{brand:"頂好超市","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好超市","name:en":"Wellcome",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/하나로마트":{name:"하나로마트",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12590611"},addTags:{brand:"하나로마트","brand:en":"Hanaro Mart","brand:wikidata":"Q12590611","brand:wikipedia":"ko:농협유통",name:"하나로마트",shop:"supermarket"},removeTags:{brand:"하나로마트","brand:en":"Hanaro Mart","brand:wikidata":"Q12590611","brand:wikipedia":"ko:농협유통",name:"하나로마트",shop:"supermarket"},matchScore:2,suggestion:true},"shop/ticket/Boutique Grandes Lignes":{name:"Boutique Grandes Lignes",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"ticket","brand:wikidata":"Q13646"},addTags:{brand:"Boutique Grandes Lignes","brand:wikidata":"Q13646","brand:wikipedia":"fr:Société nationale des chemins de fer français",name:"Boutique Grandes Lignes",shop:"ticket"},removeTags:{brand:"Boutique Grandes Lignes","brand:wikidata":"Q13646","brand:wikipedia":"fr:Société nationale des chemins de fer français",name:"Boutique Grandes Lignes",shop:"ticket"},matchScore:2,suggestion:true},"shop/ticket/Guichet Transilien":{name:"Guichet Transilien",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"ticket","brand:wikidata":"Q389554"},addTags:{brand:"Guichet Transilien","brand:wikidata":"Q389554","brand:wikipedia":"fr:Transilien",name:"Guichet Transilien",shop:"ticket"},removeTags:{brand:"Guichet Transilien","brand:wikidata":"Q389554","brand:wikipedia":"fr:Transilien",name:"Guichet Transilien",shop:"ticket"},matchScore:2,suggestion:true},"shop/toys/Dráčik":{name:"Dráčik",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q57653669"},addTags:{brand:"Dráčik","brand:wikidata":"Q57653669",name:"Dráčik",shop:"toys"},removeTags:{brand:"Dráčik","brand:wikidata":"Q57653669",name:"Dráčik",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Intertoys":{name:"Intertoys",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q1891407"},addTags:{brand:"Intertoys","brand:wikidata":"Q1891407","brand:wikipedia":"nl:Intertoys",name:"Intertoys",shop:"toys"},removeTags:{brand:"Intertoys","brand:wikidata":"Q1891407","brand:wikipedia":"nl:Intertoys",name:"Intertoys",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/JouéClub":{name:"JouéClub",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q3187152"},addTags:{brand:"JouéClub","brand:wikidata":"Q3187152","brand:wikipedia":"fr:JouéClub",name:"JouéClub",shop:"toys"},removeTags:{brand:"JouéClub","brand:wikidata":"Q3187152","brand:wikipedia":"fr:JouéClub",name:"JouéClub",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/King Jouet":{name:"King Jouet",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q3197009"},addTags:{brand:"King Jouet","brand:en":"King Toy","brand:wikidata":"Q3197009","brand:wikipedia":"fr:King Jouet",name:"King Jouet","name:en":"King Toy",shop:"toys"},removeTags:{brand:"King Jouet","brand:en":"King Toy","brand:wikidata":"Q3197009","brand:wikipedia":"fr:King Jouet",name:"King Jouet","name:en":"King Toy",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/La Grande Récré":{name:"La Grande Récré",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q3209556"},addTags:{brand:"La Grande Récré","brand:wikidata":"Q3209556","brand:wikipedia":"fr:La Grande Récré (magasin)",name:"La Grande Récré",shop:"toys"},removeTags:{brand:"La Grande Récré","brand:wikidata":"Q3209556","brand:wikipedia":"fr:La Grande Récré (magasin)",name:"La Grande Récré",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Lego":{name:"Lego",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q1063455"},addTags:{brand:"Lego","brand:wikidata":"Q1063455","brand:wikipedia":"en:The Lego Group",name:"Lego",shop:"toys"},removeTags:{brand:"Lego","brand:wikidata":"Q1063455","brand:wikipedia":"en:The Lego Group",name:"Lego",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Lekia":{name:"Lekia",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q56303274"},addTags:{brand:"Lekia","brand:wikidata":"Q56303274","brand:wikipedia":"sv:Lekia",name:"Lekia",shop:"toys"},removeTags:{brand:"Lekia","brand:wikidata":"Q56303274","brand:wikipedia":"sv:Lekia",name:"Lekia",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Maxi Toys":{name:"Maxi Toys",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q16663879"},addTags:{brand:"Maxi Toys","brand:wikidata":"Q16663879","brand:wikipedia":"fr:Maxi Toys",name:"Maxi Toys",shop:"toys"},removeTags:{brand:"Maxi Toys","brand:wikidata":"Q16663879","brand:wikipedia":"fr:Maxi Toys",name:"Maxi Toys",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/The Entertainer":{name:"The Entertainer",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q7732289"},addTags:{brand:"The Entertainer","brand:wikidata":"Q7732289","brand:wikipedia":"en:The Entertainer (retailer)",name:"The Entertainer",shop:"toys"},removeTags:{brand:"The Entertainer","brand:wikidata":"Q7732289","brand:wikipedia":"en:The Entertainer (retailer)",name:"The Entertainer",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Toys R Us":{name:"Toys R Us",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q696334"},addTags:{brand:"Toys R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Toys R Us",shop:"toys"},removeTags:{brand:"Toys R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Toys R Us",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Детский мир":{name:"Детский мир",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q16643324"},addTags:{brand:"Детский мир","brand:en":"Detskiy Mir","brand:wikidata":"Q16643324","brand:wikipedia":"en:Detsky Mir",name:"Детский мир","name:en":"Detskiy Mir",shop:"toys"},removeTags:{brand:"Детский мир","brand:en":"Detskiy Mir","brand:wikidata":"Q16643324","brand:wikipedia":"en:Detsky Mir",name:"Детский мир","name:en":"Detskiy Mir",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Кораблик":{name:"Кораблик",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q57653416"},addTags:{brand:"Кораблик","brand:wikidata":"Q57653416",name:"Кораблик",shop:"toys"},removeTags:{brand:"Кораблик","brand:wikidata":"Q57653416",name:"Кораблик",shop:"toys"},matchScore:2,suggestion:true},"shop/travel_agency/Coral Travel":{name:"Coral Travel",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q58011479"},addTags:{brand:"Coral Travel","brand:wikidata":"Q58011479",name:"Coral Travel",shop:"travel_agency"},removeTags:{brand:"Coral Travel","brand:wikidata":"Q58011479",name:"Coral Travel",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/D-reizen":{name:"D-reizen",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q2445498"},addTags:{brand:"D-reizen","brand:wikidata":"Q2445498","brand:wikipedia":"nl:D-reizen",name:"D-reizen",shop:"travel_agency"},removeTags:{brand:"D-reizen","brand:wikidata":"Q2445498","brand:wikipedia":"nl:D-reizen",name:"D-reizen",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/DER Reisebüro":{name:"DER Reisebüro",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q56729186"},addTags:{brand:"DER Reisebüro","brand:wikidata":"Q56729186","brand:wikipedia":"de:Deutsches Reisebüro",name:"DER Reisebüro",shop:"travel_agency"},removeTags:{brand:"DER Reisebüro","brand:wikidata":"Q56729186","brand:wikipedia":"de:Deutsches Reisebüro",name:"DER Reisebüro",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/First Reisebüro":{name:"First Reisebüro",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q573103"},addTags:{brand:"First Reisebüro","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"First Reisebüro",shop:"travel_agency"},removeTags:{brand:"First Reisebüro","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"First Reisebüro",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Flight Centre":{name:"Flight Centre",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q5459202"},addTags:{brand:"Flight Centre","brand:wikidata":"Q5459202","brand:wikipedia":"en:Flight Centre",name:"Flight Centre",shop:"travel_agency"},removeTags:{brand:"Flight Centre","brand:wikidata":"Q5459202","brand:wikipedia":"en:Flight Centre",name:"Flight Centre",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Halcón Viajes":{name:"Halcón Viajes",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q57591939"},addTags:{brand:"Halcón Viajes","brand:wikidata":"Q57591939",name:"Halcón Viajes",shop:"travel_agency"},removeTags:{brand:"Halcón Viajes","brand:wikidata":"Q57591939",name:"Halcón Viajes",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Havas Voyages":{name:"Havas Voyages",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q57628091"},addTags:{brand:"Havas Voyages","brand:wikidata":"Q57628091",name:"Havas Voyages",shop:"travel_agency"},removeTags:{brand:"Havas Voyages","brand:wikidata":"Q57628091",name:"Havas Voyages",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Reiseland":{name:"Reiseland",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q40387610"},addTags:{brand:"Reiseland","brand:wikidata":"Q40387610","brand:wikipedia":"de:OTTO Reisen",name:"Reiseland",shop:"travel_agency"},removeTags:{brand:"Reiseland","brand:wikidata":"Q40387610","brand:wikipedia":"de:OTTO Reisen",name:"Reiseland",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/TUI":{name:"TUI",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q573103"},addTags:{brand:"TUI","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"TUI",shop:"travel_agency"},removeTags:{brand:"TUI","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"TUI",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/The Co-operative Travel":{name:"The Co-operative Travel",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q7726526"},addTags:{brand:"The Co-operative Travel","brand:wikidata":"Q7726526","brand:wikipedia":"en:The Co-operative Travel",name:"The Co-operative Travel",shop:"travel_agency"},removeTags:{brand:"The Co-operative Travel","brand:wikidata":"Q7726526","brand:wikipedia":"en:The Co-operative Travel",name:"The Co-operative Travel",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Thomas Cook":{name:"Thomas Cook",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q2141800"},addTags:{brand:"Thomas Cook","brand:wikidata":"Q2141800","brand:wikipedia":"en:Thomas Cook Group",name:"Thomas Cook",shop:"travel_agency"},removeTags:{brand:"Thomas Cook","brand:wikidata":"Q2141800","brand:wikipedia":"en:Thomas Cook Group",name:"Thomas Cook",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Thomson":{name:"Thomson",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q7795876"},addTags:{brand:"Thomson","brand:wikidata":"Q7795876","brand:wikipedia":"en:TUI UK",name:"Thomson",shop:"travel_agency"},removeTags:{brand:"Thomson","brand:wikidata":"Q7795876","brand:wikipedia":"en:TUI UK",name:"Thomson",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Поехали с нами":{name:"Поехали с нами",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q25439141"},addTags:{brand:"Поехали с нами","brand:wikidata":"Q25439141","brand:wikipedia":"uk:Поїхали з нами",name:"Поехали с нами",shop:"travel_agency"},removeTags:{brand:"Поехали с нами","brand:wikidata":"Q25439141","brand:wikipedia":"uk:Поїхали з нами",name:"Поехали с нами",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/tyres/Big O Tires":{name:"Big O Tires",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q4906085"},addTags:{brand:"Big O Tires","brand:wikidata":"Q4906085","brand:wikipedia":"en:Big O Tires",name:"Big O Tires",shop:"tyres"},removeTags:{brand:"Big O Tires","brand:wikidata":"Q4906085","brand:wikipedia":"en:Big O Tires",name:"Big O Tires",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Bridgestone":{name:"Bridgestone",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q179433"},addTags:{brand:"Bridgestone","brand:wikidata":"Q179433","brand:wikipedia":"en:Bridgestone",name:"Bridgestone",shop:"tyres"},removeTags:{brand:"Bridgestone","brand:wikidata":"Q179433","brand:wikipedia":"en:Bridgestone",name:"Bridgestone",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Discount Tire":{name:"Discount Tire",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q5281735"},addTags:{brand:"Discount Tire","brand:wikidata":"Q5281735","brand:wikipedia":"en:Discount Tire",name:"Discount Tire",shop:"tyres"},removeTags:{brand:"Discount Tire","brand:wikidata":"Q5281735","brand:wikipedia":"en:Discount Tire",name:"Discount Tire",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Express Oil Change & Tire Engineers":{name:"Express Oil Change & Tire Engineers",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q39057654"},addTags:{brand:"Express Oil Change & Tire Engineers","brand:wikidata":"Q39057654","brand:wikipedia":"en:Express Oil Change & Tire Engineers",name:"Express Oil Change & Tire Engineers",shop:"tyres"},removeTags:{brand:"Express Oil Change & Tire Engineers","brand:wikidata":"Q39057654","brand:wikipedia":"en:Express Oil Change & Tire Engineers",name:"Express Oil Change & Tire Engineers",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Les Schwab Tire Center":{name:"Les Schwab Tire Center",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q6529977"},addTags:{brand:"Les Schwab Tire Center","brand:wikidata":"Q6529977","brand:wikipedia":"en:Les Schwab Tire Centers",name:"Les Schwab Tire Center",shop:"tyres"},removeTags:{brand:"Les Schwab Tire Center","brand:wikidata":"Q6529977","brand:wikipedia":"en:Les Schwab Tire Centers",name:"Les Schwab Tire Center",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Michelin":{name:"Michelin",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q151107"},addTags:{brand:"Michelin","brand:wikidata":"Q151107","brand:wikipedia":"en:Michelin",name:"Michelin",shop:"tyres"},removeTags:{brand:"Michelin","brand:wikidata":"Q151107","brand:wikipedia":"en:Michelin",name:"Michelin",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Vianor":{name:"Vianor",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q10714920"},addTags:{brand:"Vianor","brand:wikidata":"Q10714920","brand:wikipedia":"sv:Vianor",name:"Vianor",shop:"tyres"},removeTags:{brand:"Vianor","brand:wikidata":"Q10714920","brand:wikipedia":"sv:Vianor",name:"Vianor",shop:"tyres"},matchScore:2,suggestion:true},"shop/variety_store/Action":{name:"Action",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q2634111"},addTags:{brand:"Action","brand:wikidata":"Q2634111","brand:wikipedia":"nl:Action (winkel)",name:"Action",shop:"variety_store"},removeTags:{brand:"Action","brand:wikidata":"Q2634111","brand:wikipedia":"nl:Action (winkel)",name:"Action",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Big Bazaar":{name:"Big Bazaar",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q3631008"},addTags:{brand:"Big Bazaar","brand:wikidata":"Q3631008","brand:wikipedia":"en:Big Bazaar",name:"Big Bazaar",shop:"variety_store"},removeTags:{brand:"Big Bazaar","brand:wikidata":"Q3631008","brand:wikipedia":"en:Big Bazaar",name:"Big Bazaar",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Big Bazar":{name:"Big Bazar",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q15873104"},addTags:{brand:"Big Bazar","brand:wikidata":"Q15873104","brand:wikipedia":"nl:Big Bazar",name:"Big Bazar",shop:"variety_store"},removeTags:{brand:"Big Bazar","brand:wikidata":"Q15873104","brand:wikipedia":"nl:Big Bazar",name:"Big Bazar",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Dollar General":{name:"Dollar General",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q145168"},addTags:{brand:"Dollar General","brand:wikidata":"Q145168","brand:wikipedia":"en:Dollar General",name:"Dollar General",shop:"variety_store"},removeTags:{brand:"Dollar General","brand:wikidata":"Q145168","brand:wikipedia":"en:Dollar General",name:"Dollar General",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Dollar Tree":{name:"Dollar Tree",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q5289230"},addTags:{brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",name:"Dollar Tree",shop:"variety_store"},removeTags:{brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",name:"Dollar Tree",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Dollarama":{name:"Dollarama",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q3033947"},addTags:{brand:"Dollarama","brand:wikidata":"Q3033947","brand:wikipedia":"en:Dollarama",name:"Dollarama",shop:"variety_store"},removeTags:{brand:"Dollarama","brand:wikidata":"Q3033947","brand:wikipedia":"en:Dollarama",name:"Dollarama",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Family Dollar":{name:"Family Dollar",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q5433101"},addTags:{brand:"Family Dollar","brand:wikidata":"Q5433101","brand:wikipedia":"en:Family Dollar",name:"Family Dollar",shop:"variety_store"},removeTags:{brand:"Family Dollar","brand:wikidata":"Q5433101","brand:wikipedia":"en:Family Dollar",name:"Family Dollar",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Five Below":{name:"Five Below",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q5455836"},addTags:{brand:"Five Below","brand:wikidata":"Q5455836","brand:wikipedia":"en:Five Below",name:"Five Below",shop:"variety_store"},removeTags:{brand:"Five Below","brand:wikidata":"Q5455836","brand:wikipedia":"en:Five Below",name:"Five Below",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Fix Price":{name:"Fix Price",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q4038791"},addTags:{brand:"Fix Price","brand:wikidata":"Q4038791","brand:wikipedia":"ru:Fix Price (сеть магазинов)",name:"Fix Price",shop:"variety_store"},removeTags:{brand:"Fix Price","brand:wikidata":"Q4038791","brand:wikipedia":"ru:Fix Price (сеть магазинов)",name:"Fix Price",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/GiFi":{name:"GiFi",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q3105439"},addTags:{brand:"GiFi","brand:wikidata":"Q3105439","brand:wikipedia":"fr:Gifi",name:"GiFi",shop:"variety_store"},removeTags:{brand:"GiFi","brand:wikidata":"Q3105439","brand:wikipedia":"fr:Gifi",name:"GiFi",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Home Bargains":{name:"Home Bargains",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q5888229"},addTags:{brand:"Home Bargains","brand:wikidata":"Q5888229","brand:wikipedia":"en:Home Bargains",name:"Home Bargains",shop:"variety_store"},removeTags:{brand:"Home Bargains","brand:wikidata":"Q5888229","brand:wikipedia":"en:Home Bargains",name:"Home Bargains",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Mäc-Geiz":{name:"Mäc-Geiz",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q1957126"},addTags:{brand:"Mäc-Geiz","brand:wikidata":"Q1957126","brand:wikipedia":"de:Mäc-Geiz",name:"Mäc-Geiz",shop:"variety_store"},removeTags:{brand:"Mäc-Geiz","brand:wikidata":"Q1957126","brand:wikipedia":"de:Mäc-Geiz",name:"Mäc-Geiz",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/NOZ":{name:"NOZ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q3345688"},addTags:{brand:"NOZ","brand:wikidata":"Q3345688","brand:wikipedia":"fr:Noz",name:"NOZ",shop:"variety_store"},removeTags:{brand:"NOZ","brand:wikidata":"Q3345688","brand:wikipedia":"fr:Noz",name:"NOZ",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Poundland":{name:"Poundland",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q1434528"},addTags:{brand:"Poundland","brand:wikidata":"Q1434528","brand:wikipedia":"en:Poundland",name:"Poundland",shop:"variety_store"},removeTags:{brand:"Poundland","brand:wikidata":"Q1434528","brand:wikipedia":"en:Poundland",name:"Poundland",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Poundstretcher":{name:"Poundstretcher",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q7235675"},addTags:{brand:"Poundstretcher","brand:wikidata":"Q7235675","brand:wikipedia":"en:Poundstretcher",name:"Poundstretcher",shop:"variety_store"},removeTags:{brand:"Poundstretcher","brand:wikidata":"Q7235675","brand:wikipedia":"en:Poundstretcher",name:"Poundstretcher",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Poundworld":{name:"Poundworld",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q16967516"},addTags:{brand:"Poundworld","brand:wikidata":"Q16967516","brand:wikipedia":"en:Poundworld",name:"Poundworld",shop:"variety_store"},removeTags:{brand:"Poundworld","brand:wikidata":"Q16967516","brand:wikipedia":"en:Poundworld",name:"Poundworld",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/TEDi":{name:"TEDi",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q1364603"},addTags:{brand:"TEDi","brand:wikidata":"Q1364603","brand:wikipedia":"de:TEDi",name:"TEDi",shop:"variety_store"},removeTags:{brand:"TEDi","brand:wikidata":"Q1364603","brand:wikipedia":"de:TEDi",name:"TEDi",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Wilko":{name:"Wilko",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q8002536"},addTags:{brand:"Wilko","brand:wikidata":"Q8002536","brand:wikipedia":"en:Wilko (retailer)",name:"Wilko",shop:"variety_store"},removeTags:{brand:"Wilko","brand:wikidata":"Q8002536","brand:wikipedia":"en:Wilko (retailer)",name:"Wilko",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/キャンドゥ":{name:"キャンドゥ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q11297367"},addTags:{brand:"キャンドゥ","brand:en":"CAN DO","brand:wikidata":"Q11297367","brand:wikipedia":"ja:キャンドゥ",name:"キャンドゥ","name:en":"CAN DO",shop:"variety_store"},removeTags:{brand:"キャンドゥ","brand:en":"CAN DO","brand:wikidata":"Q11297367","brand:wikipedia":"ja:キャンドゥ",name:"キャンドゥ","name:en":"CAN DO",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/セリア":{name:"セリア",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q11314509"},addTags:{brand:"セリア","brand:en":"Seria","brand:wikidata":"Q11314509","brand:wikipedia":"ja:セリア (100円ショップ)",name:"セリア","name:en":"Seria",shop:"variety_store"},removeTags:{brand:"セリア","brand:en":"Seria","brand:wikidata":"Q11314509","brand:wikipedia":"ja:セリア (100円ショップ)",name:"セリア","name:en":"Seria",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/ダイソー":{name:"ダイソー",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q866991"},addTags:{brand:"ダイソー","brand:en":"Daiso","brand:wikidata":"Q866991","brand:wikipedia":"ja:大創産業",name:"ダイソー","name:en":"Daiso",shop:"variety_store"},removeTags:{brand:"ダイソー","brand:en":"Daiso","brand:wikidata":"Q866991","brand:wikipedia":"ja:大創産業",name:"ダイソー","name:en":"Daiso",shop:"variety_store"},matchScore:2,suggestion:true},"shop/video_games/EB Games":{name:"EB Games",icon:"maki-gaming",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"video_games","brand:wikidata":"Q4993686"},addTags:{brand:"EB Games","brand:wikidata":"Q4993686","brand:wikipedia":"en:EB Games",name:"EB Games",shop:"video_games"},removeTags:{brand:"EB Games","brand:wikidata":"Q4993686","brand:wikipedia":"en:EB Games",name:"EB Games",shop:"video_games"},matchScore:2,suggestion:true},"shop/video_games/GameStop":{name:"GameStop",icon:"maki-gaming",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"video_games","brand:wikidata":"Q202210"},addTags:{brand:"GameStop","brand:wikidata":"Q202210","brand:wikipedia":"en:GameStop",name:"GameStop",shop:"video_games"},removeTags:{brand:"GameStop","brand:wikidata":"Q202210","brand:wikipedia":"en:GameStop",name:"GameStop",shop:"video_games"},matchScore:2,suggestion:true},"shop/video_games/Micromania":{name:"Micromania",icon:"maki-gaming",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"video_games","brand:wikidata":"Q3312221"},addTags:{brand:"Micromania","brand:wikidata":"Q3312221","brand:wikipedia":"en:Micromania (video game retailer)",name:"Micromania",shop:"video_games"},removeTags:{brand:"Micromania","brand:wikidata":"Q3312221","brand:wikipedia":"en:Micromania (video game retailer)",name:"Micromania",shop:"video_games"},matchScore:2,suggestion:true},"shop/video/Blockbuster":{name:"Blockbuster",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"video","brand:wikidata":"Q884711"},addTags:{brand:"Blockbuster","brand:wikidata":"Q884711","brand:wikipedia":"en:Blockbuster LLC",name:"Blockbuster",shop:"video"},removeTags:{brand:"Blockbuster","brand:wikidata":"Q884711","brand:wikipedia":"en:Blockbuster LLC",name:"Blockbuster",shop:"video"},matchScore:2,suggestion:true},"shop/video/Family Video":{name:"Family Video",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"video","brand:wikidata":"Q5433297"},addTags:{brand:"Family Video","brand:wikidata":"Q5433297","brand:wikipedia":"en:Family Video",name:"Family Video",shop:"video"},removeTags:{brand:"Family Video","brand:wikidata":"Q5433297","brand:wikipedia":"en:Family Video",name:"Family Video",shop:"video"},matchScore:2,suggestion:true},"shop/video/TSUTAYA":{name:"TSUTAYA",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"video","brand:wikidata":"Q5193457"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"video"},removeTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"video"},matchScore:2,suggestion:true},"shop/video/ゲオ":{name:"ゲオ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"video","brand:wikidata":"Q5533938"},addTags:{brand:"GEO","brand:wikidata":"Q5533938","brand:wikipedia":"ja:ゲオ",name:"ゲオ",shop:"video"},removeTags:{brand:"GEO","brand:wikidata":"Q5533938","brand:wikipedia":"ja:ゲオ",name:"ゲオ",shop:"video"},matchScore:2,suggestion:true},"shop/watches/Swatch":{name:"Swatch",icon:"maki-watch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"watches","brand:wikidata":"Q573422"},addTags:{brand:"Swatch","brand:wikidata":"Q573422","brand:wikipedia":"en:Swatch",name:"Swatch",shop:"watches"},removeTags:{brand:"Swatch","brand:wikidata":"Q573422","brand:wikipedia":"en:Swatch",name:"Swatch",shop:"watches"},matchScore:2,suggestion:true},"shop/wholesale/Costco":{name:"Costco",icon:"maki-warehouse",fields:["name","operator","wholesale","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"wholesale","brand:wikidata":"Q715583"},addTags:{brand:"Costco","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco",shop:"wholesale",operator:"Costco"},removeTags:{brand:"Costco","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco",shop:"wholesale",operator:"Costco"},matchScore:2,suggestion:true},"shop/wholesale/Makro":{name:"Makro",icon:"maki-warehouse",fields:["name","operator","wholesale","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"wholesale","brand:wikidata":"Q704606"},addTags:{brand:"Makro","brand:wikidata":"Q704606","brand:wikipedia":"en:Makro",name:"Makro",shop:"wholesale"},removeTags:{brand:"Makro","brand:wikidata":"Q704606","brand:wikipedia":"en:Makro",name:"Makro",shop:"wholesale"},matchScore:2,suggestion:true},"shop/wholesale/Sam's Club":{name:"Sam's Club",icon:"maki-warehouse",fields:["name","operator","wholesale","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"wholesale","brand:wikidata":"Q1972120"},addTags:{brand:"Sam's Club","brand:wikipedia":"en:Sam's Club","brand:wikidata":"Q1972120",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"wholesale"},removeTags:{brand:"Sam's Club","brand:wikipedia":"en:Sam's Club","brand:wikidata":"Q1972120",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"wholesale"},matchScore:2,suggestion:true},"tourism/hotel/B&B Hôtel":{name:"B&B Hôtel",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q794939"},addTags:{brand:"B&B Hôtel","brand:wikidata":"Q794939","brand:wikipedia":"en:B&B Hotels",name:"B&B Hôtel",tourism:"hotel"},removeTags:{brand:"B&B Hôtel","brand:wikidata":"Q794939","brand:wikipedia":"en:B&B Hotels",name:"B&B Hôtel",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Best Western":{name:"Best Western",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q830334"},addTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western",tourism:"hotel"},removeTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Best Western Plus":{name:"Best Western Plus",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q830334"},addTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western Plus",tourism:"hotel"},removeTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western Plus",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Campanile":{name:"Campanile",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q2412064"},addTags:{brand:"Campanile","brand:wikidata":"Q2412064","brand:wikipedia":"fr:Campanile (chaîne d'hôtels)",name:"Campanile",tourism:"hotel"},removeTags:{brand:"Campanile","brand:wikidata":"Q2412064","brand:wikipedia":"fr:Campanile (chaîne d'hôtels)",name:"Campanile",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Candlewood Suites":{name:"Candlewood Suites",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5032010"},addTags:{brand:"Candlewood Suites","brand:wikidata":"Q5032010","brand:wikipedia":"en:Candlewood Suites",name:"Candlewood Suites",tourism:"hotel"},removeTags:{brand:"Candlewood Suites","brand:wikidata":"Q5032010","brand:wikipedia":"en:Candlewood Suites",name:"Candlewood Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Comfort Inn":{name:"Comfort Inn",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Comfort Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn",tourism:"hotel"},removeTags:{brand:"Comfort Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Comfort Inn & Suites":{name:"Comfort Inn & Suites",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Comfort Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn & Suites",tourism:"hotel"},removeTags:{brand:"Comfort Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn & Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Comfort Suites":{name:"Comfort Suites",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Comfort Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Suites",tourism:"hotel"},removeTags:{brand:"Comfort Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Country Inn & Suites":{name:"Country Inn & Suites",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5177332"},addTags:{brand:"Country Inn & Suites","brand:wikidata":"Q5177332","brand:wikipedia":"en:Country Inns & Suites",name:"Country Inn & Suites",tourism:"hotel"},removeTags:{brand:"Country Inn & Suites","brand:wikidata":"Q5177332","brand:wikipedia":"en:Country Inns & Suites",name:"Country Inn & Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Courtyard by Marriott":{name:"Courtyard by Marriott",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1053170"},addTags:{brand:"Courtyard by Marriott","brand:wikidata":"Q1053170","brand:wikipedia":"en:Courtyard by Marriott",name:"Courtyard by Marriott",tourism:"hotel"},removeTags:{brand:"Courtyard by Marriott","brand:wikidata":"Q1053170","brand:wikipedia":"en:Courtyard by Marriott",name:"Courtyard by Marriott",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Crowne Plaza":{name:"Crowne Plaza",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q2746220"},addTags:{brand:"Crowne Plaza","brand:wikidata":"Q2746220","brand:wikipedia":"en:Crowne Plaza",name:"Crowne Plaza",tourism:"hotel"},removeTags:{brand:"Crowne Plaza","brand:wikidata":"Q2746220","brand:wikipedia":"en:Crowne Plaza",name:"Crowne Plaza",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Days Inn":{name:"Days Inn",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1047239"},addTags:{brand:"Days Inn","brand:wikidata":"Q1047239","brand:wikipedia":"en:Days Inn",name:"Days Inn",tourism:"hotel"},removeTags:{brand:"Days Inn","brand:wikidata":"Q1047239","brand:wikipedia":"en:Days Inn",name:"Days Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Embassy Suites":{name:"Embassy Suites",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5369524"},addTags:{brand:"Embassy Suites","brand:wikidata":"Q5369524","brand:wikipedia":"en:Embassy Suites by Hilton",name:"Embassy Suites",tourism:"hotel"},removeTags:{brand:"Embassy Suites","brand:wikidata":"Q5369524","brand:wikipedia":"en:Embassy Suites by Hilton",name:"Embassy Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Extended Stay America":{name:"Extended Stay America",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5421850"},addTags:{brand:"Extended Stay America","brand:wikidata":"Q5421850","brand:wikipedia":"en:Extended Stay America",name:"Extended Stay America",tourism:"hotel"},removeTags:{brand:"Extended Stay America","brand:wikidata":"Q5421850","brand:wikipedia":"en:Extended Stay America",name:"Extended Stay America",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Fairfield Inn":{name:"Fairfield Inn",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5430314"},addTags:{brand:"Fairfield Inn","brand:wikidata":"Q5430314","brand:wikipedia":"en:Fairfield Inn by Marriott",name:"Fairfield Inn",tourism:"hotel"},removeTags:{brand:"Fairfield Inn","brand:wikidata":"Q5430314","brand:wikipedia":"en:Fairfield Inn by Marriott",name:"Fairfield Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Formule 1":{name:"Formule 1",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1630895"},addTags:{brand:"Formule 1","brand:wikidata":"Q1630895","brand:wikipedia":"en:Hotel Formule 1",name:"Formule 1",tourism:"hotel"},removeTags:{brand:"Formule 1","brand:wikidata":"Q1630895","brand:wikipedia":"en:Hotel Formule 1",name:"Formule 1",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hampton Inn":{name:"Hampton Inn",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5646230"},addTags:{brand:"Hampton Inn","brand:wikidata":"Q5646230","brand:wikipedia":"en:Hampton by Hilton",name:"Hampton Inn",tourism:"hotel"},removeTags:{brand:"Hampton Inn","brand:wikidata":"Q5646230","brand:wikipedia":"en:Hampton by Hilton",name:"Hampton Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hilton":{name:"Hilton",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q598884"},addTags:{brand:"Hilton","brand:wikidata":"Q598884","brand:wikipedia":"en:Hilton Hotels & Resorts",name:"Hilton",tourism:"hotel"},removeTags:{brand:"Hilton","brand:wikidata":"Q598884","brand:wikipedia":"en:Hilton Hotels & Resorts",name:"Hilton",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hilton Garden Inn":{name:"Hilton Garden Inn",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1162859"},addTags:{brand:"Hilton Garden Inn","brand:wikidata":"Q1162859","brand:wikipedia":"en:Hilton Garden Inn",name:"Hilton Garden Inn",tourism:"hotel"},removeTags:{brand:"Hilton Garden Inn","brand:wikidata":"Q1162859","brand:wikipedia":"en:Hilton Garden Inn",name:"Hilton Garden Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn":{name:"Holiday Inn",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q2717882"},addTags:{brand:"Holiday Inn","brand:wikidata":"Q2717882","brand:wikipedia":"en:Holiday Inn",name:"Holiday Inn",tourism:"hotel"},removeTags:{brand:"Holiday Inn","brand:wikidata":"Q2717882","brand:wikipedia":"en:Holiday Inn",name:"Holiday Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn Express":{name:"Holiday Inn Express",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5880423"},addTags:{brand:"Holiday Inn Express","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express",tourism:"hotel"},removeTags:{brand:"Holiday Inn Express","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn Express & Suites":{name:"Holiday Inn Express & Suites",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5880423"},addTags:{brand:"Holiday Inn Express & Suites","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express & Suites",tourism:"hotel"},removeTags:{brand:"Holiday Inn Express & Suites","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express & Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Homewood Suites":{name:"Homewood Suites",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5890701"},addTags:{brand:"Homewood Suites","brand:wikidata":"Q5890701","brand:wikipedia":"en:Homewood Suites by Hilton",name:"Homewood Suites",tourism:"hotel"},removeTags:{brand:"Homewood Suites","brand:wikidata":"Q5890701","brand:wikipedia":"en:Homewood Suites by Hilton",name:"Homewood Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ibis":{name:"Ibis",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q920166"},addTags:{brand:"Ibis","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis",tourism:"hotel"},removeTags:{brand:"Ibis","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ibis Budget":{name:"Ibis Budget",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1458135"},addTags:{brand:"Ibis Budget","brand:wikidata":"Q1458135","brand:wikipedia":"en:Ibis Budget",name:"Ibis Budget",tourism:"hotel"},removeTags:{brand:"Ibis Budget","brand:wikidata":"Q1458135","brand:wikipedia":"en:Ibis Budget",name:"Ibis Budget",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ibis Hotel":{name:"Ibis Hotel",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q920166"},addTags:{brand:"Ibis Hotel","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis Hotel",tourism:"hotel"},removeTags:{brand:"Ibis Hotel","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis Hotel",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ibis Styles":{name:"Ibis Styles",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q3147425"},addTags:{brand:"Ibis Styles","brand:wikidata":"Q3147425","brand:wikipedia":"en:Ibis Styles",name:"Ibis Styles",tourism:"hotel"},removeTags:{brand:"Ibis Styles","brand:wikidata":"Q3147425","brand:wikipedia":"en:Ibis Styles",name:"Ibis Styles",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Kyriad":{name:"Kyriad",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q11751808"},addTags:{brand:"Kyriad","brand:wikidata":"Q11751808","brand:wikipedia":"pl:Kyriad",name:"Kyriad",tourism:"hotel"},removeTags:{brand:"Kyriad","brand:wikidata":"Q11751808","brand:wikipedia":"pl:Kyriad",name:"Kyriad",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/La Quinta":{name:"La Quinta",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q6464734"},addTags:{brand:"La Quinta","brand:wikidata":"Q6464734","brand:wikipedia":"en:La Quinta Inns & Suites",name:"La Quinta",tourism:"hotel"},removeTags:{brand:"La Quinta","brand:wikidata":"Q6464734","brand:wikipedia":"en:La Quinta Inns & Suites",name:"La Quinta",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Marriott":{name:"Marriott",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1141173"},addTags:{brand:"Marriott","brand:wikidata":"Q1141173","brand:wikipedia":"en:Marriott International",name:"Marriott",tourism:"hotel"},removeTags:{brand:"Marriott","brand:wikidata":"Q1141173","brand:wikipedia":"en:Marriott International",name:"Marriott",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Mercure":{name:"Mercure",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1709809"},addTags:{brand:"Mercure","brand:wikidata":"Q1709809","brand:wikipedia":"en:Mercure (hotel)",name:"Mercure",tourism:"hotel"},removeTags:{brand:"Mercure","brand:wikidata":"Q1709809","brand:wikipedia":"en:Mercure (hotel)",name:"Mercure",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Novotel":{name:"Novotel",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q420545"},addTags:{brand:"Novotel","brand:wikidata":"Q420545","brand:wikipedia":"en:Novotel",name:"Novotel",tourism:"hotel"},removeTags:{brand:"Novotel","brand:wikidata":"Q420545","brand:wikipedia":"en:Novotel",name:"Novotel",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Premier Inn":{name:"Premier Inn",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q2108626"},addTags:{brand:"Premier Inn","brand:wikidata":"Q2108626","brand:wikipedia":"en:Premier Inn",name:"Premier Inn",tourism:"hotel"},removeTags:{brand:"Premier Inn","brand:wikidata":"Q2108626","brand:wikipedia":"en:Premier Inn",name:"Premier Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Première Classe":{name:"Première Classe",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5964551"},addTags:{brand:"Première Classe","brand:wikidata":"Q5964551","brand:wikipedia":"en:Hôtel Première Classe",name:"Première Classe",tourism:"hotel"},removeTags:{brand:"Première Classe","brand:wikidata":"Q5964551","brand:wikipedia":"en:Hôtel Première Classe",name:"Première Classe",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Quality Inn":{name:"Quality Inn",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Quality Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn",tourism:"hotel"},removeTags:{brand:"Quality Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Quality Inn & Suites":{name:"Quality Inn & Suites",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Quality Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn & Suites",tourism:"hotel"},removeTags:{brand:"Quality Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn & Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ramada":{name:"Ramada",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1502859"},addTags:{brand:"Ramada","brand:wikidata":"Q1502859","brand:wikipedia":"en:Ramada",name:"Ramada",tourism:"hotel"},removeTags:{brand:"Ramada","brand:wikidata":"Q1502859","brand:wikipedia":"en:Ramada",name:"Ramada",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Red Roof Inn":{name:"Red Roof Inn",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q7304949"},addTags:{brand:"Red Roof Inn","brand:wikidata":"Q7304949","brand:wikipedia":"en:Red Roof Inn",name:"Red Roof Inn",tourism:"hotel"},removeTags:{brand:"Red Roof Inn","brand:wikidata":"Q7304949","brand:wikipedia":"en:Red Roof Inn",name:"Red Roof Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Residence Inn":{name:"Residence Inn",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q7315394"},addTags:{brand:"Residence Inn","brand:wikidata":"Q7315394","brand:wikipedia":"en:Residence Inn by Marriott",name:"Residence Inn",tourism:"hotel"},removeTags:{brand:"Residence Inn","brand:wikidata":"Q7315394","brand:wikipedia":"en:Residence Inn by Marriott",name:"Residence Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Sheraton":{name:"Sheraton",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q634831"},addTags:{brand:"Sheraton","brand:wikidata":"Q634831","brand:wikipedia":"en:Sheraton Hotels and Resorts",name:"Sheraton",tourism:"hotel"},removeTags:{brand:"Sheraton","brand:wikidata":"Q634831","brand:wikipedia":"en:Sheraton Hotels and Resorts",name:"Sheraton",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Sleep Inn":{name:"Sleep Inn",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Sleep Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Sleep Inn",tourism:"hotel"},removeTags:{brand:"Sleep Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Sleep Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Staybridge Suites":{name:"Staybridge Suites",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q7605116"},addTags:{brand:"Staybridge Suites","brand:wikidata":"Q7605116","brand:wikipedia":"en:Staybridge Suites",name:"Staybridge Suites",tourism:"hotel"},removeTags:{brand:"Staybridge Suites","brand:wikidata":"Q7605116","brand:wikipedia":"en:Staybridge Suites",name:"Staybridge Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Travelodge":{name:"Travelodge",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q7836087"},addTags:{brand:"Travelodge","brand:wikidata":"Q7836087","brand:wikipedia":"en:Travelodge",name:"Travelodge",tourism:"hotel"},removeTags:{brand:"Travelodge","brand:wikidata":"Q7836087","brand:wikipedia":"en:Travelodge",name:"Travelodge",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/東横イン":{name:"東横イン",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1320541"},addTags:{brand:"東横イン","brand:en":"Toyoko Inn","brand:wikidata":"Q1320541","brand:wikipedia":"en:Toyoko Inn",name:"東横イン","name:en":"Toyoko Inn",tourism:"hotel"},removeTags:{brand:"東横イン","brand:en":"Toyoko Inn","brand:wikidata":"Q1320541","brand:wikipedia":"en:Toyoko Inn",name:"東横イン","name:en":"Toyoko Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/motel/Econo Lodge":{name:"Econo Lodge",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"motel","brand:wikidata":"Q5333330"},addTags:{brand:"Econo Lodge","brand:wikidata":"Q5333330","brand:wikipedia":"en:Econo Lodge",name:"Econo Lodge",tourism:"motel"},removeTags:{brand:"Econo Lodge","brand:wikidata":"Q5333330","brand:wikipedia":"en:Econo Lodge",name:"Econo Lodge",tourism:"motel"},matchScore:2,suggestion:true},"tourism/motel/Motel 6":{name:"Motel 6",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"motel","brand:wikidata":"Q2188884"},addTags:{brand:"Motel 6","brand:wikidata":"Q2188884","brand:wikipedia":"en:Motel 6",name:"Motel 6",tourism:"motel"},removeTags:{brand:"Motel 6","brand:wikidata":"Q2188884","brand:wikipedia":"en:Motel 6",name:"Motel 6",tourism:"motel"},matchScore:2,suggestion:true},"tourism/motel/Rodeway Inn":{name:"Rodeway Inn",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"motel","brand:wikidata":"Q7356709"},addTags:{brand:"Rodeway Inn","brand:wikidata":"Q7356709","brand:wikipedia":"en:Rodeway Inn",name:"Rodeway Inn",tourism:"motel"},removeTags:{brand:"Rodeway Inn","brand:wikidata":"Q7356709","brand:wikipedia":"en:Rodeway Inn",name:"Rodeway Inn",tourism:"motel"},matchScore:2,suggestion:true},"tourism/motel/Super 8":{name:"Super 8",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"motel","brand:wikidata":"Q5364003"},addTags:{brand:"Super 8","brand:wikidata":"Q5364003","brand:wikipedia":"en:Super 8 Motels",name:"Super 8",tourism:"motel"},removeTags:{brand:"Super 8","brand:wikidata":"Q5364003","brand:wikipedia":"en:Super 8 Motels",name:"Super 8",tourism:"motel"},matchScore:2,suggestion:true}};
23662
23663   var defaults = {area:["category-landuse","category-building","category-water-area","category-natural-area","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","area"],line:["category-road","category-rail","category-path","category-water-line","category-barrier","category-natural-line","category-utility","line"],point:["category-natural-point","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","amenity/fast_food","amenity/bar","amenity/bank","shop/supermarket","point"],vertex:["highway/crossing/marked","highway/crossing/unmarked","railway/level_crossing","highway/traffic_signals","highway/turning_circle","highway/turning_loop","traffic_calming","highway/mini_roundabout","highway/motorway_junction","vertex"],relation:["category-route","category-restriction","public_transport/stop_area","type/boundary","type/waterway","type/multipolygon","type/site","relation"]};
23664
23665   var categories = {"category-barrier":{icon:"maki-roadblock",geometry:"line",name:"Barrier Features",members:["barrier/fence","barrier/wall","barrier/ditch","barrier/gate","barrier/hedge","barrier/kerb","barrier"]},"category-building":{icon:"maki-building",geometry:"area",name:"Building Features",members:["building","building/house","building/apartments","building/garage","building/retail","building/commercial","building/industrial","building/residential"]},"category-golf":{icon:"maki-golf",geometry:"area",name:"Golf Features",members:["golf/fairway","golf/green","golf/lateral_water_hazard_area","golf/rough","golf/bunker","golf/tee","golf/water_hazard_area"]},"category-landuse":{icon:"maki-landuse",geometry:"area",name:"Land Use Features",members:["landuse/residential","landuse/industrial","landuse/commercial","landuse/retail","landuse/farmland","landuse/farmyard","landuse/forest","landuse/meadow","landuse/aquaculture","landuse/cemetery","landuse/military","landuse/religious"]},"category-natural-area":{icon:"maki-natural",geometry:"area",name:"Natural Features",members:["natural/water","natural/wood","natural/scrub","natural/wetland","natural/grassland","natural/heath","natural/bare_rock","natural/beach","natural/cave_entrance","natural/glacier"]},"category-natural-line":{icon:"maki-natural",geometry:"line",name:"Natural Features",members:["natural/coastline","natural/tree_row"]},"category-natural-point":{icon:"maki-natural",geometry:"point",name:"Natural Features",members:["natural/peak","natural/cliff","natural/beach","natural/cave_entrance"]},"category-path":{icon:"iD-category-path",geometry:"line",name:"Path Features",members:["highway/footway/marked","highway/footway/sidewalk","highway/steps","highway/path","highway/footway","highway/cycleway","highway/bridleway","highway/pedestrian_line"]},"category-rail":{icon:"iD-category-rail",geometry:"line",name:"Rail Features",members:["railway/rail","railway/subway","railway/tram","railway/monorail","railway/disused","railway/abandoned"]},"category-restriction":{icon:"iD-restriction",geometry:"relation",name:"Restriction Features",members:["type/restriction/no_left_turn","type/restriction/no_right_turn","type/restriction/no_straight_on","type/restriction/no_u_turn","type/restriction/only_left_turn","type/restriction/only_right_turn","type/restriction/only_straight_on","type/restriction/only_u_turn","type/restriction"]},"category-road":{icon:"iD-category-roads",geometry:"line",name:"Road Features",members:["highway/residential","highway/motorway","highway/trunk","highway/primary","highway/secondary","highway/tertiary","highway/living_street","highway/unclassified","highway/service","highway/track","highway/motorway_link","highway/trunk_link","highway/primary_link","highway/secondary_link","highway/tertiary_link","highway/road"]},"category-route":{icon:"iD-route",geometry:"relation",name:"Route Features",members:["type/route/road","type/route/bicycle","type/route/foot","type/route/hiking","type/route/horse","type/route/piste","type/route/bus","type/route/train","type/route/light_rail","type/route/tram","type/route/subway","type/route/ferry","type/route/power","type/route/pipeline","type/route/detour","type/route_master","type/route"]},"category-utility":{icon:"iD-category-utility",geometry:"line",name:"Utility Features",members:["power/line","power/minor_line","man_made/pipeline","power/cable/underground"]},"category-water-area":{icon:"maki-water",geometry:"area",name:"Water Features",members:["natural/water/lake","natural/water/pond","natural/water/reservoir","natural/water"]},"category-water-line":{icon:"iD-category-water",geometry:"line",name:"Water Features",members:["waterway/river","waterway/stream","waterway/canal","waterway/ditch","waterway/drain"]}};
23666
23667   var fields = {access_simple:{key:"access",type:"combo",label:"Allowed Access",options:["yes","permissive","private","customers","permit","no"]},access:{keys:["access","foot","motor_vehicle","bicycle","horse"],reference:{key:"access"},type:"access",label:"Allowed Access",placeholder:"Not Specified",strings:{types:{access:"All",foot:"Foot",motor_vehicle:"Motor Vehicles",bicycle:"Bicycles",horse:"Horses"},options:{yes:{title:"Allowed",description:"Access allowed by law; a right of way"},no:{title:"Prohibited",description:"Access not allowed to the general public"},permissive:{title:"Permissive",description:"Access allowed until such time as the owner revokes the permission"},"private":{title:"Private",description:"Access allowed only with permission of the owner on an individual basis"},designated:{title:"Designated",description:"Access allowed according to signs or specific local laws"},destination:{title:"Destination",description:"Access allowed only to reach a destination"},dismount:{title:"Dismount",description:"Access allowed but rider must dismount"},permit:{title:"Permit",description:"Access allowed only with a valid permit or license"}}}},address:{type:"address",keys:["addr:block_number","addr:city","addr:block_number","addr:conscriptionnumber","addr:county","addr:country","addr:county","addr:district","addr:floor","addr:hamlet","addr:housename","addr:housenumber","addr:neighbourhood","addr:place","addr:postcode","addr:province","addr:quarter","addr:state","addr:street","addr:subdistrict","addr:suburb","addr:unit"],reference:{key:"addr"},icon:"address",universal:true,label:"Address",strings:{placeholders:{block_number:"Block Number","block_number!jp":"Block No.",city:"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town",conscriptionnumber:"123",country:"Country",county:"County","county!jp":"District",district:"District","district!vn":"Arrondissement/Town/District",floor:"Floor",hamlet:"Hamlet",housename:"Housename",housenumber:"123","housenumber!jp":"Building No./Lot No.",neighbourhood:"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza",place:"Place",postcode:"Postcode",province:"Province","province!jp":"Prefecture",quarter:"Quarter","quarter!jp":"Ōaza/Machi",state:"State",street:"Street",subdistrict:"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet",suburb:"Suburb","suburb!jp":"Ward",unit:"Unit"}}},admin_level:{key:"admin_level",type:"number",minValue:1,label:"Admin Level"},aerialway:{key:"aerialway",type:"typeCombo",label:"Type"},"aerialway/access":{key:"aerialway:access",type:"combo",label:"Access",strings:{options:{entry:"Entry",exit:"Exit",both:"Both"}}},"aerialway/bubble":{key:"aerialway:bubble",type:"check",label:"Bubble"},"aerialway/capacity":{key:"aerialway:capacity",type:"number",minValue:0,label:"Capacity (per hour)",placeholder:"500, 2500, 5000..."},"aerialway/duration":{key:"aerialway:duration",type:"number",minValue:0,label:"Duration (minutes)",placeholder:"1, 2, 3..."},"aerialway/heating":{key:"aerialway:heating",type:"check",label:"Heated"},"aerialway/occupancy":{key:"aerialway:occupancy",type:"number",minValue:0,label:"Occupancy",placeholder:"2, 4, 8..."},"aerialway/summer/access":{key:"aerialway:summer:access",type:"combo",label:"Access (summer)",strings:{options:{entry:"Entry",exit:"Exit",both:"Both"}}},aeroway:{key:"aeroway",type:"typeCombo",label:"Type"},agrarian:{key:"agrarian",type:"semiCombo",label:"Products"},amenity:{key:"amenity",type:"typeCombo",label:"Type"},animal_boarding:{key:"animal_boarding",type:"semiCombo",label:"For Animals"},animal_breeding:{key:"animal_breeding",type:"semiCombo",label:"For Animals"},animal_shelter:{key:"animal_shelter",type:"semiCombo",label:"For Animals"},"area/highway":{key:"area:highway",type:"typeCombo",label:"Type"},artist:{key:"artist_name",type:"text",label:"Artist"},artwork_type:{key:"artwork_type",type:"combo",label:"Type"},atm:{key:"atm",type:"check",label:"ATM"},backrest:{key:"backrest",type:"check",label:"Backrest"},barrier:{key:"barrier",type:"typeCombo",label:"Type"},"bath/open_air":{key:"bath:open_air",label:"Open Air",type:"check"},"bath/sand_bath":{key:"bath:sand_bath",label:"Sand Bath",type:"check"},"bath/type":{key:"bath:type",type:"combo",label:"Specialty",strings:{options:{onsen:"Japanese Onsen",foot_bath:"Foot Bath",hot_spring:"Hot Spring"}}},beauty:{key:"beauty",type:"combo",label:"Shop Type"},bench:{key:"bench",type:"check",label:"Bench"},bicycle_parking:{key:"bicycle_parking",type:"combo",label:"Type"},bin:{key:"bin",type:"check",label:"Waste Bin"},blood_components:{key:"blood:",type:"multiCombo",label:"Blood Components",strings:{options:{whole:"whole blood",plasma:"plasma",platelets:"platelets",stemcells:"stem cell samples"}}},board_type:{key:"board_type",type:"typeCombo",label:"Type"},booth:{key:"booth",type:"combo",label:"Booth",caseSensitive:true},boules:{key:"boules",type:"typeCombo",label:"Type"},boundary:{key:"boundary",type:"combo",label:"Type"},brand:{key:"brand",type:"text",label:"Brand"},brewery:{key:"brewery",type:"semiCombo",label:"Draft Beers"},bridge:{key:"bridge",type:"typeCombo",label:"Type",placeholder:"Default"},"bridge/support":{key:"bridge:support",type:"combo",label:"Type"},building_area:{key:"building",type:"combo","default":"yes",geometry:"area",label:"Building"},building:{key:"building",type:"combo",label:"Building"},bunker_type:{key:"bunker_type",type:"combo",label:"Type"},cables:{key:"cables",type:"number",minValue:1,label:"Cables",placeholder:"1, 2, 3..."},"camera/direction":{key:"camera:direction",type:"number",label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},"camera/mount":{key:"camera:mount",type:"combo",label:"Camera Mount"},"camera/type":{key:"camera:type",type:"combo",label:"Camera Type",strings:{options:{fixed:"Fixed",panning:"Panning",dome:"Dome"}}},capacity:{key:"capacity",type:"number",minValue:0,label:"Capacity",placeholder:"50, 100, 200..."},cash_in:{key:"cash_in",type:"check",label:"Cash In"},castle_type:{key:"castle_type",type:"combo",label:"Type"},clothes:{key:"clothes",type:"semiCombo",label:"Clothes"},club:{key:"club",type:"typeCombo",label:"Type"},collection_times:{key:"collection_times",type:"text",label:"Collection Times"},colour:{key:"colour",type:"text",label:"Color"},comment:{key:"comment",type:"textarea",label:"Changeset Comment",placeholder:"Brief description of your contributions (required)"},communication_multi:{key:"communication:",type:"multiCombo",label:"Communication Types"},construction:{key:"construction",type:"combo",label:"Type"},"contact/webcam":{key:"contact:webcam",type:"url",icon:"website",label:"Webcam URL",placeholder:"http://example.com/"},content:{key:"content",type:"combo",label:"Content",options:["silage","water","oil","fuel","slurry","gas","manure","sewage"]},conveying:{key:"conveying",type:"typeCombo",label:"Movement Direction",strings:{options:{forward:"Forward",backward:"Backward",reversible:"Reversible"}}},country:{key:"country",type:"combo",label:"Country"},covered:{key:"covered",type:"check",label:"Covered"},craft:{key:"craft",type:"typeCombo",label:"Type"},"crane/type":{key:"crane:type",type:"combo",label:"Crane Type",strings:{options:{portal_crane:"Portal Crane","floor-mounted_crane":"Floor-mounted Crane",travel_lift:"Travel Lift"}}},crop:{key:"crop",type:"semiCombo",label:"Crops"},crossing:{key:"crossing",type:"combo",label:"Type"},cuisine:{key:"cuisine",type:"semiCombo",label:"Cuisines"},currency_multi:{key:"currency:",type:"multiCombo",label:"Currency Types"},cutting:{key:"cutting",type:"typeCombo",label:"Type",placeholder:"Default"},cycle_network:{key:"cycle_network",type:"networkCombo",label:"Network"},cycleway:{keys:["cycleway:left","cycleway:right"],reference:{key:"cycleway"},type:"cycleway",label:"Bike Lanes",placeholder:"none",strings:{types:{"cycleway:left":"Left side","cycleway:right":"Right side"},options:{none:{title:"None",description:"No bike lane"},lane:{title:"Standard bike lane",description:"A bike lane separated from auto traffic by a painted line"},shared_lane:{title:"Shared bike lane",description:"A bike lane with no separation from auto traffic"},track:{title:"Bike track",description:"A bike lane separated from traffic by a physical barrier"},share_busway:{title:"Bike lane shared with bus",description:"A bike lane shared with a bus lane"},opposite_lane:{title:"Opposite bike lane",description:"A bike lane that travels in the opposite direction of traffic"},opposite:{title:"Contraflow bike lane",description:"A bike lane that travels in both directions on a one-way street"}}}},"dance/style":{key:"dance:style",type:"semiCombo",label:"Dance Styles"},date:{key:"date",type:"check",label:"Date"},delivery:{key:"delivery",type:"check",label:"Delivery"},denomination:{key:"denomination",type:"combo",label:"Denomination"},denotation:{key:"denotation",type:"combo",label:"Denotation"},description:{key:"description",type:"textarea",label:"Description",universal:true},design:{key:"design",type:"combo",label:"Design"},devices:{key:"devices",type:"number",minValue:0,label:"Devices",placeholder:"1, 2, 3..."},diaper:{key:"diaper",type:"combo",label:"Diaper Changing Available",options:["yes","no","room","1","2","3","4","5"]},direction_cardinal:{key:"direction",type:"combo",label:"Direction",strings:{options:{N:"North",E:"East",S:"South",W:"West",NE:"Northeast",SE:"Southeast",SW:"Southwest",NW:"Northwest",NNE:"North-northeast",ENE:"East-northeast",ESE:"East-southeast",SSE:"South-southeast",SSW:"South-southwest",WSW:"West-southwest",WNW:"West-northwest",NNW:"North-northwest"}}},direction_clock:{key:"direction",type:"combo",label:"Direction",strings:{options:{clockwise:"Clockwise",anticlockwise:"Counterclockwise"}}},direction_vertex:{key:"direction",type:"combo",label:"Direction",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},direction:{key:"direction",type:"number",label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},dispensing:{key:"dispensing",type:"check",label:"Dispenses Prescriptions","default":"yes"},display:{key:"display",type:"combo",label:"Display",options:["analog","digital","sundial","unorthodox"]},distance:{key:"distance",type:"text",label:"Distance"},dock:{key:"dock",type:"combo",label:"Type"},drive_through:{key:"drive_through",type:"check",label:"Drive-Through"},duration:{key:"duration",type:"text",label:"Duration",placeholder:"00:00"},electrified:{key:"electrified",type:"combo",label:"Electrification",placeholder:"Contact Line, Electrified Rail...",strings:{options:{contact_line:"Contact Line",rail:"Electrified Rail",yes:"Yes (unspecified)",no:"No"}}},elevation:{key:"ele",type:"number",icon:"elevation",universal:true,label:"Elevation"},email:{key:"email",type:"email",placeholder:"example@example.com",universal:true,label:"Email"},embankment:{key:"embankment",type:"typeCombo",label:"Type",placeholder:"Default"},emergency:{key:"emergency",type:"check",label:"Emergency"},entrance:{key:"entrance",type:"typeCombo",label:"Type"},except:{key:"except",type:"combo",label:"Exceptions"},faces:{key:"faces",type:"number",minValue:0,label:"Faces"},fax:{key:"fax",type:"tel",label:"Fax",universal:true,placeholder:"+31 42 123 4567"},fee:{key:"fee",type:"check",label:"Fee"},fence_type:{key:"fence_type",type:"combo",label:"Type"},"fire_hydrant/position":{key:"fire_hydrant:position",type:"combo",label:"Position",strings:{options:{lane:"Lane",parking_lot:"Parking Lot",sidewalk:"Sidewalk",green:"Green"}}},"fire_hydrant/type":{key:"fire_hydrant:type",type:"combo",label:"Type",strings:{options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pond:"Pond"}}},fireplace:{key:"fireplace",type:"check",label:"Fireplace"},fitness_station:{key:"fitness_station",type:"typeCombo",label:"Equipment Type"},fixme:{key:"fixme",type:"textarea",label:"Fix Me",universal:true},"flag/type":{key:"flag:type",type:"combo",label:"Flag Type"},ford:{key:"ford",type:"typeCombo",label:"Type",placeholder:"Default"},frequency:{key:"frequency",type:"combo",label:"Operating Frequency"},from:{key:"from",type:"text",label:"From"},fuel_multi:{key:"fuel:",type:"multiCombo",label:"Fuel Types"},fuel:{key:"fuel",type:"combo",label:"Fuel"},gauge:{key:"gauge",type:"combo",label:"Gauge"},gender:{type:"radio",keys:["male","female","unisex"],label:"Gender",placeholder:"Unknown",strings:{options:{male:"Male",female:"Female",unisex:"Unisex"}}},"generator/method":{key:"generator:method",type:"combo",label:"Method"},"generator/output/electricity":{key:"generator:output:electricity",type:"typeCombo",label:"Power Output",placeholder:"50 MW, 100 MW, 200 MW...",snake_case:false},"generator/source":{key:"generator:source",type:"combo",label:"Source"},"generator/type":{key:"generator:type",type:"combo",label:"Type"},government:{key:"government",type:"typeCombo",label:"Type"},grape_variety:{key:"grape_variety",type:"semiCombo",label:"Grape Varieties"},handicap:{key:"handicap",type:"number",label:"Handicap",placeholder:"1-18"},handrail:{key:"handrail",type:"check",label:"Handrail"},hashtags:{key:"hashtags",type:"semiCombo",label:"Suggested Hashtags",placeholder:"#example"},healthcare:{key:"healthcare",type:"typeCombo",label:"Type"},"healthcare/speciality":{key:"healthcare:speciality",type:"semiCombo",reference:{key:"healthcare"},label:"Specialties"},height:{key:"height",minValue:0,type:"number",label:"Height (Meters)"},highway:{key:"highway",type:"typeCombo",label:"Type"},historic:{key:"historic",type:"typeCombo",label:"Type"},"historic/civilization":{key:"historic:civilization",type:"combo",label:"Historic Civilization"},"historic/wreck/date_sunk":{key:"wreck:date_sunk",type:"text",label:"Date Sunk"},"historic/wreck/visible_at_high_tide":{key:"wreck:visible_at_high_tide",type:"check",label:"Visible At High Tide"},"historic/wreck/visible_at_low_tide":{key:"wreck:visible_at_low_tide",type:"check",label:"Visible At Low Tide"},hoops:{key:"hoops",type:"number",minValue:0,label:"Hoops",placeholder:"1, 2, 4..."},horse_dressage:{key:"sport",type:"check",label:"Dressage Riding",strings:{options:{"undefined":"No",equestrian:"Yes"}},reference:{key:"sport",value:"equestrian"}},horse_riding:{key:"leisure",type:"check",label:"Horseback Riding",strings:{options:{"undefined":"No",horse_riding:"Yes"}},reference:{key:"leisure",value:"horse_riding"}},horse_scale:{key:"horse_scale",type:"combo",label:"Horseback Riding Difficulty",placeholder:"Difficult, Dangerous...",strings:{options:{common:"Easy: No problems or difficulties. (default)",demanding:"Use with caution: Uneven way, occasional difficult passages.",difficult:"Difficult: Way narrow and exposed. May contain obstacles to step over and narrow passages.",critical:"Borderline: Passable only for experienced riders and horses. Major obstacles. Bridges should be examined carefully.",dangerous:"Dangerous: Passable only for very experienced riders and horses and only in good weather. Dismount.",impossible:"Impassable: Way or bridge not passable for horses. Too narrow, insuffient support, obstacles like ladders. Danger of life."}}},horse_stables:{key:"amenity",type:"check",label:"Riding Stable",strings:{options:{"undefined":"No",stables:"Yes"}},reference:{key:"amenity",value:"stables"}},iata:{key:"iata",type:"text",label:"IATA"},icao:{key:"icao",type:"text",label:"ICAO"},incline_steps:{key:"incline",type:"combo",label:"Incline",strings:{options:{up:"Up",down:"Down"}}},incline:{key:"incline",type:"combo",label:"Incline"},indoor:{key:"indoor",type:"check",label:"Indoor"},industrial:{key:"industrial",type:"combo",label:"Type"},information:{key:"information",type:"typeCombo",label:"Type"},inscription:{key:"inscription",type:"textarea",label:"Inscription"},intermittent:{key:"intermittent",type:"check",label:"Intermittent"},internet_access:{key:"internet_access",type:"combo",label:"Internet Access",strings:{options:{yes:"Yes",no:"No",wlan:"Wifi",wired:"Wired",terminal:"Terminal"}}},"internet_access/fee":{key:"internet_access:fee",type:"check",label:"Internet Access Fee"},"internet_access/ssid":{key:"internet_access:ssid",type:"text",label:"SSID (Network Name)"},kerb:{key:"kerb",type:"combo",label:"Curb"},label:{key:"label",type:"textarea",label:"Label"},lamp_type:{key:"lamp_type",type:"combo",label:"Type"},landuse:{key:"landuse",type:"typeCombo",label:"Type"},lanes:{key:"lanes",type:"number",minValue:0,label:"Lanes",placeholder:"1, 2, 3..."},language_multi:{key:"language:",type:"multiCombo",label:"Languages"},layer:{key:"layer",type:"number",label:"Layer",placeholder:"0"},leaf_cycle_singular:{key:"leaf_cycle",type:"combo",label:"Leaf Cycle",strings:{options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous"}}},leaf_cycle:{key:"leaf_cycle",type:"combo",label:"Leaf Cycle",strings:{options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous",mixed:"Mixed"}}},leaf_type_singular:{key:"leaf_type",type:"combo",label:"Leaf Type",strings:{options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",leafless:"Leafless"}}},leaf_type:{key:"leaf_type",type:"combo",label:"Leaf Type",strings:{options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",mixed:"Mixed",leafless:"Leafless"}}},leisure:{key:"leisure",type:"typeCombo",label:"Type"},length:{key:"length",type:"number",minValue:0,label:"Length (Meters)"},level:{key:"level",type:"combo",label:"Level",universal:true},levels:{key:"building:levels",type:"number",minValue:0,label:"Levels",placeholder:"2, 4, 6..."},lit:{key:"lit",type:"check",label:"Lit"},location_pool:{key:"location",type:"typeCombo",label:"Location",strings:{options:{outdoor:"Outdoor",indoor:"Indoor",roof:"Rooftop"}}},location:{key:"location",type:"combo",label:"Location"},man_made:{key:"man_made",type:"typeCombo",label:"Type"},manhole:{key:"manhole",type:"typeCombo",label:"Type"},map_size:{key:"map_size",type:"typeCombo",label:"Coverage"},map_type:{key:"map_type",type:"typeCombo",label:"Type"},material:{key:"material",type:"combo",universal:true,label:"Material"},maxheight:{key:"maxheight",type:"combo",label:"Max Height",placeholder:"4, 4.5, 5, 14'0\", 14'6\", 15'0\"",snake_case:false},maxspeed:{key:"maxspeed",type:"maxspeed",label:"Speed Limit",placeholder:"40, 50, 60..."},"maxspeed/advisory":{key:"maxspeed:advisory",type:"maxspeed",label:"Advisory Speed Limit",placeholder:"40, 50, 60..."},maxstay:{key:"maxstay",type:"combo",label:"Max Stay",options:["15 min","30 min","45 min","1 hr","1.5 hr","2 hr","2.5 hr","3 hr","4 hr","1 day","2 day"],snake_case:false},maxweight:{key:"maxweight",type:"combo",label:"Max Weight",snake_case:false},memorial:{key:"memorial",type:"typeCombo",label:"Type"},monitoring_multi:{key:"monitoring:",type:"multiCombo",label:"Monitoring"},"mtb/scale":{key:"mtb:scale",type:"combo",label:"Mountain Biking Difficulty",placeholder:"0, 1, 2, 3...",strings:{options:{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}}},"mtb/scale/imba":{key:"mtb:scale:imba",type:"combo",label:"IMBA Trail Difficulty",placeholder:"Easy, Medium, Difficult...",strings:{options:{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}}},"mtb/scale/uphill":{key:"mtb:scale:uphill",type:"combo",label:"Mountain Biking Uphill Difficulty",placeholder:"0, 1, 2, 3...",strings:{options:{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}}},name:{key:"name",type:"localized",label:"Name",universal:true,placeholder:"Common name (if any)"},natural:{key:"natural",type:"typeCombo",label:"Natural"},network_bicycle:{key:"network",type:"combo",label:"Network Type",placeholder:"Local, Regional, National, International",strings:{options:{lcn:"Local",rcn:"Regional",ncn:"National",icn:"International"}}},network_foot:{key:"network",type:"combo",label:"Network Type",placeholder:"Local, Regional, National, International",strings:{options:{lwn:"Local",rwn:"Regional",nwn:"National",iwn:"International"}}},network_horse:{key:"network",type:"combo",label:"Network Type",placeholder:"Local, Regional, National, International",strings:{options:{lhn:"Local",rhn:"Regional",nhn:"National",ihn:"International"}}},network_road:{key:"network",type:"networkCombo",label:"Network"},network:{key:"network",type:"text",label:"Network"},note:{key:"note",type:"textarea",universal:true,icon:"note",label:"Note"},office:{key:"office",type:"typeCombo",label:"Type"},oneway_yes:{key:"oneway",type:"onewayCheck",label:"One Way",strings:{options:{"undefined":"Assumed to be Yes",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}}},oneway:{key:"oneway",type:"onewayCheck",label:"One Way",strings:{options:{"undefined":"Assumed to be No",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}}},opening_hours:{key:"opening_hours",type:"combo",label:"Hours",snake_case:false},operator:{key:"operator",type:"text",label:"Operator"},outdoor_seating:{key:"outdoor_seating",type:"check",label:"Outdoor Seating"},par:{key:"par",type:"number",minValue:1,label:"Par",placeholder:"3, 4, 5..."},park_ride:{key:"park_ride",type:"check",label:"Park and Ride"},parking:{key:"parking",type:"combo",label:"Type",strings:{options:{surface:"Surface","multi-storey":"Multilevel",underground:"Underground",sheds:"Sheds",carports:"Carports",garage_boxes:"Garage Boxes",lane:"Roadside Lane"}}},passenger_information_display:{key:"passenger_information_display",type:"check",label:"Passenger information display"},payment_multi:{key:"payment:",type:"multiCombo",label:"Payment Types",universal:true},phases:{key:"phases",type:"number",minValue:1,label:"Phases",placeholder:"1, 2, 3..."},phone:{key:"phone",type:"tel",icon:"maki-telephone",universal:true,label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty_downhill":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice (instructional)",easy:"Easy (green circle)",intermediate:"Intermediate (blue square)",advanced:"Advanced (black diamond)",expert:"Expert (double black diamond)",freeride:"Freeride (off-piste)",extreme:"Extreme (climbing equipment required)"}}},"piste/difficulty_nordic":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice - Flat, no effort needed",easy:"Easy - Soft hills, short steep section",intermediate:"Intermediate - Steep section",advanced:"Advanced - Narrow, steep or icy section, sharp turn",expert:"Expert - Dangerous terrain around"}}},"piste/difficulty_skitour":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice - L: <30° incline",easy:"Easy - WS: 30-35° incline",intermediate:"Intermediate - ZS: 35-40° incline",advanced:"Advanced - S: 40-45° incline",expert:"Expert - SS: 45–50° incline",freeride:"Freeride - AS: 50–55° incline",extreme:"Extreme - EX: >55° incline"}}},"piste/difficulty":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice",easy:"Easy",intermediate:"Intermediate",advanced:"Advanced",expert:"Expert",freeride:"Freeride",extreme:"Extreme"}}},"piste/grooming_downhill":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry - no grooming"}}},"piste/grooming_hike":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic - Winter Hiking",backcountry:"Backcountry - Snowshoeing"}}},"piste/grooming_nordic":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",backcountry:"Backcountry, no grooming","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}}},"piste/grooming":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}}},"piste/type":{key:"piste:type",type:"typeCombo",label:"Type",strings:{options:{downhill:"Downhill",nordic:"Nordic",skitour:"Skitour",sled:"Sled",hike:"Hike",sleigh:"Sleigh",ice_skate:"Ice Skate",snow_park:"Snow Park",playground:"Playground",connection:"Connection"}}},place:{key:"place",type:"typeCombo",label:"Type"},plant:{key:"plant",type:"combo",label:"Plant"},"plant/output/electricity":{key:"plant:output:electricity",type:"text",label:"Power Output",placeholder:"500 MW, 1000 MW, 2000 MW..."},"playground/baby":{key:"baby",type:"check",label:"Baby Seat"},"playground/max_age":{key:"max_age",type:"number",minValue:0,label:"Maximum Age"},"playground/min_age":{key:"min_age",type:"number",minValue:0,label:"Minimum Age"},population:{key:"population",type:"text",label:"Population"},power_supply:{key:"power_supply",type:"check",label:"Power Supply"},power:{key:"power",type:"typeCombo",label:"Type"},produce:{key:"produce",type:"semiCombo",label:"Produce"},product:{key:"product",type:"semiCombo",label:"Products"},railway:{key:"railway",type:"typeCombo",label:"Type"},"railway/position":{key:"railway:position",type:"text",placeholder:"Distance to one decimal (123.4)",label:"Milestone Position"},"railway/signal/direction":{key:"railway:signal:direction",type:"combo",label:"Direction",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},rating:{key:"rating",type:"combo",label:"Power Rating",snake_case:false},recycling_accepts:{key:"recycling:",type:"multiCombo",label:"Accepts"},recycling_type:{key:"recycling_type",type:"combo",label:"Type",placeholder:"Container, Center",strings:{options:{container:"Container",centre:"Center"}}},ref_aeroway_gate:{key:"ref",type:"text",label:"Gate Number"},ref_golf_hole:{key:"ref",type:"text",label:"Hole Number",placeholder:"1-18"},ref_highway_junction:{key:"ref",type:"text",label:"Junction Number"},ref_platform:{key:"ref",type:"text",label:"Platform Number"},ref_road_number:{key:"ref",type:"text",label:"Road Number"},ref_route:{key:"ref",type:"text",label:"Route Number"},ref_runway:{key:"ref",type:"text",label:"Runway Number",placeholder:"e.g. 01L/19R"},ref_stop_position:{key:"ref",type:"text",label:"Stop Number"},ref_taxiway:{key:"ref",type:"text",label:"Taxiway Name",placeholder:"e.g. A5"},ref:{key:"ref",type:"text",label:"Reference Code"},"ref/isil":{key:"ref:isil",type:"text",label:"ISIL Code"},relation:{key:"type",type:"combo",label:"Type"},religion:{key:"religion",type:"combo",label:"Religion"},restriction:{key:"restriction",type:"combo",label:"Type"},restrictions:{type:"restrictions",geometry:"vertex",icon:"iD-restrictions",reference:{rtype:"restriction"},label:"Turn Restrictions"},rooms:{key:"rooms",type:"number",minValue:0,label:"Rooms"},route_master:{key:"route_master",type:"combo",label:"Type"},route:{key:"route",type:"combo",label:"Type"},sac_scale:{key:"sac_scale",type:"combo",label:"Hiking Difficulty",placeholder:"Mountain Hiking, Alpine Hiking...",strings:{options:{hiking:"T1: Hiking",mountain_hiking:"T2: Mountain Hiking",demanding_mountain_hiking:"T3: Demanding Mountain Hiking",alpine_hiking:"T4: Alpine Hiking",demanding_alpine_hiking:"T5: Demanding Alpine Hiking",difficult_alpine_hiking:"T6: Difficult Alpine Hiking"}}},sanitary_dump_station:{key:"sanitary_dump_station",type:"check",label:"Toilet Disposal"},scuba_diving:{key:"scuba_diving:",type:"multiCombo",label:"Services",options:["repair","courses","rental","filling","air_filling","nitrox_filling","trimix_filling","oxygen_filling"]},"seamark/beacon_isolated_danger/shape":{key:"seamark:beacon_isolated_danger:shape",type:"combo",label:"Shape"},"seamark/beacon_lateral/category":{key:"seamark:beacon_lateral:category",type:"combo",label:"Category",strings:{options:{port:"Port",starboard:"Starboard",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right"}}},"seamark/beacon_lateral/colour":{key:"seamark:beacon_lateral:colour",type:"combo",label:"Color",strings:{options:{red:"Red",green:"Green",grey:"Grey"}}},"seamark/beacon_lateral/shape":{key:"seamark:beacon_lateral:shape",type:"combo",label:"Shape"},"seamark/beacon_lateral/system":{key:"seamark:beacon_lateral:system",type:"combo",label:"System",strings:{options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}}},"seamark/buoy_lateral/category":{key:"seamark:buoy_lateral:category",type:"combo",label:"Category",strings:{options:{port:"Port",starboard:"Starboard",channel_left:"Channel Left",channel_right:"Channel Right",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right",preferred_channel_port:"Preferred Channel Port",preferred_channel_starboard:"Preferred Channel Starboard"}}},"seamark/buoy_lateral/colour":{key:"seamark:buoy_lateral:colour",type:"combo",label:"Color",strings:{options:{red:"Red",green:"Green","red;white;red;white":"Red-White-Red-White","green;white;green;white":"Green-White-Green-White","red;green;red":"Red-Green-Red","green;red;green":"Green-Red-Green",white:"White",yellow:"Yellow"}}},"seamark/buoy_lateral/shape":{key:"seamark:buoy_lateral:shape",type:"combo",label:"Shape"},"seamark/buoy_lateral/system":{key:"seamark:buoy_lateral:system",type:"combo",label:"System",strings:{options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}}},"seamark/mooring/category":{key:"seamark:mooring:category",type:"combo",label:"Category"},"seamark/type":{key:"seamark:type",type:"combo",universal:true,label:"Seamark"},"seamark/wreck/category":{key:"seamark:wreck:category",type:"combo",label:"Category"},seasonal:{key:"seasonal",type:"check",label:"Seasonal"},seats:{key:"seats",type:"number",minValue:0,label:"Seats",placeholder:"2, 4, 6..."},second_hand:{key:"second_hand",type:"combo",label:"Sells Used",placeholder:"Yes, No, Only",strings:{options:{yes:"Yes",no:"No",only:"Only"}}},service_rail:{key:"service",type:"combo",label:"Service Type",strings:{options:{spur:"Spur",yard:"Yard",siding:"Siding",crossover:"Crossover"}}},service_times:{key:"service_times",type:"text",label:"Service Times"},service:{key:"service",type:"combo",label:"Type",options:["parking_aisle","driveway","alley","emergency_access","drive-through"]},"service/bicycle":{key:"service:bicycle:",type:"multiCombo",label:"Services"},"service/vehicle":{key:"service:vehicle:",type:"multiCombo",label:"Services"},shelter_type:{key:"shelter_type",type:"combo",label:"Type"},shelter:{key:"shelter",type:"check",label:"Shelter"},shop:{key:"shop",type:"typeCombo",label:"Type"},"siren/purpose":{key:"siren:purpose",type:"combo",label:"Purpose"},"siren/type":{key:"siren:type",type:"combo",label:"Type",strings:{options:{pneumatic:"Pneumatic",electronic:"Electronic",other:"Other"}}},site_type:{key:"site_type",type:"combo",label:"Site Type"},site:{key:"site",type:"combo",label:"Type"},smoking:{key:"smoking",type:"combo",label:"Smoking",placeholder:"No, Separated, Yes...",strings:{options:{no:"No smoking anywhere",separated:"In smoking areas, not physically isolated",isolated:"In smoking areas, physically isolated",outside:"Allowed outside",yes:"Allowed everywhere",dedicated:"Dedicated to smokers (e.g. smokers' club)"}}},smoothness:{key:"smoothness",type:"combo",label:"Smoothness",placeholder:"Thin Rollers, Wheels, Off-Road...",strings:{options:{excellent:"Thin Rollers: rollerblade, skateboard",good:"Thin Wheels: racing bike",intermediate:"Wheels: city bike, wheelchair, scooter",bad:"Robust Wheels: trekking bike, car, rickshaw",very_bad:"High Clearance: light duty off-road vehicle",horrible:"Off-Road: heavy duty off-road vehicle",very_horrible:"Specialized off-road: tractor, ATV",impassable:"Impassable / No wheeled vehicle"}}},social_facility_for:{key:"social_facility:for",type:"combo",label:"People Served"},social_facility:{key:"social_facility",type:"combo",label:"Type"},source:{key:"source",type:"semiCombo",icon:"source",universal:true,label:"Sources",snake_case:false,caseSensitive:true,options:["survey","local knowledge","gps","aerial imagery","streetlevel imagery"]},sport_ice:{key:"sport",type:"semiCombo",label:"Sports",options:["skating","hockey","multi","curling","ice_stock"]},sport_racing_motor:{key:"sport",type:"semiCombo",label:"Sports",options:["motor","karting","motocross"]},sport_racing_nonmotor:{key:"sport",type:"semiCombo",label:"Sports",options:["bmx","cycling","dog_racing","horse_racing","running"]},sport:{key:"sport",type:"semiCombo",label:"Sports"},stars:{key:"stars",type:"combo",label:"Stars"},start_date:{key:"start_date",type:"text",universal:true,label:"Start Date"},step_count:{key:"step_count",type:"number",minValue:0,label:"Number of Steps"},stop:{key:"stop",type:"combo",label:"Stop Type",strings:{options:{all:"All Ways",minor:"Minor Road"}}},structure_waterway:{type:"structureRadio",keys:["tunnel"],label:"Structure",placeholder:"Unknown",strings:{options:{tunnel:"Tunnel"}}},structure:{type:"structureRadio",keys:["bridge","tunnel","embankment","cutting","ford"],label:"Structure",placeholder:"Unknown",strings:{options:{bridge:"Bridge",tunnel:"Tunnel",embankment:"Embankment",cutting:"Cutting",ford:"Ford"}}},studio:{key:"studio",type:"combo",label:"Type"},substance:{key:"substance",type:"combo",label:"Substance"},substation:{key:"substation",type:"typeCombo",label:"Type"},supervised:{key:"supervised",type:"check",label:"Supervised"},support:{key:"support",type:"combo",label:"Support"},surface:{key:"surface",type:"combo",label:"Surface"},surveillance:{key:"surveillance",type:"combo",label:"Surveillance Kind"},"surveillance/type":{key:"surveillance:type",type:"combo",label:"Surveillance Type",strings:{options:{camera:"Camera",guard:"Guard",ALPR:"Automatic License Plate Reader"}}},"surveillance/zone":{key:"surveillance:zone",type:"combo",label:"Surveillance Zone"},swimming_pool:{key:"swimming_pool",type:"combo",label:"Type"},"switch":{key:"switch",type:"combo",label:"Type",strings:{options:{mechanical:"Mechanical",circuit_breaker:"Circuit Breaker",disconnector:"Disconnector",earthing:"Earthing"}}},tactile_paving:{key:"tactile_paving",type:"check",label:"Tactile Paving"},takeaway:{key:"takeaway",type:"combo",label:"Takeaway",placeholder:"Yes, No, Takeaway Only...",strings:{options:{yes:"Yes",no:"No",only:"Takeaway Only"}}},to:{key:"to",type:"text",label:"To"},"toilets/disposal":{key:"toilets:disposal",type:"combo",label:"Disposal",strings:{options:{flush:"Flush",pitlatrine:"Pit/Latrine",chemical:"Chemical",bucket:"Bucket"}}},toll:{key:"toll",type:"check",label:"Toll"},tomb:{key:"tomb",type:"typeCombo",label:"Type"},tourism_attraction:{key:"tourism","default":"attraction",type:"typeCombo",universal:true,label:"Tourism"},tourism:{key:"tourism",type:"typeCombo",label:"Type"},"tower/construction":{key:"tower:construction",type:"combo",label:"Construction",placeholder:"Guyed, Lattice, Concealed, ..."},"tower/type":{key:"tower:type",type:"combo",label:"Type"},tracktype:{key:"tracktype",type:"combo",label:"Track Type",placeholder:"Solid, Mostly Solid, Soft...",strings:{options:{grade1:"Solid: paved or heavily compacted hardcore surface",grade2:"Mostly Solid: gravel/rock with some soft material mixed in",grade3:"Even mixture of hard and soft materials",grade4:"Mostly Soft: soil/sand/grass with some hard material mixed in",grade5:"Soft: soil/sand/grass"}}},trade:{key:"trade",type:"typeCombo",label:"Type"},traffic_calming:{key:"traffic_calming",type:"typeCombo",label:"Type"},traffic_sign:{key:"traffic_sign",type:"typeCombo",label:"Traffic Sign"},"traffic_sign/direction":{key:"traffic_sign:direction",type:"combo",label:"Direction",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},traffic_signals:{key:"traffic_signals",type:"combo",label:"Type","default":"signal"},"traffic_signals/direction":{key:"traffic_signals:direction",type:"combo",label:"Direction",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},trail_visibility:{key:"trail_visibility",type:"combo",label:"Trail Visibility",placeholder:"Excellent, Good, Bad...",strings:{options:{excellent:"Excellent: unambiguous path or markers everywhere",good:"Good: markers visible, sometimes require searching",intermediate:"Intermediate: few markers, path mostly visible",bad:"Bad: no markers, path sometimes invisible/pathless",horrible:"Horrible: often pathless, some orientation skills required",no:"No: pathless, excellent orientation skills required"}}},transformer:{key:"transformer",type:"combo",label:"Type",strings:{options:{distribution:"Distribution",generator:"Generator",converter:"Converter",traction:"Traction",auto:"Autotransformer",phase_angle_regulator:"Phase Angle Regulator",auxiliary:"Auxiliary",yes:"Unknown"}}},trees:{key:"trees",type:"semiCombo",label:"Trees"},tunnel:{key:"tunnel",type:"typeCombo",label:"Type",placeholder:"Default"},usage_rail:{key:"usage",type:"combo",label:"Usage Type",strings:{options:{main:"Main",branch:"Branch",industrial:"Industrial",military:"Military",test:"Test",tourism:"Tourism"}}},vending:{key:"vending",type:"semiCombo",label:"Types of Goods"},visibility:{key:"visibility",type:"combo",label:"Visibility",strings:{options:{house:"Up to 5m (16ft)",street:"5 to 20m (16 to 65ft)",area:"Over 20m (65ft)"}}},"volcano/status":{key:"volcano:status",type:"combo",label:"Volcano Status",strings:{options:{active:"Active",dormant:"Dormant",extinct:"Extinct"}}},"volcano/type":{key:"volcano:type",type:"combo",label:"Volcano Type",strings:{options:{stratovolcano:"Stratovolcano",shield:"Shield",scoria:"Scoria"}}},voltage:{key:"voltage",type:"combo",label:"Voltage"},"voltage/primary":{key:"voltage:primary",type:"combo",label:"Primary Voltage"},"voltage/secondary":{key:"voltage:secondary",type:"combo",label:"Secondary Voltage"},"voltage/tertiary":{key:"voltage:tertiary",type:"combo",label:"Tertiary Voltage"},wall:{key:"wall",type:"combo",label:"Type"},water_point:{key:"water_point",type:"check",label:"Water Point"},water:{key:"water",type:"combo",label:"Type"},waterway:{key:"waterway",type:"typeCombo",label:"Type"},website:{key:"website",type:"url",icon:"website",placeholder:"http://example.com/",universal:true,label:"Website"},wetland:{key:"wetland",type:"combo",label:"Type"},wheelchair:{key:"wheelchair",type:"radio",options:["yes","limited","no"],icon:"maki-wheelchair",universal:true,label:"Wheelchair Access"},wholesale:{key:"wholesale",type:"typeCombo",label:"Wholesale"},width:{key:"width",type:"number",minValue:0,label:"Width (Meters)"},wikidata:{key:"wikidata",type:"wikidata",icon:"wikipedia",universal:true,label:"Wikidata"},wikipedia:{key:"wikipedia",keys:["wikipedia","wikidata"],type:"wikipedia",icon:"wikipedia",universal:true,label:"Wikipedia"},windings:{key:"windings",type:"number",minValue:1,label:"Windings",placeholder:"1, 2, 3..."},"windings/configuration":{key:"windings:configuration",type:"combo",label:"Windings Configuration",strings:{options:{star:"Star / Wye",delta:"Delta","open-delta":"Open Delta",zigzag:"Zig Zag",open:"Open",scott:"Scott",leblanc:"Leblanc"}}}};
23668
23669   var quickselect_1 = quickselect;
23670   var default_1 = quickselect;
23671
23672   function quickselect(arr, k, left, right, compare) {
23673       quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
23674   }
23675   function quickselectStep(arr, k, left, right, compare) {
23676
23677       while (right > left) {
23678           if (right - left > 600) {
23679               var n = right - left + 1;
23680               var m = k - left + 1;
23681               var z = Math.log(n);
23682               var s = 0.5 * Math.exp(2 * z / 3);
23683               var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
23684               var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
23685               var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
23686               quickselectStep(arr, k, newLeft, newRight, compare);
23687           }
23688
23689           var t = arr[k];
23690           var i = left;
23691           var j = right;
23692
23693           swap(arr, left, k);
23694           if (compare(arr[right], t) > 0) swap(arr, left, right);
23695
23696           while (i < j) {
23697               swap(arr, i, j);
23698               i++;
23699               j--;
23700               while (compare(arr[i], t) < 0) i++;
23701               while (compare(arr[j], t) > 0) j--;
23702           }
23703
23704           if (compare(arr[left], t) === 0) swap(arr, left, j);
23705           else {
23706               j++;
23707               swap(arr, j, right);
23708           }
23709
23710           if (j <= k) left = j + 1;
23711           if (k <= j) right = j - 1;
23712       }
23713   }
23714
23715   function swap(arr, i, j) {
23716       var tmp = arr[i];
23717       arr[i] = arr[j];
23718       arr[j] = tmp;
23719   }
23720
23721   function defaultCompare(a, b) {
23722       return a < b ? -1 : a > b ? 1 : 0;
23723   }
23724   quickselect_1.default = default_1;
23725
23726   var rbush_1 = rbush;
23727   var default_1$1 = rbush;
23728
23729
23730
23731   function rbush(maxEntries, format) {
23732       if (!(this instanceof rbush)) return new rbush(maxEntries, format);
23733
23734       // max entries in a node is 9 by default; min node fill is 40% for best performance
23735       this._maxEntries = Math.max(4, maxEntries || 9);
23736       this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
23737
23738       if (format) {
23739           this._initFormat(format);
23740       }
23741
23742       this.clear();
23743   }
23744
23745   rbush.prototype = {
23746
23747       all: function () {
23748           return this._all(this.data, []);
23749       },
23750
23751       search: function (bbox) {
23752
23753           var node = this.data,
23754               result = [],
23755               toBBox = this.toBBox;
23756
23757           if (!intersects$1(bbox, node)) return result;
23758
23759           var nodesToSearch = [],
23760               i, len, child, childBBox;
23761
23762           while (node) {
23763               for (i = 0, len = node.children.length; i < len; i++) {
23764
23765                   child = node.children[i];
23766                   childBBox = node.leaf ? toBBox(child) : child;
23767
23768                   if (intersects$1(bbox, childBBox)) {
23769                       if (node.leaf) result.push(child);
23770                       else if (contains$2(bbox, childBBox)) this._all(child, result);
23771                       else nodesToSearch.push(child);
23772                   }
23773               }
23774               node = nodesToSearch.pop();
23775           }
23776
23777           return result;
23778       },
23779
23780       collides: function (bbox) {
23781
23782           var node = this.data,
23783               toBBox = this.toBBox;
23784
23785           if (!intersects$1(bbox, node)) return false;
23786
23787           var nodesToSearch = [],
23788               i, len, child, childBBox;
23789
23790           while (node) {
23791               for (i = 0, len = node.children.length; i < len; i++) {
23792
23793                   child = node.children[i];
23794                   childBBox = node.leaf ? toBBox(child) : child;
23795
23796                   if (intersects$1(bbox, childBBox)) {
23797                       if (node.leaf || contains$2(bbox, childBBox)) return true;
23798                       nodesToSearch.push(child);
23799                   }
23800               }
23801               node = nodesToSearch.pop();
23802           }
23803
23804           return false;
23805       },
23806
23807       load: function (data) {
23808           if (!(data && data.length)) return this;
23809
23810           if (data.length < this._minEntries) {
23811               for (var i = 0, len = data.length; i < len; i++) {
23812                   this.insert(data[i]);
23813               }
23814               return this;
23815           }
23816
23817           // recursively build the tree with the given data from scratch using OMT algorithm
23818           var node = this._build(data.slice(), 0, data.length - 1, 0);
23819
23820           if (!this.data.children.length) {
23821               // save as is if tree is empty
23822               this.data = node;
23823
23824           } else if (this.data.height === node.height) {
23825               // split root if trees have the same height
23826               this._splitRoot(this.data, node);
23827
23828           } else {
23829               if (this.data.height < node.height) {
23830                   // swap trees if inserted one is bigger
23831                   var tmpNode = this.data;
23832                   this.data = node;
23833                   node = tmpNode;
23834               }
23835
23836               // insert the small tree into the large tree at appropriate level
23837               this._insert(node, this.data.height - node.height - 1, true);
23838           }
23839
23840           return this;
23841       },
23842
23843       insert: function (item) {
23844           if (item) this._insert(item, this.data.height - 1);
23845           return this;
23846       },
23847
23848       clear: function () {
23849           this.data = createNode([]);
23850           return this;
23851       },
23852
23853       remove: function (item, equalsFn) {
23854           if (!item) return this;
23855
23856           var node = this.data,
23857               bbox = this.toBBox(item),
23858               path = [],
23859               indexes = [],
23860               i, parent, index, goingUp;
23861
23862           // depth-first iterative tree traversal
23863           while (node || path.length) {
23864
23865               if (!node) { // go up
23866                   node = path.pop();
23867                   parent = path[path.length - 1];
23868                   i = indexes.pop();
23869                   goingUp = true;
23870               }
23871
23872               if (node.leaf) { // check current node
23873                   index = findItem(item, node.children, equalsFn);
23874
23875                   if (index !== -1) {
23876                       // item found, remove the item and condense tree upwards
23877                       node.children.splice(index, 1);
23878                       path.push(node);
23879                       this._condense(path);
23880                       return this;
23881                   }
23882               }
23883
23884               if (!goingUp && !node.leaf && contains$2(node, bbox)) { // go down
23885                   path.push(node);
23886                   indexes.push(i);
23887                   i = 0;
23888                   parent = node;
23889                   node = node.children[0];
23890
23891               } else if (parent) { // go right
23892                   i++;
23893                   node = parent.children[i];
23894                   goingUp = false;
23895
23896               } else node = null; // nothing found
23897           }
23898
23899           return this;
23900       },
23901
23902       toBBox: function (item) { return item; },
23903
23904       compareMinX: compareNodeMinX,
23905       compareMinY: compareNodeMinY,
23906
23907       toJSON: function () { return this.data; },
23908
23909       fromJSON: function (data) {
23910           this.data = data;
23911           return this;
23912       },
23913
23914       _all: function (node, result) {
23915           var nodesToSearch = [];
23916           while (node) {
23917               if (node.leaf) result.push.apply(result, node.children);
23918               else nodesToSearch.push.apply(nodesToSearch, node.children);
23919
23920               node = nodesToSearch.pop();
23921           }
23922           return result;
23923       },
23924
23925       _build: function (items, left, right, height) {
23926
23927           var N = right - left + 1,
23928               M = this._maxEntries,
23929               node;
23930
23931           if (N <= M) {
23932               // reached leaf level; return leaf
23933               node = createNode(items.slice(left, right + 1));
23934               calcBBox(node, this.toBBox);
23935               return node;
23936           }
23937
23938           if (!height) {
23939               // target height of the bulk-loaded tree
23940               height = Math.ceil(Math.log(N) / Math.log(M));
23941
23942               // target number of root entries to maximize storage utilization
23943               M = Math.ceil(N / Math.pow(M, height - 1));
23944           }
23945
23946           node = createNode([]);
23947           node.leaf = false;
23948           node.height = height;
23949
23950           // split the items into M mostly square tiles
23951
23952           var N2 = Math.ceil(N / M),
23953               N1 = N2 * Math.ceil(Math.sqrt(M)),
23954               i, j, right2, right3;
23955
23956           multiSelect(items, left, right, N1, this.compareMinX);
23957
23958           for (i = left; i <= right; i += N1) {
23959
23960               right2 = Math.min(i + N1 - 1, right);
23961
23962               multiSelect(items, i, right2, N2, this.compareMinY);
23963
23964               for (j = i; j <= right2; j += N2) {
23965
23966                   right3 = Math.min(j + N2 - 1, right2);
23967
23968                   // pack each entry recursively
23969                   node.children.push(this._build(items, j, right3, height - 1));
23970               }
23971           }
23972
23973           calcBBox(node, this.toBBox);
23974
23975           return node;
23976       },
23977
23978       _chooseSubtree: function (bbox, node, level, path) {
23979
23980           var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
23981
23982           while (true) {
23983               path.push(node);
23984
23985               if (node.leaf || path.length - 1 === level) break;
23986
23987               minArea = minEnlargement = Infinity;
23988
23989               for (i = 0, len = node.children.length; i < len; i++) {
23990                   child = node.children[i];
23991                   area = bboxArea(child);
23992                   enlargement = enlargedArea(bbox, child) - area;
23993
23994                   // choose entry with the least area enlargement
23995                   if (enlargement < minEnlargement) {
23996                       minEnlargement = enlargement;
23997                       minArea = area < minArea ? area : minArea;
23998                       targetNode = child;
23999
24000                   } else if (enlargement === minEnlargement) {
24001                       // otherwise choose one with the smallest area
24002                       if (area < minArea) {
24003                           minArea = area;
24004                           targetNode = child;
24005                       }
24006                   }
24007               }
24008
24009               node = targetNode || node.children[0];
24010           }
24011
24012           return node;
24013       },
24014
24015       _insert: function (item, level, isNode) {
24016
24017           var toBBox = this.toBBox,
24018               bbox = isNode ? item : toBBox(item),
24019               insertPath = [];
24020
24021           // find the best node for accommodating the item, saving all nodes along the path too
24022           var node = this._chooseSubtree(bbox, this.data, level, insertPath);
24023
24024           // put the item into the node
24025           node.children.push(item);
24026           extend$1(node, bbox);
24027
24028           // split on node overflow; propagate upwards if necessary
24029           while (level >= 0) {
24030               if (insertPath[level].children.length > this._maxEntries) {
24031                   this._split(insertPath, level);
24032                   level--;
24033               } else break;
24034           }
24035
24036           // adjust bboxes along the insertion path
24037           this._adjustParentBBoxes(bbox, insertPath, level);
24038       },
24039
24040       // split overflowed node into two
24041       _split: function (insertPath, level) {
24042
24043           var node = insertPath[level],
24044               M = node.children.length,
24045               m = this._minEntries;
24046
24047           this._chooseSplitAxis(node, m, M);
24048
24049           var splitIndex = this._chooseSplitIndex(node, m, M);
24050
24051           var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
24052           newNode.height = node.height;
24053           newNode.leaf = node.leaf;
24054
24055           calcBBox(node, this.toBBox);
24056           calcBBox(newNode, this.toBBox);
24057
24058           if (level) insertPath[level - 1].children.push(newNode);
24059           else this._splitRoot(node, newNode);
24060       },
24061
24062       _splitRoot: function (node, newNode) {
24063           // split root node
24064           this.data = createNode([node, newNode]);
24065           this.data.height = node.height + 1;
24066           this.data.leaf = false;
24067           calcBBox(this.data, this.toBBox);
24068       },
24069
24070       _chooseSplitIndex: function (node, m, M) {
24071
24072           var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
24073
24074           minOverlap = minArea = Infinity;
24075
24076           for (i = m; i <= M - m; i++) {
24077               bbox1 = distBBox(node, 0, i, this.toBBox);
24078               bbox2 = distBBox(node, i, M, this.toBBox);
24079
24080               overlap = intersectionArea(bbox1, bbox2);
24081               area = bboxArea(bbox1) + bboxArea(bbox2);
24082
24083               // choose distribution with minimum overlap
24084               if (overlap < minOverlap) {
24085                   minOverlap = overlap;
24086                   index = i;
24087
24088                   minArea = area < minArea ? area : minArea;
24089
24090               } else if (overlap === minOverlap) {
24091                   // otherwise choose distribution with minimum area
24092                   if (area < minArea) {
24093                       minArea = area;
24094                       index = i;
24095                   }
24096               }
24097           }
24098
24099           return index;
24100       },
24101
24102       // sorts node children by the best axis for split
24103       _chooseSplitAxis: function (node, m, M) {
24104
24105           var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
24106               compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
24107               xMargin = this._allDistMargin(node, m, M, compareMinX),
24108               yMargin = this._allDistMargin(node, m, M, compareMinY);
24109
24110           // if total distributions margin value is minimal for x, sort by minX,
24111           // otherwise it's already sorted by minY
24112           if (xMargin < yMargin) node.children.sort(compareMinX);
24113       },
24114
24115       // total margin of all possible split distributions where each node is at least m full
24116       _allDistMargin: function (node, m, M, compare) {
24117
24118           node.children.sort(compare);
24119
24120           var toBBox = this.toBBox,
24121               leftBBox = distBBox(node, 0, m, toBBox),
24122               rightBBox = distBBox(node, M - m, M, toBBox),
24123               margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
24124               i, child;
24125
24126           for (i = m; i < M - m; i++) {
24127               child = node.children[i];
24128               extend$1(leftBBox, node.leaf ? toBBox(child) : child);
24129               margin += bboxMargin(leftBBox);
24130           }
24131
24132           for (i = M - m - 1; i >= m; i--) {
24133               child = node.children[i];
24134               extend$1(rightBBox, node.leaf ? toBBox(child) : child);
24135               margin += bboxMargin(rightBBox);
24136           }
24137
24138           return margin;
24139       },
24140
24141       _adjustParentBBoxes: function (bbox, path, level) {
24142           // adjust bboxes along the given tree path
24143           for (var i = level; i >= 0; i--) {
24144               extend$1(path[i], bbox);
24145           }
24146       },
24147
24148       _condense: function (path) {
24149           // go through the path, removing empty nodes and updating bboxes
24150           for (var i = path.length - 1, siblings; i >= 0; i--) {
24151               if (path[i].children.length === 0) {
24152                   if (i > 0) {
24153                       siblings = path[i - 1].children;
24154                       siblings.splice(siblings.indexOf(path[i]), 1);
24155
24156                   } else this.clear();
24157
24158               } else calcBBox(path[i], this.toBBox);
24159           }
24160       },
24161
24162       _initFormat: function (format) {
24163           // data format (minX, minY, maxX, maxY accessors)
24164
24165           // uses eval-type function compilation instead of just accepting a toBBox function
24166           // because the algorithms are very sensitive to sorting functions performance,
24167           // so they should be dead simple and without inner calls
24168
24169           var compareArr = ['return a', ' - b', ';'];
24170
24171           this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
24172           this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
24173
24174           this.toBBox = new Function('a',
24175               'return {minX: a' + format[0] +
24176               ', minY: a' + format[1] +
24177               ', maxX: a' + format[2] +
24178               ', maxY: a' + format[3] + '};');
24179       }
24180   };
24181
24182   function findItem(item, items, equalsFn) {
24183       if (!equalsFn) return items.indexOf(item);
24184
24185       for (var i = 0; i < items.length; i++) {
24186           if (equalsFn(item, items[i])) return i;
24187       }
24188       return -1;
24189   }
24190
24191   // calculate node's bbox from bboxes of its children
24192   function calcBBox(node, toBBox) {
24193       distBBox(node, 0, node.children.length, toBBox, node);
24194   }
24195
24196   // min bounding rectangle of node children from k to p-1
24197   function distBBox(node, k, p, toBBox, destNode) {
24198       if (!destNode) destNode = createNode(null);
24199       destNode.minX = Infinity;
24200       destNode.minY = Infinity;
24201       destNode.maxX = -Infinity;
24202       destNode.maxY = -Infinity;
24203
24204       for (var i = k, child; i < p; i++) {
24205           child = node.children[i];
24206           extend$1(destNode, node.leaf ? toBBox(child) : child);
24207       }
24208
24209       return destNode;
24210   }
24211
24212   function extend$1(a, b) {
24213       a.minX = Math.min(a.minX, b.minX);
24214       a.minY = Math.min(a.minY, b.minY);
24215       a.maxX = Math.max(a.maxX, b.maxX);
24216       a.maxY = Math.max(a.maxY, b.maxY);
24217       return a;
24218   }
24219
24220   function compareNodeMinX(a, b) { return a.minX - b.minX; }
24221   function compareNodeMinY(a, b) { return a.minY - b.minY; }
24222
24223   function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
24224   function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
24225
24226   function enlargedArea(a, b) {
24227       return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
24228              (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
24229   }
24230
24231   function intersectionArea(a, b) {
24232       var minX = Math.max(a.minX, b.minX),
24233           minY = Math.max(a.minY, b.minY),
24234           maxX = Math.min(a.maxX, b.maxX),
24235           maxY = Math.min(a.maxY, b.maxY);
24236
24237       return Math.max(0, maxX - minX) *
24238              Math.max(0, maxY - minY);
24239   }
24240
24241   function contains$2(a, b) {
24242       return a.minX <= b.minX &&
24243              a.minY <= b.minY &&
24244              b.maxX <= a.maxX &&
24245              b.maxY <= a.maxY;
24246   }
24247
24248   function intersects$1(a, b) {
24249       return b.minX <= a.maxX &&
24250              b.minY <= a.maxY &&
24251              b.maxX >= a.minX &&
24252              b.maxY >= a.minY;
24253   }
24254
24255   function createNode(children) {
24256       return {
24257           children: children,
24258           height: 1,
24259           leaf: true,
24260           minX: Infinity,
24261           minY: Infinity,
24262           maxX: -Infinity,
24263           maxY: -Infinity
24264       };
24265   }
24266
24267   // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
24268   // combines selection algorithm with binary divide & conquer approach
24269
24270   function multiSelect(arr, left, right, n, compare) {
24271       var stack = [left, right],
24272           mid;
24273
24274       while (stack.length) {
24275           right = stack.pop();
24276           left = stack.pop();
24277
24278           if (right - left <= n) continue;
24279
24280           mid = left + Math.ceil((right - left) / n / 2) * n;
24281           quickselect_1(arr, mid, left, right, compare);
24282
24283           stack.push(left, mid, mid, right);
24284       }
24285   }
24286   rbush_1.default = default_1$1;
24287
24288   var lineclip_1 = lineclip;
24289
24290   lineclip.polyline = lineclip;
24291   lineclip.polygon = polygonclip;
24292
24293
24294   // Cohen-Sutherland line clippign algorithm, adapted to efficiently
24295   // handle polylines rather than just segments
24296
24297   function lineclip(points, bbox, result) {
24298
24299       var len = points.length,
24300           codeA = bitCode(points[0], bbox),
24301           part = [],
24302           i, a, b, codeB, lastCode;
24303
24304       if (!result) result = [];
24305
24306       for (i = 1; i < len; i++) {
24307           a = points[i - 1];
24308           b = points[i];
24309           codeB = lastCode = bitCode(b, bbox);
24310
24311           while (true) {
24312
24313               if (!(codeA | codeB)) { // accept
24314                   part.push(a);
24315
24316                   if (codeB !== lastCode) { // segment went outside
24317                       part.push(b);
24318
24319                       if (i < len - 1) { // start a new line
24320                           result.push(part);
24321                           part = [];
24322                       }
24323                   } else if (i === len - 1) {
24324                       part.push(b);
24325                   }
24326                   break;
24327
24328               } else if (codeA & codeB) { // trivial reject
24329                   break;
24330
24331               } else if (codeA) { // a outside, intersect with clip edge
24332                   a = intersect$1(a, b, codeA, bbox);
24333                   codeA = bitCode(a, bbox);
24334
24335               } else { // b outside
24336                   b = intersect$1(a, b, codeB, bbox);
24337                   codeB = bitCode(b, bbox);
24338               }
24339           }
24340
24341           codeA = lastCode;
24342       }
24343
24344       if (part.length) result.push(part);
24345
24346       return result;
24347   }
24348
24349   // Sutherland-Hodgeman polygon clipping algorithm
24350
24351   function polygonclip(points, bbox) {
24352
24353       var result, edge, prev, prevInside, i, p, inside;
24354
24355       // clip against each side of the clip rectangle
24356       for (edge = 1; edge <= 8; edge *= 2) {
24357           result = [];
24358           prev = points[points.length - 1];
24359           prevInside = !(bitCode(prev, bbox) & edge);
24360
24361           for (i = 0; i < points.length; i++) {
24362               p = points[i];
24363               inside = !(bitCode(p, bbox) & edge);
24364
24365               // if segment goes through the clip window, add an intersection
24366               if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
24367
24368               if (inside) result.push(p); // add a point if it's inside
24369
24370               prev = p;
24371               prevInside = inside;
24372           }
24373
24374           points = result;
24375
24376           if (!points.length) break;
24377       }
24378
24379       return result;
24380   }
24381
24382   // intersect a segment against one of the 4 lines that make up the bbox
24383
24384   function intersect$1(a, b, edge, bbox) {
24385       return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
24386              edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
24387              edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
24388              edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
24389              null;
24390   }
24391
24392   // bit code reflects the point position relative to the bbox:
24393
24394   //         left  mid  right
24395   //    top  1001  1000  1010
24396   //    mid  0001  0000  0010
24397   // bottom  0101  0100  0110
24398
24399   function bitCode(p, bbox) {
24400       var code = 0;
24401
24402       if (p[0] < bbox[0]) code |= 1; // left
24403       else if (p[0] > bbox[2]) code |= 2; // right
24404
24405       if (p[1] < bbox[1]) code |= 4; // bottom
24406       else if (p[1] > bbox[3]) code |= 8; // top
24407
24408       return code;
24409   }
24410
24411   var whichPolygon_1 = whichPolygon;
24412
24413   function whichPolygon(data) {
24414       var bboxes = [];
24415       for (var i = 0; i < data.features.length; i++) {
24416           var feature = data.features[i];
24417           var coords = feature.geometry.coordinates;
24418
24419           if (feature.geometry.type === 'Polygon') {
24420               bboxes.push(treeItem(coords, feature.properties));
24421
24422           } else if (feature.geometry.type === 'MultiPolygon') {
24423               for (var j = 0; j < coords.length; j++) {
24424                   bboxes.push(treeItem(coords[j], feature.properties));
24425               }
24426           }
24427       }
24428
24429       var tree = rbush_1().load(bboxes);
24430
24431       function query(p, multi) {
24432           var output = [],
24433               result = tree.search({
24434                   minX: p[0],
24435                   minY: p[1],
24436                   maxX: p[0],
24437                   maxY: p[1]
24438               });
24439           for (var i = 0; i < result.length; i++) {
24440               if (insidePolygon(result[i].coords, p)) {
24441                   if (multi)
24442                       output.push(result[i].props);
24443                   else
24444                       return result[i].props;
24445               }
24446           }
24447           return multi && output.length ? output : null;
24448       }
24449
24450       query.tree = tree;
24451       query.bbox = function queryBBox(bbox) {
24452           var output = [];
24453           var result = tree.search({
24454               minX: bbox[0],
24455               minY: bbox[1],
24456               maxX: bbox[2],
24457               maxY: bbox[3]
24458           });
24459           for (var i = 0; i < result.length; i++) {
24460               if (polygonIntersectsBBox(result[i].coords, bbox)) {
24461                   output.push(result[i].props);
24462               }
24463           }
24464           return output;
24465       };
24466
24467       return query;
24468   }
24469
24470   function polygonIntersectsBBox(polygon, bbox) {
24471       var bboxCenter = [
24472           (bbox[0] + bbox[2]) / 2,
24473           (bbox[1] + bbox[3]) / 2
24474       ];
24475       if (insidePolygon(polygon, bboxCenter)) return true;
24476       for (var i = 0; i < polygon.length; i++) {
24477           if (lineclip_1(polygon[i], bbox).length > 0) return true;
24478       }
24479       return false;
24480   }
24481
24482   // ray casting algorithm for detecting if point is in polygon
24483   function insidePolygon(rings, p) {
24484       var inside = false;
24485       for (var i = 0, len = rings.length; i < len; i++) {
24486           var ring = rings[i];
24487           for (var j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) {
24488               if (rayIntersect(p, ring[j], ring[k])) inside = !inside;
24489           }
24490       }
24491       return inside;
24492   }
24493
24494   function rayIntersect(p, p1, p2) {
24495       return ((p1[1] > p[1]) !== (p2[1] > p[1])) && (p[0] < (p2[0] - p1[0]) * (p[1] - p1[1]) / (p2[1] - p1[1]) + p1[0]);
24496   }
24497
24498   function treeItem(coords, props) {
24499       var item = {
24500           minX: Infinity,
24501           minY: Infinity,
24502           maxX: -Infinity,
24503           maxY: -Infinity,
24504           coords: coords,
24505           props: props
24506       };
24507
24508       for (var i = 0; i < coords[0].length; i++) {
24509           var p = coords[0][i];
24510           item.minX = Math.min(item.minX, p[0]);
24511           item.minY = Math.min(item.minY, p[1]);
24512           item.maxX = Math.max(item.maxX, p[0]);
24513           item.maxY = Math.max(item.maxY, p[1]);
24514       }
24515       return item;
24516   }
24517
24518   // index the osm-community-index
24519   var ociFeatureCollection = values$1(features$2).map(function(feature) {
24520       // workaround for which-polygon: only supports `properties`, not `id`
24521       // https://github.com/mapbox/which-polygon/pull/6
24522       feature.properties = {
24523           id: feature.id,
24524           area: d3_geoArea(feature)   // also precompute areas
24525       };
24526       return feature;
24527   });
24528
24529
24530   var data = {
24531       community: {
24532           features: features$2,
24533           resources: resources,
24534           query: whichPolygon_1({
24535               type: 'FeatureCollection',
24536               features: ociFeatureCollection
24537           })
24538       },
24539       imagery: dataImagery,  //legacy
24540       presets: {
24541           presets: presets,
24542           defaults: defaults,
24543           categories: categories,
24544           fields: fields
24545       }
24546   };
24547
24548   function osmEntity$$1(attrs) {
24549       // For prototypal inheritance.
24550       if (this instanceof osmEntity$$1) return;
24551
24552       // Create the appropriate subtype.
24553       if (attrs && attrs.type) {
24554           return osmEntity$$1[attrs.type].apply(this, arguments);
24555       } else if (attrs && attrs.id) {
24556           return osmEntity$$1[osmEntity$$1.id.type(attrs.id)].apply(this, arguments);
24557       }
24558
24559       // Initialize a generic Entity (used only in tests).
24560       return (new osmEntity$$1()).initialize(arguments);
24561   }
24562
24563
24564   osmEntity$$1.id = function(type) {
24565       return osmEntity$$1.id.fromOSM(type, osmEntity$$1.id.next[type]--);
24566   };
24567
24568
24569   osmEntity$$1.id.next = {
24570       changeset: -1, node: -1, way: -1, relation: -1
24571   };
24572
24573
24574   osmEntity$$1.id.fromOSM = function(type, id) {
24575       return type[0] + id;
24576   };
24577
24578
24579   osmEntity$$1.id.toOSM = function(id) {
24580       return id.slice(1);
24581   };
24582
24583
24584   osmEntity$$1.id.type = function(id) {
24585       return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
24586   };
24587
24588
24589   // A function suitable for use as the second argument to d3.selection#data().
24590   osmEntity$$1.key = function(entity) {
24591       return entity.id + 'v' + (entity.v || 0);
24592   };
24593
24594
24595   osmEntity$$1.prototype = {
24596
24597       tags: {},
24598
24599
24600       initialize: function(sources) {
24601           for (var i = 0; i < sources.length; ++i) {
24602               var source = sources[i];
24603               for (var prop in source) {
24604                   if (Object.prototype.hasOwnProperty.call(source, prop)) {
24605                       if (source[prop] === undefined) {
24606                           delete this[prop];
24607                       } else {
24608                           this[prop] = source[prop];
24609                       }
24610                   }
24611               }
24612           }
24613
24614           if (!this.id && this.type) {
24615               this.id = osmEntity$$1.id(this.type);
24616           }
24617           if (!this.hasOwnProperty('visible')) {
24618               this.visible = true;
24619           }
24620
24621           return this;
24622       },
24623
24624
24625       copy: function(resolver, copies) {
24626           if (copies[this.id])
24627               return copies[this.id];
24628
24629           var copy = osmEntity$$1(this, {id: undefined, user: undefined, version: undefined});
24630           copies[this.id] = copy;
24631
24632           return copy;
24633       },
24634
24635
24636       osmId: function() {
24637           return osmEntity$$1.id.toOSM(this.id);
24638       },
24639
24640
24641       isNew: function() {
24642           return this.osmId() < 0;
24643       },
24644
24645
24646       update: function(attrs) {
24647           return osmEntity$$1(this, attrs, {v: 1 + (this.v || 0)});
24648       },
24649
24650
24651       mergeTags: function(tags) {
24652           var merged = clone(this.tags), changed = false;
24653           for (var k in tags) {
24654               var t1 = merged[k],
24655                   t2 = tags[k];
24656               if (!t1) {
24657                   changed = true;
24658                   merged[k] = t2;
24659               } else if (t1 !== t2) {
24660                   changed = true;
24661                   merged[k] = union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
24662               }
24663           }
24664           return changed ? this.update({tags: merged}) : this;
24665       },
24666
24667
24668       intersects: function(extent, resolver) {
24669           return this.extent(resolver).intersects(extent);
24670       },
24671
24672
24673       isUsed: function(resolver) {
24674           return without(Object.keys(this.tags), 'area').length > 0 ||
24675               resolver.parentRelations(this).length > 0;
24676       },
24677
24678
24679       hasInterestingTags: function() {
24680           return keys$1(this.tags).some(osmIsInterestingTag);
24681       },
24682
24683
24684       isHighwayIntersection: function() {
24685           return false;
24686       },
24687
24688       isDegenerate: function() {
24689           return true;
24690       },
24691
24692       deprecatedTags: function() {
24693           var tags = toPairs(this.tags);
24694           var deprecated = {};
24695
24696           dataDeprecated.forEach(function(d) {
24697               var match = toPairs(d.old)[0];
24698               tags.forEach(function(t) {
24699                   if (t[0] === match[0] &&
24700                       (t[1] === match[1] || match[1] === '*')) {
24701                       deprecated[t[0]] = t[1];
24702                   }
24703               });
24704           });
24705
24706           return deprecated;
24707       }
24708   };
24709
24710   function geoExtent$$1(min, max) {
24711       if (!(this instanceof geoExtent$$1)) {
24712           return new geoExtent$$1(min, max);
24713       } else if (min instanceof geoExtent$$1) {
24714           return min;
24715       } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
24716           this[0] = min[0];
24717           this[1] = min[1];
24718       } else {
24719           this[0] = min        || [ Infinity,  Infinity];
24720           this[1] = max || min || [-Infinity, -Infinity];
24721       }
24722   }
24723
24724   geoExtent$$1.prototype = new Array(2);
24725
24726   assignIn(geoExtent$$1.prototype, {
24727
24728       equals: function (obj) {
24729           return this[0][0] === obj[0][0] &&
24730               this[0][1] === obj[0][1] &&
24731               this[1][0] === obj[1][0] &&
24732               this[1][1] === obj[1][1];
24733       },
24734
24735
24736       extend: function(obj) {
24737           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24738           return geoExtent$$1(
24739               [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
24740               [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
24741           );
24742       },
24743
24744
24745       _extend: function(extent) {
24746           this[0][0] = Math.min(extent[0][0], this[0][0]);
24747           this[0][1] = Math.min(extent[0][1], this[0][1]);
24748           this[1][0] = Math.max(extent[1][0], this[1][0]);
24749           this[1][1] = Math.max(extent[1][1], this[1][1]);
24750       },
24751
24752
24753       area: function() {
24754           return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
24755       },
24756
24757
24758       center: function() {
24759           return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
24760       },
24761
24762
24763       rectangle: function() {
24764           return [this[0][0], this[0][1], this[1][0], this[1][1]];
24765       },
24766
24767
24768       bbox: function() {
24769           return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
24770       },
24771
24772
24773       polygon: function() {
24774           return [
24775               [this[0][0], this[0][1]],
24776               [this[0][0], this[1][1]],
24777               [this[1][0], this[1][1]],
24778               [this[1][0], this[0][1]],
24779               [this[0][0], this[0][1]]
24780           ];
24781       },
24782
24783
24784       contains: function(obj) {
24785           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24786           return obj[0][0] >= this[0][0] &&
24787                  obj[0][1] >= this[0][1] &&
24788                  obj[1][0] <= this[1][0] &&
24789                  obj[1][1] <= this[1][1];
24790       },
24791
24792
24793       intersects: function(obj) {
24794           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24795           return obj[0][0] <= this[1][0] &&
24796                  obj[0][1] <= this[1][1] &&
24797                  obj[1][0] >= this[0][0] &&
24798                  obj[1][1] >= this[0][1];
24799       },
24800
24801
24802       intersection: function(obj) {
24803           if (!this.intersects(obj)) return new geoExtent$$1();
24804           return new geoExtent$$1(
24805               [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
24806               [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
24807           );
24808       },
24809
24810
24811       percentContainedIn: function(obj) {
24812           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24813           var a1 = this.intersection(obj).area();
24814           var a2 = this.area();
24815
24816           if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
24817               return 0;
24818           } else {
24819               return a1 / a2;
24820           }
24821       },
24822
24823
24824       padByMeters: function(meters) {
24825           var dLat = geoMetersToLat(meters);
24826           var dLon = geoMetersToLon(meters, this.center()[1]);
24827           return geoExtent$$1(
24828               [this[0][0] - dLon, this[0][1] - dLat],
24829               [this[1][0] + dLon, this[1][1] + dLat]
24830           );
24831       },
24832
24833
24834       toParam: function() {
24835           return this.rectangle().join(',');
24836       }
24837
24838   });
24839
24840   // constants
24841   var TAU = 2 * Math.PI;
24842   var EQUATORIAL_RADIUS = 6356752.314245179;
24843   var POLAR_RADIUS = 6378137.0;
24844
24845
24846   function geoLatToMeters(dLat) {
24847       return dLat * (TAU * POLAR_RADIUS / 360);
24848   }
24849
24850
24851   function geoLonToMeters(dLon, atLat) {
24852       return Math.abs(atLat) >= 90 ? 0 :
24853           dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
24854   }
24855
24856
24857   function geoMetersToLat(m) {
24858       return m / (TAU * POLAR_RADIUS / 360);
24859   }
24860
24861
24862   function geoMetersToLon(m, atLat) {
24863       return Math.abs(atLat) >= 90 ? 0 :
24864           m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
24865   }
24866
24867
24868   function geoMetersToOffset(meters, tileSize) {
24869       tileSize = tileSize || 256;
24870       return [
24871           meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
24872           -meters[1] * tileSize / (TAU * POLAR_RADIUS)
24873       ];
24874   }
24875
24876
24877   function geoOffsetToMeters(offset, tileSize) {
24878       tileSize = tileSize || 256;
24879       return [
24880           offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
24881           -offset[1] * TAU * POLAR_RADIUS / tileSize
24882       ];
24883   }
24884
24885
24886   // Equirectangular approximation of spherical distances on Earth
24887   function geoSphericalDistance(a, b) {
24888       var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
24889       var y = geoLatToMeters(a[1] - b[1]);
24890       return Math.sqrt((x * x) + (y * y));
24891   }
24892
24893
24894   // scale to zoom
24895   function geoScaleToZoom(k, tileSize) {
24896       tileSize = tileSize || 256;
24897       var log2ts = Math.log(tileSize) * Math.LOG2E;
24898       return Math.log(k * TAU) / Math.LN2 - log2ts;
24899   }
24900
24901
24902   // zoom to scale
24903   function geoZoomToScale(z, tileSize) {
24904       tileSize = tileSize || 256;
24905       return tileSize * Math.pow(2, z) / TAU;
24906   }
24907
24908   /**
24909    * A specialized version of `_.every` for arrays without support for
24910    * iteratee shorthands.
24911    *
24912    * @private
24913    * @param {Array} [array] The array to iterate over.
24914    * @param {Function} predicate The function invoked per iteration.
24915    * @returns {boolean} Returns `true` if all elements pass the predicate check,
24916    *  else `false`.
24917    */
24918   function arrayEvery(array, predicate) {
24919     var index = -1,
24920         length = array == null ? 0 : array.length;
24921
24922     while (++index < length) {
24923       if (!predicate(array[index], index, array)) {
24924         return false;
24925       }
24926     }
24927     return true;
24928   }
24929
24930   /**
24931    * The base implementation of `_.every` without support for iteratee shorthands.
24932    *
24933    * @private
24934    * @param {Array|Object} collection The collection to iterate over.
24935    * @param {Function} predicate The function invoked per iteration.
24936    * @returns {boolean} Returns `true` if all elements pass the predicate check,
24937    *  else `false`
24938    */
24939   function baseEvery(collection, predicate) {
24940     var result = true;
24941     baseEach(collection, function(value, index, collection) {
24942       result = !!predicate(value, index, collection);
24943       return result;
24944     });
24945     return result;
24946   }
24947
24948   /**
24949    * Checks if `predicate` returns truthy for **all** elements of `collection`.
24950    * Iteration is stopped once `predicate` returns falsey. The predicate is
24951    * invoked with three arguments: (value, index|key, collection).
24952    *
24953    * **Note:** This method returns `true` for
24954    * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
24955    * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
24956    * elements of empty collections.
24957    *
24958    * @static
24959    * @memberOf _
24960    * @since 0.1.0
24961    * @category Collection
24962    * @param {Array|Object} collection The collection to iterate over.
24963    * @param {Function} [predicate=_.identity] The function invoked per iteration.
24964    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
24965    * @returns {boolean} Returns `true` if all elements pass the predicate check,
24966    *  else `false`.
24967    * @example
24968    *
24969    * _.every([true, 1, null, 'yes'], Boolean);
24970    * // => false
24971    *
24972    * var users = [
24973    *   { 'user': 'barney', 'age': 36, 'active': false },
24974    *   { 'user': 'fred',   'age': 40, 'active': false }
24975    * ];
24976    *
24977    * // The `_.matches` iteratee shorthand.
24978    * _.every(users, { 'user': 'barney', 'active': false });
24979    * // => false
24980    *
24981    * // The `_.matchesProperty` iteratee shorthand.
24982    * _.every(users, ['active', false]);
24983    * // => true
24984    *
24985    * // The `_.property` iteratee shorthand.
24986    * _.every(users, 'active');
24987    * // => false
24988    */
24989   function every(collection, predicate, guard) {
24990     var func = isArray(collection) ? arrayEvery : baseEvery;
24991     if (guard && isIterateeCall(collection, predicate, guard)) {
24992       predicate = undefined;
24993     }
24994     return func(collection, baseIteratee(predicate, 3));
24995   }
24996
24997   /**
24998    * The base implementation of `_.some` without support for iteratee shorthands.
24999    *
25000    * @private
25001    * @param {Array|Object} collection The collection to iterate over.
25002    * @param {Function} predicate The function invoked per iteration.
25003    * @returns {boolean} Returns `true` if any element passes the predicate check,
25004    *  else `false`.
25005    */
25006   function baseSome(collection, predicate) {
25007     var result;
25008
25009     baseEach(collection, function(value, index, collection) {
25010       result = predicate(value, index, collection);
25011       return !result;
25012     });
25013     return !!result;
25014   }
25015
25016   /**
25017    * Checks if `predicate` returns truthy for **any** element of `collection`.
25018    * Iteration is stopped once `predicate` returns truthy. The predicate is
25019    * invoked with three arguments: (value, index|key, collection).
25020    *
25021    * @static
25022    * @memberOf _
25023    * @since 0.1.0
25024    * @category Collection
25025    * @param {Array|Object} collection The collection to iterate over.
25026    * @param {Function} [predicate=_.identity] The function invoked per iteration.
25027    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
25028    * @returns {boolean} Returns `true` if any element passes the predicate check,
25029    *  else `false`.
25030    * @example
25031    *
25032    * _.some([null, 0, 'yes', false], Boolean);
25033    * // => true
25034    *
25035    * var users = [
25036    *   { 'user': 'barney', 'active': true },
25037    *   { 'user': 'fred',   'active': false }
25038    * ];
25039    *
25040    * // The `_.matches` iteratee shorthand.
25041    * _.some(users, { 'user': 'barney', 'active': false });
25042    * // => false
25043    *
25044    * // The `_.matchesProperty` iteratee shorthand.
25045    * _.some(users, ['active', false]);
25046    * // => true
25047    *
25048    * // The `_.property` iteratee shorthand.
25049    * _.some(users, 'active');
25050    * // => true
25051    */
25052   function some(collection, predicate, guard) {
25053     var func = isArray(collection) ? arraySome : baseSome;
25054     if (guard && isIterateeCall(collection, predicate, guard)) {
25055       predicate = undefined;
25056     }
25057     return func(collection, baseIteratee(predicate, 3));
25058   }
25059
25060   // vector equals
25061   function geoVecEqual(a, b, epsilon) {
25062       if (epsilon) {
25063           return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
25064       } else {
25065           return (a[0] === b[0]) && (a[1] === b[1]);
25066       }
25067   }
25068
25069   // vector addition
25070   function geoVecAdd(a, b) {
25071       return [ a[0] + b[0], a[1] + b[1] ];
25072   }
25073
25074   // vector subtraction
25075   function geoVecSubtract(a, b) {
25076       return [ a[0] - b[0], a[1] - b[1] ];
25077   }
25078
25079   // vector scaling
25080   function geoVecScale(a, mag) {
25081       return [ a[0] * mag, a[1] * mag ];
25082   }
25083
25084   // vector rounding (was: geoRoundCoordinates)
25085   function geoVecFloor(a) {
25086       return [ Math.floor(a[0]), Math.floor(a[1]) ];
25087   }
25088
25089   // linear interpolation
25090   function geoVecInterp(a, b, t) {
25091       return [
25092           a[0] + (b[0] - a[0]) * t,
25093           a[1] + (b[1] - a[1]) * t
25094       ];
25095   }
25096
25097   // http://jsperf.com/id-dist-optimization
25098   function geoVecLength(a, b) {
25099       var x = a[0] - b[0];
25100       var y = a[1] - b[1];
25101       return Math.sqrt((x * x) + (y * y));
25102   }
25103
25104   // Return the counterclockwise angle in the range (-pi, pi)
25105   // between the positive X axis and the line intersecting a and b.
25106   function geoVecAngle(a, b) {
25107       return Math.atan2(b[1] - a[1], b[0] - a[0]);
25108   }
25109
25110   // dot product
25111   function geoVecDot(a, b, origin) {
25112       origin = origin || [0, 0];
25113       return (a[0] - origin[0]) * (b[0] - origin[0]) +
25114           (a[1] - origin[1]) * (b[1] - origin[1]);
25115   }
25116
25117   // 2D cross product of OA and OB vectors, returns magnitude of Z vector
25118   // Returns a positive value, if OAB makes a counter-clockwise turn,
25119   // negative for clockwise turn, and zero if the points are collinear.
25120   function geoVecCross(a, b, origin) {
25121       origin = origin || [0, 0];
25122       return (a[0] - origin[0]) * (b[1] - origin[1]) -
25123           (a[1] - origin[1]) * (b[0] - origin[0]);
25124   }
25125
25126   // Return the counterclockwise angle in the range (-pi, pi)
25127   // between the positive X axis and the line intersecting a and b.
25128   function geoAngle(a, b, projection) {
25129       return geoVecAngle(projection(a.loc), projection(b.loc));
25130   }
25131
25132   function geoEdgeEqual(a, b) {
25133       return (a[0] === b[0] && a[1] === b[1]) ||
25134           (a[0] === b[1] && a[1] === b[0]);
25135   }
25136
25137   // Rotate all points counterclockwise around a pivot point by given angle
25138   function geoRotate(points, angle, around) {
25139       return points.map(function(point) {
25140           var radial = geoVecSubtract(point, around);
25141           return [
25142               radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
25143               radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
25144           ];
25145       });
25146   }
25147
25148
25149   // Choose the edge with the minimal distance from `point` to its orthogonal
25150   // projection onto that edge, if such a projection exists, or the distance to
25151   // the closest vertex on that edge. Returns an object with the `index` of the
25152   // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
25153   function geoChooseEdge(nodes, point, projection, activeID) {
25154       var dist = geoVecLength;
25155       var points = nodes.map(function(n) { return projection(n.loc); });
25156       var ids = nodes.map(function(n) { return n.id; });
25157       var min = Infinity;
25158       var idx;
25159       var loc;
25160
25161       for (var i = 0; i < points.length - 1; i++) {
25162           if (ids[i] === activeID || ids[i + 1] === activeID) continue;
25163
25164           var o = points[i];
25165           var s = geoVecSubtract(points[i + 1], o);
25166           var v = geoVecSubtract(point, o);
25167           var proj = geoVecDot(v, s) / geoVecDot(s, s);
25168           var p;
25169
25170           if (proj < 0) {
25171               p = o;
25172           } else if (proj > 1) {
25173               p = points[i + 1];
25174           } else {
25175               p = [o[0] + proj * s[0], o[1] + proj * s[1]];
25176           }
25177
25178           var d = dist(p, point);
25179           if (d < min) {
25180               min = d;
25181               idx = i + 1;
25182               loc = projection.invert(p);
25183           }
25184       }
25185
25186       if (idx !== undefined) {
25187           return { index: idx, distance: min, loc: loc };
25188       } else {
25189           return null;
25190       }
25191   }
25192
25193
25194   // Test active (dragged or drawing) segments against inactive segments
25195   // This is used to test e.g. multipolygon rings that cross
25196   // `activeNodes` is the ring containing the activeID being dragged.
25197   // `inactiveNodes` is the other ring to test against
25198   function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
25199       var actives = [];
25200       var inactives = [];
25201       var j, k, n1, n2, segment;
25202
25203       // gather active segments (only segments in activeNodes that contain the activeID)
25204       for (j = 0; j < activeNodes.length - 1; j++) {
25205           n1 = activeNodes[j];
25206           n2 = activeNodes[j+1];
25207           segment = [n1.loc, n2.loc];
25208           if (n1.id === activeID || n2.id === activeID) {
25209               actives.push(segment);
25210           }
25211       }
25212
25213       // gather inactive segments
25214       for (j = 0; j < inactiveNodes.length - 1; j++) {
25215           n1 = inactiveNodes[j];
25216           n2 = inactiveNodes[j+1];
25217           segment = [n1.loc, n2.loc];
25218           inactives.push(segment);
25219       }
25220
25221       // test
25222       for (j = 0; j < actives.length; j++) {
25223           for (k = 0; k < inactives.length; k++) {
25224               var p = actives[j];
25225               var q = inactives[k];
25226               var hit = geoLineIntersection(p, q);
25227               if (hit) {
25228                   return true;
25229               }
25230           }
25231       }
25232
25233       return false;
25234   }
25235
25236
25237   // Test active (dragged or drawing) segments against inactive segments
25238   // This is used to test whether a way intersects with itself.
25239   function geoHasSelfIntersections(nodes, activeID) {
25240       var actives = [];
25241       var inactives = [];
25242       var j, k;
25243
25244       // group active and passive segments along the nodes
25245       for (j = 0; j < nodes.length - 1; j++) {
25246           var n1 = nodes[j];
25247           var n2 = nodes[j+1];
25248           var segment = [n1.loc, n2.loc];
25249           if (n1.id === activeID || n2.id === activeID) {
25250               actives.push(segment);
25251           } else {
25252               inactives.push(segment);
25253           }
25254       }
25255
25256       // test
25257       for (j = 0; j < actives.length; j++) {
25258           for (k = 0; k < inactives.length; k++) {
25259               var p = actives[j];
25260               var q = inactives[k];
25261               // skip if segments share an endpoint
25262               if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
25263                   geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
25264                   continue;
25265               }
25266
25267               var hit = geoLineIntersection(p, q);
25268               if (hit) {
25269                   var epsilon = 1e-8;
25270                   // skip if the hit is at the segment's endpoint
25271                   if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
25272                       geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
25273                       continue;
25274                   } else {
25275                       return true;
25276                   }
25277               }
25278           }
25279       }
25280
25281       return false;
25282   }
25283
25284
25285   // Return the intersection point of 2 line segments.
25286   // From https://github.com/pgkelley4/line-segments-intersect
25287   // This uses the vector cross product approach described below:
25288   //  http://stackoverflow.com/a/565282/786339
25289   function geoLineIntersection(a, b) {
25290       var p = [a[0][0], a[0][1]];
25291       var p2 = [a[1][0], a[1][1]];
25292       var q = [b[0][0], b[0][1]];
25293       var q2 = [b[1][0], b[1][1]];
25294       var r = geoVecSubtract(p2, p);
25295       var s = geoVecSubtract(q2, q);
25296       var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
25297       var denominator = geoVecCross(r, s);
25298
25299       if (uNumerator && denominator) {
25300           var u = uNumerator / denominator;
25301           var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
25302
25303           if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
25304               return geoVecInterp(p, p2, t);
25305           }
25306       }
25307
25308       return null;
25309   }
25310
25311
25312   function geoPathIntersections(path1, path2) {
25313       var intersections = [];
25314       for (var i = 0; i < path1.length - 1; i++) {
25315           for (var j = 0; j < path2.length - 1; j++) {
25316               var a = [ path1[i], path1[i+1] ];
25317               var b = [ path2[j], path2[j+1] ];
25318               var hit = geoLineIntersection(a, b);
25319               if (hit) {
25320                   intersections.push(hit);
25321               }
25322           }
25323       }
25324       return intersections;
25325   }
25326
25327   function geoPathHasIntersections(path1, path2) {
25328       for (var i = 0; i < path1.length - 1; i++) {
25329           for (var j = 0; j < path2.length - 1; j++) {
25330               var a = [ path1[i], path1[i+1] ];
25331               var b = [ path2[j], path2[j+1] ];
25332               var hit = geoLineIntersection(a, b);
25333               if (hit) {
25334                   return true;
25335               }
25336           }
25337       }
25338       return false;
25339   }
25340
25341
25342   // Return whether point is contained in polygon.
25343   //
25344   // `point` should be a 2-item array of coordinates.
25345   // `polygon` should be an array of 2-item arrays of coordinates.
25346   //
25347   // From https://github.com/substack/point-in-polygon.
25348   // ray-casting algorithm based on
25349   // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
25350   //
25351   function geoPointInPolygon(point, polygon) {
25352       var x = point[0];
25353       var y = point[1];
25354       var inside = false;
25355
25356       for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
25357           var xi = polygon[i][0];
25358           var yi = polygon[i][1];
25359           var xj = polygon[j][0];
25360           var yj = polygon[j][1];
25361
25362           var intersect = ((yi > y) !== (yj > y)) &&
25363               (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
25364           if (intersect) inside = !inside;
25365       }
25366
25367       return inside;
25368   }
25369
25370
25371   function geoPolygonContainsPolygon(outer, inner) {
25372       return every(inner, function(point) {
25373           return geoPointInPolygon(point, outer);
25374       });
25375   }
25376
25377
25378   function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
25379       function testPoints(outer, inner) {
25380           return some(inner, function(point) {
25381               return geoPointInPolygon(point, outer);
25382           });
25383       }
25384
25385      return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
25386   }
25387
25388
25389   function geoPathLength(path) {
25390       var length = 0;
25391       for (var i = 0; i < path.length - 1; i++) {
25392           length += geoVecLength(path[i], path[i + 1]);
25393       }
25394       return length;
25395   }
25396
25397
25398   // If the given point is at the edge of the padded viewport,
25399   // return a vector that will nudge the viewport in that direction
25400   function geoViewportEdge(point, dimensions) {
25401       var pad = [80, 20, 50, 20];   // top, right, bottom, left
25402       var x = 0;
25403       var y = 0;
25404
25405       if (point[0] > dimensions[0] - pad[1])
25406           x = -10;
25407       if (point[0] < pad[3])
25408           x = 10;
25409       if (point[1] > dimensions[1] - pad[2])
25410           y = -10;
25411       if (point[1] < pad[0])
25412           y = 10;
25413
25414       if (x || y) {
25415           return [x, y];
25416       } else {
25417           return null;
25418       }
25419   }
25420
25421   /*
25422       Bypasses features of D3's default projection stream pipeline that are unnecessary:
25423       * Antimeridian clipping
25424       * Spherical rotation
25425       * Resampling
25426   */
25427   function geoRawMercator() {
25428       var project = mercatorRaw;
25429       var k = 512 / Math.PI; // scale
25430       var x = 0;
25431       var y = 0; // translate
25432       var clipExtent = [[0, 0], [0, 0]];
25433
25434
25435       function projection$$1(point) {
25436           point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
25437           return [point[0] * k + x, y - point[1] * k];
25438       }
25439
25440
25441       projection$$1.invert = function(point) {
25442           point = project.invert((point[0] - x) / k, (y - point[1]) / k);
25443           return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
25444       };
25445
25446
25447       projection$$1.scale = function(_) {
25448           if (!arguments.length) return k;
25449           k = +_;
25450           return projection$$1;
25451       };
25452
25453
25454       projection$$1.translate = function(_) {
25455           if (!arguments.length) return [x, y];
25456           x = +_[0];
25457           y = +_[1];
25458           return projection$$1;
25459       };
25460
25461
25462       projection$$1.clipExtent = function(_) {
25463           if (!arguments.length) return clipExtent;
25464           clipExtent = _;
25465           return projection$$1;
25466       };
25467
25468
25469       projection$$1.transform = function(obj) {
25470           if (!arguments.length) return identity$7.translate(x, y).scale(k);
25471           x = +obj.x;
25472           y = +obj.y;
25473           k = +obj.k;
25474           return projection$$1;
25475       };
25476
25477
25478       projection$$1.stream = d3_geoTransform({
25479           point: function(x, y) {
25480               var vec = projection$$1([x, y]);
25481               this.stream.point(vec[0], vec[1]);
25482           }
25483       }).stream;
25484
25485
25486       return projection$$1;
25487   }
25488
25489   function osmChangeset() {
25490       if (!(this instanceof osmChangeset)) {
25491           return (new osmChangeset()).initialize(arguments);
25492       } else if (arguments.length) {
25493           this.initialize(arguments);
25494       }
25495   }
25496
25497
25498   osmEntity$$1.changeset = osmChangeset;
25499
25500   osmChangeset.prototype = Object.create(osmEntity$$1.prototype);
25501
25502   assignIn(osmChangeset.prototype, {
25503
25504       type: 'changeset',
25505
25506
25507       extent: function() {
25508           return new geoExtent$$1();
25509       },
25510
25511
25512       geometry: function() {
25513           return 'changeset';
25514       },
25515
25516
25517       asJXON: function() {
25518           return {
25519               osm: {
25520                   changeset: {
25521                       tag: map$3(this.tags, function(value, key) {
25522                           return { '@k': key, '@v': value };
25523                       }),
25524                       '@version': 0.6,
25525                       '@generator': 'iD'
25526                   }
25527               }
25528           };
25529       },
25530
25531
25532       // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
25533       // XML. Returns a string.
25534       osmChangeJXON: function(changes) {
25535           var changeset_id = this.id;
25536
25537           function nest(x, order) {
25538               var groups = {};
25539               for (var i = 0; i < x.length; i++) {
25540                   var tagName = Object.keys(x[i])[0];
25541                   if (!groups[tagName]) groups[tagName] = [];
25542                   groups[tagName].push(x[i][tagName]);
25543               }
25544               var ordered = {};
25545               order.forEach(function(o) {
25546                   if (groups[o]) ordered[o] = groups[o];
25547               });
25548               return ordered;
25549           }
25550
25551
25552           // sort relations in a changeset by dependencies
25553           function sort(changes) {
25554
25555               // find a referenced relation in the current changeset
25556               function resolve(item) {
25557                   return find$1(relations, function(relation) {
25558                       return item.keyAttributes.type === 'relation'
25559                           && item.keyAttributes.ref === relation['@id'];
25560                   });
25561               }
25562
25563               // a new item is an item that has not been already processed
25564               function isNew(item) {
25565                   return !sorted[ item['@id'] ] && !find$1(processing, function(proc) {
25566                       return proc['@id'] === item['@id'];
25567                   });
25568               }
25569
25570               var processing = [],
25571                   sorted = {},
25572                   relations = changes.relation;
25573
25574               if (!relations) return changes;
25575
25576               for (var i = 0; i < relations.length; i++) {
25577                   var relation = relations[i];
25578
25579                   // skip relation if already sorted
25580                   if (!sorted[relation['@id']]) {
25581                       processing.push(relation);
25582                   }
25583
25584                   while (processing.length > 0) {
25585                       var next = processing[0],
25586                       deps = filter(compact(next.member.map(resolve)), isNew);
25587                       if (deps.length === 0) {
25588                           sorted[next['@id']] = next;
25589                           processing.shift();
25590                       } else {
25591                           processing = deps.concat(processing);
25592                       }
25593                   }
25594               }
25595
25596               changes.relation = values$1(sorted);
25597               return changes;
25598           }
25599
25600           function rep(entity) {
25601               return entity.asJXON(changeset_id);
25602           }
25603
25604           return {
25605               osmChange: {
25606                   '@version': 0.6,
25607                   '@generator': 'iD',
25608                   'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
25609                   'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
25610                   'delete': assignIn(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
25611               }
25612           };
25613       },
25614
25615
25616       asGeoJSON: function() {
25617           return {};
25618       }
25619
25620   });
25621
25622   /**
25623    * Creates a duplicate-free version of an array, using
25624    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
25625    * for equality comparisons, in which only the first occurrence of each element
25626    * is kept. The order of result values is determined by the order they occur
25627    * in the array.
25628    *
25629    * @static
25630    * @memberOf _
25631    * @since 0.1.0
25632    * @category Array
25633    * @param {Array} array The array to inspect.
25634    * @returns {Array} Returns the new duplicate free array.
25635    * @example
25636    *
25637    * _.uniq([2, 1, 2]);
25638    * // => [2, 1]
25639    */
25640   function uniq(array) {
25641     return (array && array.length) ? baseUniq(array) : [];
25642   }
25643
25644   function osmNode() {
25645       if (!(this instanceof osmNode)) {
25646           return (new osmNode()).initialize(arguments);
25647       } else if (arguments.length) {
25648           this.initialize(arguments);
25649       }
25650   }
25651
25652   osmEntity$$1.node = osmNode;
25653
25654   osmNode.prototype = Object.create(osmEntity$$1.prototype);
25655
25656   assignIn(osmNode.prototype, {
25657
25658       type: 'node',
25659
25660
25661       extent: function() {
25662           return new geoExtent$$1(this.loc);
25663       },
25664
25665
25666       geometry: function(graph) {
25667           return graph.transient(this, 'geometry', function() {
25668               return graph.isPoi(this) ? 'point' : 'vertex';
25669           });
25670       },
25671
25672
25673       move: function(loc) {
25674           return this.update({loc: loc});
25675       },
25676
25677
25678       isDegenerate: function() {
25679           return !(
25680               Array.isArray(this.loc) && this.loc.length === 2 &&
25681               this.loc[0] >= -180 && this.loc[0] <= 180 &&
25682               this.loc[1] >= -90 && this.loc[1] <= 90
25683           );
25684       },
25685
25686
25687       // Inspect tags and geometry to determine which direction(s) this node/vertex points
25688       directions: function(resolver, projection) {
25689           var val;
25690           var i;
25691
25692           // which tag to use?
25693           if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
25694               // all-way stop tag on a highway intersection
25695               val = 'all';
25696           } else {
25697               // generic direction tag
25698               val = (this.tags.direction || '').toLowerCase();
25699
25700               // better suffix-style direction tag
25701               var re = /:direction$/i;
25702               var keys = Object.keys(this.tags);
25703               for (i = 0; i < keys.length; i++) {
25704                   if (re.test(keys[i])) {
25705                       val = this.tags[keys[i]].toLowerCase();
25706                       break;
25707                   }
25708               }
25709           }
25710
25711           if (val === '') return [];
25712
25713           var cardinal = {
25714               north: 0,               n: 0,
25715               northnortheast: 22,     nne: 22,
25716               northeast: 45,          ne: 45,
25717               eastnortheast: 67,      ene: 67,
25718               east: 90,               e: 90,
25719               eastsoutheast: 112,     ese: 112,
25720               southeast: 135,         se: 135,
25721               southsoutheast: 157,    sse: 157,
25722               south: 180,             s: 180,
25723               southsouthwest: 202,    ssw: 202,
25724               southwest: 225,         sw: 225,
25725               westsouthwest: 247,     wsw: 247,
25726               west: 270,              w: 270,
25727               westnorthwest: 292,     wnw: 292,
25728               northwest: 315,         nw: 315,
25729               northnorthwest: 337,    nnw: 337
25730           };
25731
25732
25733           var values = val.split(';');
25734           var results = [];
25735
25736           values.forEach(function(v) {
25737               // swap cardinal for numeric directions
25738               if (cardinal[v] !== undefined) {
25739                   v = cardinal[v];
25740               }
25741
25742               // numeric direction - just add to results
25743               if (v !== '' && !isNaN(+v)) {
25744                   results.push(+v);
25745                   return;
25746               }
25747
25748               // string direction - inspect parent ways
25749               var lookBackward =
25750                   (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
25751               var lookForward =
25752                   (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
25753
25754               if (!lookForward && !lookBackward) return;
25755
25756               var nodeIds = {};
25757               resolver.parentWays(this).forEach(function(parent) {
25758                   var nodes = parent.nodes;
25759                   for (i = 0; i < nodes.length; i++) {
25760                       if (nodes[i] === this.id) {  // match current entity
25761                           if (lookForward && i > 0) {
25762                               nodeIds[nodes[i - 1]] = true;  // look back to prev node
25763                           }
25764                           if (lookBackward && i < nodes.length - 1) {
25765                               nodeIds[nodes[i + 1]] = true;  // look ahead to next node
25766                           }
25767                       }
25768                   }
25769               }, this);
25770
25771               Object.keys(nodeIds).forEach(function(nodeId) {
25772                   // +90 because geoAngle returns angle from X axis, not Y (north)
25773                   results.push(
25774                       (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
25775                   );
25776               }, this);
25777
25778           }, this);
25779
25780           return uniq(results);
25781       },
25782
25783
25784       isEndpoint: function(resolver) {
25785           return resolver.transient(this, 'isEndpoint', function() {
25786               var id = this.id;
25787               return resolver.parentWays(this).filter(function(parent) {
25788                   return !parent.isClosed() && !!parent.affix(id);
25789               }).length > 0;
25790           });
25791       },
25792
25793
25794       isConnected: function(resolver) {
25795           return resolver.transient(this, 'isConnected', function() {
25796               var parents = resolver.parentWays(this);
25797
25798               function isLine(entity) {
25799                   return entity.geometry(resolver) === 'line' &&
25800                       entity.hasInterestingTags();
25801               }
25802
25803               // vertex is connected to multiple parent lines
25804               if (parents.length > 1 && some(parents, isLine)) {
25805                   return true;
25806
25807               } else if (parents.length === 1) {
25808                   var way = parents[0],
25809                       nodes = way.nodes.slice();
25810                   if (way.isClosed()) { nodes.pop(); }  // ignore connecting node if closed
25811
25812                   // return true if vertex appears multiple times (way is self intersecting)
25813                   return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
25814               }
25815
25816               return false;
25817           });
25818       },
25819
25820
25821       isIntersection: function(resolver) {
25822           return resolver.transient(this, 'isIntersection', function() {
25823               return resolver.parentWays(this).filter(function(parent) {
25824                   return (parent.tags.highway ||
25825                       parent.tags.waterway ||
25826                       parent.tags.railway ||
25827                       parent.tags.aeroway) &&
25828                       parent.geometry(resolver) === 'line';
25829               }).length > 1;
25830           });
25831       },
25832
25833
25834       isHighwayIntersection: function(resolver) {
25835           return resolver.transient(this, 'isHighwayIntersection', function() {
25836               return resolver.parentWays(this).filter(function(parent) {
25837                   return parent.tags.highway && parent.geometry(resolver) === 'line';
25838               }).length > 1;
25839           });
25840       },
25841
25842
25843       isOnAddressLine: function(resolver) {
25844           return resolver.transient(this, 'isOnAddressLine', function() {
25845               return resolver.parentWays(this).filter(function(parent) {
25846                   return parent.tags.hasOwnProperty('addr:interpolation') &&
25847                       parent.geometry(resolver) === 'line';
25848               }).length > 0;
25849           });
25850       },
25851
25852
25853       asJXON: function(changeset_id) {
25854           var r = {
25855               node: {
25856                   '@id': this.osmId(),
25857                   '@lon': this.loc[0],
25858                   '@lat': this.loc[1],
25859                   '@version': (this.version || 0),
25860                   tag: map$3(this.tags, function(v, k) {
25861                       return { keyAttributes: { k: k, v: v } };
25862                   })
25863               }
25864           };
25865           if (changeset_id) r.node['@changeset'] = changeset_id;
25866           return r;
25867       },
25868
25869
25870       asGeoJSON: function() {
25871           return {
25872               type: 'Point',
25873               coordinates: this.loc
25874           };
25875       }
25876   });
25877
25878   function osmNote() {
25879       if (!(this instanceof osmNote)) {
25880           return (new osmNote()).initialize(arguments);
25881       } else if (arguments.length) {
25882           this.initialize(arguments);
25883       }
25884   }
25885
25886
25887   osmNote.id = function() {
25888       return osmNote.id.next--;
25889   };
25890
25891
25892   osmNote.id.next = -1;
25893
25894
25895   assignIn(osmNote.prototype, {
25896
25897       type: 'note',
25898
25899       initialize: function(sources) {
25900           for (var i = 0; i < sources.length; ++i) {
25901               var source = sources[i];
25902               for (var prop in source) {
25903                   if (Object.prototype.hasOwnProperty.call(source, prop)) {
25904                       if (source[prop] === undefined) {
25905                           delete this[prop];
25906                       } else {
25907                           this[prop] = source[prop];
25908                       }
25909                   }
25910               }
25911           }
25912
25913           if (!this.id) {
25914               this.id = osmNote.id() + '';  // as string
25915           }
25916
25917           return this;
25918       },
25919
25920       extent: function() {
25921           return new geoExtent$$1(this.loc);
25922       },
25923
25924       update: function(attrs) {
25925           return osmNote(this, attrs); // {v: 1 + (this.v || 0)}
25926       },
25927
25928       isNew: function() {
25929           return this.id < 0;
25930       },
25931
25932       move: function(loc) {
25933           return this.update({ loc: loc });
25934       }
25935
25936   });
25937
25938   /** Error message constants. */
25939   var FUNC_ERROR_TEXT$1 = 'Expected a function';
25940
25941   /**
25942    * Creates a function that negates the result of the predicate `func`. The
25943    * `func` predicate is invoked with the `this` binding and arguments of the
25944    * created function.
25945    *
25946    * @static
25947    * @memberOf _
25948    * @since 3.0.0
25949    * @category Function
25950    * @param {Function} predicate The predicate to negate.
25951    * @returns {Function} Returns the new negated function.
25952    * @example
25953    *
25954    * function isEven(n) {
25955    *   return n % 2 == 0;
25956    * }
25957    *
25958    * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
25959    * // => [1, 3, 5]
25960    */
25961   function negate(predicate) {
25962     if (typeof predicate != 'function') {
25963       throw new TypeError(FUNC_ERROR_TEXT$1);
25964     }
25965     return function() {
25966       var args = arguments;
25967       switch (args.length) {
25968         case 0: return !predicate.call(this);
25969         case 1: return !predicate.call(this, args[0]);
25970         case 2: return !predicate.call(this, args[0], args[1]);
25971         case 3: return !predicate.call(this, args[0], args[1], args[2]);
25972       }
25973       return !predicate.apply(this, args);
25974     };
25975   }
25976
25977   /**
25978    * The opposite of `_.filter`; this method returns the elements of `collection`
25979    * that `predicate` does **not** return truthy for.
25980    *
25981    * @static
25982    * @memberOf _
25983    * @since 0.1.0
25984    * @category Collection
25985    * @param {Array|Object} collection The collection to iterate over.
25986    * @param {Function} [predicate=_.identity] The function invoked per iteration.
25987    * @returns {Array} Returns the new filtered array.
25988    * @see _.filter
25989    * @example
25990    *
25991    * var users = [
25992    *   { 'user': 'barney', 'age': 36, 'active': false },
25993    *   { 'user': 'fred',   'age': 40, 'active': true }
25994    * ];
25995    *
25996    * _.reject(users, function(o) { return !o.active; });
25997    * // => objects for ['fred']
25998    *
25999    * // The `_.matches` iteratee shorthand.
26000    * _.reject(users, { 'age': 40, 'active': true });
26001    * // => objects for ['barney']
26002    *
26003    * // The `_.matchesProperty` iteratee shorthand.
26004    * _.reject(users, ['active', false]);
26005    * // => objects for ['fred']
26006    *
26007    * // The `_.property` iteratee shorthand.
26008    * _.reject(users, 'active');
26009    * // => objects for ['barney']
26010    */
26011   function reject(collection, predicate) {
26012     var func = isArray(collection) ? arrayFilter : baseFilter;
26013     return func(collection, negate(baseIteratee(predicate, 3)));
26014   }
26015
26016   /*
26017   Order the nodes of a way in reverse order and reverse any direction dependent tags
26018   other than `oneway`. (We assume that correcting a backwards oneway is the primary
26019   reason for reversing a way.)
26020
26021   In addition, numeric-valued `incline` tags are negated.
26022
26023   The JOSM implementation was used as a guide, but transformations that were of unclear benefit
26024   or adjusted tags that don't seem to be used in practice were omitted.
26025
26026   References:
26027       http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
26028       http://wiki.openstreetmap.org/wiki/Key:direction#Steps
26029       http://wiki.openstreetmap.org/wiki/Key:incline
26030       http://wiki.openstreetmap.org/wiki/Route#Members
26031       http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
26032       http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
26033       http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
26034   */
26035   function actionReverse(wayID, options) {
26036       var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/;
26037       var numeric = /^([+\-]?)(?=[\d.])/;
26038       var keyReplacements = [
26039           [/:right$/, ':left'],
26040           [/:left$/, ':right'],
26041           [/:forward$/, ':backward'],
26042           [/:backward$/, ':forward']
26043       ];
26044       var valueReplacements = {
26045           left: 'right',
26046           right: 'left',
26047           up: 'down',
26048           down: 'up',
26049           forward: 'backward',
26050           backward: 'forward',
26051           forwards: 'backward',
26052           backwards: 'forward',
26053       };
26054       var roleReplacements = {
26055           forward: 'backward',
26056           backward: 'forward',
26057           forwards: 'backward',
26058           backwards: 'forward'
26059       };
26060       var onewayReplacements = {
26061           yes: '-1',
26062           '1': '-1',
26063           '-1': 'yes'
26064       };
26065
26066
26067       function reverseKey(key) {
26068           for (var i = 0; i < keyReplacements.length; ++i) {
26069               var replacement = keyReplacements[i];
26070               if (replacement[0].test(key)) {
26071                   return key.replace(replacement[0], replacement[1]);
26072               }
26073           }
26074           return key;
26075       }
26076
26077
26078       function reverseValue(key, value) {
26079           if (ignoreKey.test(key)) return value;
26080
26081           if (key === 'incline' && numeric.test(value)) {
26082               return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
26083           } else if (options && options.reverseOneway && key === 'oneway') {
26084               return onewayReplacements[value] || value;
26085           } else {
26086               return valueReplacements[value] || value;
26087           }
26088       }
26089
26090
26091       // Reverse the direction of tags attached to the nodes - #3076
26092       function reverseNodeTags(graph, nodeIDs) {
26093           for (var i = 0; i < nodeIDs.length; i++) {
26094               var node = graph.hasEntity(nodeIDs[i]);
26095               if (!node || !Object.keys(node.tags).length) continue;
26096
26097               var tags = {};
26098               for (var key in node.tags) {
26099                   tags[reverseKey(key)] = reverseValue(key, node.tags[key]);
26100               }
26101               graph = graph.replace(node.update({tags: tags}));
26102           }
26103           return graph;
26104       }
26105
26106
26107       return function(graph) {
26108           var way = graph.entity(wayID);
26109           var nodes = way.nodes.slice().reverse();
26110           var tags = {};
26111           var role;
26112
26113           for (var key in way.tags) {
26114               tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
26115           }
26116
26117           graph.parentRelations(way).forEach(function(relation) {
26118               relation.members.forEach(function(member, index) {
26119                   if (member.id === way.id && (role = roleReplacements[member.role])) {
26120                       relation = relation.updateMember({role: role}, index);
26121                       graph = graph.replace(relation);
26122                   }
26123               });
26124           });
26125
26126           // Reverse any associated directions on nodes on the way and then replace
26127           // the way itself with the reversed node ids and updated way tags
26128           return reverseNodeTags(graph, nodes)
26129               .replace(way.update({nodes: nodes, tags: tags}));
26130       };
26131   }
26132
26133   /** `Object#toString` result references. */
26134   var numberTag$4 = '[object Number]';
26135
26136   /**
26137    * Checks if `value` is classified as a `Number` primitive or object.
26138    *
26139    * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
26140    * classified as numbers, use the `_.isFinite` method.
26141    *
26142    * @static
26143    * @memberOf _
26144    * @since 0.1.0
26145    * @category Lang
26146    * @param {*} value The value to check.
26147    * @returns {boolean} Returns `true` if `value` is a number, else `false`.
26148    * @example
26149    *
26150    * _.isNumber(3);
26151    * // => true
26152    *
26153    * _.isNumber(Number.MIN_VALUE);
26154    * // => true
26155    *
26156    * _.isNumber(Infinity);
26157    * // => true
26158    *
26159    * _.isNumber('3');
26160    * // => false
26161    */
26162   function isNumber(value) {
26163     return typeof value == 'number' ||
26164       (isObjectLike(value) && baseGetTag(value) == numberTag$4);
26165   }
26166
26167   /** `Object#toString` result references. */
26168   var stringTag$4 = '[object String]';
26169
26170   /**
26171    * Checks if `value` is classified as a `String` primitive or object.
26172    *
26173    * @static
26174    * @since 0.1.0
26175    * @memberOf _
26176    * @category Lang
26177    * @param {*} value The value to check.
26178    * @returns {boolean} Returns `true` if `value` is a string, else `false`.
26179    * @example
26180    *
26181    * _.isString('abc');
26182    * // => true
26183    *
26184    * _.isString(1);
26185    * // => false
26186    */
26187   function isString(value) {
26188     return typeof value == 'string' ||
26189       (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag$4);
26190   }
26191
26192   /**
26193    * Checks if `value` is `NaN`.
26194    *
26195    * **Note:** This method is based on
26196    * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
26197    * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
26198    * `undefined` and other non-number values.
26199    *
26200    * @static
26201    * @memberOf _
26202    * @since 0.1.0
26203    * @category Lang
26204    * @param {*} value The value to check.
26205    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
26206    * @example
26207    *
26208    * _.isNaN(NaN);
26209    * // => true
26210    *
26211    * _.isNaN(new Number(NaN));
26212    * // => true
26213    *
26214    * isNaN(undefined);
26215    * // => true
26216    *
26217    * _.isNaN(undefined);
26218    * // => false
26219    */
26220   function isNaN$1(value) {
26221     // An `NaN` primitive is the only value that is not equal to itself.
26222     // Perform the `toStringTag` check first to avoid errors with some
26223     // ActiveX objects in IE.
26224     return isNumber(value) && value != +value;
26225   }
26226
26227   function osmLanes(entity) {
26228       if (entity.type !== 'way') return null;
26229       if (!entity.tags.highway) return null;
26230
26231       var tags = entity.tags;
26232       var isOneWay = entity.isOneWay();
26233       var laneCount = getLaneCount(tags, isOneWay);
26234       var maxspeed = parseMaxspeed(tags);
26235
26236       var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
26237       var forward = laneDirections.forward;
26238       var backward = laneDirections.backward;
26239       var bothways = laneDirections.bothways;
26240
26241       // parse the piped string 'x|y|z' format
26242       var turnLanes = {};
26243       turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
26244       turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
26245       turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
26246
26247       var maxspeedLanes = {};
26248       maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
26249       maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
26250       maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
26251
26252       var psvLanes = {};
26253       psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
26254       psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
26255       psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
26256
26257       var busLanes = {};
26258       busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
26259       busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
26260       busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
26261
26262       var taxiLanes = {};
26263       taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
26264       taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
26265       taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
26266
26267       var hovLanes = {};
26268       hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
26269       hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
26270       hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
26271
26272       var hgvLanes = {};
26273       hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
26274       hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
26275       hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
26276
26277       var bicyclewayLanes = {};
26278       bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
26279       bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
26280       bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
26281
26282       var lanesObj = {
26283           forward: [],
26284           backward: [],
26285           unspecified: []
26286       };
26287
26288       // map forward/backward/unspecified of each lane type to lanesObj
26289       mapToLanesObj(lanesObj, turnLanes, 'turnLane');
26290       mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
26291       mapToLanesObj(lanesObj, psvLanes, 'psv');
26292       mapToLanesObj(lanesObj, busLanes, 'bus');
26293       mapToLanesObj(lanesObj, taxiLanes, 'taxi');
26294       mapToLanesObj(lanesObj, hovLanes, 'hov');
26295       mapToLanesObj(lanesObj, hgvLanes, 'hgv');
26296       mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
26297
26298       return {
26299           metadata: {
26300               count: laneCount,
26301               oneway: isOneWay,
26302               forward: forward,
26303               backward: backward,
26304               bothways: bothways,
26305               turnLanes: turnLanes,
26306               maxspeed: maxspeed,
26307               maxspeedLanes: maxspeedLanes,
26308               psvLanes: psvLanes,
26309               busLanes: busLanes,
26310               taxiLanes: taxiLanes,
26311               hovLanes: hovLanes,
26312               hgvLanes: hgvLanes,
26313               bicyclewayLanes: bicyclewayLanes
26314           },
26315           lanes: lanesObj
26316       };
26317   }
26318
26319
26320   function getLaneCount(tags, isOneWay) {
26321       var count;
26322       if (tags.lanes) {
26323           count = parseInt(tags.lanes, 10);
26324           if (count > 0) {
26325               return count;
26326           }
26327       }
26328
26329
26330       switch (tags.highway) {
26331           case 'trunk':
26332           case 'motorway':
26333               count = isOneWay ? 2 : 4;
26334               break;
26335           default:
26336               count = isOneWay ? 1 : 2;
26337               break;
26338       }
26339
26340       return count;
26341   }
26342
26343
26344   function parseMaxspeed(tags) {
26345       var maxspeed = tags.maxspeed;
26346       if (isNumber(maxspeed)) return maxspeed;
26347       if (isString(maxspeed)) {
26348           maxspeed = maxspeed.match(/^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/g);
26349           if (!maxspeed) return;
26350           return parseInt(maxspeed, 10);
26351       }
26352   }
26353
26354
26355   function parseLaneDirections(tags, isOneWay, laneCount) {
26356       var forward = parseInt(tags['lanes:forward'], 10);
26357       var backward = parseInt(tags['lanes:backward'], 10);
26358       var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
26359
26360       if (parseInt(tags.oneway, 10) === -1) {
26361           forward = 0;
26362           bothways = 0;
26363           backward = laneCount;
26364       }
26365       else if (isOneWay) {
26366           forward = laneCount;
26367           bothways = 0;
26368           backward = 0;
26369       }
26370       else if (isNaN$1(forward) && isNaN$1(backward)) {
26371           backward = Math.floor((laneCount - bothways) / 2);
26372           forward = laneCount - bothways - backward;
26373       }
26374       else if (isNaN$1(forward)) {
26375           if (backward > laneCount - bothways) {
26376               backward = laneCount - bothways;
26377           }
26378           forward = laneCount - bothways - backward;
26379       }
26380       else if (isNaN$1(backward)) {
26381           if (forward > laneCount - bothways) {
26382               forward = laneCount - bothways;
26383           }
26384           backward = laneCount - bothways - forward;
26385       }
26386       return {
26387           forward: forward,
26388           backward: backward,
26389           bothways: bothways
26390       };
26391   }
26392
26393
26394   function parseTurnLanes(tag){
26395       if (!tag) return;
26396
26397       var validValues = [
26398           'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
26399           'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
26400       ];
26401
26402       return tag.split('|')
26403           .map(function (s) {
26404               if (s === '') s = 'none';
26405               return s.split(';')
26406                   .map(function (d) {
26407                       return validValues.indexOf(d) === -1 ? 'unknown': d;
26408                   });
26409           });
26410   }
26411
26412
26413   function parseMaxspeedLanes(tag, maxspeed) {
26414       if (!tag) return;
26415
26416       return tag.split('|')
26417           .map(function (s) {
26418               if (s === 'none') return s;
26419               var m = parseInt(s, 10);
26420               if (s === '' || m === maxspeed) return null;
26421               return isNaN$1(m) ? 'unknown': m;
26422           });
26423   }
26424
26425
26426   function parseMiscLanes(tag) {
26427       if (!tag) return;
26428
26429       var validValues = [
26430           'yes', 'no', 'designated'
26431       ];
26432
26433       return tag.split('|')
26434           .map(function (s) {
26435               if (s === '') s = 'no';
26436               return validValues.indexOf(s) === -1 ? 'unknown': s;
26437           });
26438   }
26439
26440
26441   function parseBicycleWay(tag) {
26442       if (!tag) return;
26443
26444       var validValues = [
26445           'yes', 'no', 'designated', 'lane'
26446       ];
26447
26448       return tag.split('|')
26449           .map(function (s) {
26450               if (s === '') s = 'no';
26451               return validValues.indexOf(s) === -1 ? 'unknown': s;
26452           });
26453   }
26454
26455
26456   function mapToLanesObj(lanesObj, data, key) {
26457       if (data.forward) data.forward.forEach(function(l, i) {
26458           if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
26459           lanesObj.forward[i][key] = l;
26460       });
26461       if (data.backward) data.backward.forEach(function(l, i) {
26462           if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
26463           lanesObj.backward[i][key] = l;
26464       });
26465       if (data.unspecified) data.unspecified.forEach(function(l, i) {
26466           if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
26467           lanesObj.unspecified[i][key] = l;
26468       });
26469   }
26470
26471   /** Used to compose bitmasks for cloning. */
26472   var CLONE_DEEP_FLAG$2 = 1,
26473       CLONE_SYMBOLS_FLAG$3 = 4;
26474
26475   /**
26476    * This method is like `_.clone` except that it recursively clones `value`.
26477    *
26478    * @static
26479    * @memberOf _
26480    * @since 1.0.0
26481    * @category Lang
26482    * @param {*} value The value to recursively clone.
26483    * @returns {*} Returns the deep cloned value.
26484    * @see _.clone
26485    * @example
26486    *
26487    * var objects = [{ 'a': 1 }, { 'b': 2 }];
26488    *
26489    * var deep = _.cloneDeep(objects);
26490    * console.log(deep[0] === objects[0]);
26491    * // => false
26492    */
26493   function cloneDeep(value) {
26494     return baseClone(value, CLONE_DEEP_FLAG$2 | CLONE_SYMBOLS_FLAG$3);
26495   }
26496
26497   /**
26498    * Gets the timestamp of the number of milliseconds that have elapsed since
26499    * the Unix epoch (1 January 1970 00:00:00 UTC).
26500    *
26501    * @static
26502    * @memberOf _
26503    * @since 2.4.0
26504    * @category Date
26505    * @returns {number} Returns the timestamp.
26506    * @example
26507    *
26508    * _.defer(function(stamp) {
26509    *   console.log(_.now() - stamp);
26510    * }, _.now());
26511    * // => Logs the number of milliseconds it took for the deferred invocation.
26512    */
26513   var now$1 = function() {
26514     return root$2.Date.now();
26515   };
26516
26517   /** Error message constants. */
26518   var FUNC_ERROR_TEXT$2 = 'Expected a function';
26519
26520   /* Built-in method references for those with the same name as other `lodash` methods. */
26521   var nativeMax$2 = Math.max,
26522       nativeMin = Math.min;
26523
26524   /**
26525    * Creates a debounced function that delays invoking `func` until after `wait`
26526    * milliseconds have elapsed since the last time the debounced function was
26527    * invoked. The debounced function comes with a `cancel` method to cancel
26528    * delayed `func` invocations and a `flush` method to immediately invoke them.
26529    * Provide `options` to indicate whether `func` should be invoked on the
26530    * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
26531    * with the last arguments provided to the debounced function. Subsequent
26532    * calls to the debounced function return the result of the last `func`
26533    * invocation.
26534    *
26535    * **Note:** If `leading` and `trailing` options are `true`, `func` is
26536    * invoked on the trailing edge of the timeout only if the debounced function
26537    * is invoked more than once during the `wait` timeout.
26538    *
26539    * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
26540    * until to the next tick, similar to `setTimeout` with a timeout of `0`.
26541    *
26542    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
26543    * for details over the differences between `_.debounce` and `_.throttle`.
26544    *
26545    * @static
26546    * @memberOf _
26547    * @since 0.1.0
26548    * @category Function
26549    * @param {Function} func The function to debounce.
26550    * @param {number} [wait=0] The number of milliseconds to delay.
26551    * @param {Object} [options={}] The options object.
26552    * @param {boolean} [options.leading=false]
26553    *  Specify invoking on the leading edge of the timeout.
26554    * @param {number} [options.maxWait]
26555    *  The maximum time `func` is allowed to be delayed before it's invoked.
26556    * @param {boolean} [options.trailing=true]
26557    *  Specify invoking on the trailing edge of the timeout.
26558    * @returns {Function} Returns the new debounced function.
26559    * @example
26560    *
26561    * // Avoid costly calculations while the window size is in flux.
26562    * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
26563    *
26564    * // Invoke `sendMail` when clicked, debouncing subsequent calls.
26565    * jQuery(element).on('click', _.debounce(sendMail, 300, {
26566    *   'leading': true,
26567    *   'trailing': false
26568    * }));
26569    *
26570    * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
26571    * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
26572    * var source = new EventSource('/stream');
26573    * jQuery(source).on('message', debounced);
26574    *
26575    * // Cancel the trailing debounced invocation.
26576    * jQuery(window).on('popstate', debounced.cancel);
26577    */
26578   function debounce(func, wait, options) {
26579     var lastArgs,
26580         lastThis,
26581         maxWait,
26582         result,
26583         timerId,
26584         lastCallTime,
26585         lastInvokeTime = 0,
26586         leading = false,
26587         maxing = false,
26588         trailing = true;
26589
26590     if (typeof func != 'function') {
26591       throw new TypeError(FUNC_ERROR_TEXT$2);
26592     }
26593     wait = toNumber(wait) || 0;
26594     if (isObject(options)) {
26595       leading = !!options.leading;
26596       maxing = 'maxWait' in options;
26597       maxWait = maxing ? nativeMax$2(toNumber(options.maxWait) || 0, wait) : maxWait;
26598       trailing = 'trailing' in options ? !!options.trailing : trailing;
26599     }
26600
26601     function invokeFunc(time) {
26602       var args = lastArgs,
26603           thisArg = lastThis;
26604
26605       lastArgs = lastThis = undefined;
26606       lastInvokeTime = time;
26607       result = func.apply(thisArg, args);
26608       return result;
26609     }
26610
26611     function leadingEdge(time) {
26612       // Reset any `maxWait` timer.
26613       lastInvokeTime = time;
26614       // Start the timer for the trailing edge.
26615       timerId = setTimeout(timerExpired, wait);
26616       // Invoke the leading edge.
26617       return leading ? invokeFunc(time) : result;
26618     }
26619
26620     function remainingWait(time) {
26621       var timeSinceLastCall = time - lastCallTime,
26622           timeSinceLastInvoke = time - lastInvokeTime,
26623           timeWaiting = wait - timeSinceLastCall;
26624
26625       return maxing
26626         ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
26627         : timeWaiting;
26628     }
26629
26630     function shouldInvoke(time) {
26631       var timeSinceLastCall = time - lastCallTime,
26632           timeSinceLastInvoke = time - lastInvokeTime;
26633
26634       // Either this is the first call, activity has stopped and we're at the
26635       // trailing edge, the system time has gone backwards and we're treating
26636       // it as the trailing edge, or we've hit the `maxWait` limit.
26637       return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
26638         (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
26639     }
26640
26641     function timerExpired() {
26642       var time = now$1();
26643       if (shouldInvoke(time)) {
26644         return trailingEdge(time);
26645       }
26646       // Restart the timer.
26647       timerId = setTimeout(timerExpired, remainingWait(time));
26648     }
26649
26650     function trailingEdge(time) {
26651       timerId = undefined;
26652
26653       // Only invoke if we have `lastArgs` which means `func` has been
26654       // debounced at least once.
26655       if (trailing && lastArgs) {
26656         return invokeFunc(time);
26657       }
26658       lastArgs = lastThis = undefined;
26659       return result;
26660     }
26661
26662     function cancel() {
26663       if (timerId !== undefined) {
26664         clearTimeout(timerId);
26665       }
26666       lastInvokeTime = 0;
26667       lastArgs = lastCallTime = lastThis = timerId = undefined;
26668     }
26669
26670     function flush() {
26671       return timerId === undefined ? result : trailingEdge(now$1());
26672     }
26673
26674     function debounced() {
26675       var time = now$1(),
26676           isInvoking = shouldInvoke(time);
26677
26678       lastArgs = arguments;
26679       lastThis = this;
26680       lastCallTime = time;
26681
26682       if (isInvoking) {
26683         if (timerId === undefined) {
26684           return leadingEdge(lastCallTime);
26685         }
26686         if (maxing) {
26687           // Handle invocations in a tight loop.
26688           timerId = setTimeout(timerExpired, wait);
26689           return invokeFunc(lastCallTime);
26690         }
26691       }
26692       if (timerId === undefined) {
26693         timerId = setTimeout(timerExpired, wait);
26694       }
26695       return result;
26696     }
26697     debounced.cancel = cancel;
26698     debounced.flush = flush;
26699     return debounced;
26700   }
26701
26702   /**
26703    * Casts `value` to `identity` if it's not a function.
26704    *
26705    * @private
26706    * @param {*} value The value to inspect.
26707    * @returns {Function} Returns cast function.
26708    */
26709   function castFunction(value) {
26710     return typeof value == 'function' ? value : identity$8;
26711   }
26712
26713   /**
26714    * Iterates over elements of `collection` and invokes `iteratee` for each element.
26715    * The iteratee is invoked with three arguments: (value, index|key, collection).
26716    * Iteratee functions may exit iteration early by explicitly returning `false`.
26717    *
26718    * **Note:** As with other "Collections" methods, objects with a "length"
26719    * property are iterated like arrays. To avoid this behavior use `_.forIn`
26720    * or `_.forOwn` for object iteration.
26721    *
26722    * @static
26723    * @memberOf _
26724    * @since 0.1.0
26725    * @alias each
26726    * @category Collection
26727    * @param {Array|Object} collection The collection to iterate over.
26728    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26729    * @returns {Array|Object} Returns `collection`.
26730    * @see _.forEachRight
26731    * @example
26732    *
26733    * _.forEach([1, 2], function(value) {
26734    *   console.log(value);
26735    * });
26736    * // => Logs `1` then `2`.
26737    *
26738    * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
26739    *   console.log(key);
26740    * });
26741    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
26742    */
26743   function forEach(collection, iteratee) {
26744     var func = isArray(collection) ? arrayEach : baseEach;
26745     return func(collection, castFunction(iteratee));
26746   }
26747
26748   /**
26749    * Iterates over own enumerable string keyed properties of an object and
26750    * invokes `iteratee` for each property. The iteratee is invoked with three
26751    * arguments: (value, key, object). Iteratee functions may exit iteration
26752    * early by explicitly returning `false`.
26753    *
26754    * @static
26755    * @memberOf _
26756    * @since 0.3.0
26757    * @category Object
26758    * @param {Object} object The object to iterate over.
26759    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26760    * @returns {Object} Returns `object`.
26761    * @see _.forOwnRight
26762    * @example
26763    *
26764    * function Foo() {
26765    *   this.a = 1;
26766    *   this.b = 2;
26767    * }
26768    *
26769    * Foo.prototype.c = 3;
26770    *
26771    * _.forOwn(new Foo, function(value, key) {
26772    *   console.log(key);
26773    * });
26774    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
26775    */
26776   function forOwn(object, iteratee) {
26777     return object && baseForOwn(object, castFunction(iteratee));
26778   }
26779
26780   var translations = Object.create(null);
26781
26782   var currentLocale = 'en';
26783   var textDirection = 'ltr';
26784
26785   function setLocale(_) {
26786       if (translations[_] !== undefined) {
26787           currentLocale = _;
26788       } else if (translations[_.split('-')[0]]) {
26789           currentLocale = _.split('-')[0];
26790       }
26791   }
26792
26793   function addTranslation(id, value) {
26794       translations[id] = value;
26795   }
26796
26797   /**
26798    * Given a string identifier, try to find that string in the current
26799    * language, and return it.  This function will be called recursively
26800    * with locale `en` if a string can not be found in the requested language.
26801    *
26802    * @param {string}   s   string identifier
26803    * @param {object?}  o   object of token replacements and default string
26804    * @param {string?}  loc locale to use
26805    * @returns {string?} locale string
26806    */
26807   function t(s, o, loc) {
26808       loc = loc || currentLocale;
26809
26810       var path = s
26811           .split('.')
26812           .map(function (s) { return s.replace('<TX_DOT>', '.'); })
26813           .reverse();
26814
26815       var rep = translations[loc];
26816
26817       while (rep !== undefined && path.length) {
26818           rep = rep[path.pop()];
26819       }
26820
26821       if (rep !== undefined) {
26822           if (o) {
26823               for (var k in o) {
26824                   rep = rep.replace('{' + k + '}', o[k]);
26825               }
26826           }
26827           return rep;
26828       }
26829
26830       if (loc !== 'en') {
26831           return t(s, o, 'en');
26832       }
26833
26834       if (o && 'default' in o) {
26835           return o.default;
26836       }
26837
26838       var missing = 'Missing ' + loc + ' translation: ' + s;
26839       if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
26840
26841       return missing;
26842   }
26843
26844   /**
26845    * Given string 'ltr' or 'rtl', save that setting
26846    *
26847    * @param {string} dir ltr or rtl
26848    */
26849
26850   function setTextDirection(dir) {
26851       textDirection = dir;
26852   }
26853
26854   /** Used to compose bitmasks for cloning. */
26855   var CLONE_DEEP_FLAG$3 = 1,
26856       CLONE_SYMBOLS_FLAG$4 = 4;
26857
26858   /**
26859    * This method is like `_.cloneWith` except that it recursively clones `value`.
26860    *
26861    * @static
26862    * @memberOf _
26863    * @since 4.0.0
26864    * @category Lang
26865    * @param {*} value The value to recursively clone.
26866    * @param {Function} [customizer] The function to customize cloning.
26867    * @returns {*} Returns the deep cloned value.
26868    * @see _.cloneWith
26869    * @example
26870    *
26871    * function customizer(value) {
26872    *   if (_.isElement(value)) {
26873    *     return value.cloneNode(true);
26874    *   }
26875    * }
26876    *
26877    * var el = _.cloneDeepWith(document.body, customizer);
26878    *
26879    * console.log(el === document.body);
26880    * // => false
26881    * console.log(el.nodeName);
26882    * // => 'BODY'
26883    * console.log(el.childNodes.length);
26884    * // => 20
26885    */
26886   function cloneDeepWith(value, customizer) {
26887     customizer = typeof customizer == 'function' ? customizer : undefined;
26888     return baseClone(value, CLONE_DEEP_FLAG$3 | CLONE_SYMBOLS_FLAG$4, customizer);
26889   }
26890
26891   /**
26892    * Creates an array of `array` values not included in the other given arrays
26893    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
26894    * for equality comparisons. The order and references of result values are
26895    * determined by the first array.
26896    *
26897    * **Note:** Unlike `_.pullAll`, this method returns a new array.
26898    *
26899    * @static
26900    * @memberOf _
26901    * @since 0.1.0
26902    * @category Array
26903    * @param {Array} array The array to inspect.
26904    * @param {...Array} [values] The values to exclude.
26905    * @returns {Array} Returns the new array of filtered values.
26906    * @see _.without, _.xor
26907    * @example
26908    *
26909    * _.difference([2, 1], [2, 3]);
26910    * // => [1]
26911    */
26912   var difference = baseRest(function(array, values) {
26913     return isArrayLikeObject(array)
26914       ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
26915       : [];
26916   });
26917
26918   /** `Object#toString` result references. */
26919   var mapTag$7 = '[object Map]',
26920       setTag$7 = '[object Set]';
26921
26922   /** Used for built-in method references. */
26923   var objectProto$h = Object.prototype;
26924
26925   /** Used to check objects for own properties. */
26926   var hasOwnProperty$e = objectProto$h.hasOwnProperty;
26927
26928   /**
26929    * Checks if `value` is an empty object, collection, map, or set.
26930    *
26931    * Objects are considered empty if they have no own enumerable string keyed
26932    * properties.
26933    *
26934    * Array-like values such as `arguments` objects, arrays, buffers, strings, or
26935    * jQuery-like collections are considered empty if they have a `length` of `0`.
26936    * Similarly, maps and sets are considered empty if they have a `size` of `0`.
26937    *
26938    * @static
26939    * @memberOf _
26940    * @since 0.1.0
26941    * @category Lang
26942    * @param {*} value The value to check.
26943    * @returns {boolean} Returns `true` if `value` is empty, else `false`.
26944    * @example
26945    *
26946    * _.isEmpty(null);
26947    * // => true
26948    *
26949    * _.isEmpty(true);
26950    * // => true
26951    *
26952    * _.isEmpty(1);
26953    * // => true
26954    *
26955    * _.isEmpty([1, 2, 3]);
26956    * // => false
26957    *
26958    * _.isEmpty({ 'a': 1 });
26959    * // => false
26960    */
26961   function isEmpty(value) {
26962     if (value == null) {
26963       return true;
26964     }
26965     if (isArrayLike(value) &&
26966         (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
26967           isBuffer(value) || isTypedArray(value) || isArguments(value))) {
26968       return !value.length;
26969     }
26970     var tag = getTag$1(value);
26971     if (tag == mapTag$7 || tag == setTag$7) {
26972       return !value.size;
26973     }
26974     if (isPrototype(value)) {
26975       return !baseKeys(value).length;
26976     }
26977     for (var key in value) {
26978       if (hasOwnProperty$e.call(value, key)) {
26979         return false;
26980       }
26981     }
26982     return true;
26983   }
26984
26985   var detected;
26986
26987   function utilDetect(force) {
26988       if (detected && !force) return detected;
26989       detected = {};
26990
26991       var ua = navigator.userAgent,
26992           m = null;
26993
26994       m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
26995       if (m !== null) {
26996           detected.browser = m[1];
26997           detected.version = m[2];
26998       }
26999       if (!detected.browser) {
27000           m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
27001           if (m !== null) {
27002               detected.browser = 'msie';
27003               detected.version = m[1];
27004           }
27005       }
27006       if (!detected.browser) {
27007           m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
27008           if (m !== null) {
27009               detected.browser = 'Opera';
27010               detected.version = m[2];
27011           }
27012       }
27013       if (!detected.browser) {
27014           m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
27015           if (m !== null) {
27016               detected.browser = m[1];
27017               detected.version = m[2];
27018               m = ua.match(/version\/([\.\d]+)/i);
27019               if (m !== null) detected.version = m[1];
27020           }
27021       }
27022       if (!detected.browser) {
27023           detected.browser = navigator.appName;
27024           detected.version = navigator.appVersion;
27025       }
27026
27027       // keep major.minor version only..
27028       detected.version = detected.version.split(/\W/).slice(0,2).join('.');
27029
27030       if (detected.browser.toLowerCase() === 'msie') {
27031           detected.ie = true;
27032           detected.browser = 'Internet Explorer';
27033           detected.support = parseFloat(detected.version) >= 11;
27034       } else {
27035           detected.ie = false;
27036           detected.support = true;
27037       }
27038
27039       // Added due to incomplete svg style support. See #715
27040       detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
27041
27042       detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
27043       detected.language = detected.locale.split('-')[0];
27044
27045       // Search `navigator.languages` for a better locale.. Prefer the first language,
27046       // unless the second language is a culture-specific version of the first one, see #3842
27047       if (navigator.languages && navigator.languages.length > 0) {
27048           var code0 = navigator.languages[0],
27049               parts0 = code0.split('-');
27050
27051           detected.locale = code0;
27052           detected.language = parts0[0];
27053
27054           if (navigator.languages.length > 1 && parts0.length === 1) {
27055               var code1 = navigator.languages[1],
27056                   parts1 = code1.split('-');
27057
27058               if (parts1[0] === parts0[0]) {
27059                   detected.locale = code1;
27060               }
27061           }
27062       }
27063
27064       // Loaded locale is stored in currentLocale
27065       // return that instead (except in the situation where 'en' might override 'en-US')
27066       var loadedLocale = currentLocale || 'en';
27067       if (loadedLocale !== 'en') {
27068           detected.locale = loadedLocale;
27069           detected.language = detected.locale.split('-')[0];
27070       }
27071
27072       // detect text direction
27073       var q = utilStringQs(window.location.hash.substring(1));
27074       var lang = dataLocales[detected.locale];
27075       if ((lang && lang.rtl) || (q.rtl === 'true')) {
27076           detected.textDirection = 'rtl';
27077       } else {
27078           detected.textDirection = 'ltr';
27079       }
27080       setTextDirection(detected.textDirection);
27081
27082       // detect host
27083       var loc = window.top.location;
27084       var origin = loc.origin;
27085       if (!origin) {  // for unpatched IE11
27086           origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
27087       }
27088
27089       detected.host = origin + loc.pathname;
27090
27091       detected.filedrop = (window.FileReader && 'ondrop' in window);
27092
27093       detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
27094
27095       detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
27096
27097       function nav(x) {
27098           return navigator.userAgent.indexOf(x) !== -1;
27099       }
27100
27101       if (nav('Win')) {
27102           detected.os = 'win';
27103           detected.platform = 'Windows';
27104       }
27105       else if (nav('Mac')) {
27106           detected.os = 'mac';
27107           detected.platform = 'Macintosh';
27108       }
27109       else if (nav('X11') || nav('Linux')) {
27110           detected.os = 'linux';
27111           detected.platform = 'Linux';
27112       }
27113       else {
27114           detected.os = 'win';
27115           detected.platform = 'Unknown';
27116       }
27117
27118       return detected;
27119   }
27120
27121   var remove$1 = removeDiacritics;
27122
27123   var replacementList = [
27124     {
27125       base: ' ',
27126       chars: "\u00A0",
27127     }, {
27128       base: '0',
27129       chars: "\u07C0",
27130     }, {
27131       base: 'A',
27132       chars: "\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F",
27133     }, {
27134       base: 'AA',
27135       chars: "\uA732",
27136     }, {
27137       base: 'AE',
27138       chars: "\u00C6\u01FC\u01E2",
27139     }, {
27140       base: 'AO',
27141       chars: "\uA734",
27142     }, {
27143       base: 'AU',
27144       chars: "\uA736",
27145     }, {
27146       base: 'AV',
27147       chars: "\uA738\uA73A",
27148     }, {
27149       base: 'AY',
27150       chars: "\uA73C",
27151     }, {
27152       base: 'B',
27153       chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
27154     }, {
27155       base: 'C',
27156       chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
27157     }, {
27158       base: 'D',
27159       chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
27160     }, {
27161       base: 'Dh',
27162       chars: "\u00D0",
27163     }, {
27164       base: 'DZ',
27165       chars: "\u01F1\u01C4",
27166     }, {
27167       base: 'Dz',
27168       chars: "\u01F2\u01C5",
27169     }, {
27170       base: 'E',
27171       chars: "\u025B\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E\u1D07",
27172     }, {
27173       base: 'F',
27174       chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
27175     }, {
27176       base: 'G',
27177       chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
27178     }, {
27179       base: 'H',
27180       chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
27181     }, {
27182       base: 'I',
27183       chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
27184     }, {
27185       base: 'J',
27186       chars: "\u24BF\uFF2A\u0134\u0248\u0237",
27187     }, {
27188       base: 'K',
27189       chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
27190     }, {
27191       base: 'L',
27192       chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
27193     }, {
27194       base: 'LJ',
27195       chars: "\u01C7",
27196     }, {
27197       base: 'Lj',
27198       chars: "\u01C8",
27199     }, {
27200       base: 'M',
27201       chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
27202     }, {
27203       base: 'N',
27204       chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
27205     }, {
27206       base: 'NJ',
27207       chars: "\u01CA",
27208     }, {
27209       base: 'Nj',
27210       chars: "\u01CB",
27211     }, {
27212       base: 'O',
27213       chars: "\u24C4\uFF2F\xD2\xD3\xD4\u1ED2\u1ED0\u1ED6\u1ED4\xD5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\xD6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\xD8\u01FE\u0186\u019F\uA74A\uA74C",
27214     }, {
27215       base: 'OE',
27216       chars: "\u0152",
27217     }, {
27218       base: 'OI',
27219       chars: "\u01A2",
27220     }, {
27221       base: 'OO',
27222       chars: "\uA74E",
27223     }, {
27224       base: 'OU',
27225       chars: "\u0222",
27226     }, {
27227       base: 'P',
27228       chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
27229     }, {
27230       base: 'Q',
27231       chars: "\u24C6\uFF31\uA756\uA758\u024A",
27232     }, {
27233       base: 'R',
27234       chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
27235     }, {
27236       base: 'S',
27237       chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
27238     }, {
27239       base: 'T',
27240       chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
27241     }, {
27242       base: 'Th',
27243       chars: "\u00DE",
27244     }, {
27245       base: 'TZ',
27246       chars: "\uA728",
27247     }, {
27248       base: 'U',
27249       chars: "\u24CA\uFF35\xD9\xDA\xDB\u0168\u1E78\u016A\u1E7A\u016C\xDC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244",
27250     }, {
27251       base: 'V',
27252       chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
27253     }, {
27254       base: 'VY',
27255       chars: "\uA760",
27256     }, {
27257       base: 'W',
27258       chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
27259     }, {
27260       base: 'X',
27261       chars: "\u24CD\uFF38\u1E8A\u1E8C",
27262     }, {
27263       base: 'Y',
27264       chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
27265     }, {
27266       base: 'Z',
27267       chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
27268     }, {
27269       base: 'a',
27270       chars: "\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250\u0251",
27271     }, {
27272       base: 'aa',
27273       chars: "\uA733",
27274     }, {
27275       base: 'ae',
27276       chars: "\u00E6\u01FD\u01E3",
27277     }, {
27278       base: 'ao',
27279       chars: "\uA735",
27280     }, {
27281       base: 'au',
27282       chars: "\uA737",
27283     }, {
27284       base: 'av',
27285       chars: "\uA739\uA73B",
27286     }, {
27287       base: 'ay',
27288       chars: "\uA73D",
27289     }, {
27290       base: 'b',
27291       chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
27292     }, {
27293       base: 'c',
27294       chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
27295     }, {
27296       base: 'd',
27297       chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
27298     }, {
27299       base: 'dh',
27300       chars: "\u00F0",
27301     }, {
27302       base: 'dz',
27303       chars: "\u01F3\u01C6",
27304     }, {
27305       base: 'e',
27306       chars: "\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u01DD",
27307     }, {
27308       base: 'f',
27309       chars: "\u24D5\uFF46\u1E1F\u0192",
27310     }, {
27311       base: 'ff',
27312       chars: "\uFB00",
27313     }, {
27314       base: 'fi',
27315       chars: "\uFB01",
27316     }, {
27317       base: 'fl',
27318       chars: "\uFB02",
27319     }, {
27320       base: 'ffi',
27321       chars: "\uFB03",
27322     }, {
27323       base: 'ffl',
27324       chars: "\uFB04",
27325     }, {
27326       base: 'g',
27327       chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
27328     }, {
27329       base: 'h',
27330       chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
27331     }, {
27332       base: 'hv',
27333       chars: "\u0195",
27334     }, {
27335       base: 'i',
27336       chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
27337     }, {
27338       base: 'j',
27339       chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
27340     }, {
27341       base: 'k',
27342       chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
27343     }, {
27344       base: 'l',
27345       chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
27346     }, {
27347       base: 'lj',
27348       chars: "\u01C9",
27349     }, {
27350       base: 'm',
27351       chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
27352     }, {
27353       base: 'n',
27354       chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
27355     }, {
27356       base: 'nj',
27357       chars: "\u01CC",
27358     }, {
27359       base: 'o',
27360       chars: "\u24DE\uFF4F\xF2\xF3\xF4\u1ED3\u1ED1\u1ED7\u1ED5\xF5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\xF6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\xF8\u01FF\uA74B\uA74D\u0275\u0254\u1D11",
27361     }, {
27362       base: 'oe',
27363       chars: "\u0153",
27364     }, {
27365       base: 'oi',
27366       chars: "\u01A3",
27367     }, {
27368       base: 'oo',
27369       chars: "\uA74F",
27370     }, {
27371       base: 'ou',
27372       chars: "\u0223",
27373     }, {
27374       base: 'p',
27375       chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
27376     }, {
27377       base: 'q',
27378       chars: "\u24E0\uFF51\u024B\uA757\uA759",
27379     }, {
27380       base: 'r',
27381       chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
27382     }, {
27383       base: 's',
27384       chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
27385     }, {
27386       base: 'ss',
27387       chars: "\xDF",
27388     }, {
27389       base: 't',
27390       chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
27391     }, {
27392       base: 'th',
27393       chars: "\u00FE",
27394     }, {
27395       base: 'tz',
27396       chars: "\uA729",
27397     }, {
27398       base: 'u',
27399       chars: "\u24E4\uFF55\xF9\xFA\xFB\u0169\u1E79\u016B\u1E7B\u016D\xFC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289",
27400     }, {
27401       base: 'v',
27402       chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
27403     }, {
27404       base: 'vy',
27405       chars: "\uA761",
27406     }, {
27407       base: 'w',
27408       chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
27409     }, {
27410       base: 'x',
27411       chars: "\u24E7\uFF58\u1E8B\u1E8D",
27412     }, {
27413       base: 'y',
27414       chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
27415     }, {
27416       base: 'z',
27417       chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
27418     }
27419   ];
27420
27421   var diacriticsMap = {};
27422   for (var i = 0; i < replacementList.length; i += 1) {
27423     var chars = replacementList[i].chars;
27424     for (var j = 0; j < chars.length; j += 1) {
27425       diacriticsMap[chars[j]] = replacementList[i].base;
27426     }
27427   }
27428
27429   function removeDiacritics(str) {
27430     return str.replace(/[^\u0000-\u007e]/g, function(c) {
27431       return diacriticsMap[c] || c;
27432     });
27433   }
27434
27435   // see https://github.com/openstreetmap/iD/pull/3707
27436   // https://gist.github.com/mapmeld/556b09ddec07a2044c76e1ef45f01c60
27437
27438   var chars$1 = {
27439       // madda above alef
27440       1570: { initial: 'آ‎', isolated: 'ﺁ', medial: 'ﺁ', final: 'ﺂ' },
27441
27442       // hamza above and below alef
27443       1571: { initial: 'أ', isolated: 'ﺃ', medial: '', final: 'ﺄ' },
27444       // 1572 is ؤ
27445       1573: { initial: 'إ', isolated: 'ﺇ', medial: '', final: 'ﺈ' },
27446       // 1574 is ئ
27447       1575: { initial: 'ا', isolated: 'ا', medial: '', final: 'ﺎ' },
27448       1576: { initial: 'ﺑ', isolated: 'ﺏ', medial: 'ﺒ', final: 'ﺐ' },
27449
27450       // 1577 ة
27451       1577: { initial: '', isolated: 'ة', medial: '', final: 'ﺔ' },
27452
27453       1578: { initial: 'ﺗ', isolated: 'ﺕ', medial: 'ﺘ', final: 'ﺖ' },
27454       1579: { initial: 'ﺛ', isolated: 'ﺙ', medial: 'ﺜ', final: 'ﺚ' },
27455       1580: { initial: 'ﺟ', isolated: 'ﺝ', medial: 'ﺠ', final: 'ﺞ' },
27456       1581: { initial: 'ﺣ', isolated: 'ﺡ', medial: 'ﺤ', final: 'ﺢ' },
27457       1582: { initial: 'ﺧ', isolated: 'ﺥ', medial: 'ﺨ', final: 'ﺦ' },
27458       1583: { initial: 'ﺩ', isolated: 'ﺩ', medial: '', final: 'ﺪ' },
27459       1584: { initial: 'ﺫ', isolated: 'ﺫ', medial: '', final: 'ﺬ' },
27460       1585: { initial: 'ﺭ', isolated: 'ﺭ', medial: '', final: 'ﺮ' },
27461       1586: { initial: 'ﺯ', isolated: 'ﺯ', medial: '', final: 'ﺰ' },
27462       1688: { initial: 'ﮊ', isolated: 'ﮊ', medial: '', final: 'ﮋ' },
27463       1587: { initial: 'ﺳ', isolated: 'ﺱ', medial: 'ﺴ', final: 'ﺲ' },
27464       1588: { initial: 'ﺷ', isolated: 'ﺵ', medial: 'ﺸ', final: 'ﺶ' },
27465       1589: { initial: 'ﺻ', isolated: 'ﺹ', medial: 'ﺼ', final: 'ﺺ' },
27466       1590: { initial: 'ﺿ', isolated: 'ﺽ', medial: 'ﻀ', final: 'ﺾ' },
27467       1591: { initial: 'ﻃ', isolated: 'ﻁ', medial: 'ﻄ', final: 'ﻂ' },
27468       1592: { initial: 'ﻇ', isolated: 'ﻅ', medial: 'ﻈ', final: 'ﻆ' },
27469       1593: { initial: 'ﻋ', isolated: 'ﻉ', medial: 'ﻌ', final: 'ﻊ' },
27470       1594: { initial: 'ﻏ', isolated: 'ﻍ', medial: 'ﻐ', final: 'ﻎ' },
27471
27472       // 1595 ػ - may be very rare
27473
27474       1601: { initial: 'ﻓ', isolated: 'ﻑ', medial: 'ﻔ', final: 'ﻒ' },
27475       1602: { initial: 'ﻗ', isolated: 'ﻕ', medial: 'ﻘ', final: 'ﻖ' },
27476       1604: { initial: 'ﻟ', isolated: 'ﻝ', medial: 'ﻠ', final: 'ﻞ' },
27477       1605: { initial: 'ﻣ', isolated: 'ﻡ', medial: 'ﻤ', final: 'ﻢ' },
27478       1606: { initial: 'ﻧ', isolated: 'ﻥ', medial: 'ﻨ', final: 'ﻦ' },
27479       1607: { initial: 'ﻫ', isolated: 'ﻩ', medial: 'ﻬ', final: 'ﻪ' },
27480       1608: { initial: 'ﻭ', isolated: 'ﻭ', medial: '', final: 'ﻮ' },
27481
27482       // 1609 ى
27483       1609: { initial: 'ﯨ', isolated: 'ﻯ', medial: 'ﯩ', final: 'ﻰ' },
27484       // 1610 ي
27485       1610: { initial: 'ﻳ', isolated: 'ﻱ', medial: 'ﻴ', final: 'ﻲ' },
27486
27487       // short vowel sounds / tashkil markings
27488
27489       1662: { initial: 'ﭘ', isolated: 'ﭖ', medial: 'ﭙ', final: 'ﭗ' },
27490
27491       1670: { initial: 'ﭼ', isolated: 'ﭺ', medial: 'ﭽ', final: 'ﭻ' },
27492       1603: { initial: 'ﻛ', isolated: 'ﻙ', medial: 'ﻜ', final: 'ﻚ' },
27493       1705: { initial: 'ﻛ', isolated: 'ﮎ', medial: 'ﻜ', final: 'ﮏ' },
27494       1711: { initial: 'ﮔ', isolated: 'ﮒ', medial: 'ﮕ', final: 'ﮓ' },
27495       1740: { initial: 'ﻳ', isolated: 'ﻯ', medial: 'ﻴ', final: 'ﻰ' },
27496       5000: { initial: 'ﻻ', isolated: 'ﻻ', medial: '', final: 'ﻼ' }
27497   };
27498
27499   var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
27500
27501   function fixRTLTextForSvg(inputText) {
27502       var context = true;
27503       var ret = '';
27504       var rtlBuffer = [];
27505       var arabicRegex = /[\u0600-\u06FF]/g;
27506       var arabicTashkil = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]/;
27507       var thaanaVowel = /[\u07A6-\u07B0]/;
27508       var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
27509
27510       if (!arabicRegex.test(inputText)) {
27511           // Hebrew or Thaana RTL script
27512           for (var n = 0; n < inputText.length; n++) {
27513               var c = inputText[n];
27514               if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
27515                   rtlBuffer[rtlBuffer.length - 1] += c;
27516               } else if (rtlRegex.test(c)) {
27517                   rtlBuffer.push(c);
27518               } else if (c === ' ' && rtlBuffer.length) {
27519                   // whitespace within RTL text
27520                   rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
27521               } else {
27522                   // non-RTL character
27523                   ret += rtlBuffer.reverse().join('') + c;
27524                   rtlBuffer = [];
27525               }
27526           }
27527       } else {
27528           for (var i = 0, l = inputText.length; i < l; i++) {
27529               var code = inputText[i].charCodeAt(0);
27530               var nextCode = inputText[i + 1] ? inputText[i + 1].charCodeAt(0) : 0;
27531
27532               if (!chars$1[code]) {
27533                   if (code === 32 && rtlBuffer.length) {
27534                       // whitespace
27535                       rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
27536                   } else if (arabicTashkil.test(inputText[i]) && rtlBuffer.length) {
27537                       // tashkil mark
27538                       rtlBuffer[rtlBuffer.length - 1] += inputText[i];
27539                   } else {
27540                       // non-RTL character
27541                       ret += rtlBuffer.reverse().join('') + inputText[i];
27542                       rtlBuffer = [];
27543                   }
27544                   continue;
27545               }
27546               if (context) {
27547                   if (i === l - 1 || nextCode === 32) {
27548                       rtlBuffer.push(chars$1[code].isolated);
27549                   } else {
27550                       // special case for لا
27551                       if (code === 1604 && nextCode === 1575) {
27552                           rtlBuffer.push(chars$1[5000].initial);
27553                           i++;
27554                           context = true;
27555                           continue;
27556                       }
27557                       rtlBuffer.push(chars$1[code].initial);
27558                   }
27559               } else {
27560                   if (i === l - 1 || nextCode === 32){
27561                       rtlBuffer.push(chars$1[code].final);
27562                   } else {
27563                       // special case for ﻼ
27564                       if (code === 1604 && nextCode === 1575){
27565                           rtlBuffer.push(chars$1[5000].final);
27566                           i++;
27567                           context = true;
27568                           continue;
27569                       }
27570                       if (chars$1[code].medial === ''){
27571                           rtlBuffer.push(chars$1[code].final);
27572                       } else {
27573                           rtlBuffer.push(chars$1[code].medial);
27574                       }
27575                   }
27576               }
27577               context = (chars$1[code].medial === '') || nextCode === 32;
27578           }
27579       }
27580       ret += rtlBuffer.reverse().join('');
27581       return ret;
27582   }
27583
27584   function utilTagText(entity) {
27585       return map$3(entity.tags, function(v, k) {
27586           return k + '=' + v;
27587       }).join(', ');
27588   }
27589
27590
27591   function utilEntitySelector(ids) {
27592       return ids.length ? '.' + ids.join(',.') : 'nothing';
27593   }
27594
27595
27596   function utilEntityOrMemberSelector(ids, graph) {
27597       var s = utilEntitySelector(ids);
27598
27599       ids.forEach(function(id) {
27600           var entity = graph.hasEntity(id);
27601           if (entity && entity.type === 'relation') {
27602               entity.members.forEach(function(member) {
27603                   s += ',.' + member.id;
27604               });
27605           }
27606       });
27607
27608       return s;
27609   }
27610
27611
27612   function utilEntityOrDeepMemberSelector(ids, graph) {
27613       var seen = {};
27614       var allIDs = [];
27615       function addEntityAndMembersIfNotYetSeen(id) {
27616           // avoid infinite recursion for circular relations by skipping seen entities
27617           if (seen[id]) return;
27618           // mark the entity as seen
27619           seen[id] = true;
27620           // add the id;
27621           allIDs.push(id);
27622           if (graph.hasEntity(id)) {
27623               var entity = graph.entity(id);
27624               if (entity.type === 'relation' && entity.members) {
27625                   entity.members.forEach(function(member){
27626                       addEntityAndMembersIfNotYetSeen(member.id);
27627                   });
27628               }
27629           }
27630       }
27631       ids.forEach(function(id) {
27632           addEntityAndMembersIfNotYetSeen(id);
27633       });
27634       return utilEntitySelector(allIDs);
27635   }
27636
27637
27638   function utilGetAllNodes(ids, graph) {
27639       var seen = {};
27640       var nodes = [];
27641       ids.forEach(getNodes);
27642       return nodes;
27643
27644       function getNodes(id) {
27645           if (seen[id]) return;
27646           seen[id] = true;
27647
27648           var entity = graph.hasEntity(id);
27649           if (!entity) return;
27650
27651           if (entity.type === 'node') {
27652               nodes.push(entity);
27653           } else if (entity.type === 'way') {
27654               entity.nodes.forEach(getNodes);
27655           } else {
27656               entity.members.map(function(member) { return member.id; }).forEach(getNodes);
27657           }
27658       }
27659   }
27660
27661
27662   function utilDisplayName(entity) {
27663       var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0],
27664           name = entity.tags[localizedNameKey] || entity.tags.name || '',
27665           network = entity.tags.cycle_network || entity.tags.network;
27666
27667       if (!name && entity.tags.ref) {
27668           name = entity.tags.ref;
27669           if (network) {
27670               name = network + ' ' + name;
27671           }
27672       }
27673
27674       return name;
27675   }
27676
27677
27678   function utilDisplayNameForPath(entity) {
27679       var name = utilDisplayName(entity);
27680       var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
27681
27682       if (!isFirefox && name && rtlRegex.test(name)) {
27683           name = fixRTLTextForSvg(name);
27684       }
27685
27686       return name;
27687   }
27688
27689
27690   function utilDisplayType(id) {
27691       return {
27692           n: t('inspector.node'),
27693           w: t('inspector.way'),
27694           r: t('inspector.relation')
27695       }[id.charAt(0)];
27696   }
27697
27698
27699   function utilStringQs(str) {
27700       return str.split('&').reduce(function(obj, pair){
27701           var parts = pair.split('=');
27702           if (parts.length === 2) {
27703               obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
27704           }
27705           if (parts[0] === 'mvt') {
27706               obj[parts[0]] = (parts[2] !== undefined) ? (decodeURIComponent(parts[1]) + '=' + decodeURIComponent(parts[2])) : (decodeURIComponent(parts[1]));
27707           }
27708           return obj;
27709       }, {});
27710   }
27711
27712
27713   function utilQsString(obj, noencode) {
27714       function softEncode(s) {
27715         // encode everything except special characters used in certain hash parameters:
27716         // "/" in map states, ":", ",", {" and "}" in background
27717         return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
27718       }
27719       return Object.keys(obj).sort().map(function(key) {
27720           return encodeURIComponent(key) + '=' + (
27721               noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
27722       }).join('&');
27723   }
27724
27725
27726   function utilPrefixDOMProperty(property) {
27727       var prefixes = ['webkit', 'ms', 'moz', 'o'],
27728           i = -1,
27729           n = prefixes.length,
27730           s = document.body;
27731
27732       if (property in s)
27733           return property;
27734
27735       property = property.substr(0, 1).toUpperCase() + property.substr(1);
27736
27737       while (++i < n)
27738           if (prefixes[i] + property in s)
27739               return prefixes[i] + property;
27740
27741       return false;
27742   }
27743
27744
27745   function utilPrefixCSSProperty(property) {
27746       var prefixes = ['webkit', 'ms', 'Moz', 'O'],
27747           i = -1,
27748           n = prefixes.length,
27749           s = document.body.style;
27750
27751       if (property.toLowerCase() in s)
27752           return property.toLowerCase();
27753
27754       while (++i < n)
27755           if (prefixes[i] + property in s)
27756               return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
27757
27758       return false;
27759   }
27760
27761
27762   var transformProperty;
27763   function utilSetTransform(el, x, y, scale) {
27764       var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform'),
27765           translate = utilDetect().opera ?
27766               'translate('   + x + 'px,' + y + 'px)' :
27767               'translate3d(' + x + 'px,' + y + 'px,0)';
27768       return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
27769   }
27770
27771
27772   // Calculates Levenshtein distance between two strings
27773   // see:  https://en.wikipedia.org/wiki/Levenshtein_distance
27774   // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
27775   function utilEditDistance(a, b) {
27776       a = remove$1(a.toLowerCase());
27777       b = remove$1(b.toLowerCase());
27778       if (a.length === 0) return b.length;
27779       if (b.length === 0) return a.length;
27780       var matrix = [];
27781       for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
27782       for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
27783       for (i = 1; i <= b.length; i++) {
27784           for (j = 1; j <= a.length; j++) {
27785               if (b.charAt(i-1) === a.charAt(j-1)) {
27786                   matrix[i][j] = matrix[i-1][j-1];
27787               } else {
27788                   matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
27789                       Math.min(matrix[i][j-1] + 1, // insertion
27790                       matrix[i-1][j] + 1)); // deletion
27791               }
27792           }
27793       }
27794       return matrix[b.length][a.length];
27795   }
27796
27797
27798   // a d3.mouse-alike which
27799   // 1. Only works on HTML elements, not SVG
27800   // 2. Does not cause style recalculation
27801   function utilFastMouse(container) {
27802       var rect = container.getBoundingClientRect(),
27803           rectLeft = rect.left,
27804           rectTop = rect.top,
27805           clientLeft = +container.clientLeft,
27806           clientTop = +container.clientTop;
27807       if (textDirection === 'rtl') {
27808           rectLeft = 0;
27809       }
27810       return function(e) {
27811           return [
27812               e.clientX - rectLeft - clientLeft,
27813               e.clientY - rectTop - clientTop];
27814       };
27815   }
27816
27817
27818   /* eslint-disable no-proto */
27819   var utilGetPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
27820   /* eslint-enable no-proto */
27821
27822
27823   function utilAsyncMap(inputs, func, callback) {
27824       var remaining = inputs.length,
27825           results = [],
27826           errors = [];
27827
27828       inputs.forEach(function(d, i) {
27829           func(d, function done(err, data) {
27830               errors[i] = err;
27831               results[i] = data;
27832               remaining--;
27833               if (!remaining) callback(errors, results);
27834           });
27835       });
27836   }
27837
27838
27839   // wraps an index to an interval [0..length-1]
27840   function utilWrap(index, length) {
27841       if (index < 0)
27842           index += Math.ceil(-index/length)*length;
27843       return index % length;
27844   }
27845
27846
27847   /**
27848    * a replacement for functor
27849    *
27850    * @param {*} value any value
27851    * @returns {Function} a function that returns that value or the value if it's a function
27852    */
27853   function utilFunctor(value) {
27854       if (typeof value === 'function') return value;
27855       return function() {
27856           return value;
27857       };
27858   }
27859
27860
27861   function utilNoAuto(selection) {
27862       var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
27863
27864       return selection
27865           .attr('autocomplete', 'off')
27866           .attr('autocorrect', 'off')
27867           .attr('autocapitalize', 'off')
27868           .attr('spellcheck', isText ? 'true' : 'false');
27869   }
27870
27871
27872   // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript
27873   // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
27874   function utilHashcode(str) {
27875       var hash = 0;
27876       if (str.length === 0) {
27877           return hash;
27878       }
27879       for (var i = 0; i < str.length; i++) {
27880           var char = str.charCodeAt(i);
27881           hash = ((hash << 5) - hash) + char;
27882           hash = hash & hash; // Convert to 32bit integer
27883       }
27884       return hash;
27885   }
27886
27887   // Adds or removes highlight styling for the specified entity's SVG elements in the map.
27888   function utilHighlightEntity(id, highlighted, context) {
27889       context.surface()
27890           .selectAll(utilEntityOrDeepMemberSelector([id], context.graph()))
27891           .classed('highlighted', highlighted);
27892   }
27893
27894   // note the function should be of low priority
27895   // and should not be returning a value.
27896   function utilCallWhenIdle(func, timeout) {
27897       return function() {
27898           var args = arguments;
27899           var that = this;
27900           window.requestIdleCallback(function() {
27901               func.apply(that, args);
27902           }, {timeout: timeout});
27903       };
27904   }
27905
27906   function utilCleanTags(tags) {
27907       var out = {};
27908       for (var k in tags) {
27909           if (!k) continue;
27910           var v = tags[k];
27911           if (v !== undefined) {
27912               out[k] = cleanValue(k, v);
27913           }
27914       }
27915
27916       return out;
27917
27918
27919       function cleanValue(k, v) {
27920           function keepSpaces(k) {
27921               return /_hours|_times|:conditional$/.test(k);
27922           }
27923
27924           function skip(k) {
27925               return /^(description|note|fixme)$/.test(k);
27926           }
27927
27928           if (skip(k)) return v;
27929
27930           var cleaned = v
27931               .split(';')
27932               .map(function(s) { return s.trim(); })
27933               .join(keepSpaces(k) ? '; ' : ';');
27934
27935           // The code below is not intended to validate websites and emails.
27936           // It is only intended to prevent obvious copy-paste errors. (#2323)
27937           // clean website- and email-like tags
27938           if (k.indexOf('website') !== -1 ||
27939               k.indexOf('email') !== -1 ||
27940               cleaned.indexOf('http') === 0) {
27941               cleaned = cleaned
27942                   .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
27943
27944           }
27945
27946           return cleaned;
27947       }
27948   }
27949
27950   // Like selection.property('value', ...), but avoids no-op value sets,
27951   // which can result in layout/repaint thrashing in some situations.
27952   function utilGetSetValue(selection, value) {
27953       function d3_selection_value(value) {
27954           function valueNull() {
27955               delete this.value;
27956           }
27957
27958           function valueConstant() {
27959               if (this.value !== value) {
27960                   this.value = value;
27961               }
27962           }
27963
27964           function valueFunction() {
27965               var x = value.apply(this, arguments);
27966               if (x == null) {
27967                   delete this.value;
27968               } else if (this.value !== x) {
27969                   this.value = x;
27970               }
27971           }
27972
27973           return value == null
27974               ? valueNull : (typeof value === 'function'
27975               ? valueFunction : valueConstant);
27976       }
27977
27978       if (arguments.length === 1) {
27979           return selection.property('value');
27980       }
27981
27982       return selection.each(d3_selection_value(value));
27983   }
27984
27985   function utilIdleWorker(tasks, processor, callback) {
27986       var results = [], result;
27987       for (var i = 0; i < tasks.length; i++) {
27988           result = processor(tasks[i]);
27989           if (result) results.push(result);
27990       }
27991       callback(results);
27992
27993       // var processed = [];
27994       // var currentPos = 0;
27995       // var totalTasks = tasks.length;
27996
27997       // function worker(deadline) {
27998       //     while (deadline.timeRemaining() > 0 && currentPos < totalTasks) {
27999       //         var result = processor(tasks[currentPos]);
28000
28001       //         // if falsy dont add to the processed list
28002       //         if (result) processed.push(result);
28003       //         currentPos++;
28004       //     }
28005
28006       //     // more tasks are left, we might need more idleCallbacks
28007       //     if (currentPos < totalTasks) {
28008       //         return window.requestIdleCallback(function(deadline) {worker(deadline);});
28009       //     }
28010
28011       //     // tasks are completed
28012       //     return callback(processed);
28013       // }
28014
28015       // window.requestIdleCallback(function(deadline) {worker(deadline);});
28016   }
28017
28018   // shim
28019   window.requestIdleCallback =
28020       window.requestIdleCallback ||
28021       function(cb) {
28022           var start = Date.now();
28023           return setTimeout(function() {
28024               cb({
28025                   didTimeout: false,
28026                   timeRemaining: function() {
28027                       return Math.max(0, 50 - (Date.now() - start));
28028                   }
28029               });
28030           }, 1);
28031       };
28032
28033   window.cancelIdleCallback =
28034       window.cancelIdleCallback ||
28035       function(id) {
28036           clearTimeout(id);
28037       };
28038
28039   function utilKeybinding(namespace$$1) {
28040       var _keybindings = {};
28041
28042
28043       function testBindings(isCapturing) {
28044           var didMatch = false;
28045           var bindings = Object.keys(_keybindings).map(function(id) { return _keybindings[id]; });
28046           var i, binding;
28047
28048           // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
28049           // so we don't strictly match on the shift key, but we prioritize
28050           // shifted keybindings first, and fallback to unshifted only if no match.
28051           // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
28052
28053           // priority match shifted keybindings first
28054           for (i = 0; i < bindings.length; i++) {
28055               binding = bindings[i];
28056               if (!binding.event.modifiers.shiftKey) continue;  // no shift
28057               if (!!binding.capture !== isCapturing) continue;
28058               if (matches(binding, true)) {
28059                   binding.callback();
28060                   didMatch = true;
28061               }
28062           }
28063
28064           // then unshifted keybindings
28065           if (didMatch) return;
28066           for (i = 0; i < bindings.length; i++) {
28067               binding = bindings[i];
28068               if (binding.event.modifiers.shiftKey) continue;   // shift
28069               if (!!binding.capture !== isCapturing) continue;
28070               if (matches(binding, false)) {
28071                   binding.callback();
28072               }
28073           }
28074
28075
28076           function matches(binding, testShift) {
28077               var event$$1 = event;
28078               var isMatch = false;
28079               var tryKeyCode = true;
28080
28081               // Prefer a match on `KeyboardEvent.key`
28082               if (event$$1.key !== undefined) {
28083                   tryKeyCode = (event$$1.key.charCodeAt(0) > 255);  // outside ISO-Latin-1
28084                   isMatch = true;
28085
28086                   if (binding.event.key === undefined) {
28087                       isMatch = false;
28088                   } else if (Array.isArray(binding.event.key)) {
28089                       if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$$1.key.toLowerCase()) === -1)
28090                           isMatch = false;
28091                   } else {
28092                       if (event$$1.key.toLowerCase() !== binding.event.key.toLowerCase())
28093                           isMatch = false;
28094                   }
28095               }
28096
28097               // Fallback match on `KeyboardEvent.keyCode`, can happen if:
28098               // - browser doesn't support `KeyboardEvent.key`
28099               // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
28100               if (!isMatch && tryKeyCode) {
28101                   isMatch = (event$$1.keyCode === binding.event.keyCode);
28102               }
28103
28104               if (!isMatch) return false;
28105
28106               // test modifier keys
28107               if (!(event$$1.ctrlKey && event$$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
28108                   if (event$$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
28109                   if (event$$1.altKey !== binding.event.modifiers.altKey) return false;
28110               }
28111               if (event$$1.metaKey !== binding.event.modifiers.metaKey) return false;
28112               if (testShift && event$$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
28113
28114               return true;
28115           }
28116       }
28117
28118
28119       function capture() {
28120           testBindings(true);
28121       }
28122
28123
28124       function bubble() {
28125           var tagName = select(event.target).node().tagName;
28126           if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
28127               return;
28128           }
28129           testBindings(false);
28130       }
28131
28132
28133       function keybinding(selection$$1) {
28134           selection$$1 = selection$$1 || select(document);
28135           selection$$1.on('keydown.capture.' + namespace$$1, capture, true);
28136           selection$$1.on('keydown.bubble.' + namespace$$1, bubble, false);
28137           return keybinding;
28138       }
28139
28140       // was: keybinding.off()
28141       keybinding.unbind = function(selection$$1) {
28142           _keybindings = [];
28143           selection$$1 = selection$$1 || select(document);
28144           selection$$1.on('keydown.capture.' + namespace$$1, null);
28145           selection$$1.on('keydown.bubble.' + namespace$$1, null);
28146           return keybinding;
28147       };
28148
28149
28150       keybinding.clear = function() {
28151           _keybindings = {};
28152           return keybinding;
28153       };
28154
28155
28156       // Remove one or more keycode bindings.
28157       keybinding.off = function(codes, capture) {
28158           var arr = [].concat(codes);
28159
28160           for (var i = 0; i < arr.length; i++) {
28161               var id = arr[i] + (capture ? '-capture' : '-bubble');
28162               delete _keybindings[id];
28163           }
28164           return keybinding;
28165       };
28166
28167
28168       // Add one or more keycode bindings.
28169       keybinding.on = function(codes, callback, capture) {
28170           if (!isFunction(callback)) {
28171               return keybinding.off(codes, capture);
28172           }
28173
28174           var arr = [].concat(codes);
28175
28176           for (var i = 0; i < arr.length; i++) {
28177               var id = arr[i] + (capture ? '-capture' : '-bubble');
28178               var binding = {
28179                   id: id,
28180                   capture: capture,
28181                   callback: callback,
28182                   event: {
28183                       key: undefined,  // preferred
28184                       keyCode: 0,      // fallback
28185                       modifiers: {
28186                           shiftKey: false,
28187                           ctrlKey: false,
28188                           altKey: false,
28189                           metaKey: false
28190                       }
28191                   }
28192               };
28193
28194               if (_keybindings[id]) {
28195                   console.warn('warning: duplicate keybinding for "' + id + '"'); // eslint-disable-line no-console
28196               }
28197
28198               _keybindings[id] = binding;
28199
28200               var matches = arr[i].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
28201               for (var j = 0; j < matches.length; j++) {
28202                   // Normalise matching errors
28203                   if (matches[j] === '++') matches[j] = '+';
28204
28205                   if (matches[j] in utilKeybinding.modifierCodes) {
28206                       var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j]]];
28207                       binding.event.modifiers[prop] = true;
28208                   } else {
28209                       binding.event.key = utilKeybinding.keys[matches[j]] || matches[j];
28210                       if (matches[j] in utilKeybinding.keyCodes) {
28211                           binding.event.keyCode = utilKeybinding.keyCodes[matches[j]];
28212                       }
28213                   }
28214               }
28215           }
28216
28217           return keybinding;
28218       };
28219
28220
28221       return keybinding;
28222   }
28223
28224
28225   /*
28226    * See https://github.com/keithamus/jwerty
28227    */
28228
28229   utilKeybinding.modifierCodes = {
28230       // Shift key, ⇧
28231       '⇧': 16, shift: 16,
28232       // CTRL key, on Mac: ⌃
28233       '⌃': 17, ctrl: 17,
28234       // ALT key, on Mac: ⌥ (Alt)
28235       '⌥': 18, alt: 18, option: 18,
28236       // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
28237       '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
28238   };
28239
28240   utilKeybinding.modifierProperties = {
28241       16: 'shiftKey',
28242       17: 'ctrlKey',
28243       18: 'altKey',
28244       91: 'metaKey'
28245   };
28246
28247   utilKeybinding.keys = {
28248       // Backspace key, on Mac: ⌫ (Backspace)
28249       '⌫': 'Backspace', backspace: 'Backspace',
28250       // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
28251       '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
28252       // Return key, ↩
28253       '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
28254       // Pause/Break key
28255       'pause': 'Pause', 'pause-break': 'Pause',
28256       // Caps Lock key, ⇪
28257       '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
28258       // Escape key, on Mac: ⎋, on Windows: Esc
28259       '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
28260       // Space key
28261       space: [' ', 'Spacebar'],
28262       // Page-Up key, or pgup, on Mac: ↖
28263       '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
28264       // Page-Down key, or pgdown, on Mac: ↘
28265       '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
28266       // END key, on Mac: ⇟
28267       '⇟': 'End', end: 'End',
28268       // HOME key, on Mac: ⇞
28269       '⇞': 'Home', home: 'Home',
28270       // Insert key, or ins
28271       ins: 'Insert', insert: 'Insert',
28272       // Delete key, on Mac: ⌦ (Delete)
28273       '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
28274       // Left Arrow Key, or ←
28275       '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
28276       // Up Arrow Key, or ↑
28277       '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
28278       // Right Arrow Key, or →
28279       '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
28280       // Up Arrow Key, or ↓
28281       '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
28282       // odities, stuff for backward compatibility (browsers and code):
28283       // Num-Multiply, or *
28284       '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
28285       // Num-Plus or +
28286       '+': ['+', 'Add'], 'plus': ['+', 'Add'],
28287       // Num-Subtract, or -
28288       '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
28289       // Semicolon
28290       semicolon: ';',
28291       // = or equals
28292       equals: '=',
28293       // Comma, or ,
28294       comma: ',',
28295       // Period, or ., or full-stop
28296       period: '.', 'full-stop': '.',
28297       // Slash, or /, or forward-slash
28298       slash: '/', 'forward-slash': '/',
28299       // Tick, or `, or back-quote
28300       tick: '`', 'back-quote': '`',
28301       // Open bracket, or [
28302       'open-bracket': '[',
28303       // Back slash, or \
28304       'back-slash': '\\',
28305       // Close backet, or ]
28306       'close-bracket': ']',
28307       // Apostrophe, or Quote, or '
28308       quote: '\'', apostrophe: '\'',
28309       // NUMPAD 0-9
28310       'num-0': '0',
28311       'num-1': '1',
28312       'num-2': '2',
28313       'num-3': '3',
28314       'num-4': '4',
28315       'num-5': '5',
28316       'num-6': '6',
28317       'num-7': '7',
28318       'num-8': '8',
28319       'num-9': '9',
28320       // F1-F25
28321       f1: 'F1',
28322       f2: 'F2',
28323       f3: 'F3',
28324       f4: 'F4',
28325       f5: 'F5',
28326       f6: 'F6',
28327       f7: 'F7',
28328       f8: 'F8',
28329       f9: 'F9',
28330       f10: 'F10',
28331       f11: 'F11',
28332       f12: 'F12',
28333       f13: 'F13',
28334       f14: 'F14',
28335       f15: 'F15',
28336       f16: 'F16',
28337       f17: 'F17',
28338       f18: 'F18',
28339       f19: 'F19',
28340       f20: 'F20',
28341       f21: 'F21',
28342       f22: 'F22',
28343       f23: 'F23',
28344       f24: 'F24',
28345       f25: 'F25'
28346   };
28347
28348   utilKeybinding.keyCodes = {
28349       // Backspace key, on Mac: ⌫ (Backspace)
28350       '⌫': 8, backspace: 8,
28351       // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
28352       '⇥': 9, '⇆': 9, tab: 9,
28353       // Return key, ↩
28354       '↩': 13, 'return': 13, enter: 13, '⌅': 13,
28355       // Pause/Break key
28356       'pause': 19, 'pause-break': 19,
28357       // Caps Lock key, ⇪
28358       '⇪': 20, caps: 20, 'caps-lock': 20,
28359       // Escape key, on Mac: ⎋, on Windows: Esc
28360       '⎋': 27, escape: 27, esc: 27,
28361       // Space key
28362       space: 32,
28363       // Page-Up key, or pgup, on Mac: ↖
28364       '↖': 33, pgup: 33, 'page-up': 33,
28365       // Page-Down key, or pgdown, on Mac: ↘
28366       '↘': 34, pgdown: 34, 'page-down': 34,
28367       // END key, on Mac: ⇟
28368       '⇟': 35, end: 35,
28369       // HOME key, on Mac: ⇞
28370       '⇞': 36, home: 36,
28371       // Insert key, or ins
28372       ins: 45, insert: 45,
28373       // Delete key, on Mac: ⌦ (Delete)
28374       '⌦': 46, del: 46, 'delete': 46,
28375       // Left Arrow Key, or ←
28376       '←': 37, left: 37, 'arrow-left': 37,
28377       // Up Arrow Key, or ↑
28378       '↑': 38, up: 38, 'arrow-up': 38,
28379       // Right Arrow Key, or →
28380       '→': 39, right: 39, 'arrow-right': 39,
28381       // Up Arrow Key, or ↓
28382       '↓': 40, down: 40, 'arrow-down': 40,
28383       // odities, printing characters that come out wrong:
28384       // Firefox Equals
28385       'ffequals': 61,
28386       // Num-Multiply, or *
28387       '*': 106, star: 106, asterisk: 106, multiply: 106,
28388       // Num-Plus or +
28389       '+': 107, 'plus': 107,
28390       // Num-Subtract, or -
28391       '-': 109, subtract: 109,
28392       // Firefox Plus
28393       'ffplus': 171,
28394       // Firefox Minus
28395       'ffminus': 173,
28396       // Semicolon
28397       ';': 186, semicolon: 186,
28398       // = or equals
28399       '=': 187, 'equals': 187,
28400       // Comma, or ,
28401       ',': 188, comma: 188,
28402       // Dash / Underscore key
28403       'dash': 189,
28404       // Period, or ., or full-stop
28405       '.': 190, period: 190, 'full-stop': 190,
28406       // Slash, or /, or forward-slash
28407       '/': 191, slash: 191, 'forward-slash': 191,
28408       // Tick, or `, or back-quote
28409       '`': 192, tick: 192, 'back-quote': 192,
28410       // Open bracket, or [
28411       '[': 219, 'open-bracket': 219,
28412       // Back slash, or \
28413       '\\': 220, 'back-slash': 220,
28414       // Close backet, or ]
28415       ']': 221, 'close-bracket': 221,
28416       // Apostrophe, or Quote, or '
28417       '\'': 222, quote: 222, apostrophe: 222
28418   };
28419
28420   // NUMPAD 0-9
28421   var i$1 = 95, n = 0;
28422   while (++i$1 < 106) {
28423       utilKeybinding.keyCodes['num-' + n] = i$1;
28424       ++n;
28425   }
28426
28427   // 0-9
28428   i$1 = 47; n = 0;
28429   while (++i$1 < 58) {
28430       utilKeybinding.keyCodes[n] = i$1;
28431       ++n;
28432   }
28433
28434   // F1-F25
28435   i$1 = 111; n = 1;
28436   while (++i$1 < 136) {
28437       utilKeybinding.keyCodes['f' + n] = i$1;
28438       ++n;
28439   }
28440
28441   // a-z
28442   i$1 = 64;
28443   while (++i$1 < 91) {
28444       utilKeybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
28445   }
28446
28447   // Copies a variable number of methods from source to target.
28448   function utilRebind(target, source) {
28449       var i = 1, n = arguments.length, method;
28450       while (++i < n) {
28451           target[method = arguments[i]] = d3_rebind(target, source, source[method]);
28452       }
28453       return target;
28454   }
28455
28456   // Method is assumed to be a standard D3 getter-setter:
28457   // If passed with no arguments, gets the value.
28458   // If passed with arguments, sets the value and returns the target.
28459   function d3_rebind(target, source, method) {
28460       return function() {
28461           var value = method.apply(source, arguments);
28462           return value === source ? target : value;
28463       };
28464   }
28465
28466   // A per-domain session mutex backed by a cookie and dead man's
28467   // switch. If the session crashes, the mutex will auto-release
28468   // after 5 seconds.
28469
28470   // This accepts a string and returns an object that complies with utilSessionMutexType
28471   function utilSessionMutex(name) {
28472       var mutex = {};
28473       var intervalID;
28474
28475       function renew() {
28476           var expires = new Date();
28477           expires.setSeconds(expires.getSeconds() + 5);
28478           document.cookie = name + '=1; expires=' + expires.toUTCString();
28479       }
28480
28481       mutex.lock = function () {
28482           if (intervalID) return true;
28483           var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
28484           if (cookie) return false;
28485           renew();
28486           intervalID = window.setInterval(renew, 4000);
28487           return true;
28488       };
28489
28490       mutex.unlock = function () {
28491           if (!intervalID) return;
28492           document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
28493           clearInterval(intervalID);
28494           intervalID = null;
28495       };
28496
28497       mutex.locked = function () {
28498           return !!intervalID;
28499       };
28500
28501       return mutex;
28502   }
28503
28504   function utilTiler() {
28505       var _size = [256, 256];
28506       var _scale = 256;
28507       var _tileSize = 256;
28508       var _zoomExtent = [0, 20];
28509       var _translate = [_size[0] / 2, _size[1] / 2];
28510       var _margin = 0;
28511       var _skipNullIsland = false;
28512
28513
28514       function clamp(num, min$$1, max$$1) {
28515           return Math.max(min$$1, Math.min(num, max$$1));
28516       }
28517
28518
28519       function nearNullIsland(tile) {
28520           var x = tile[0];
28521           var y = tile[1];
28522           var z = tile[2];
28523           if (z >= 7) {
28524               var center = Math.pow(2, z - 1);
28525               var width = Math.pow(2, z - 6);
28526               var min$$1 = center - (width / 2);
28527               var max$$1 = center + (width / 2) - 1;
28528               return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
28529           }
28530           return false;
28531       }
28532
28533
28534       function tiler() {
28535           var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
28536           var z0 = clamp(Math.round(z), _zoomExtent[0], _zoomExtent[1]);
28537           var tileMin = 0;
28538           var tileMax = Math.pow(2, z0) - 1;
28539           var log2ts = Math.log(_tileSize) * Math.LOG2E;
28540           var k = Math.pow(2, z - z0 + log2ts);
28541           var origin = [
28542               (_translate[0] - _scale / 2) / k,
28543               (_translate[1] - _scale / 2) / k
28544           ];
28545
28546           var cols = range(
28547               clamp(Math.floor(-origin[0]) - _margin,               tileMin, tileMax + 1),
28548               clamp(Math.ceil(_size[0] / k - origin[0]) + _margin,  tileMin, tileMax + 1)
28549           );
28550           var rows = range(
28551               clamp(Math.floor(-origin[1]) - _margin,               tileMin, tileMax + 1),
28552               clamp(Math.ceil(_size[1] / k - origin[1]) + _margin,  tileMin, tileMax + 1)
28553           );
28554
28555           var tiles = [];
28556           for (var i = 0; i < rows.length; i++) {
28557               var y = rows[i];
28558               for (var j = 0; j < cols.length; j++) {
28559                   var x = cols[j];
28560
28561                   if (i >= _margin && i <= rows.length - _margin &&
28562                       j >= _margin && j <= cols.length - _margin) {
28563                       tiles.unshift([x, y, z0]);  // tiles in view at beginning
28564                   } else {
28565                       tiles.push([x, y, z0]);     // tiles in margin at the end
28566                   }
28567               }
28568           }
28569
28570           tiles.translate = origin;
28571           tiles.scale = k;
28572
28573           return tiles;
28574       }
28575
28576
28577       /**
28578        * getTiles() returns an array of tiles that cover the map view
28579        */
28580       tiler.getTiles = function(projection) {
28581           var origin = [
28582               projection.scale() * Math.PI - projection.translate()[0],
28583               projection.scale() * Math.PI - projection.translate()[1]
28584           ];
28585
28586           this
28587               .size(projection.clipExtent()[1])
28588               .scale(projection.scale() * 2 * Math.PI)
28589               .translate(projection.translate());
28590
28591           var tiles = tiler();
28592           var ts = tiles.scale;
28593
28594           return tiles
28595               .map(function(tile) {
28596                   if (_skipNullIsland && nearNullIsland(tile)) {
28597                       return false;
28598                   }
28599                   var x = tile[0] * ts - origin[0];
28600                   var y = tile[1] * ts - origin[1];
28601                   return {
28602                       id: tile.toString(),
28603                       xyz: tile,
28604                       extent: geoExtent$$1(
28605                           projection.invert([x, y + ts]),
28606                           projection.invert([x + ts, y])
28607                       )
28608                   };
28609               }).filter(Boolean);
28610       };
28611
28612
28613       /**
28614        * getGeoJSON() returns a FeatureCollection for debugging tiles
28615        */
28616       tiler.getGeoJSON = function(projection) {
28617           var features = tiler.getTiles(projection).map(function(tile) {
28618               return {
28619                   type: 'Feature',
28620                   properties: {
28621                       id: tile.id,
28622                       name: tile.id
28623                   },
28624                   geometry: {
28625                       type: 'Polygon',
28626                       coordinates: [ tile.extent.polygon() ]
28627                   }
28628               };
28629           });
28630
28631           return {
28632               type: 'FeatureCollection',
28633               features: features
28634           };
28635       };
28636
28637
28638       tiler.tileSize = function(val) {
28639           if (!arguments.length) return _tileSize;
28640           _tileSize = val;
28641           return tiler;
28642       };
28643
28644
28645       tiler.zoomExtent = function(val) {
28646           if (!arguments.length) return _zoomExtent;
28647           _zoomExtent = val;
28648           return tiler;
28649       };
28650
28651
28652       tiler.size = function(val) {
28653           if (!arguments.length) return _size;
28654           _size = val;
28655           return tiler;
28656       };
28657
28658
28659       tiler.scale = function(val) {
28660           if (!arguments.length) return _scale;
28661           _scale = val;
28662           return tiler;
28663       };
28664
28665
28666       tiler.translate = function(val) {
28667           if (!arguments.length) return _translate;
28668           _translate = val;
28669           return tiler;
28670       };
28671
28672
28673       // number to extend the rows/columns beyond those covering the viewport
28674       tiler.margin = function(val) {
28675           if (!arguments.length) return _margin;
28676           _margin = +val;
28677           return tiler;
28678       };
28679
28680
28681       tiler.skipNullIsland = function(val) {
28682           if (!arguments.length) return _skipNullIsland;
28683           _skipNullIsland = val;
28684           return tiler;
28685       };
28686
28687
28688       return tiler;
28689   }
28690
28691   function utilTriggerEvent(target, type) {
28692       target.each(function() {
28693           var evt = document.createEvent('HTMLEvents');
28694           evt.initEvent(type, true, true);
28695           this.dispatchEvent(evt);
28696       });
28697   }
28698
28699   function validationDeprecatedTag() {
28700
28701       var validation = function(changes) {
28702           var warnings = [];
28703           for (var i = 0; i < changes.created.length; i++) {
28704               var change = changes.created[i],
28705                   deprecatedTags = change.deprecatedTags();
28706
28707               if (!isEmpty(deprecatedTags)) {
28708                   var tags = utilTagText({ tags: deprecatedTags });
28709                   warnings.push({
28710                       id: 'deprecated_tags',
28711                       message: t('validations.deprecated_tags', { tags: tags }),
28712                       entity: change
28713                   });
28714               }
28715           }
28716
28717           return warnings;
28718       };
28719
28720
28721       return validation;
28722   }
28723
28724   function validationDisconnectedHighway() {
28725
28726       function isDisconnectedHighway(entity, graph) {
28727           if (!entity.tags.highway) return false;
28728           if (entity.geometry(graph) !== 'line') return false;
28729
28730           return graph.childNodes(entity)
28731               .every(function(vertex) {
28732                   var parents = graph.parentWays(vertex);
28733                   if (parents.length === 1) {  // standalone vertex
28734                       return true;
28735                   } else {                     // shared vertex
28736                       return !vertex.tags.entrance &&
28737                           parents.filter(function(parent) {
28738                               return parent.tags.highway && parent !== entity;
28739                           }).length === 0;
28740                   }
28741               });
28742       }
28743
28744
28745       var validation = function(changes, graph) {
28746           var warnings = [];
28747           for (var i = 0; i < changes.created.length; i++) {
28748               var entity = changes.created[i];
28749
28750               if (isDisconnectedHighway(entity, graph)) {
28751                   warnings.push({
28752                       id: 'disconnected_highway',
28753                       message: t('validations.disconnected_highway'),
28754                       tooltip: t('validations.disconnected_highway_tooltip'),
28755                       entity: entity
28756                   });
28757               }
28758           }
28759
28760           return warnings;
28761       };
28762
28763
28764       return validation;
28765   }
28766
28767   function validationManyDeletions() {
28768       var threshold = 100;
28769
28770       var validation = function(changes, graph) {
28771           var warnings = [];
28772           var nodes=0, ways=0, areas=0, relations=0;
28773
28774           changes.deleted.forEach(function(c) {
28775               if (c.type === 'node') {nodes++;}
28776               else if (c.type === 'way' && c.geometry(graph) === 'line') {ways++;}
28777               else if (c.type === 'way' && c.geometry(graph) === 'area') {areas++;}
28778               else if (c.type === 'relation') {relations++;}
28779           });
28780           if (changes.deleted.length > threshold) {
28781               warnings.push({
28782                   id: 'many_deletions',
28783                   message: t('validations.many_deletions',
28784                       { n: changes.deleted.length, p: nodes, l: ways, a:areas, r: relations })
28785               });
28786           }
28787
28788           return warnings;
28789       };
28790
28791
28792       return validation;
28793   }
28794
28795   function validationMissingTag() {
28796
28797       // Slightly stricter check than Entity#isUsed (#3091)
28798       function hasTags(entity, graph) {
28799           return without(Object.keys(entity.tags), 'area', 'name').length > 0 ||
28800               graph.parentRelations(entity).length > 0;
28801       }
28802
28803       var validation = function(changes, graph) {
28804           var types = ['point', 'line', 'area', 'relation'],
28805               warnings = [];
28806
28807           for (var i = 0; i < changes.created.length; i++) {
28808               var change = changes.created[i],
28809                   geometry = change.geometry(graph);
28810
28811               if (types.indexOf(geometry) !== -1 && !hasTags(change, graph)) {
28812                   warnings.push({
28813                       id: 'missing_tag',
28814                       message: t('validations.untagged_' + geometry),
28815                       tooltip: t('validations.untagged_' + geometry + '_tooltip'),
28816                       entity: change
28817                   });
28818               }
28819           }
28820
28821           return warnings;
28822       };
28823
28824
28825       return validation;
28826   }
28827
28828   function validationOldMultipolygon() {
28829
28830       return function validation(changes, graph) {
28831           var warnings = [];
28832           for (var i = 0; i < changes.created.length; i++) {
28833               var entity = changes.created[i];
28834               var parent = osmIsSimpleMultipolygonOuterMember(entity, graph);
28835               if (parent) {
28836                   warnings.push({
28837                       id: 'old_multipolygon',
28838                       message: t('validations.old_multipolygon'),
28839                       tooltip: t('validations.old_multipolygon_tooltip'),
28840                       entity: parent
28841                   });
28842               }
28843           }
28844           return warnings;
28845       };
28846   }
28847
28848   // https://github.com/openstreetmap/josm/blob/mirror/src/org/
28849   // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
28850   function validationTagSuggestsArea() {
28851
28852       function tagSuggestsArea(tags) {
28853           if (isEmpty(tags)) return false;
28854
28855           var presence = ['landuse', 'amenities', 'tourism', 'shop'];
28856           for (var i = 0; i < presence.length; i++) {
28857               if (tags[presence[i]] !== undefined) {
28858                   if (presence[i] === 'tourism' && tags[presence[i]] === 'artwork') {
28859                       continue;   // exception for tourism=artwork - #5206
28860                   } else {
28861                       return presence[i] + '=' + tags[presence[i]];
28862                   }
28863               }
28864           }
28865
28866           if (tags.building && tags.building === 'yes') return 'building=yes';
28867       }
28868
28869
28870       var validation = function(changes, graph) {
28871           var warnings = [];
28872           for (var i = 0; i < changes.created.length; i++) {
28873               var change = changes.created[i],
28874                   geometry = change.geometry(graph),
28875                   suggestion = (geometry === 'line' ? tagSuggestsArea(change.tags) : undefined);
28876
28877               if (suggestion) {
28878                   warnings.push({
28879                       id: 'tag_suggests_area',
28880                       message: t('validations.tag_suggests_area', { tag: suggestion }),
28881                       entity: change
28882                   });
28883               }
28884           }
28885
28886           return warnings;
28887       };
28888
28889
28890       return validation;
28891   }
28892
28893
28894
28895   var Validations = /*#__PURE__*/Object.freeze({
28896     validationDeprecatedTag: validationDeprecatedTag,
28897     validationDisconnectedHighway: validationDisconnectedHighway,
28898     validationManyDeletions: validationManyDeletions,
28899     validationMissingTag: validationMissingTag,
28900     validationOldMultipolygon: validationOldMultipolygon,
28901     validationTagSuggestsArea: validationTagSuggestsArea
28902   });
28903
28904   /**
28905    * Performs a deep comparison between two values to determine if they are
28906    * equivalent.
28907    *
28908    * **Note:** This method supports comparing arrays, array buffers, booleans,
28909    * date objects, error objects, maps, numbers, `Object` objects, regexes,
28910    * sets, strings, symbols, and typed arrays. `Object` objects are compared
28911    * by their own, not inherited, enumerable properties. Functions and DOM
28912    * nodes are compared by strict equality, i.e. `===`.
28913    *
28914    * @static
28915    * @memberOf _
28916    * @since 0.1.0
28917    * @category Lang
28918    * @param {*} value The value to compare.
28919    * @param {*} other The other value to compare.
28920    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
28921    * @example
28922    *
28923    * var object = { 'a': 1 };
28924    * var other = { 'a': 1 };
28925    *
28926    * _.isEqual(object, other);
28927    * // => true
28928    *
28929    * object === other;
28930    * // => false
28931    */
28932   function isEqual(value, other) {
28933     return baseIsEqual(value, other);
28934   }
28935
28936   /*
28937       iD.Difference represents the difference between two graphs.
28938       It knows how to calculate the set of entities that were
28939       created, modified, or deleted, and also contains the logic
28940       for recursively extending a difference to the complete set
28941       of entities that will require a redraw, taking into account
28942       child and parent relationships.
28943    */
28944   function coreDifference(base, head) {
28945       var _changes = {};
28946       var _diff = {};
28947       var _length = 0;
28948       var i, k, h, b, keys;
28949
28950       function changed(h, b) {
28951           if (h === b) return false;
28952           if (!h || !b) return true;
28953
28954           if (h.loc || b.loc) {
28955               if (!h.loc && b.loc || h.loc && !b.loc ||
28956                   h.loc[0] !== b.loc[0] || h.loc[1] !== b.loc[1]) return true;
28957           }
28958           if (h.nodes || b.nodes) {
28959               if (!isEqual(h.nodes, b.nodes)) return true;
28960           }
28961           if (h.members || b.members) {
28962               if (!isEqual(h.members, b.members)) return true;
28963           }
28964           return !isEqual(h.tags, b.tags);
28965       }
28966
28967
28968       keys = Object.keys(head.entities);
28969       for (i = 0; i < keys.length; i++) {
28970           k = keys[i];
28971           h = head.entities[k];
28972           b = base.entities[k];
28973           if (changed(h, b)) {
28974               _changes[k] = {base: b, head: h};
28975               _length++;
28976           }
28977       }
28978
28979       keys = Object.keys(base.entities);
28980       for (i = 0; i < keys.length; i++) {
28981           k = keys[i];
28982           h = head.entities[k];
28983           b = base.entities[k];
28984           if (!_changes[k] && changed(h, b)) {
28985               _changes[k] = {base: b, head: h};
28986               _length++;
28987           }
28988       }
28989
28990
28991       function addParents(parents, result) {
28992           for (var i = 0; i < parents.length; i++) {
28993               var parent = parents[i];
28994
28995               if (parent.id in result)
28996                   continue;
28997
28998               result[parent.id] = parent;
28999               addParents(head.parentRelations(parent), result);
29000           }
29001       }
29002
29003
29004       _diff.length = function length() {
29005           return _length;
29006       };
29007
29008
29009       _diff.changes = function changes() {
29010           return _changes;
29011       };
29012
29013
29014       _diff.extantIDs = function extantIDs() {
29015           var result = [];
29016           forEach(_changes, function(change, id) {
29017               if (change.head) result.push(id);
29018           });
29019           return result;
29020       };
29021
29022
29023       _diff.modified = function modified() {
29024           var result = [];
29025           forEach(_changes, function(change) {
29026               if (change.base && change.head) result.push(change.head);
29027           });
29028           return result;
29029       };
29030
29031
29032       _diff.created = function created() {
29033           var result = [];
29034           forEach(_changes, function(change) {
29035               if (!change.base && change.head) result.push(change.head);
29036           });
29037           return result;
29038       };
29039
29040
29041       _diff.deleted = function deleted() {
29042           var result = [];
29043           forEach(_changes, function(change) {
29044               if (change.base && !change.head) result.push(change.base);
29045           });
29046           return result;
29047       };
29048
29049
29050       _diff.summary = function summary() {
29051           var relevant = {};
29052
29053           function addEntity(entity, graph, changeType) {
29054               relevant[entity.id] = {
29055                   entity: entity,
29056                   graph: graph,
29057                   changeType: changeType
29058               };
29059           }
29060
29061           function addParents(entity) {
29062               var parents = head.parentWays(entity);
29063               for (var j = parents.length - 1; j >= 0; j--) {
29064                   var parent = parents[j];
29065                   if (!(parent.id in relevant)) addEntity(parent, head, 'modified');
29066               }
29067           }
29068
29069           var keys = Object.keys(_changes);
29070           for (var i = 0; i < keys.length; i++) {
29071               var change = _changes[keys[i]];
29072
29073               if (change.head && change.head.geometry(head) !== 'vertex') {
29074                   addEntity(change.head, head, change.base ? 'modified' : 'created');
29075
29076               } else if (change.base && change.base.geometry(base) !== 'vertex') {
29077                   addEntity(change.base, base, 'deleted');
29078
29079               } else if (change.base && change.head) { // modified vertex
29080                   var moved    = !isEqual(change.base.loc,  change.head.loc);
29081                   var retagged = !isEqual(change.base.tags, change.head.tags);
29082
29083                   if (moved) {
29084                       addParents(change.head);
29085                   }
29086
29087                   if (retagged || (moved && change.head.hasInterestingTags())) {
29088                       addEntity(change.head, head, 'modified');
29089                   }
29090
29091               } else if (change.head && change.head.hasInterestingTags()) { // created vertex
29092                   addEntity(change.head, head, 'created');
29093
29094               } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
29095                   addEntity(change.base, base, 'deleted');
29096               }
29097           }
29098
29099           return values$1(relevant);
29100       };
29101
29102
29103       _diff.complete = function complete(extent) {
29104           var result = {};
29105           var id, change;
29106
29107           for (id in _changes) {
29108               change = _changes[id];
29109
29110               var h = change.head;
29111               var b = change.base;
29112               var entity = h || b;
29113
29114               if (extent &&
29115                   (!h || !h.intersects(extent, head)) &&
29116                   (!b || !b.intersects(extent, base)))
29117                   continue;
29118
29119               result[id] = h;
29120
29121               if (entity.type === 'way') {
29122                   var nh = h ? h.nodes : [];
29123                   var nb = b ? b.nodes : [];
29124                   var diff, i;
29125
29126                   diff = difference(nh, nb);
29127                   for (i = 0; i < diff.length; i++) {
29128                       result[diff[i]] = head.hasEntity(diff[i]);
29129                   }
29130
29131                   diff = difference(nb, nh);
29132                   for (i = 0; i < diff.length; i++) {
29133                       result[diff[i]] = head.hasEntity(diff[i]);
29134                   }
29135               }
29136
29137               addParents(head.parentWays(entity), result);
29138               addParents(head.parentRelations(entity), result);
29139           }
29140
29141           return result;
29142       };
29143
29144
29145       return _diff;
29146   }
29147
29148   /** Used for built-in method references. */
29149   var objectProto$i = Object.prototype;
29150
29151   /** Used to check objects for own properties. */
29152   var hasOwnProperty$f = objectProto$i.hasOwnProperty;
29153
29154   /**
29155    * Assigns own enumerable string keyed properties of source objects to the
29156    * destination object. Source objects are applied from left to right.
29157    * Subsequent sources overwrite property assignments of previous sources.
29158    *
29159    * **Note:** This method mutates `object` and is loosely based on
29160    * [`Object.assign`](https://mdn.io/Object/assign).
29161    *
29162    * @static
29163    * @memberOf _
29164    * @since 0.10.0
29165    * @category Object
29166    * @param {Object} object The destination object.
29167    * @param {...Object} [sources] The source objects.
29168    * @returns {Object} Returns `object`.
29169    * @see _.assignIn
29170    * @example
29171    *
29172    * function Foo() {
29173    *   this.a = 1;
29174    * }
29175    *
29176    * function Bar() {
29177    *   this.c = 3;
29178    * }
29179    *
29180    * Foo.prototype.b = 2;
29181    * Bar.prototype.d = 4;
29182    *
29183    * _.assign({ 'a': 0 }, new Foo, new Bar);
29184    * // => { 'a': 1, 'c': 3 }
29185    */
29186   var assign = createAssigner(function(object, source) {
29187     if (isPrototype(source) || isArrayLike(source)) {
29188       copyObject(source, keys$1(source), object);
29189       return;
29190     }
29191     for (var key in source) {
29192       if (hasOwnProperty$f.call(source, key)) {
29193         assignValue(object, key, source[key]);
29194       }
29195     }
29196   });
29197
29198   /* Built-in method references for those with the same name as other `lodash` methods. */
29199   var nativeMax$3 = Math.max;
29200
29201   /**
29202    * Checks if `value` is in `collection`. If `collection` is a string, it's
29203    * checked for a substring of `value`, otherwise
29204    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
29205    * is used for equality comparisons. If `fromIndex` is negative, it's used as
29206    * the offset from the end of `collection`.
29207    *
29208    * @static
29209    * @memberOf _
29210    * @since 0.1.0
29211    * @category Collection
29212    * @param {Array|Object|string} collection The collection to inspect.
29213    * @param {*} value The value to search for.
29214    * @param {number} [fromIndex=0] The index to search from.
29215    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
29216    * @returns {boolean} Returns `true` if `value` is found, else `false`.
29217    * @example
29218    *
29219    * _.includes([1, 2, 3], 1);
29220    * // => true
29221    *
29222    * _.includes([1, 2, 3], 1, 2);
29223    * // => false
29224    *
29225    * _.includes({ 'a': 1, 'b': 2 }, 1);
29226    * // => true
29227    *
29228    * _.includes('abcd', 'bc');
29229    * // => true
29230    */
29231   function includes(collection, value, fromIndex, guard) {
29232     collection = isArrayLike(collection) ? collection : values$1(collection);
29233     fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
29234
29235     var length = collection.length;
29236     if (fromIndex < 0) {
29237       fromIndex = nativeMax$3(length + fromIndex, 0);
29238     }
29239     return isString(collection)
29240       ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
29241       : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
29242   }
29243
29244   function coreGraph$$1(other, mutable) {
29245       if (!(this instanceof coreGraph$$1)) return new coreGraph$$1(other, mutable);
29246
29247       if (other instanceof coreGraph$$1) {
29248           var base = other.base();
29249           this.entities = assign(Object.create(base.entities), other.entities);
29250           this._parentWays = assign(Object.create(base.parentWays), other._parentWays);
29251           this._parentRels = assign(Object.create(base.parentRels), other._parentRels);
29252
29253       } else {
29254           this.entities = Object.create({});
29255           this._parentWays = Object.create({});
29256           this._parentRels = Object.create({});
29257           this.rebase(other || [], [this]);
29258       }
29259
29260       this.transients = {};
29261       this._childNodes = {};
29262       this.frozen = !mutable;
29263   }
29264
29265
29266   coreGraph$$1.prototype = {
29267
29268       hasEntity: function(id) {
29269           return this.entities[id];
29270       },
29271
29272
29273       entity: function(id) {
29274           var entity = this.entities[id];
29275
29276           //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
29277           if (!entity) {
29278               entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
29279           }
29280
29281           if (!entity) {
29282               throw new Error('entity ' + id + ' not found');
29283           }
29284           return entity;
29285       },
29286
29287
29288       transient: function(entity, key, fn) {
29289           var id = entity.id;
29290           var transients = this.transients[id] || (this.transients[id] = {});
29291
29292           if (transients[key] !== undefined) {
29293               return transients[key];
29294           }
29295
29296           transients[key] = fn.call(entity);
29297
29298           return transients[key];
29299       },
29300
29301
29302       parentWays: function(entity) {
29303           var parents = this._parentWays[entity.id];
29304           var result = [];
29305
29306           if (parents) {
29307               for (var i = 0; i < parents.length; i++) {
29308                   result.push(this.entity(parents[i]));
29309               }
29310           }
29311           return result;
29312       },
29313
29314
29315       isPoi: function(entity) {
29316           var parentWays = this._parentWays[entity.id];
29317           return !parentWays || parentWays.length === 0;
29318       },
29319
29320
29321       isShared: function(entity) {
29322           var parentWays = this._parentWays[entity.id];
29323           return parentWays && parentWays.length > 1;
29324       },
29325
29326
29327       parentRelations: function(entity) {
29328           var parents = this._parentRels[entity.id];
29329           var result = [];
29330
29331           if (parents) {
29332               for (var i = 0; i < parents.length; i++) {
29333                   result.push(this.entity(parents[i]));
29334               }
29335           }
29336           return result;
29337       },
29338
29339
29340       childNodes: function(entity) {
29341           if (this._childNodes[entity.id]) return this._childNodes[entity.id];
29342           if (!entity.nodes) return [];
29343
29344           var nodes = [];
29345           for (var i = 0; i < entity.nodes.length; i++) {
29346               nodes[i] = this.entity(entity.nodes[i]);
29347           }
29348
29349           this._childNodes[entity.id] = nodes;
29350           return this._childNodes[entity.id];
29351       },
29352
29353
29354       base: function() {
29355           return {
29356               'entities': utilGetPrototypeOf(this.entities),
29357               'parentWays': utilGetPrototypeOf(this._parentWays),
29358               'parentRels': utilGetPrototypeOf(this._parentRels)
29359           };
29360       },
29361
29362
29363       // Unlike other graph methods, rebase mutates in place. This is because it
29364       // is used only during the history operation that merges newly downloaded
29365       // data into each state. To external consumers, it should appear as if the
29366       // graph always contained the newly downloaded data.
29367       rebase: function(entities, stack, force) {
29368           var base = this.base();
29369           var i, j, k, id;
29370
29371           for (i = 0; i < entities.length; i++) {
29372               var entity = entities[i];
29373
29374               if (!entity.visible || (!force && base.entities[entity.id]))
29375                   continue;
29376
29377               // Merging data into the base graph
29378               base.entities[entity.id] = entity;
29379               this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
29380
29381               // Restore provisionally-deleted nodes that are discovered to have an extant parent
29382               if (entity.type === 'way') {
29383                   for (j = 0; j < entity.nodes.length; j++) {
29384                       id = entity.nodes[j];
29385                       for (k = 1; k < stack.length; k++) {
29386                           var ents = stack[k].entities;
29387                           if (ents.hasOwnProperty(id) && ents[id] === undefined) {
29388                               delete ents[id];
29389                           }
29390                       }
29391                   }
29392               }
29393           }
29394
29395           for (i = 0; i < stack.length; i++) {
29396               stack[i]._updateRebased();
29397           }
29398       },
29399
29400
29401       _updateRebased: function() {
29402           var base = this.base();
29403           var i, k, child, id, keys;
29404
29405           keys = Object.keys(this._parentWays);
29406           for (i = 0; i < keys.length; i++) {
29407               child = keys[i];
29408               if (base.parentWays[child]) {
29409                   for (k = 0; k < base.parentWays[child].length; k++) {
29410                       id = base.parentWays[child][k];
29411                       if (!this.entities.hasOwnProperty(id) && !includes(this._parentWays[child], id)) {
29412                           this._parentWays[child].push(id);
29413                       }
29414                   }
29415               }
29416           }
29417
29418           keys = Object.keys(this._parentRels);
29419           for (i = 0; i < keys.length; i++) {
29420               child = keys[i];
29421               if (base.parentRels[child]) {
29422                   for (k = 0; k < base.parentRels[child].length; k++) {
29423                       id = base.parentRels[child][k];
29424                       if (!this.entities.hasOwnProperty(id) && !includes(this._parentRels[child], id)) {
29425                           this._parentRels[child].push(id);
29426                       }
29427                   }
29428               }
29429           }
29430
29431           this.transients = {};
29432
29433           // this._childNodes is not updated, under the assumption that
29434           // ways are always downloaded with their child nodes.
29435       },
29436
29437
29438       // Updates calculated properties (parentWays, parentRels) for the specified change
29439       _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
29440           parentWays = parentWays || this._parentWays;
29441           parentRels = parentRels || this._parentRels;
29442
29443           var type = entity && entity.type || oldentity && oldentity.type;
29444           var removed, added, ways, rels, i;
29445
29446           if (type === 'way') {   // Update parentWays
29447               if (oldentity && entity) {
29448                   removed = difference(oldentity.nodes, entity.nodes);
29449                   added = difference(entity.nodes, oldentity.nodes);
29450               } else if (oldentity) {
29451                   removed = oldentity.nodes;
29452                   added = [];
29453               } else if (entity) {
29454                   removed = [];
29455                   added = entity.nodes;
29456               }
29457               for (i = 0; i < removed.length; i++) {
29458                   parentWays[removed[i]] = without(parentWays[removed[i]], oldentity.id);
29459               }
29460               for (i = 0; i < added.length; i++) {
29461                   ways = without(parentWays[added[i]], entity.id);
29462                   ways.push(entity.id);
29463                   parentWays[added[i]] = ways;
29464               }
29465
29466           } else if (type === 'relation') {   // Update parentRels
29467               if (oldentity && entity) {
29468                   removed = difference(oldentity.members, entity.members);
29469                   added = difference(entity.members, oldentity);
29470               } else if (oldentity) {
29471                   removed = oldentity.members;
29472                   added = [];
29473               } else if (entity) {
29474                   removed = [];
29475                   added = entity.members;
29476               }
29477               for (i = 0; i < removed.length; i++) {
29478                   parentRels[removed[i].id] = without(parentRels[removed[i].id], oldentity.id);
29479               }
29480               for (i = 0; i < added.length; i++) {
29481                   rels = without(parentRels[added[i].id], entity.id);
29482                   rels.push(entity.id);
29483                   parentRels[added[i].id] = rels;
29484               }
29485           }
29486       },
29487
29488
29489       replace: function(entity) {
29490           if (this.entities[entity.id] === entity) return this;
29491
29492           return this.update(function() {
29493               this._updateCalculated(this.entities[entity.id], entity);
29494               this.entities[entity.id] = entity;
29495           });
29496       },
29497
29498
29499       remove: function(entity) {
29500           return this.update(function() {
29501               this._updateCalculated(entity, undefined);
29502               this.entities[entity.id] = undefined;
29503           });
29504       },
29505
29506
29507       revert: function(id) {
29508           var baseEntity = this.base().entities[id];
29509           var headEntity = this.entities[id];
29510           if (headEntity === baseEntity) return this;
29511
29512           return this.update(function() {
29513               this._updateCalculated(headEntity, baseEntity);
29514               delete this.entities[id];
29515           });
29516       },
29517
29518
29519       update: function() {
29520           var graph = this.frozen ? coreGraph$$1(this, true) : this;
29521           for (var i = 0; i < arguments.length; i++) {
29522               arguments[i].call(graph, graph);
29523           }
29524
29525           if (this.frozen) graph.frozen = true;
29526
29527           return graph;
29528       },
29529
29530
29531       // Obliterates any existing entities
29532       load: function(entities) {
29533           var base = this.base();
29534           this.entities = Object.create(base.entities);
29535
29536           for (var i in entities) {
29537               this.entities[i] = entities[i];
29538               this._updateCalculated(base.entities[i], this.entities[i]);
29539           }
29540
29541           return this;
29542       }
29543   };
29544
29545   function coreTree(head) {
29546       var rtree = rbush_1(),
29547           bboxes = {},
29548           tree = {};
29549
29550
29551       function entityBBox(entity) {
29552           var bbox = entity.extent(head).bbox();
29553           bbox.id = entity.id;
29554           bboxes[entity.id] = bbox;
29555           return bbox;
29556       }
29557
29558
29559       function updateParents(entity, insertions, memo) {
29560           head.parentWays(entity).forEach(function(way) {
29561               if (bboxes[way.id]) {
29562                   rtree.remove(bboxes[way.id]);
29563                   insertions[way.id] = way;
29564               }
29565               updateParents(way, insertions, memo);
29566           });
29567
29568           head.parentRelations(entity).forEach(function(relation) {
29569               if (memo[entity.id]) return;
29570               memo[entity.id] = true;
29571               if (bboxes[relation.id]) {
29572                   rtree.remove(bboxes[relation.id]);
29573                   insertions[relation.id] = relation;
29574               }
29575               updateParents(relation, insertions, memo);
29576           });
29577       }
29578
29579
29580       tree.rebase = function(entities, force) {
29581           var insertions = {};
29582
29583           for (var i = 0; i < entities.length; i++) {
29584               var entity = entities[i];
29585
29586               if (!entity.visible)
29587                   continue;
29588
29589               if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
29590                   if (!force) {
29591                       continue;
29592                   } else if (bboxes[entity.id]) {
29593                       rtree.remove(bboxes[entity.id]);
29594                   }
29595               }
29596
29597               insertions[entity.id] = entity;
29598               updateParents(entity, insertions, {});
29599           }
29600
29601           rtree.load(map$3(insertions, entityBBox));
29602
29603           return tree;
29604       };
29605
29606
29607       tree.intersects = function(extent, graph) {
29608           if (graph !== head) {
29609               var diff = coreDifference(head, graph),
29610                   insertions = {};
29611
29612               head = graph;
29613
29614               diff.deleted().forEach(function(entity) {
29615                   rtree.remove(bboxes[entity.id]);
29616                   delete bboxes[entity.id];
29617               });
29618
29619               diff.modified().forEach(function(entity) {
29620                   rtree.remove(bboxes[entity.id]);
29621                   insertions[entity.id] = entity;
29622                   updateParents(entity, insertions, {});
29623               });
29624
29625               diff.created().forEach(function(entity) {
29626                   insertions[entity.id] = entity;
29627               });
29628
29629               rtree.load(map$3(insertions, entityBBox));
29630           }
29631
29632           return rtree.search(extent.bbox()).map(function(bbox) {
29633               return head.entity(bbox.id);
29634           });
29635       };
29636
29637
29638       return tree;
29639   }
29640
29641   var _tooltipID = 0;
29642
29643   function tooltip() {
29644       var _id = _tooltipID++;
29645       var tooltip = function(selection$$1) {
29646           selection$$1.each(setup);
29647       };
29648       var _animation = utilFunctor(false);
29649       var _title = function() {
29650           var title = this.getAttribute('data-original-title');
29651           if (title) {
29652               return title;
29653           } else {
29654               title = this.getAttribute('title');
29655               this.removeAttribute('title');
29656               this.setAttribute('data-original-title', title);
29657           }
29658           return title;
29659       };
29660       var _html = utilFunctor(false);
29661       var _placement = utilFunctor('top');
29662
29663
29664       tooltip.title = function(val) {
29665           if (arguments.length) {
29666               _title = utilFunctor(val);
29667               return tooltip;
29668           } else {
29669               return _title;
29670           }
29671       };
29672
29673
29674       tooltip.html = function(val) {
29675           if (arguments.length) {
29676               _html = utilFunctor(val);
29677               return tooltip;
29678           } else {
29679               return _html;
29680           }
29681       };
29682
29683
29684       tooltip.placement = function(val) {
29685           if (arguments.length) {
29686               _placement = utilFunctor(val);
29687               return tooltip;
29688           } else {
29689               return _placement;
29690           }
29691       };
29692
29693
29694       tooltip.show = function(selection$$1) {
29695           selection$$1.each(show);
29696       };
29697
29698
29699       tooltip.hide = function(selection$$1) {
29700           selection$$1.each(hide);
29701       };
29702
29703
29704       tooltip.toggle = function(selection$$1) {
29705           selection$$1.each(toggle);
29706       };
29707
29708
29709       tooltip.destroy = function(selection$$1) {
29710           selection$$1
29711               .on('mouseenter.tooltip', null)
29712               .on('mouseleave.tooltip', null)
29713               .attr('title', function() {
29714                   return this.getAttribute('data-original-title') || this.getAttribute('title');
29715               })
29716               .attr('data-original-title', null)
29717               .selectAll('.tooltip-' + _id)
29718               .remove();
29719       };
29720
29721
29722       function setup() {
29723           var root = select(this);
29724           var animate = _animation.apply(this, arguments);
29725           var tip = root.selectAll('.tooltip-' + _id)
29726               .data([0]);
29727
29728           var enter = tip.enter()
29729               .append('div')
29730               .attr('class', 'tooltip tooltip-' + _id);
29731
29732           enter
29733               .append('div')
29734               .attr('class', 'tooltip-arrow');
29735
29736           enter
29737               .append('div')
29738               .attr('class', 'tooltip-inner');
29739
29740           tip = enter
29741               .merge(tip);
29742
29743           if (animate) {
29744               tip.classed('fade', true);
29745           }
29746
29747           var place = _placement.apply(this, arguments);
29748           tip.classed(place, true);
29749
29750           root.on('mouseenter.tooltip', show);
29751           root.on('mouseleave.tooltip', hide);
29752       }
29753
29754
29755       function show() {
29756           var root = select(this);
29757           var content = _title.apply(this, arguments);
29758           var tip = root.selectAll('.tooltip-' + _id);
29759
29760           if (tip.empty()) {   // tooltip was removed somehow, put it back
29761               root.call(tooltip.destroy);
29762               root.each(setup);
29763               tip = root.selectAll('.tooltip-' + _id);
29764           }
29765
29766           tip.classed('in', true);
29767           var markup = _html.apply(this, arguments);
29768
29769           tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
29770           var place = _placement.apply(this, arguments);
29771           var outer = getPosition(root.node());
29772           var inner = getPosition(tip.node());
29773           var pos;
29774
29775           switch (place) {
29776               case 'top':
29777               pos = { x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h };
29778               break;
29779               case 'right':
29780               pos = { x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2 };
29781               break;
29782               case 'left':
29783               pos = { x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2 };
29784               break;
29785               case 'bottom':
29786               pos = { x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h };
29787               break;
29788           }
29789
29790           if (pos) {
29791               tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
29792           } else {
29793               tip.style('left', null).style('top', null);
29794           }
29795
29796           this.tooltipVisible = true;
29797
29798
29799           function getPosition(node) {
29800               var mode = select(node).style('position');
29801               if (mode === 'absolute' || mode === 'static') {
29802                   return {
29803                       x: node.offsetLeft,
29804                       y: node.offsetTop,
29805                       w: node.offsetWidth,
29806                       h: node.offsetHeight
29807                   };
29808               } else {
29809                   return {
29810                       x: 0,
29811                       y: 0,
29812                       w: node.offsetWidth,
29813                       h: node.offsetHeight
29814                   };
29815               }
29816           }
29817       }
29818
29819
29820       function hide() {
29821           select(this).selectAll('.tooltip-' + _id).classed('in', false);
29822           this.tooltipVisible = false;
29823       }
29824
29825
29826       function toggle() {
29827           if (this.tooltipVisible) {
29828               hide.apply(this, arguments);
29829           } else {
29830               show.apply(this, arguments);
29831           }
29832       }
29833
29834
29835       return tooltip;
29836   }
29837
29838   function behaviorEdit(context) {
29839
29840       function behavior() {
29841           context.map()
29842               .minzoom(context.minEditableZoom());
29843       }
29844
29845
29846       behavior.off = function() {
29847           context.map()
29848               .minzoom(0);
29849       };
29850
29851       return behavior;
29852   }
29853
29854   /*
29855      The hover behavior adds the `.hover` class on mouseover to all elements to which
29856      the identical datum is bound, and removes it on mouseout.
29857
29858      The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
29859      representation may consist of several elements scattered throughout the DOM hierarchy.
29860      Only one of these elements can have the :hover pseudo-class, but all of them will
29861      have the .hover class.
29862    */
29863   function behaviorHover(context) {
29864       var dispatch$$1 = dispatch('hover');
29865       var _selection = select(null);
29866       var _newId = null;
29867       var _buttonDown;
29868       var _altDisables;
29869       var _target;
29870
29871
29872       function keydown() {
29873           if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
29874               _selection.selectAll('.hover')
29875                   .classed('hover-suppressed', true)
29876                   .classed('hover', false);
29877
29878               _selection
29879                   .classed('hover-disabled', true);
29880
29881               dispatch$$1.call('hover', this, null);
29882           }
29883       }
29884
29885
29886       function keyup() {
29887           if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
29888               _selection.selectAll('.hover-suppressed')
29889                   .classed('hover-suppressed', false)
29890                   .classed('hover', true);
29891
29892               _selection
29893                   .classed('hover-disabled', false);
29894
29895               dispatch$$1.call('hover', this, _target ? _target.id : null);
29896           }
29897       }
29898
29899
29900       function behavior(selection$$1) {
29901           _selection = selection$$1;
29902           _newId = null;
29903
29904           _selection
29905               .on('mouseover.hover', mouseover)
29906               .on('mouseout.hover', mouseout)
29907               .on('mousedown.hover', mousedown);
29908
29909           select(window)
29910               .on('keydown.hover', keydown)
29911               .on('keyup.hover', keyup);
29912
29913
29914           function mouseover() {
29915               if (_buttonDown) return;
29916               var target = event.target;
29917               enter(target ? target.__data__ : null);
29918           }
29919
29920
29921           function mouseout() {
29922               if (_buttonDown) return;
29923               var target = event.relatedTarget;
29924               enter(target ? target.__data__ : null);
29925           }
29926
29927
29928           function mousedown() {
29929               _buttonDown = true;
29930               select(window)
29931                   .on('mouseup.hover', mouseup, true);
29932           }
29933
29934
29935           function mouseup() {
29936               _buttonDown = false;
29937               select(window)
29938                   .on('mouseup.hover', null, true);
29939           }
29940
29941
29942           function enter(datum) {
29943               if (datum === _target) return;
29944               _target = datum;
29945
29946               _selection.selectAll('.hover')
29947                   .classed('hover', false);
29948               _selection.selectAll('.hover-suppressed')
29949                   .classed('hover-suppressed', false);
29950
29951               // What are we hovering over?
29952               var entity, selector$$1;
29953               if (datum && datum.__featurehash__) {
29954                   entity = datum;
29955                   selector$$1 = '.data' + datum.__featurehash__;
29956
29957               } else if (datum instanceof osmNote) {
29958                   entity = datum;
29959                   selector$$1 = '.note-' + datum.id;
29960
29961               } else if (datum instanceof osmEntity$$1) {
29962                   entity = datum;
29963                   selector$$1 = '.' + entity.id;
29964                   if (entity.type === 'relation') {
29965                       entity.members.forEach(function(member) { selector$$1 += ', .' + member.id; });
29966                   }
29967
29968               } else if (datum && datum.properties && (datum.properties.entity instanceof osmEntity$$1)) {
29969                   entity = datum.properties.entity;
29970                   selector$$1 = '.' + entity.id;
29971                   if (entity.type === 'relation') {
29972                       entity.members.forEach(function(member) { selector$$1 += ', .' + member.id; });
29973                   }
29974               }
29975
29976               // Update hover state and dispatch event
29977               if (entity && entity.id !== _newId) {
29978                   // If drawing a way, don't hover on a node that was just placed. #3974
29979                   var mode = context.mode() && context.mode().id;
29980                   if ((mode === 'draw-line' || mode === 'draw-area') && !_newId && entity.type === 'node') {
29981                       _newId = entity.id;
29982                       return;
29983                   }
29984
29985                   var suppressed = _altDisables && event && event.altKey;
29986                   _selection.selectAll(selector$$1)
29987                       .classed(suppressed ? 'hover-suppressed' : 'hover', true);
29988
29989                   dispatch$$1.call('hover', this, !suppressed && entity);
29990
29991               } else {
29992                   dispatch$$1.call('hover', this, null);
29993               }
29994           }
29995       }
29996
29997
29998       behavior.off = function(selection$$1) {
29999           selection$$1.selectAll('.hover')
30000               .classed('hover', false);
30001           selection$$1.selectAll('.hover-suppressed')
30002               .classed('hover-suppressed', false);
30003           selection$$1
30004               .classed('hover-disabled', false);
30005
30006           selection$$1
30007               .on('mouseover.hover', null)
30008               .on('mouseout.hover', null)
30009               .on('mousedown.hover', null);
30010
30011           select(window)
30012               .on('keydown.hover', null)
30013               .on('keyup.hover', null);
30014       };
30015
30016
30017       behavior.altDisables = function(val) {
30018           if (!arguments.length) return _altDisables;
30019           _altDisables = val;
30020           return behavior;
30021       };
30022
30023
30024       return utilRebind(behavior, dispatch$$1, 'on');
30025   }
30026
30027   function refresh(selection, node) {
30028       var cr = node.getBoundingClientRect();
30029       var prop = [cr.width, cr.height];
30030       selection.property('__dimensions__', prop);
30031       return prop;
30032   }
30033
30034   function utilGetDimensions(selection, force) {
30035       if (!selection || selection.empty()) {
30036           return [0, 0];
30037       }
30038       var node = selection.node(),
30039           cached = selection.property('__dimensions__');
30040       return (!cached || force) ? refresh(selection, node) : cached;
30041   }
30042
30043
30044   function utilSetDimensions(selection, dimensions) {
30045       if (!selection || selection.empty()) {
30046           return selection;
30047       }
30048       var node = selection.node();
30049       if (dimensions === null) {
30050           refresh(selection, node);
30051           return selection;
30052       }
30053       return selection
30054           .property('__dimensions__', [dimensions[0], dimensions[1]])
30055           .attr('width', dimensions[0])
30056           .attr('height', dimensions[1]);
30057   }
30058
30059   function behaviorTail() {
30060       var container;
30061       var xmargin = 25;
30062       var tooltipSize = [0, 0];
30063       var selectionSize = [0, 0];
30064       var _text;
30065
30066
30067       function behavior(selection$$1) {
30068           if (!_text) return;
30069
30070           select(window)
30071               .on('resize.tail', function() { selectionSize = utilGetDimensions(selection$$1); });
30072
30073           container = select(document.body)
30074               .append('div')
30075               .style('display', 'none')
30076               .attr('class', 'tail tooltip-inner');
30077
30078           container.append('div')
30079               .text(_text);
30080
30081           selection$$1
30082               .on('mousemove.tail', mousemove)
30083               .on('mouseenter.tail', mouseenter)
30084               .on('mouseleave.tail', mouseleave);
30085
30086           container
30087               .on('mousemove.tail', mousemove);
30088
30089           tooltipSize = utilGetDimensions(container);
30090           selectionSize = utilGetDimensions(selection$$1);
30091
30092
30093           function show() {
30094               container.style('display', 'block');
30095               tooltipSize = utilGetDimensions(container);
30096           }
30097
30098
30099           function mousemove() {
30100               if (container.style('display') === 'none') show();
30101               var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
30102                   -tooltipSize[0] - xmargin : xmargin;
30103               container.classed('left', xoffset > 0);
30104               utilSetTransform(container, event.clientX + xoffset, event.clientY);
30105           }
30106
30107
30108           function mouseleave() {
30109               if (event.relatedTarget !== container.node()) {
30110                   container.style('display', 'none');
30111               }
30112           }
30113
30114
30115           function mouseenter() {
30116               if (event.relatedTarget !== container.node()) {
30117                   show();
30118               }
30119           }
30120       }
30121
30122
30123       behavior.off = function(selection$$1) {
30124           if (!_text) return;
30125
30126           container
30127               .on('mousemove.tail', null)
30128               .remove();
30129
30130           selection$$1
30131               .on('mousemove.tail', null)
30132               .on('mouseenter.tail', null)
30133               .on('mouseleave.tail', null);
30134
30135           select(window)
30136               .on('resize.tail', null);
30137       };
30138
30139
30140       behavior.text = function(val) {
30141           if (!arguments.length) return _text;
30142           _text = val;
30143           return behavior;
30144       };
30145
30146
30147       return behavior;
30148   }
30149
30150   var _usedTails = {};
30151   var _disableSpace = false;
30152   var _lastSpace = null;
30153
30154
30155   function behaviorDraw(context) {
30156       var dispatch$$1 = dispatch(
30157           'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
30158       );
30159
30160       var keybinding = utilKeybinding('draw');
30161
30162       var hover = behaviorHover(context).altDisables(true)
30163           .on('hover', context.ui().sidebar.hover);
30164       var tail = behaviorTail();
30165       var edit = behaviorEdit(context);
30166
30167       var closeTolerance = 4;
30168       var tolerance = 12;
30169       var _mouseLeave = false;
30170       var _lastMouse = null;
30171
30172
30173       // related code
30174       // - `mode/drag_node.js` `datum()`
30175       function datum() {
30176           var mode = context.mode();
30177           var isNote = mode && (mode.id.indexOf('note') !== -1);
30178           if (event.altKey || isNote) return {};
30179
30180           var element;
30181           if (event.type === 'keydown') {
30182               element = _lastMouse && _lastMouse.target;
30183           } else {
30184               element = event.target;
30185           }
30186
30187           // When drawing, snap only to touch targets..
30188           // (this excludes area fills and active drawing elements)
30189           var d = element.__data__;
30190           return (d && d.properties && d.properties.target) ? d : {};
30191       }
30192
30193
30194       function mousedown() {
30195
30196           function point$$1() {
30197               var p = context.container().node();
30198               return touchId !== null ? d3_touches(p).filter(function(p) {
30199                   return p.identifier === touchId;
30200               })[0] : mouse(p);
30201           }
30202
30203           var element = select(this);
30204           var touchId = event.touches ? event.changedTouches[0].identifier : null;
30205           var t1 = +new Date();
30206           var p1 = point$$1();
30207
30208           element.on('mousemove.draw', null);
30209
30210           select(window).on('mouseup.draw', function() {
30211               var t2 = +new Date();
30212               var p2 = point$$1();
30213               var dist = geoVecLength(p1, p2);
30214
30215               element.on('mousemove.draw', mousemove);
30216               select(window).on('mouseup.draw', null);
30217
30218               if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
30219                   // Prevent a quick second click
30220                   select(window).on('click.draw-block', function() {
30221                       event.stopPropagation();
30222                   }, true);
30223
30224                   context.map().dblclickEnable(false);
30225
30226                   window.setTimeout(function() {
30227                       context.map().dblclickEnable(true);
30228                       select(window).on('click.draw-block', null);
30229                   }, 500);
30230
30231                   click();
30232               }
30233           }, true);
30234       }
30235
30236
30237       function mousemove() {
30238           _lastMouse = event;
30239           dispatch$$1.call('move', this, datum());
30240       }
30241
30242
30243       function mouseenter() {
30244           _mouseLeave = false;
30245       }
30246
30247
30248       function mouseleave() {
30249           _mouseLeave = true;
30250       }
30251
30252
30253       // related code
30254       // - `mode/drag_node.js`     `doMode()`
30255       // - `behavior/draw.js`      `click()`
30256       // - `behavior/draw_way.js`  `move()`
30257       function click() {
30258           var d = datum();
30259           var target = d && d.properties && d.properties.entity;
30260
30261           if (target && target.type === 'node') {   // Snap to a node
30262               dispatch$$1.call('clickNode', this, target, d);
30263               return;
30264
30265           } else if (target && target.type === 'way') {   // Snap to a way
30266               var choice = geoChooseEdge(
30267                   context.childNodes(target), context.mouse(), context.projection, context.activeID()
30268               );
30269               if (choice) {
30270                   var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
30271                   dispatch$$1.call('clickWay', this, choice.loc, edge, d);
30272                   return;
30273               }
30274           }
30275           dispatch$$1.call('click', this, context.map().mouseCoordinates(), d);
30276       }
30277
30278
30279       function space() {
30280           event.preventDefault();
30281           event.stopPropagation();
30282
30283           var currSpace = context.mouse();
30284           if (_disableSpace && _lastSpace) {
30285               var dist = geoVecLength(_lastSpace, currSpace);
30286               if (dist > tolerance) {
30287                   _disableSpace = false;
30288               }
30289           }
30290
30291           if (_disableSpace || _mouseLeave || !_lastMouse) return;
30292
30293           // user must move mouse or release space bar to allow another click
30294           _lastSpace = currSpace;
30295           _disableSpace = true;
30296
30297           select(window).on('keyup.space-block', function() {
30298               event.preventDefault();
30299               event.stopPropagation();
30300               _disableSpace = false;
30301               select(window).on('keyup.space-block', null);
30302           });
30303
30304           click();
30305       }
30306
30307
30308       function backspace() {
30309           event.preventDefault();
30310           dispatch$$1.call('undo');
30311       }
30312
30313
30314       function del() {
30315           event.preventDefault();
30316           dispatch$$1.call('cancel');
30317       }
30318
30319
30320       function ret() {
30321           event.preventDefault();
30322           dispatch$$1.call('finish');
30323       }
30324
30325
30326       function behavior(selection$$1) {
30327           context.install(hover);
30328           context.install(edit);
30329
30330           if (!context.inIntro() && !_usedTails[tail.text()]) {
30331               context.install(tail);
30332           }
30333
30334           keybinding
30335               .on('⌫', backspace)
30336               .on('⌦', del)
30337               .on('⎋', ret)
30338               .on('↩', ret)
30339               .on('space', space)
30340               .on('⌥space', space);
30341
30342           selection$$1
30343               .on('mouseenter.draw', mouseenter)
30344               .on('mouseleave.draw', mouseleave)
30345               .on('mousedown.draw', mousedown)
30346               .on('mousemove.draw', mousemove);
30347
30348           select(document)
30349               .call(keybinding);
30350
30351           return behavior;
30352       }
30353
30354
30355       behavior.off = function(selection$$1) {
30356           context.ui().sidebar.hover.cancel();
30357           context.uninstall(hover);
30358           context.uninstall(edit);
30359
30360           if (!context.inIntro() && !_usedTails[tail.text()]) {
30361               context.uninstall(tail);
30362               _usedTails[tail.text()] = true;
30363           }
30364
30365           selection$$1
30366               .on('mouseenter.draw', null)
30367               .on('mouseleave.draw', null)
30368               .on('mousedown.draw', null)
30369               .on('mousemove.draw', null);
30370
30371           select(window)
30372               .on('mouseup.draw', null);
30373               // note: keyup.space-block, click.draw-block should remain
30374
30375           select(document)
30376               .call(keybinding.unbind);
30377       };
30378
30379
30380       behavior.tail = function(_) {
30381           tail.text(_);
30382           return behavior;
30383       };
30384
30385
30386       return utilRebind(behavior, dispatch$$1, 'on');
30387   }
30388
30389   function modeAddArea$$1(context) {
30390       var mode = {
30391           id: 'add-area',
30392           button: 'area',
30393           title: t('modes.add_area.title'),
30394           description: t('modes.add_area.description'),
30395           key: '3'
30396       };
30397
30398       var behavior = behaviorAddWay(context)
30399           .tail(t('modes.add_area.tail'))
30400           .on('start', start)
30401           .on('startFromWay', startFromWay)
30402           .on('startFromNode', startFromNode);
30403
30404       var defaultTags = { area: 'yes' };
30405
30406
30407       function actionClose(wayId) {
30408           return function (graph) {
30409               return graph.replace(graph.entity(wayId).close());
30410           };
30411       }
30412
30413
30414       function start(loc) {
30415           var startGraph = context.graph();
30416           var node = osmNode({ loc: loc });
30417           var way = osmWay({ tags: defaultTags });
30418
30419           context.perform(
30420               actionAddEntity(node),
30421               actionAddEntity(way),
30422               actionAddVertex(way.id, node.id),
30423               actionClose(way.id)
30424           );
30425
30426           context.enter(modeDrawArea(context, way.id, startGraph));
30427       }
30428
30429
30430       function startFromWay(loc, edge) {
30431           var startGraph = context.graph();
30432           var node = osmNode({ loc: loc });
30433           var way = osmWay({ tags: defaultTags });
30434
30435           context.perform(
30436               actionAddEntity(node),
30437               actionAddEntity(way),
30438               actionAddVertex(way.id, node.id),
30439               actionClose(way.id),
30440               actionAddMidpoint({ loc: loc, edge: edge }, node)
30441           );
30442
30443           context.enter(modeDrawArea(context, way.id, startGraph));
30444       }
30445
30446
30447       function startFromNode(node) {
30448           var startGraph = context.graph();
30449           var way = osmWay({ tags: defaultTags });
30450
30451           context.perform(
30452               actionAddEntity(way),
30453               actionAddVertex(way.id, node.id),
30454               actionClose(way.id)
30455           );
30456
30457           context.enter(modeDrawArea(context, way.id, startGraph));
30458       }
30459
30460
30461       mode.enter = function() {
30462           context.install(behavior);
30463       };
30464
30465
30466       mode.exit = function() {
30467           context.uninstall(behavior);
30468       };
30469
30470
30471       return mode;
30472   }
30473
30474   function modeAddLine$$1(context) {
30475       var mode = {
30476           id: 'add-line',
30477           button: 'line',
30478           title: t('modes.add_line.title'),
30479           description: t('modes.add_line.description'),
30480           key: '2'
30481       };
30482
30483       var behavior = behaviorAddWay(context)
30484           .tail(t('modes.add_line.tail'))
30485           .on('start', start)
30486           .on('startFromWay', startFromWay)
30487           .on('startFromNode', startFromNode);
30488
30489
30490       function start(loc) {
30491           var startGraph = context.graph();
30492           var node = osmNode({ loc: loc });
30493           var way = osmWay();
30494
30495           context.perform(
30496               actionAddEntity(node),
30497               actionAddEntity(way),
30498               actionAddVertex(way.id, node.id)
30499           );
30500
30501           context.enter(modeDrawLine(context, way.id, startGraph));
30502       }
30503
30504
30505       function startFromWay(loc, edge) {
30506           var startGraph = context.graph();
30507           var node = osmNode({ loc: loc });
30508           var way = osmWay();
30509
30510           context.perform(
30511               actionAddEntity(node),
30512               actionAddEntity(way),
30513               actionAddVertex(way.id, node.id),
30514               actionAddMidpoint({ loc: loc, edge: edge }, node)
30515           );
30516
30517           context.enter(modeDrawLine(context, way.id, startGraph));
30518       }
30519
30520
30521       function startFromNode(node) {
30522           var startGraph = context.graph();
30523           var way = osmWay();
30524
30525           context.perform(
30526               actionAddEntity(way),
30527               actionAddVertex(way.id, node.id)
30528           );
30529
30530           context.enter(modeDrawLine(context, way.id, startGraph));
30531       }
30532
30533
30534       mode.enter = function() {
30535           context.install(behavior);
30536       };
30537
30538
30539       mode.exit = function() {
30540           context.uninstall(behavior);
30541       };
30542
30543       return mode;
30544   }
30545
30546   function modeAddPoint$$1(context) {
30547       var mode = {
30548           id: 'add-point',
30549           button: 'point',
30550           title: t('modes.add_point.title'),
30551           description: t('modes.add_point.description'),
30552           key: '1'
30553       };
30554
30555       var behavior = behaviorDraw(context)
30556           .tail(t('modes.add_point.tail'))
30557           .on('click', add)
30558           .on('clickWay', addWay)
30559           .on('clickNode', addNode)
30560           .on('cancel', cancel)
30561           .on('finish', cancel);
30562
30563
30564       function add(loc) {
30565           var node = osmNode({ loc: loc });
30566
30567           context.perform(
30568               actionAddEntity(node),
30569               t('operations.add.annotation.point')
30570           );
30571
30572           context.enter(
30573               modeSelect(context, [node.id]).newFeature(true)
30574           );
30575       }
30576
30577
30578       function addWay(loc, edge) {
30579           var node =  osmNode();
30580
30581           context.perform(
30582               actionAddMidpoint({loc: loc, edge: edge}, node),
30583               t('operations.add.annotation.vertex')
30584           );
30585
30586           context.enter(
30587               modeSelect(context, [node.id]).newFeature(true)
30588           );
30589       }
30590
30591
30592       function addNode(node) {
30593           add(node.loc);
30594       }
30595
30596
30597       function cancel() {
30598           context.enter(modeBrowse(context));
30599       }
30600
30601
30602       mode.enter = function() {
30603           context.install(behavior);
30604       };
30605
30606
30607       mode.exit = function() {
30608           context.uninstall(behavior);
30609       };
30610
30611
30612       return mode;
30613   }
30614
30615   function svgAreas$$1(projection, context) {
30616       // Patterns only work in Firefox when set directly on element.
30617       // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
30618       var patterns = {
30619           // tag - value - pattern name
30620           // -or-
30621           // tag - value - rules (optional tag-values, pattern name)
30622           // (matches earlier rules first, so fallback should be last entry)
30623           amenity: {
30624               grave_yard: 'cemetery'
30625           },
30626           landuse: {
30627               cemetery: [
30628                   { religion: 'christian', pattern: 'cemetery_christian' },
30629                   { religion: 'buddhist', pattern: 'cemetery_buddhist' },
30630                   { religion: 'muslim', pattern: 'cemetery_muslim' },
30631                   { religion: 'jewish', pattern: 'cemetery_jewish' },
30632                   { pattern: 'cemetery' }
30633               ],
30634               construction: 'construction',
30635               farmland: 'farmland',
30636               farmyard: 'farmyard',
30637               forest: [
30638                   { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
30639                   { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
30640                   { leaf_type: 'leafless', pattern: 'forest_leafless' },
30641                   { pattern: 'forest' } // same as 'leaf_type:mixed'
30642               ],
30643               grave_yard: 'cemetery',
30644               grass: 'grass',
30645               landfill: 'landfill',
30646               meadow: 'meadow',
30647               military: 'construction',
30648               orchard: 'orchard',
30649               quarry: 'quarry',
30650               vineyard: 'vineyard'
30651           },
30652           natural: {
30653               beach: 'beach',
30654               grassland: 'grass',
30655               sand: 'beach',
30656               scrub: 'scrub',
30657               water: [
30658                   { water: 'pond', pattern: 'pond' },
30659                   { pattern: 'waves' }
30660               ],
30661               wetland: [
30662                   { wetland: 'marsh', pattern: 'wetland_marsh' },
30663                   { wetland: 'swamp', pattern: 'wetland_swamp' },
30664                   { wetland: 'bog', pattern: 'wetland_bog' },
30665                   { wetland: 'reedbed', pattern: 'wetland_reedbed' },
30666                   { pattern: 'wetland' }
30667               ],
30668               wood: [
30669                   { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
30670                   { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
30671                   { leaf_type: 'leafless', pattern: 'forest_leafless' },
30672                   { pattern: 'forest' } // same as 'leaf_type:mixed'
30673               ]
30674           }
30675       };
30676
30677       function setPattern(entity) {
30678           // Skip pattern filling if this is a building (buildings don't get patterns applied)
30679           if (entity.tags.building && entity.tags.building !== 'no') {
30680               this.style.fill = this.style.stroke = '';
30681               return;
30682           }
30683
30684           for (var tag in patterns) {
30685               if (patterns.hasOwnProperty(tag)) {
30686                   var entityValue = entity.tags[tag];
30687                   if (entityValue) {
30688
30689                       var values = patterns[tag];
30690                       for (var value in values) {
30691                           if (entityValue === value) {
30692
30693                               var rules = values[value];
30694                               if (typeof rules === 'string') { // short syntax - pattern name
30695                                   this.style.fill = this.style.stroke = 'url("#pattern-' + rules + '")';
30696                                   return;
30697                               } else { // long syntax - rule array
30698                                   for (var ruleKey in rules) {
30699                                       var rule = rules[ruleKey];
30700
30701                                       var pass = true;
30702                                       for (var criterion in rule) {
30703                                           if (criterion !== 'pattern') { // reserved for pattern name
30704                                               // The only rule is a required tag-value pair
30705                                               var v = entity.tags[criterion];
30706                                               if (!v || v !== rule[criterion]) {
30707                                                   pass = false;
30708                                                   break;
30709                                               }
30710                                           }
30711                                       }
30712
30713                                       if (pass) {
30714                                           this.style.fill = this.style.stroke = 'url("#pattern-' + rule.pattern + '")';
30715                                           return;
30716                                       }
30717                                   }
30718                               }
30719                           }
30720                       }
30721                   }
30722               }
30723           }
30724
30725           this.style.fill = this.style.stroke = '';
30726       }
30727
30728
30729       function drawTargets(selection, graph, entities, filter) {
30730           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
30731           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
30732           var getPath = svgPath(projection).geojson;
30733           var activeID = context.activeID();
30734
30735           // The targets and nopes will be MultiLineString sub-segments of the ways
30736           var data = { targets: [], nopes: [] };
30737
30738           entities.forEach(function(way) {
30739               var features = svgSegmentWay(way, graph, activeID);
30740               data.targets.push.apply(data.targets, features.passive);
30741               data.nopes.push.apply(data.nopes, features.active);
30742           });
30743
30744
30745           // Targets allow hover and vertex snapping
30746           var targetData = data.targets.filter(getPath);
30747           var targets = selection.selectAll('.area.target-allowed')
30748               .filter(function(d) { return filter(d.properties.entity); })
30749               .data(targetData, function key(d) { return d.id; });
30750
30751           // exit
30752           targets.exit()
30753               .remove();
30754
30755           // enter/update
30756           targets.enter()
30757               .append('path')
30758               .merge(targets)
30759               .attr('d', getPath)
30760               .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
30761
30762
30763           // NOPE
30764           var nopeData = data.nopes.filter(getPath);
30765           var nopes = selection.selectAll('.area.target-nope')
30766               .filter(function(d) { return filter(d.properties.entity); })
30767               .data(nopeData, function key(d) { return d.id; });
30768
30769           // exit
30770           nopes.exit()
30771               .remove();
30772
30773           // enter/update
30774           nopes.enter()
30775               .append('path')
30776               .merge(nopes)
30777               .attr('d', getPath)
30778               .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
30779       }
30780
30781
30782       function drawAreas(selection, graph, entities, filter) {
30783           var path = svgPath(projection, graph, true),
30784               areas = {},
30785               multipolygon;
30786
30787           for (var i = 0; i < entities.length; i++) {
30788               var entity = entities[i];
30789               if (entity.geometry(graph) !== 'area') continue;
30790
30791               multipolygon = osmIsSimpleMultipolygonOuterMember(entity, graph);
30792               if (multipolygon) {
30793                   areas[multipolygon.id] = {
30794                       entity: multipolygon.mergeTags(entity.tags),
30795                       area: Math.abs(entity.area(graph))
30796                   };
30797               } else if (!areas[entity.id]) {
30798                   areas[entity.id] = {
30799                       entity: entity,
30800                       area: Math.abs(entity.area(graph))
30801                   };
30802               }
30803           }
30804
30805           areas = values$1(areas).filter(function hasPath(a) { return path(a.entity); });
30806           areas.sort(function areaSort(a, b) { return b.area - a.area; });
30807           areas = map$3(areas, 'entity');
30808
30809           var strokes = areas.filter(function(area) {
30810               return area.type === 'way';
30811           });
30812
30813           var data = {
30814               clip: areas,
30815               shadow: strokes,
30816               stroke: strokes,
30817               fill: areas
30818           };
30819
30820           var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath-osm')
30821              .filter(filter)
30822              .data(data.clip, osmEntity$$1.key);
30823
30824           clipPaths.exit()
30825              .remove();
30826
30827           var clipPathsEnter = clipPaths.enter()
30828              .append('clipPath')
30829              .attr('class', 'clipPath-osm')
30830              .attr('id', function(entity) { return entity.id + '-clippath'; });
30831
30832           clipPathsEnter
30833              .append('path');
30834
30835           clipPaths.merge(clipPathsEnter)
30836              .selectAll('path')
30837              .attr('d', path);
30838
30839
30840           var drawLayer = selection.selectAll('.layer-osm.areas');
30841           var touchLayer = selection.selectAll('.layer-touch.areas');
30842
30843           // Draw areas..
30844           var areagroup = drawLayer
30845               .selectAll('g.areagroup')
30846               .data(['fill', 'shadow', 'stroke']);
30847
30848           areagroup = areagroup.enter()
30849               .append('g')
30850               .attr('class', function(d) { return 'areagroup area-' + d; })
30851               .merge(areagroup);
30852
30853           var paths = areagroup
30854               .selectAll('path')
30855               .filter(filter)
30856               .data(function(layer) { return data[layer]; }, osmEntity$$1.key);
30857
30858           paths.exit()
30859               .remove();
30860
30861           var fills = selection.selectAll('.area-fill path.area').nodes();
30862
30863           var bisect = bisector(function(node) {
30864               return -node.__data__.area(graph);
30865           }).left;
30866
30867           function sortedByArea(entity) {
30868               if (this._parent.__data__ === 'fill') {
30869                   return fills[bisect(fills, -entity.area(graph))];
30870               }
30871           }
30872
30873           paths = paths.enter()
30874               .insert('path', sortedByArea)
30875               .merge(paths)
30876               .each(function(entity) {
30877                   var layer = this.parentNode.__data__;
30878                   this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
30879
30880                   if (layer === 'fill') {
30881                       this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
30882                       setPattern.call(this, entity);
30883                   }
30884               })
30885               .call(svgTagClasses())
30886               .attr('d', path);
30887
30888
30889           // Draw touch targets..
30890           touchLayer
30891               .call(drawTargets, graph, data.stroke, filter);
30892       }
30893
30894       return drawAreas;
30895   }
30896
30897   /**
30898    * A specialized version of `_.reduce` for arrays without support for
30899    * iteratee shorthands.
30900    *
30901    * @private
30902    * @param {Array} [array] The array to iterate over.
30903    * @param {Function} iteratee The function invoked per iteration.
30904    * @param {*} [accumulator] The initial value.
30905    * @param {boolean} [initAccum] Specify using the first element of `array` as
30906    *  the initial value.
30907    * @returns {*} Returns the accumulated value.
30908    */
30909   function arrayReduce(array, iteratee, accumulator, initAccum) {
30910     var index = -1,
30911         length = array == null ? 0 : array.length;
30912
30913     if (initAccum && length) {
30914       accumulator = array[++index];
30915     }
30916     while (++index < length) {
30917       accumulator = iteratee(accumulator, array[index], index, array);
30918     }
30919     return accumulator;
30920   }
30921
30922   /**
30923    * The base implementation of `_.reduce` and `_.reduceRight`, without support
30924    * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
30925    *
30926    * @private
30927    * @param {Array|Object} collection The collection to iterate over.
30928    * @param {Function} iteratee The function invoked per iteration.
30929    * @param {*} accumulator The initial value.
30930    * @param {boolean} initAccum Specify using the first or last element of
30931    *  `collection` as the initial value.
30932    * @param {Function} eachFunc The function to iterate over `collection`.
30933    * @returns {*} Returns the accumulated value.
30934    */
30935   function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
30936     eachFunc(collection, function(value, index, collection) {
30937       accumulator = initAccum
30938         ? (initAccum = false, value)
30939         : iteratee(accumulator, value, index, collection);
30940     });
30941     return accumulator;
30942   }
30943
30944   /**
30945    * Reduces `collection` to a value which is the accumulated result of running
30946    * each element in `collection` thru `iteratee`, where each successive
30947    * invocation is supplied the return value of the previous. If `accumulator`
30948    * is not given, the first element of `collection` is used as the initial
30949    * value. The iteratee is invoked with four arguments:
30950    * (accumulator, value, index|key, collection).
30951    *
30952    * Many lodash methods are guarded to work as iteratees for methods like
30953    * `_.reduce`, `_.reduceRight`, and `_.transform`.
30954    *
30955    * The guarded methods are:
30956    * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
30957    * and `sortBy`
30958    *
30959    * @static
30960    * @memberOf _
30961    * @since 0.1.0
30962    * @category Collection
30963    * @param {Array|Object} collection The collection to iterate over.
30964    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
30965    * @param {*} [accumulator] The initial value.
30966    * @returns {*} Returns the accumulated value.
30967    * @see _.reduceRight
30968    * @example
30969    *
30970    * _.reduce([1, 2], function(sum, n) {
30971    *   return sum + n;
30972    * }, 0);
30973    * // => 3
30974    *
30975    * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
30976    *   (result[value] || (result[value] = [])).push(key);
30977    *   return result;
30978    * }, {});
30979    * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
30980    */
30981   function reduce(collection, iteratee, accumulator) {
30982     var func = isArray(collection) ? arrayReduce : baseReduce,
30983         initAccum = arguments.length < 3;
30984
30985     return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
30986   }
30987
30988   /** Error message constants. */
30989   var FUNC_ERROR_TEXT$3 = 'Expected a function';
30990
30991   /**
30992    * Creates a throttled function that only invokes `func` at most once per
30993    * every `wait` milliseconds. The throttled function comes with a `cancel`
30994    * method to cancel delayed `func` invocations and a `flush` method to
30995    * immediately invoke them. Provide `options` to indicate whether `func`
30996    * should be invoked on the leading and/or trailing edge of the `wait`
30997    * timeout. The `func` is invoked with the last arguments provided to the
30998    * throttled function. Subsequent calls to the throttled function return the
30999    * result of the last `func` invocation.
31000    *
31001    * **Note:** If `leading` and `trailing` options are `true`, `func` is
31002    * invoked on the trailing edge of the timeout only if the throttled function
31003    * is invoked more than once during the `wait` timeout.
31004    *
31005    * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
31006    * until to the next tick, similar to `setTimeout` with a timeout of `0`.
31007    *
31008    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
31009    * for details over the differences between `_.throttle` and `_.debounce`.
31010    *
31011    * @static
31012    * @memberOf _
31013    * @since 0.1.0
31014    * @category Function
31015    * @param {Function} func The function to throttle.
31016    * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
31017    * @param {Object} [options={}] The options object.
31018    * @param {boolean} [options.leading=true]
31019    *  Specify invoking on the leading edge of the timeout.
31020    * @param {boolean} [options.trailing=true]
31021    *  Specify invoking on the trailing edge of the timeout.
31022    * @returns {Function} Returns the new throttled function.
31023    * @example
31024    *
31025    * // Avoid excessively updating the position while scrolling.
31026    * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
31027    *
31028    * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
31029    * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
31030    * jQuery(element).on('click', throttled);
31031    *
31032    * // Cancel the trailing throttled invocation.
31033    * jQuery(window).on('popstate', throttled.cancel);
31034    */
31035   function throttle(func, wait, options) {
31036     var leading = true,
31037         trailing = true;
31038
31039     if (typeof func != 'function') {
31040       throw new TypeError(FUNC_ERROR_TEXT$3);
31041     }
31042     if (isObject(options)) {
31043       leading = 'leading' in options ? !!options.leading : leading;
31044       trailing = 'trailing' in options ? !!options.trailing : trailing;
31045     }
31046     return debounce(func, wait, {
31047       'leading': leading,
31048       'maxWait': wait,
31049       'trailing': trailing
31050     });
31051   }
31052
31053   var fastJsonStableStringify = function (data, opts) {
31054       if (!opts) opts = {};
31055       if (typeof opts === 'function') opts = { cmp: opts };
31056       var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;
31057
31058       var cmp = opts.cmp && (function (f) {
31059           return function (node) {
31060               return function (a, b) {
31061                   var aobj = { key: a, value: node[a] };
31062                   var bobj = { key: b, value: node[b] };
31063                   return f(aobj, bobj);
31064               };
31065           };
31066       })(opts.cmp);
31067
31068       var seen = [];
31069       return (function stringify (node) {
31070           if (node && node.toJSON && typeof node.toJSON === 'function') {
31071               node = node.toJSON();
31072           }
31073
31074           if (node === undefined) return;
31075           if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
31076           if (typeof node !== 'object') return JSON.stringify(node);
31077
31078           var i, out;
31079           if (Array.isArray(node)) {
31080               out = '[';
31081               for (i = 0; i < node.length; i++) {
31082                   if (i) out += ',';
31083                   out += stringify(node[i]) || 'null';
31084               }
31085               return out + ']';
31086           }
31087
31088           if (node === null) return 'null';
31089
31090           if (seen.indexOf(node) !== -1) {
31091               if (cycles) return JSON.stringify('__cycle__');
31092               throw new TypeError('Converting circular structure to JSON');
31093           }
31094
31095           var seenIndex = seen.push(node) - 1;
31096           var keys = Object.keys(node).sort(cmp && cmp(node));
31097           out = '';
31098           for (i = 0; i < keys.length; i++) {
31099               var key = keys[i];
31100               var value = stringify(node[key]);
31101
31102               if (!value) continue;
31103               if (out) out += ',';
31104               out += JSON.stringify(key) + ':' + value;
31105           }
31106           seen.splice(seenIndex, 1);
31107           return '{' + out + '}';
31108       })(data);
31109   };
31110
31111   var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
31112
31113   function unwrapExports (x) {
31114         return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
31115   }
31116
31117   function createCommonjsModule(fn, module) {
31118         return module = { exports: {} }, fn(module, module.exports), module.exports;
31119   }
31120
31121   //[4]         NameStartChar      ::=          ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
31122   //[4a]        NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
31123   //[5]         Name       ::=          NameStartChar (NameChar)*
31124   var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/;//\u10000-\uEFFFF
31125   var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
31126   var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
31127   //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
31128   //var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')
31129
31130   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
31131   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
31132   var S_TAG = 0;//tag name offerring
31133   var S_ATTR = 1;//attr name offerring 
31134   var S_ATTR_SPACE=2;//attr name end and space offer
31135   var S_EQ = 3;//=space?
31136   var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
31137   var S_ATTR_END = 5;//attr value end and no space(quot end)
31138   var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
31139   var S_TAG_CLOSE = 7;//closed el<el />
31140
31141   function XMLReader(){
31142         
31143   }
31144
31145   XMLReader.prototype = {
31146         parse:function(source,defaultNSMap,entityMap){
31147                 var domBuilder = this.domBuilder;
31148                 domBuilder.startDocument();
31149                 _copy(defaultNSMap ,defaultNSMap = {});
31150                 parse(source,defaultNSMap,entityMap,
31151                                 domBuilder,this.errorHandler);
31152                 domBuilder.endDocument();
31153         }
31154   };
31155   function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
31156         function fixedFromCharCode(code) {
31157                 // String.prototype.fromCharCode does not supports
31158                 // > 2 bytes unicode chars directly
31159                 if (code > 0xffff) {
31160                         code -= 0x10000;
31161                         var surrogate1 = 0xd800 + (code >> 10)
31162                                 , surrogate2 = 0xdc00 + (code & 0x3ff);
31163
31164                         return String.fromCharCode(surrogate1, surrogate2);
31165                 } else {
31166                         return String.fromCharCode(code);
31167                 }
31168         }
31169         function entityReplacer(a){
31170                 var k = a.slice(1,-1);
31171                 if(k in entityMap){
31172                         return entityMap[k]; 
31173                 }else if(k.charAt(0) === '#'){
31174                         return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
31175                 }else{
31176                         errorHandler.error('entity not found:'+a);
31177                         return a;
31178                 }
31179         }
31180         function appendText(end){//has some bugs
31181                 if(end>start){
31182                         var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
31183                         locator&&position(start);
31184                         domBuilder.characters(xt,0,end-start);
31185                         start = end;
31186                 }
31187         }
31188         function position(p,m){
31189                 while(p>=lineEnd && (m = linePattern.exec(source))){
31190                         lineStart = m.index;
31191                         lineEnd = lineStart + m[0].length;
31192                         locator.lineNumber++;
31193                         //console.log('line++:',locator,startPos,endPos)
31194                 }
31195                 locator.columnNumber = p-lineStart+1;
31196         }
31197         var lineStart = 0;
31198         var lineEnd = 0;
31199         var linePattern = /.*(?:\r\n?|\n)|.*$/g;
31200         var locator = domBuilder.locator;
31201         
31202         var parseStack = [{currentNSMap:defaultNSMapCopy}];
31203         var closeMap = {};
31204         var start = 0;
31205         while(true){
31206                 try{
31207                         var tagStart = source.indexOf('<',start);
31208                         if(tagStart<0){
31209                                 if(!source.substr(start).match(/^\s*$/)){
31210                                         var doc = domBuilder.doc;
31211                                 var text = doc.createTextNode(source.substr(start));
31212                                 doc.appendChild(text);
31213                                 domBuilder.currentElement = text;
31214                                 }
31215                                 return;
31216                         }
31217                         if(tagStart>start){
31218                                 appendText(tagStart);
31219                         }
31220                         switch(source.charAt(tagStart+1)){
31221                         case '/':
31222                                 var end = source.indexOf('>',tagStart+3);
31223                                 var tagName = source.substring(tagStart+2,end);
31224                                 var config = parseStack.pop();
31225                                 if(end<0){
31226                                         
31227                                 tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
31228                                 //console.error('#@@@@@@'+tagName)
31229                                 errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
31230                                 end = tagStart+1+tagName.length;
31231                         }else if(tagName.match(/\s</)){
31232                                 tagName = tagName.replace(/[\s<].*/,'');
31233                                 errorHandler.error("end tag name: "+tagName+' maybe not complete');
31234                                 end = tagStart+1+tagName.length;
31235                                 }
31236                                 //console.error(parseStack.length,parseStack)
31237                                 //console.error(config);
31238                                 var localNSMap = config.localNSMap;
31239                                 var endMatch = config.tagName == tagName;
31240                                 var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
31241                         if(endIgnoreCaseMach){
31242                                 domBuilder.endElement(config.uri,config.localName,tagName);
31243                                         if(localNSMap){
31244                                                 for(var prefix in localNSMap){
31245                                                         domBuilder.endPrefixMapping(prefix) ;
31246                                                 }
31247                                         }
31248                                         if(!endMatch){
31249                                 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
31250                                         }
31251                         }else{
31252                                 parseStack.push(config);
31253                         }
31254                                 
31255                                 end++;
31256                                 break;
31257                                 // end elment
31258                         case '?':// <?...?>
31259                                 locator&&position(tagStart);
31260                                 end = parseInstruction(source,tagStart,domBuilder);
31261                                 break;
31262                         case '!':// <!doctype,<![CDATA,<!--
31263                                 locator&&position(tagStart);
31264                                 end = parseDCC(source,tagStart,domBuilder,errorHandler);
31265                                 break;
31266                         default:
31267                                 locator&&position(tagStart);
31268                                 var el = new ElementAttributes();
31269                                 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
31270                                 //elStartEnd
31271                                 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
31272                                 var len = el.length;
31273                                 
31274                                 
31275                                 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
31276                                         el.closed = true;
31277                                         if(!entityMap.nbsp){
31278                                                 errorHandler.warning('unclosed xml attribute');
31279                                         }
31280                                 }
31281                                 if(locator && len){
31282                                         var locator2 = copyLocator(locator,{});
31283                                         //try{//attribute position fixed
31284                                         for(var i = 0;i<len;i++){
31285                                                 var a = el[i];
31286                                                 position(a.offset);
31287                                                 a.locator = copyLocator(locator,{});
31288                                         }
31289                                         //}catch(e){console.error('@@@@@'+e)}
31290                                         domBuilder.locator = locator2;
31291                                         if(appendElement(el,domBuilder,currentNSMap)){
31292                                                 parseStack.push(el);
31293                                         }
31294                                         domBuilder.locator = locator;
31295                                 }else{
31296                                         if(appendElement(el,domBuilder,currentNSMap)){
31297                                                 parseStack.push(el);
31298                                         }
31299                                 }
31300                                 
31301                                 
31302                                 
31303                                 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
31304                                         end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
31305                                 }else{
31306                                         end++;
31307                                 }
31308                         }
31309                 }catch(e){
31310                         errorHandler.error('element parse error: '+e);
31311                         //errorHandler.error('element parse error: '+e);
31312                         end = -1;
31313                         //throw e;
31314                 }
31315                 if(end>start){
31316                         start = end;
31317                 }else{
31318                         //TODO: 这里有可能sax回退,有位置错误风险
31319                         appendText(Math.max(tagStart,start)+1);
31320                 }
31321         }
31322   }
31323   function copyLocator(f,t){
31324         t.lineNumber = f.lineNumber;
31325         t.columnNumber = f.columnNumber;
31326         return t;
31327   }
31328
31329   /**
31330    * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
31331    * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
31332    */
31333   function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
31334         var attrName;
31335         var value;
31336         var p = ++start;
31337         var s = S_TAG;//status
31338         while(true){
31339                 var c = source.charAt(p);
31340                 switch(c){
31341                 case '=':
31342                         if(s === S_ATTR){//attrName
31343                                 attrName = source.slice(start,p);
31344                                 s = S_EQ;
31345                         }else if(s === S_ATTR_SPACE){
31346                                 s = S_EQ;
31347                         }else{
31348                                 //fatalError: equal must after attrName or space after attrName
31349                                 throw new Error('attribute equal must after attrName');
31350                         }
31351                         break;
31352                 case '\'':
31353                 case '"':
31354                         if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
31355                                 ){//equal
31356                                 if(s === S_ATTR){
31357                                         errorHandler.warning('attribute value must after "="');
31358                                         attrName = source.slice(start,p);
31359                                 }
31360                                 start = p+1;
31361                                 p = source.indexOf(c,start);
31362                                 if(p>0){
31363                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
31364                                         el.add(attrName,value,start-1);
31365                                         s = S_ATTR_END;
31366                                 }else{
31367                                         //fatalError: no end quot match
31368                                         throw new Error('attribute value no end \''+c+'\' match');
31369                                 }
31370                         }else if(s == S_ATTR_NOQUOT_VALUE){
31371                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
31372                                 //console.log(attrName,value,start,p)
31373                                 el.add(attrName,value,start);
31374                                 //console.dir(el)
31375                                 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
31376                                 start = p+1;
31377                                 s = S_ATTR_END;
31378                         }else{
31379                                 //fatalError: no equal before
31380                                 throw new Error('attribute value must after "="');
31381                         }
31382                         break;
31383                 case '/':
31384                         switch(s){
31385                         case S_TAG:
31386                                 el.setTagName(source.slice(start,p));
31387                         case S_ATTR_END:
31388                         case S_TAG_SPACE:
31389                         case S_TAG_CLOSE:
31390                                 s =S_TAG_CLOSE;
31391                                 el.closed = true;
31392                         case S_ATTR_NOQUOT_VALUE:
31393                         case S_ATTR:
31394                         case S_ATTR_SPACE:
31395                                 break;
31396                         //case S_EQ:
31397                         default:
31398                                 throw new Error("attribute invalid close char('/')")
31399                         }
31400                         break;
31401                 case ''://end document
31402                         //throw new Error('unexpected end of input')
31403                         errorHandler.error('unexpected end of input');
31404                         if(s == S_TAG){
31405                                 el.setTagName(source.slice(start,p));
31406                         }
31407                         return p;
31408                 case '>':
31409                         switch(s){
31410                         case S_TAG:
31411                                 el.setTagName(source.slice(start,p));
31412                         case S_ATTR_END:
31413                         case S_TAG_SPACE:
31414                         case S_TAG_CLOSE:
31415                                 break;//normal
31416                         case S_ATTR_NOQUOT_VALUE://Compatible state
31417                         case S_ATTR:
31418                                 value = source.slice(start,p);
31419                                 if(value.slice(-1) === '/'){
31420                                         el.closed  = true;
31421                                         value = value.slice(0,-1);
31422                                 }
31423                         case S_ATTR_SPACE:
31424                                 if(s === S_ATTR_SPACE){
31425                                         value = attrName;
31426                                 }
31427                                 if(s == S_ATTR_NOQUOT_VALUE){
31428                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
31429                                         el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
31430                                 }else{
31431                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
31432                                                 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
31433                                         }
31434                                         el.add(value,value,start);
31435                                 }
31436                                 break;
31437                         case S_EQ:
31438                                 throw new Error('attribute value missed!!');
31439                         }
31440   //                    console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
31441                         return p;
31442                 /*xml space '\x20' | #x9 | #xD | #xA; */
31443                 case '\u0080':
31444                         c = ' ';
31445                 default:
31446                         if(c<= ' '){//space
31447                                 switch(s){
31448                                 case S_TAG:
31449                                         el.setTagName(source.slice(start,p));//tagName
31450                                         s = S_TAG_SPACE;
31451                                         break;
31452                                 case S_ATTR:
31453                                         attrName = source.slice(start,p);
31454                                         s = S_ATTR_SPACE;
31455                                         break;
31456                                 case S_ATTR_NOQUOT_VALUE:
31457                                         var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
31458                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
31459                                         el.add(attrName,value,start);
31460                                 case S_ATTR_END:
31461                                         s = S_TAG_SPACE;
31462                                         break;
31463                                 //case S_TAG_SPACE:
31464                                 //case S_EQ:
31465                                 //case S_ATTR_SPACE:
31466                                 //      void();break;
31467                                 //case S_TAG_CLOSE:
31468                                         //ignore warning
31469                                 }
31470                         }else{//not space
31471   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
31472   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
31473                                 switch(s){
31474                                 //case S_TAG:void();break;
31475                                 //case S_ATTR:void();break;
31476                                 //case S_ATTR_NOQUOT_VALUE:void();break;
31477                                 case S_ATTR_SPACE:
31478                                         var tagName =  el.tagName;
31479                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
31480                                                 errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
31481                                         }
31482                                         el.add(attrName,attrName,start);
31483                                         start = p;
31484                                         s = S_ATTR;
31485                                         break;
31486                                 case S_ATTR_END:
31487                                         errorHandler.warning('attribute space is required"'+attrName+'"!!');
31488                                 case S_TAG_SPACE:
31489                                         s = S_ATTR;
31490                                         start = p;
31491                                         break;
31492                                 case S_EQ:
31493                                         s = S_ATTR_NOQUOT_VALUE;
31494                                         start = p;
31495                                         break;
31496                                 case S_TAG_CLOSE:
31497                                         throw new Error("elements closed character '/' and '>' must be connected to");
31498                                 }
31499                         }
31500                 }//end outer switch
31501                 //console.log('p++',p)
31502                 p++;
31503         }
31504   }
31505   /**
31506    * @return true if has new namespace define
31507    */
31508   function appendElement(el,domBuilder,currentNSMap){
31509         var tagName = el.tagName;
31510         var localNSMap = null;
31511         //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
31512         var i = el.length;
31513         while(i--){
31514                 var a = el[i];
31515                 var qName = a.qName;
31516                 var value = a.value;
31517                 var nsp = qName.indexOf(':');
31518                 if(nsp>0){
31519                         var prefix = a.prefix = qName.slice(0,nsp);
31520                         var localName = qName.slice(nsp+1);
31521                         var nsPrefix = prefix === 'xmlns' && localName;
31522                 }else{
31523                         localName = qName;
31524                         prefix = null;
31525                         nsPrefix = qName === 'xmlns' && '';
31526                 }
31527                 //can not set prefix,because prefix !== ''
31528                 a.localName = localName ;
31529                 //prefix == null for no ns prefix attribute 
31530                 if(nsPrefix !== false){//hack!!
31531                         if(localNSMap == null){
31532                                 localNSMap = {};
31533                                 //console.log(currentNSMap,0)
31534                                 _copy(currentNSMap,currentNSMap={});
31535                                 //console.log(currentNSMap,1)
31536                         }
31537                         currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
31538                         a.uri = 'http://www.w3.org/2000/xmlns/';
31539                         domBuilder.startPrefixMapping(nsPrefix, value); 
31540                 }
31541         }
31542         var i = el.length;
31543         while(i--){
31544                 a = el[i];
31545                 var prefix = a.prefix;
31546                 if(prefix){//no prefix attribute has no namespace
31547                         if(prefix === 'xml'){
31548                                 a.uri = 'http://www.w3.org/XML/1998/namespace';
31549                         }if(prefix !== 'xmlns'){
31550                                 a.uri = currentNSMap[prefix || ''];
31551                                 
31552                                 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
31553                         }
31554                 }
31555         }
31556         var nsp = tagName.indexOf(':');
31557         if(nsp>0){
31558                 prefix = el.prefix = tagName.slice(0,nsp);
31559                 localName = el.localName = tagName.slice(nsp+1);
31560         }else{
31561                 prefix = null;//important!!
31562                 localName = el.localName = tagName;
31563         }
31564         //no prefix element has default namespace
31565         var ns = el.uri = currentNSMap[prefix || ''];
31566         domBuilder.startElement(ns,localName,tagName,el);
31567         //endPrefixMapping and startPrefixMapping have not any help for dom builder
31568         //localNSMap = null
31569         if(el.closed){
31570                 domBuilder.endElement(ns,localName,tagName);
31571                 if(localNSMap){
31572                         for(prefix in localNSMap){
31573                                 domBuilder.endPrefixMapping(prefix); 
31574                         }
31575                 }
31576         }else{
31577                 el.currentNSMap = currentNSMap;
31578                 el.localNSMap = localNSMap;
31579                 //parseStack.push(el);
31580                 return true;
31581         }
31582   }
31583   function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
31584         if(/^(?:script|textarea)$/i.test(tagName)){
31585                 var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
31586                 var text = source.substring(elStartEnd+1,elEndStart);
31587                 if(/[&<]/.test(text)){
31588                         if(/^script$/i.test(tagName)){
31589                                 //if(!/\]\]>/.test(text)){
31590                                         //lexHandler.startCDATA();
31591                                         domBuilder.characters(text,0,text.length);
31592                                         //lexHandler.endCDATA();
31593                                         return elEndStart;
31594                                 //}
31595                         }//}else{//text area
31596                                 text = text.replace(/&#?\w+;/g,entityReplacer);
31597                                 domBuilder.characters(text,0,text.length);
31598                                 return elEndStart;
31599                         //}
31600                         
31601                 }
31602         }
31603         return elStartEnd+1;
31604   }
31605   function fixSelfClosed(source,elStartEnd,tagName,closeMap){
31606         //if(tagName in closeMap){
31607         var pos = closeMap[tagName];
31608         if(pos == null){
31609                 //console.log(tagName)
31610                 pos =  source.lastIndexOf('</'+tagName+'>');
31611                 if(pos<elStartEnd){//忘记闭合
31612                         pos = source.lastIndexOf('</'+tagName);
31613                 }
31614                 closeMap[tagName] =pos;
31615         }
31616         return pos<elStartEnd;
31617         //} 
31618   }
31619   function _copy(source,target){
31620         for(var n in source){target[n] = source[n];}
31621   }
31622   function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
31623         var next= source.charAt(start+2);
31624         switch(next){
31625         case '-':
31626                 if(source.charAt(start + 3) === '-'){
31627                         var end = source.indexOf('-->',start+4);
31628                         //append comment source.substring(4,end)//<!--
31629                         if(end>start){
31630                                 domBuilder.comment(source,start+4,end-start-4);
31631                                 return end+3;
31632                         }else{
31633                                 errorHandler.error("Unclosed comment");
31634                                 return -1;
31635                         }
31636                 }else{
31637                         //error
31638                         return -1;
31639                 }
31640         default:
31641                 if(source.substr(start+3,6) == 'CDATA['){
31642                         var end = source.indexOf(']]>',start+9);
31643                         domBuilder.startCDATA();
31644                         domBuilder.characters(source,start+9,end-start-9);
31645                         domBuilder.endCDATA(); 
31646                         return end+3;
31647                 }
31648                 //<!DOCTYPE
31649                 //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
31650                 var matchs = split(source,start);
31651                 var len = matchs.length;
31652                 if(len>1 && /!doctype/i.test(matchs[0][0])){
31653                         var name = matchs[1][0];
31654                         var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
31655                         var sysid = len>4 && matchs[4][0];
31656                         var lastMatch = matchs[len-1];
31657                         domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
31658                                         sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
31659                         domBuilder.endDTD();
31660                         
31661                         return lastMatch.index+lastMatch[0].length
31662                 }
31663         }
31664         return -1;
31665   }
31666
31667
31668
31669   function parseInstruction(source,start,domBuilder){
31670         var end = source.indexOf('?>',start);
31671         if(end){
31672                 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
31673                 if(match){
31674                         var len = match[0].length;
31675                         domBuilder.processingInstruction(match[1], match[2]) ;
31676                         return end+2;
31677                 }else{//error
31678                         return -1;
31679                 }
31680         }
31681         return -1;
31682   }
31683
31684   /**
31685    * @param source
31686    */
31687   function ElementAttributes(source){
31688         
31689   }
31690   ElementAttributes.prototype = {
31691         setTagName:function(tagName){
31692                 if(!tagNamePattern.test(tagName)){
31693                         throw new Error('invalid tagName:'+tagName)
31694                 }
31695                 this.tagName = tagName;
31696         },
31697         add:function(qName,value,offset){
31698                 if(!tagNamePattern.test(qName)){
31699                         throw new Error('invalid attribute:'+qName)
31700                 }
31701                 this[this.length++] = {qName:qName,value:value,offset:offset};
31702         },
31703         length:0,
31704         getLocalName:function(i){return this[i].localName},
31705         getLocator:function(i){return this[i].locator},
31706         getQName:function(i){return this[i].qName},
31707         getURI:function(i){return this[i].uri},
31708         getValue:function(i){return this[i].value}
31709   //    ,getIndex:function(uri, localName)){
31710   //            if(localName){
31711   //                    
31712   //            }else{
31713   //                    var qName = uri
31714   //            }
31715   //    },
31716   //    getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
31717   //    getType:function(uri,localName){}
31718   //    getType:function(i){},
31719   };
31720
31721
31722
31723
31724   function _set_proto_(thiz,parent){
31725         thiz.__proto__ = parent;
31726         return thiz;
31727   }
31728   if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
31729         _set_proto_ = function(thiz,parent){
31730                 function p(){}          p.prototype = parent;
31731                 p = new p();
31732                 for(parent in thiz){
31733                         p[parent] = thiz[parent];
31734                 }
31735                 return p;
31736         };
31737   }
31738
31739   function split(source,start){
31740         var match;
31741         var buf = [];
31742         var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
31743         reg.lastIndex = start;
31744         reg.exec(source);//skip <
31745         while(match = reg.exec(source)){
31746                 buf.push(match);
31747                 if(match[1])return buf;
31748         }
31749   }
31750
31751   var XMLReader_1 = XMLReader;
31752
31753   var sax = {
31754         XMLReader: XMLReader_1
31755   };
31756
31757   /*
31758    * DOM Level 2
31759    * Object DOMException
31760    * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
31761    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
31762    */
31763
31764   function copy$1(src,dest){
31765         for(var p in src){
31766                 dest[p] = src[p];
31767         }
31768   }
31769   /**
31770   ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
31771   ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
31772    */
31773   function _extends(Class,Super){
31774         var pt = Class.prototype;
31775         if(Object.create){
31776                 var ppt = Object.create(Super.prototype);
31777                 pt.__proto__ = ppt;
31778         }
31779         if(!(pt instanceof Super)){
31780                 function t(){}          t.prototype = Super.prototype;
31781                 t = new t();
31782                 copy$1(pt,t);
31783                 Class.prototype = pt = t;
31784         }
31785         if(pt.constructor != Class){
31786                 if(typeof Class != 'function'){
31787                         console.error("unknow Class:"+Class);
31788                 }
31789                 pt.constructor = Class;
31790         }
31791   }
31792   var htmlns = 'http://www.w3.org/1999/xhtml' ;
31793   // Node Types
31794   var NodeType = {};
31795   var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
31796   var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
31797   var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
31798   var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
31799   var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
31800   var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
31801   var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
31802   var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
31803   var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
31804   var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
31805   var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
31806   var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
31807
31808   // ExceptionCode
31809   var ExceptionCode = {};
31810   var ExceptionMessage = {};
31811   var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
31812   var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
31813   var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
31814   var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
31815   var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
31816   var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
31817   var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
31818   var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
31819   var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
31820   var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
31821   //level2
31822   var INVALID_STATE_ERR         = ExceptionCode.INVALID_STATE_ERR               = ((ExceptionMessage[11]="Invalid state"),11);
31823   var SYNTAX_ERR                = ExceptionCode.SYNTAX_ERR                      = ((ExceptionMessage[12]="Syntax error"),12);
31824   var INVALID_MODIFICATION_ERR  = ExceptionCode.INVALID_MODIFICATION_ERR        = ((ExceptionMessage[13]="Invalid modification"),13);
31825   var NAMESPACE_ERR             = ExceptionCode.NAMESPACE_ERR                   = ((ExceptionMessage[14]="Invalid namespace"),14);
31826   var INVALID_ACCESS_ERR        = ExceptionCode.INVALID_ACCESS_ERR              = ((ExceptionMessage[15]="Invalid access"),15);
31827
31828
31829   function DOMException(code, message) {
31830         if(message instanceof Error){
31831                 var error = message;
31832         }else{
31833                 error = this;
31834                 Error.call(this, ExceptionMessage[code]);
31835                 this.message = ExceptionMessage[code];
31836                 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
31837         }
31838         error.code = code;
31839         if(message) this.message = this.message + ": " + message;
31840         return error;
31841   }DOMException.prototype = Error.prototype;
31842   copy$1(ExceptionCode,DOMException);
31843   /**
31844    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
31845    * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
31846    * The items in the NodeList are accessible via an integral index, starting from 0.
31847    */
31848   function NodeList() {
31849   }NodeList.prototype = {
31850         /**
31851          * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
31852          * @standard level1
31853          */
31854         length:0, 
31855         /**
31856          * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
31857          * @standard level1
31858          * @param index  unsigned long 
31859          *   Index into the collection.
31860          * @return Node
31861          *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
31862          */
31863         item: function(index) {
31864                 return this[index] || null;
31865         },
31866         toString:function(isHTML,nodeFilter){
31867                 for(var buf = [], i = 0;i<this.length;i++){
31868                         serializeToString(this[i],buf,isHTML,nodeFilter);
31869                 }
31870                 return buf.join('');
31871         }
31872   };
31873   function LiveNodeList(node,refresh){
31874         this._node = node;
31875         this._refresh = refresh;
31876         _updateLiveList(this);
31877   }
31878   function _updateLiveList(list){
31879         var inc = list._node._inc || list._node.ownerDocument._inc;
31880         if(list._inc != inc){
31881                 var ls = list._refresh(list._node);
31882                 //console.log(ls.length)
31883                 __set__(list,'length',ls.length);
31884                 copy$1(ls,list);
31885                 list._inc = inc;
31886         }
31887   }
31888   LiveNodeList.prototype.item = function(i){
31889         _updateLiveList(this);
31890         return this[i];
31891   };
31892
31893   _extends(LiveNodeList,NodeList);
31894   /**
31895    * 
31896    * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.
31897    * NamedNodeMap objects in the DOM are live.
31898    * used for attributes or DocumentType entities 
31899    */
31900   function NamedNodeMap() {
31901   }
31902   function _findNodeIndex(list,node){
31903         var i = list.length;
31904         while(i--){
31905                 if(list[i] === node){return i}
31906         }
31907   }
31908
31909   function _addNamedNode(el,list,newAttr,oldAttr){
31910         if(oldAttr){
31911                 list[_findNodeIndex(list,oldAttr)] = newAttr;
31912         }else{
31913                 list[list.length++] = newAttr;
31914         }
31915         if(el){
31916                 newAttr.ownerElement = el;
31917                 var doc = el.ownerDocument;
31918                 if(doc){
31919                         oldAttr && _onRemoveAttribute(doc,el,oldAttr);
31920                         _onAddAttribute(doc,el,newAttr);
31921                 }
31922         }
31923   }
31924   function _removeNamedNode(el,list,attr){
31925         //console.log('remove attr:'+attr)
31926         var i = _findNodeIndex(list,attr);
31927         if(i>=0){
31928                 var lastIndex = list.length-1;
31929                 while(i<lastIndex){
31930                         list[i] = list[++i];
31931                 }
31932                 list.length = lastIndex;
31933                 if(el){
31934                         var doc = el.ownerDocument;
31935                         if(doc){
31936                                 _onRemoveAttribute(doc,el,attr);
31937                                 attr.ownerElement = null;
31938                         }
31939                 }
31940         }else{
31941                 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
31942         }
31943   }
31944   NamedNodeMap.prototype = {
31945         length:0,
31946         item:NodeList.prototype.item,
31947         getNamedItem: function(key) {
31948   //            if(key.indexOf(':')>0 || key == 'xmlns'){
31949   //                    return null;
31950   //            }
31951                 //console.log()
31952                 var i = this.length;
31953                 while(i--){
31954                         var attr = this[i];
31955                         //console.log(attr.nodeName,key)
31956                         if(attr.nodeName == key){
31957                                 return attr;
31958                         }
31959                 }
31960         },
31961         setNamedItem: function(attr) {
31962                 var el = attr.ownerElement;
31963                 if(el && el!=this._ownerElement){
31964                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
31965                 }
31966                 var oldAttr = this.getNamedItem(attr.nodeName);
31967                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
31968                 return oldAttr;
31969         },
31970         /* returns Node */
31971         setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
31972                 var el = attr.ownerElement, oldAttr;
31973                 if(el && el!=this._ownerElement){
31974                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
31975                 }
31976                 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
31977                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
31978                 return oldAttr;
31979         },
31980
31981         /* returns Node */
31982         removeNamedItem: function(key) {
31983                 var attr = this.getNamedItem(key);
31984                 _removeNamedNode(this._ownerElement,this,attr);
31985                 return attr;
31986                 
31987                 
31988         },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
31989         
31990         //for level2
31991         removeNamedItemNS:function(namespaceURI,localName){
31992                 var attr = this.getNamedItemNS(namespaceURI,localName);
31993                 _removeNamedNode(this._ownerElement,this,attr);
31994                 return attr;
31995         },
31996         getNamedItemNS: function(namespaceURI, localName) {
31997                 var i = this.length;
31998                 while(i--){
31999                         var node = this[i];
32000                         if(node.localName == localName && node.namespaceURI == namespaceURI){
32001                                 return node;
32002                         }
32003                 }
32004                 return null;
32005         }
32006   };
32007   /**
32008    * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
32009    */
32010   function DOMImplementation(/* Object */ features) {
32011         this._features = {};
32012         if (features) {
32013                 for (var feature in features) {
32014                          this._features = features[feature];
32015                 }
32016         }
32017   }
32018   DOMImplementation.prototype = {
32019         hasFeature: function(/* string */ feature, /* string */ version) {
32020                 var versions = this._features[feature.toLowerCase()];
32021                 if (versions && (!version || version in versions)) {
32022                         return true;
32023                 } else {
32024                         return false;
32025                 }
32026         },
32027         // Introduced in DOM Level 2:
32028         createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
32029                 var doc = new Document();
32030                 doc.implementation = this;
32031                 doc.childNodes = new NodeList();
32032                 doc.doctype = doctype;
32033                 if(doctype){
32034                         doc.appendChild(doctype);
32035                 }
32036                 if(qualifiedName){
32037                         var root = doc.createElementNS(namespaceURI,qualifiedName);
32038                         doc.appendChild(root);
32039                 }
32040                 return doc;
32041         },
32042         // Introduced in DOM Level 2:
32043         createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
32044                 var node = new DocumentType();
32045                 node.name = qualifiedName;
32046                 node.nodeName = qualifiedName;
32047                 node.publicId = publicId;
32048                 node.systemId = systemId;
32049                 // Introduced in DOM Level 2:
32050                 //readonly attribute DOMString        internalSubset;
32051                 
32052                 //TODO:..
32053                 //  readonly attribute NamedNodeMap     entities;
32054                 //  readonly attribute NamedNodeMap     notations;
32055                 return node;
32056         }
32057   };
32058
32059
32060   /**
32061    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
32062    */
32063
32064   function Node$2() {
32065   }
32066   Node$2.prototype = {
32067         firstChild : null,
32068         lastChild : null,
32069         previousSibling : null,
32070         nextSibling : null,
32071         attributes : null,
32072         parentNode : null,
32073         childNodes : null,
32074         ownerDocument : null,
32075         nodeValue : null,
32076         namespaceURI : null,
32077         prefix : null,
32078         localName : null,
32079         // Modified in DOM Level 2:
32080         insertBefore:function(newChild, refChild){//raises 
32081                 return _insertBefore(this,newChild,refChild);
32082         },
32083         replaceChild:function(newChild, oldChild){//raises 
32084                 this.insertBefore(newChild,oldChild);
32085                 if(oldChild){
32086                         this.removeChild(oldChild);
32087                 }
32088         },
32089         removeChild:function(oldChild){
32090                 return _removeChild(this,oldChild);
32091         },
32092         appendChild:function(newChild){
32093                 return this.insertBefore(newChild,null);
32094         },
32095         hasChildNodes:function(){
32096                 return this.firstChild != null;
32097         },
32098         cloneNode:function(deep){
32099                 return cloneNode(this.ownerDocument||this,this,deep);
32100         },
32101         // Modified in DOM Level 2:
32102         normalize:function(){
32103                 var child = this.firstChild;
32104                 while(child){
32105                         var next = child.nextSibling;
32106                         if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
32107                                 this.removeChild(next);
32108                                 child.appendData(next.data);
32109                         }else{
32110                                 child.normalize();
32111                                 child = next;
32112                         }
32113                 }
32114         },
32115         // Introduced in DOM Level 2:
32116         isSupported:function(feature, version){
32117                 return this.ownerDocument.implementation.hasFeature(feature,version);
32118         },
32119       // Introduced in DOM Level 2:
32120       hasAttributes:function(){
32121         return this.attributes.length>0;
32122       },
32123       lookupPrefix:function(namespaceURI){
32124         var el = this;
32125         while(el){
32126                 var map = el._nsMap;
32127                 //console.dir(map)
32128                 if(map){
32129                         for(var n in map){
32130                                 if(map[n] == namespaceURI){
32131                                         return n;
32132                                 }
32133                         }
32134                 }
32135                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
32136         }
32137         return null;
32138       },
32139       // Introduced in DOM Level 3:
32140       lookupNamespaceURI:function(prefix){
32141         var el = this;
32142         while(el){
32143                 var map = el._nsMap;
32144                 //console.dir(map)
32145                 if(map){
32146                         if(prefix in map){
32147                                 return map[prefix] ;
32148                         }
32149                 }
32150                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
32151         }
32152         return null;
32153       },
32154       // Introduced in DOM Level 3:
32155       isDefaultNamespace:function(namespaceURI){
32156         var prefix = this.lookupPrefix(namespaceURI);
32157         return prefix == null;
32158       }
32159   };
32160
32161
32162   function _xmlEncoder(c){
32163         return c == '<' && '&lt;' ||
32164            c == '>' && '&gt;' ||
32165            c == '&' && '&amp;' ||
32166            c == '"' && '&quot;' ||
32167            '&#'+c.charCodeAt()+';'
32168   }
32169
32170
32171   copy$1(NodeType,Node$2);
32172   copy$1(NodeType,Node$2.prototype);
32173
32174   /**
32175    * @param callback return true for continue,false for break
32176    * @return boolean true: break visit;
32177    */
32178   function _visitNode(node,callback){
32179         if(callback(node)){
32180                 return true;
32181         }
32182         if(node = node.firstChild){
32183                 do{
32184                         if(_visitNode(node,callback)){return true}
32185           }while(node=node.nextSibling)
32186       }
32187   }
32188
32189
32190
32191   function Document(){
32192   }
32193   function _onAddAttribute(doc,el,newAttr){
32194         doc && doc._inc++;
32195         var ns = newAttr.namespaceURI ;
32196         if(ns == 'http://www.w3.org/2000/xmlns/'){
32197                 //update namespace
32198                 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
32199         }
32200   }
32201   function _onRemoveAttribute(doc,el,newAttr,remove){
32202         doc && doc._inc++;
32203         var ns = newAttr.namespaceURI ;
32204         if(ns == 'http://www.w3.org/2000/xmlns/'){
32205                 //update namespace
32206                 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
32207         }
32208   }
32209   function _onUpdateChild(doc,el,newChild){
32210         if(doc && doc._inc){
32211                 doc._inc++;
32212                 //update childNodes
32213                 var cs = el.childNodes;
32214                 if(newChild){
32215                         cs[cs.length++] = newChild;
32216                 }else{
32217                         //console.log(1)
32218                         var child = el.firstChild;
32219                         var i = 0;
32220                         while(child){
32221                                 cs[i++] = child;
32222                                 child =child.nextSibling;
32223                         }
32224                         cs.length = i;
32225                 }
32226         }
32227   }
32228
32229   /**
32230    * attributes;
32231    * children;
32232    * 
32233    * writeable properties:
32234    * nodeValue,Attr:value,CharacterData:data
32235    * prefix
32236    */
32237   function _removeChild(parentNode,child){
32238         var previous = child.previousSibling;
32239         var next = child.nextSibling;
32240         if(previous){
32241                 previous.nextSibling = next;
32242         }else{
32243                 parentNode.firstChild = next;
32244         }
32245         if(next){
32246                 next.previousSibling = previous;
32247         }else{
32248                 parentNode.lastChild = previous;
32249         }
32250         _onUpdateChild(parentNode.ownerDocument,parentNode);
32251         return child;
32252   }
32253   /**
32254    * preformance key(refChild == null)
32255    */
32256   function _insertBefore(parentNode,newChild,nextChild){
32257         var cp = newChild.parentNode;
32258         if(cp){
32259                 cp.removeChild(newChild);//remove and update
32260         }
32261         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
32262                 var newFirst = newChild.firstChild;
32263                 if (newFirst == null) {
32264                         return newChild;
32265                 }
32266                 var newLast = newChild.lastChild;
32267         }else{
32268                 newFirst = newLast = newChild;
32269         }
32270         var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
32271
32272         newFirst.previousSibling = pre;
32273         newLast.nextSibling = nextChild;
32274         
32275         
32276         if(pre){
32277                 pre.nextSibling = newFirst;
32278         }else{
32279                 parentNode.firstChild = newFirst;
32280         }
32281         if(nextChild == null){
32282                 parentNode.lastChild = newLast;
32283         }else{
32284                 nextChild.previousSibling = newLast;
32285         }
32286         do{
32287                 newFirst.parentNode = parentNode;
32288         }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
32289         _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
32290         //console.log(parentNode.lastChild.nextSibling == null)
32291         if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
32292                 newChild.firstChild = newChild.lastChild = null;
32293         }
32294         return newChild;
32295   }
32296   function _appendSingleChild(parentNode,newChild){
32297         var cp = newChild.parentNode;
32298         if(cp){
32299                 var pre = parentNode.lastChild;
32300                 cp.removeChild(newChild);//remove and update
32301                 var pre = parentNode.lastChild;
32302         }
32303         var pre = parentNode.lastChild;
32304         newChild.parentNode = parentNode;
32305         newChild.previousSibling = pre;
32306         newChild.nextSibling = null;
32307         if(pre){
32308                 pre.nextSibling = newChild;
32309         }else{
32310                 parentNode.firstChild = newChild;
32311         }
32312         parentNode.lastChild = newChild;
32313         _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
32314         return newChild;
32315         //console.log("__aa",parentNode.lastChild.nextSibling == null)
32316   }
32317   Document.prototype = {
32318         //implementation : null,
32319         nodeName :  '#document',
32320         nodeType :  DOCUMENT_NODE,
32321         doctype :  null,
32322         documentElement :  null,
32323         _inc : 1,
32324         
32325         insertBefore :  function(newChild, refChild){//raises 
32326                 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
32327                         var child = newChild.firstChild;
32328                         while(child){
32329                                 var next = child.nextSibling;
32330                                 this.insertBefore(child,refChild);
32331                                 child = next;
32332                         }
32333                         return newChild;
32334                 }
32335                 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
32336                         this.documentElement = newChild;
32337                 }
32338                 
32339                 return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
32340         },
32341         removeChild :  function(oldChild){
32342                 if(this.documentElement == oldChild){
32343                         this.documentElement = null;
32344                 }
32345                 return _removeChild(this,oldChild);
32346         },
32347         // Introduced in DOM Level 2:
32348         importNode : function(importedNode,deep){
32349                 return importNode(this,importedNode,deep);
32350         },
32351         // Introduced in DOM Level 2:
32352         getElementById :        function(id){
32353                 var rtv = null;
32354                 _visitNode(this.documentElement,function(node){
32355                         if(node.nodeType == ELEMENT_NODE){
32356                                 if(node.getAttribute('id') == id){
32357                                         rtv = node;
32358                                         return true;
32359                                 }
32360                         }
32361                 });
32362                 return rtv;
32363         },
32364         
32365         //document factory method:
32366         createElement : function(tagName){
32367                 var node = new Element();
32368                 node.ownerDocument = this;
32369                 node.nodeName = tagName;
32370                 node.tagName = tagName;
32371                 node.childNodes = new NodeList();
32372                 var attrs       = node.attributes = new NamedNodeMap();
32373                 attrs._ownerElement = node;
32374                 return node;
32375         },
32376         createDocumentFragment :        function(){
32377                 var node = new DocumentFragment();
32378                 node.ownerDocument = this;
32379                 node.childNodes = new NodeList();
32380                 return node;
32381         },
32382         createTextNode :        function(data){
32383                 var node = new Text();
32384                 node.ownerDocument = this;
32385                 node.appendData(data);
32386                 return node;
32387         },
32388         createComment : function(data){
32389                 var node = new Comment();
32390                 node.ownerDocument = this;
32391                 node.appendData(data);
32392                 return node;
32393         },
32394         createCDATASection :    function(data){
32395                 var node = new CDATASection();
32396                 node.ownerDocument = this;
32397                 node.appendData(data);
32398                 return node;
32399         },
32400         createProcessingInstruction :   function(target,data){
32401                 var node = new ProcessingInstruction();
32402                 node.ownerDocument = this;
32403                 node.tagName = node.target = target;
32404                 node.nodeValue= node.data = data;
32405                 return node;
32406         },
32407         createAttribute :       function(name){
32408                 var node = new Attr();
32409                 node.ownerDocument      = this;
32410                 node.name = name;
32411                 node.nodeName   = name;
32412                 node.localName = name;
32413                 node.specified = true;
32414                 return node;
32415         },
32416         createEntityReference : function(name){
32417                 var node = new EntityReference();
32418                 node.ownerDocument      = this;
32419                 node.nodeName   = name;
32420                 return node;
32421         },
32422         // Introduced in DOM Level 2:
32423         createElementNS :       function(namespaceURI,qualifiedName){
32424                 var node = new Element();
32425                 var pl = qualifiedName.split(':');
32426                 var attrs       = node.attributes = new NamedNodeMap();
32427                 node.childNodes = new NodeList();
32428                 node.ownerDocument = this;
32429                 node.nodeName = qualifiedName;
32430                 node.tagName = qualifiedName;
32431                 node.namespaceURI = namespaceURI;
32432                 if(pl.length == 2){
32433                         node.prefix = pl[0];
32434                         node.localName = pl[1];
32435                 }else{
32436                         //el.prefix = null;
32437                         node.localName = qualifiedName;
32438                 }
32439                 attrs._ownerElement = node;
32440                 return node;
32441         },
32442         // Introduced in DOM Level 2:
32443         createAttributeNS :     function(namespaceURI,qualifiedName){
32444                 var node = new Attr();
32445                 var pl = qualifiedName.split(':');
32446                 node.ownerDocument = this;
32447                 node.nodeName = qualifiedName;
32448                 node.name = qualifiedName;
32449                 node.namespaceURI = namespaceURI;
32450                 node.specified = true;
32451                 if(pl.length == 2){
32452                         node.prefix = pl[0];
32453                         node.localName = pl[1];
32454                 }else{
32455                         //el.prefix = null;
32456                         node.localName = qualifiedName;
32457                 }
32458                 return node;
32459         }
32460   };
32461   _extends(Document,Node$2);
32462
32463
32464   function Element() {
32465         this._nsMap = {};
32466   }Element.prototype = {
32467         nodeType : ELEMENT_NODE,
32468         hasAttribute : function(name){
32469                 return this.getAttributeNode(name)!=null;
32470         },
32471         getAttribute : function(name){
32472                 var attr = this.getAttributeNode(name);
32473                 return attr && attr.value || '';
32474         },
32475         getAttributeNode : function(name){
32476                 return this.attributes.getNamedItem(name);
32477         },
32478         setAttribute : function(name, value){
32479                 var attr = this.ownerDocument.createAttribute(name);
32480                 attr.value = attr.nodeValue = "" + value;
32481                 this.setAttributeNode(attr);
32482         },
32483         removeAttribute : function(name){
32484                 var attr = this.getAttributeNode(name);
32485                 attr && this.removeAttributeNode(attr);
32486         },
32487         
32488         //four real opeartion method
32489         appendChild:function(newChild){
32490                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
32491                         return this.insertBefore(newChild,null);
32492                 }else{
32493                         return _appendSingleChild(this,newChild);
32494                 }
32495         },
32496         setAttributeNode : function(newAttr){
32497                 return this.attributes.setNamedItem(newAttr);
32498         },
32499         setAttributeNodeNS : function(newAttr){
32500                 return this.attributes.setNamedItemNS(newAttr);
32501         },
32502         removeAttributeNode : function(oldAttr){
32503                 //console.log(this == oldAttr.ownerElement)
32504                 return this.attributes.removeNamedItem(oldAttr.nodeName);
32505         },
32506         //get real attribute name,and remove it by removeAttributeNode
32507         removeAttributeNS : function(namespaceURI, localName){
32508                 var old = this.getAttributeNodeNS(namespaceURI, localName);
32509                 old && this.removeAttributeNode(old);
32510         },
32511         
32512         hasAttributeNS : function(namespaceURI, localName){
32513                 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
32514         },
32515         getAttributeNS : function(namespaceURI, localName){
32516                 var attr = this.getAttributeNodeNS(namespaceURI, localName);
32517                 return attr && attr.value || '';
32518         },
32519         setAttributeNS : function(namespaceURI, qualifiedName, value){
32520                 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
32521                 attr.value = attr.nodeValue = "" + value;
32522                 this.setAttributeNode(attr);
32523         },
32524         getAttributeNodeNS : function(namespaceURI, localName){
32525                 return this.attributes.getNamedItemNS(namespaceURI, localName);
32526         },
32527         
32528         getElementsByTagName : function(tagName){
32529                 return new LiveNodeList(this,function(base){
32530                         var ls = [];
32531                         _visitNode(base,function(node){
32532                                 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
32533                                         ls.push(node);
32534                                 }
32535                         });
32536                         return ls;
32537                 });
32538         },
32539         getElementsByTagNameNS : function(namespaceURI, localName){
32540                 return new LiveNodeList(this,function(base){
32541                         var ls = [];
32542                         _visitNode(base,function(node){
32543                                 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
32544                                         ls.push(node);
32545                                 }
32546                         });
32547                         return ls;
32548                         
32549                 });
32550         }
32551   };
32552   Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
32553   Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
32554
32555
32556   _extends(Element,Node$2);
32557   function Attr() {
32558   }Attr.prototype.nodeType = ATTRIBUTE_NODE;
32559   _extends(Attr,Node$2);
32560
32561
32562   function CharacterData() {
32563   }CharacterData.prototype = {
32564         data : '',
32565         substringData : function(offset, count) {
32566                 return this.data.substring(offset, offset+count);
32567         },
32568         appendData: function(text) {
32569                 text = this.data+text;
32570                 this.nodeValue = this.data = text;
32571                 this.length = text.length;
32572         },
32573         insertData: function(offset,text) {
32574                 this.replaceData(offset,0,text);
32575         
32576         },
32577         appendChild:function(newChild){
32578                 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
32579         },
32580         deleteData: function(offset, count) {
32581                 this.replaceData(offset,count,"");
32582         },
32583         replaceData: function(offset, count, text) {
32584                 var start = this.data.substring(0,offset);
32585                 var end = this.data.substring(offset+count);
32586                 text = start + text + end;
32587                 this.nodeValue = this.data = text;
32588                 this.length = text.length;
32589         }
32590   };
32591   _extends(CharacterData,Node$2);
32592   function Text() {
32593   }Text.prototype = {
32594         nodeName : "#text",
32595         nodeType : TEXT_NODE,
32596         splitText : function(offset) {
32597                 var text = this.data;
32598                 var newText = text.substring(offset);
32599                 text = text.substring(0, offset);
32600                 this.data = this.nodeValue = text;
32601                 this.length = text.length;
32602                 var newNode = this.ownerDocument.createTextNode(newText);
32603                 if(this.parentNode){
32604                         this.parentNode.insertBefore(newNode, this.nextSibling);
32605                 }
32606                 return newNode;
32607         }
32608   };
32609   _extends(Text,CharacterData);
32610   function Comment() {
32611   }Comment.prototype = {
32612         nodeName : "#comment",
32613         nodeType : COMMENT_NODE
32614   };
32615   _extends(Comment,CharacterData);
32616
32617   function CDATASection() {
32618   }CDATASection.prototype = {
32619         nodeName : "#cdata-section",
32620         nodeType : CDATA_SECTION_NODE
32621   };
32622   _extends(CDATASection,CharacterData);
32623
32624
32625   function DocumentType() {
32626   }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
32627   _extends(DocumentType,Node$2);
32628
32629   function Notation() {
32630   }Notation.prototype.nodeType = NOTATION_NODE;
32631   _extends(Notation,Node$2);
32632
32633   function Entity() {
32634   }Entity.prototype.nodeType = ENTITY_NODE;
32635   _extends(Entity,Node$2);
32636
32637   function EntityReference() {
32638   }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
32639   _extends(EntityReference,Node$2);
32640
32641   function DocumentFragment() {
32642   }DocumentFragment.prototype.nodeName =        "#document-fragment";
32643   DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
32644   _extends(DocumentFragment,Node$2);
32645
32646
32647   function ProcessingInstruction() {
32648   }
32649   ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
32650   _extends(ProcessingInstruction,Node$2);
32651   function XMLSerializer$1(){}
32652   XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
32653         return nodeSerializeToString.call(node,isHtml,nodeFilter);
32654   };
32655   Node$2.prototype.toString = nodeSerializeToString;
32656   function nodeSerializeToString(isHtml,nodeFilter){
32657         var buf = [];
32658         var refNode = this.nodeType == 9?this.documentElement:this;
32659         var prefix = refNode.prefix;
32660         var uri = refNode.namespaceURI;
32661         
32662         if(uri && prefix == null){
32663                 //console.log(prefix)
32664                 var prefix = refNode.lookupPrefix(uri);
32665                 if(prefix == null){
32666                         //isHTML = true;
32667                         var visibleNamespaces=[
32668                         {namespace:uri,prefix:null}
32669                         //{namespace:uri,prefix:''}
32670                         ];
32671                 }
32672         }
32673         serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
32674         //console.log('###',this.nodeType,uri,prefix,buf.join(''))
32675         return buf.join('');
32676   }
32677   function needNamespaceDefine(node,isHTML, visibleNamespaces) {
32678         var prefix = node.prefix||'';
32679         var uri = node.namespaceURI;
32680         if (!prefix && !uri){
32681                 return false;
32682         }
32683         if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
32684                 || uri == 'http://www.w3.org/2000/xmlns/'){
32685                 return false;
32686         }
32687         
32688         var i = visibleNamespaces.length; 
32689         //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
32690         while (i--) {
32691                 var ns = visibleNamespaces[i];
32692                 // get namespace prefix
32693                 //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
32694                 if (ns.prefix == prefix){
32695                         return ns.namespace != uri;
32696                 }
32697         }
32698         //console.log(isHTML,uri,prefix=='')
32699         //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
32700         //      return false;
32701         //}
32702         //node.flag = '11111'
32703         //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
32704         return true;
32705   }
32706   function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
32707         if(nodeFilter){
32708                 node = nodeFilter(node);
32709                 if(node){
32710                         if(typeof node == 'string'){
32711                                 buf.push(node);
32712                                 return;
32713                         }
32714                 }else{
32715                         return;
32716                 }
32717                 //buf.sort.apply(attrs, attributeSorter);
32718         }
32719         switch(node.nodeType){
32720         case ELEMENT_NODE:
32721                 if (!visibleNamespaces) visibleNamespaces = [];
32722                 var startVisibleNamespaces = visibleNamespaces.length;
32723                 var attrs = node.attributes;
32724                 var len = attrs.length;
32725                 var child = node.firstChild;
32726                 var nodeName = node.tagName;
32727                 
32728                 isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
32729                 buf.push('<',nodeName);
32730                 
32731                 
32732                 
32733                 for(var i=0;i<len;i++){
32734                         // add namespaces for attributes
32735                         var attr = attrs.item(i);
32736                         if (attr.prefix == 'xmlns') {
32737                                 visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
32738                         }else if(attr.nodeName == 'xmlns'){
32739                                 visibleNamespaces.push({ prefix: '', namespace: attr.value });
32740                         }
32741                 }
32742                 for(var i=0;i<len;i++){
32743                         var attr = attrs.item(i);
32744                         if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
32745                                 var prefix = attr.prefix||'';
32746                                 var uri = attr.namespaceURI;
32747                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
32748                                 buf.push(ns, '="' , uri , '"');
32749                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
32750                         }
32751                         serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
32752                 }
32753                 // add namespace for current node               
32754                 if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
32755                         var prefix = node.prefix||'';
32756                         var uri = node.namespaceURI;
32757                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
32758                         buf.push(ns, '="' , uri , '"');
32759                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
32760                 }
32761                 
32762                 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
32763                         buf.push('>');
32764                         //if is cdata child node
32765                         if(isHTML && /^script$/i.test(nodeName)){
32766                                 while(child){
32767                                         if(child.data){
32768                                                 buf.push(child.data);
32769                                         }else{
32770                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
32771                                         }
32772                                         child = child.nextSibling;
32773                                 }
32774                         }else
32775                         {
32776                                 while(child){
32777                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
32778                                         child = child.nextSibling;
32779                                 }
32780                         }
32781                         buf.push('</',nodeName,'>');
32782                 }else{
32783                         buf.push('/>');
32784                 }
32785                 // remove added visible namespaces
32786                 //visibleNamespaces.length = startVisibleNamespaces;
32787                 return;
32788         case DOCUMENT_NODE:
32789         case DOCUMENT_FRAGMENT_NODE:
32790                 var child = node.firstChild;
32791                 while(child){
32792                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
32793                         child = child.nextSibling;
32794                 }
32795                 return;
32796         case ATTRIBUTE_NODE:
32797                 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
32798         case TEXT_NODE:
32799                 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
32800         case CDATA_SECTION_NODE:
32801                 return buf.push( '<![CDATA[',node.data,']]>');
32802         case COMMENT_NODE:
32803                 return buf.push( "<!--",node.data,"-->");
32804         case DOCUMENT_TYPE_NODE:
32805                 var pubid = node.publicId;
32806                 var sysid = node.systemId;
32807                 buf.push('<!DOCTYPE ',node.name);
32808                 if(pubid){
32809                         buf.push(' PUBLIC "',pubid);
32810                         if (sysid && sysid!='.') {
32811                                 buf.push( '" "',sysid);
32812                         }
32813                         buf.push('">');
32814                 }else if(sysid && sysid!='.'){
32815                         buf.push(' SYSTEM "',sysid,'">');
32816                 }else{
32817                         var sub = node.internalSubset;
32818                         if(sub){
32819                                 buf.push(" [",sub,"]");
32820                         }
32821                         buf.push(">");
32822                 }
32823                 return;
32824         case PROCESSING_INSTRUCTION_NODE:
32825                 return buf.push( "<?",node.target," ",node.data,"?>");
32826         case ENTITY_REFERENCE_NODE:
32827                 return buf.push( '&',node.nodeName,';');
32828         //case ENTITY_NODE:
32829         //case NOTATION_NODE:
32830         default:
32831                 buf.push('??',node.nodeName);
32832         }
32833   }
32834   function importNode(doc,node,deep){
32835         var node2;
32836         switch (node.nodeType) {
32837         case ELEMENT_NODE:
32838                 node2 = node.cloneNode(false);
32839                 node2.ownerDocument = doc;
32840                 //var attrs = node2.attributes;
32841                 //var len = attrs.length;
32842                 //for(var i=0;i<len;i++){
32843                         //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
32844                 //}
32845         case DOCUMENT_FRAGMENT_NODE:
32846                 break;
32847         case ATTRIBUTE_NODE:
32848                 deep = true;
32849                 break;
32850         //case ENTITY_REFERENCE_NODE:
32851         //case PROCESSING_INSTRUCTION_NODE:
32852         ////case TEXT_NODE:
32853         //case CDATA_SECTION_NODE:
32854         //case COMMENT_NODE:
32855         //      deep = false;
32856         //      break;
32857         //case DOCUMENT_NODE:
32858         //case DOCUMENT_TYPE_NODE:
32859         //cannot be imported.
32860         //case ENTITY_NODE:
32861         //case NOTATION_NODE:
32862         //can not hit in level3
32863         //default:throw e;
32864         }
32865         if(!node2){
32866                 node2 = node.cloneNode(false);//false
32867         }
32868         node2.ownerDocument = doc;
32869         node2.parentNode = null;
32870         if(deep){
32871                 var child = node.firstChild;
32872                 while(child){
32873                         node2.appendChild(importNode(doc,child,deep));
32874                         child = child.nextSibling;
32875                 }
32876         }
32877         return node2;
32878   }
32879   //
32880   //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
32881   //                                    attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
32882   function cloneNode(doc,node,deep){
32883         var node2 = new node.constructor();
32884         for(var n in node){
32885                 var v = node[n];
32886                 if(typeof v != 'object' ){
32887                         if(v != node2[n]){
32888                                 node2[n] = v;
32889                         }
32890                 }
32891         }
32892         if(node.childNodes){
32893                 node2.childNodes = new NodeList();
32894         }
32895         node2.ownerDocument = doc;
32896         switch (node2.nodeType) {
32897         case ELEMENT_NODE:
32898                 var attrs       = node.attributes;
32899                 var attrs2      = node2.attributes = new NamedNodeMap();
32900                 var len = attrs.length;
32901                 attrs2._ownerElement = node2;
32902                 for(var i=0;i<len;i++){
32903                         node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
32904                 }
32905                 break;
32906         case ATTRIBUTE_NODE:
32907                 deep = true;
32908         }
32909         if(deep){
32910                 var child = node.firstChild;
32911                 while(child){
32912                         node2.appendChild(cloneNode(doc,child,deep));
32913                         child = child.nextSibling;
32914                 }
32915         }
32916         return node2;
32917   }
32918
32919   function __set__(object,key,value){
32920         object[key] = value;
32921   }
32922   //do dynamic
32923   try{
32924         if(Object.defineProperty){
32925                 Object.defineProperty(LiveNodeList.prototype,'length',{
32926                         get:function(){
32927                                 _updateLiveList(this);
32928                                 return this.$$length;
32929                         }
32930                 });
32931                 Object.defineProperty(Node$2.prototype,'textContent',{
32932                         get:function(){
32933                                 return getTextContent(this);
32934                         },
32935                         set:function(data){
32936                                 switch(this.nodeType){
32937                                 case ELEMENT_NODE:
32938                                 case DOCUMENT_FRAGMENT_NODE:
32939                                         while(this.firstChild){
32940                                                 this.removeChild(this.firstChild);
32941                                         }
32942                                         if(data || String(data)){
32943                                                 this.appendChild(this.ownerDocument.createTextNode(data));
32944                                         }
32945                                         break;
32946                                 default:
32947                                         //TODO:
32948                                         this.data = data;
32949                                         this.value = data;
32950                                         this.nodeValue = data;
32951                                 }
32952                         }
32953                 });
32954                 
32955                 function getTextContent(node){
32956                         switch(node.nodeType){
32957                         case ELEMENT_NODE:
32958                         case DOCUMENT_FRAGMENT_NODE:
32959                                 var buf = [];
32960                                 node = node.firstChild;
32961                                 while(node){
32962                                         if(node.nodeType!==7 && node.nodeType !==8){
32963                                                 buf.push(getTextContent(node));
32964                                         }
32965                                         node = node.nextSibling;
32966                                 }
32967                                 return buf.join('');
32968                         default:
32969                                 return node.nodeValue;
32970                         }
32971                 }
32972                 __set__ = function(object,key,value){
32973                         //console.log(value)
32974                         object['$$'+key] = value;
32975                 };
32976         }
32977   }catch(e){//ie8
32978   }
32979
32980   //if(typeof require == 'function'){
32981         var DOMImplementation_1 = DOMImplementation;
32982         var XMLSerializer_1 = XMLSerializer$1;
32983   //}
32984
32985   var dom = {
32986         DOMImplementation: DOMImplementation_1,
32987         XMLSerializer: XMLSerializer_1
32988   };
32989
32990   var domParser = createCommonjsModule(function (module, exports) {
32991   function DOMParser(options){
32992         this.options = options ||{locator:{}};
32993         
32994   }
32995   DOMParser.prototype.parseFromString = function(source,mimeType){
32996         var options = this.options;
32997         var sax$$1 =  new XMLReader();
32998         var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
32999         var errorHandler = options.errorHandler;
33000         var locator = options.locator;
33001         var defaultNSMap = options.xmlns||{};
33002         var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
33003         if(locator){
33004                 domBuilder.setDocumentLocator(locator);
33005         }
33006         
33007         sax$$1.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
33008         sax$$1.domBuilder = options.domBuilder || domBuilder;
33009         if(/\/x?html?$/.test(mimeType)){
33010                 entityMap.nbsp = '\xa0';
33011                 entityMap.copy = '\xa9';
33012                 defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
33013         }
33014         defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
33015         if(source){
33016                 sax$$1.parse(source,defaultNSMap,entityMap);
33017         }else{
33018                 sax$$1.errorHandler.error("invalid doc source");
33019         }
33020         return domBuilder.doc;
33021   };
33022   function buildErrorHandler(errorImpl,domBuilder,locator){
33023         if(!errorImpl){
33024                 if(domBuilder instanceof DOMHandler){
33025                         return domBuilder;
33026                 }
33027                 errorImpl = domBuilder ;
33028         }
33029         var errorHandler = {};
33030         var isCallback = errorImpl instanceof Function;
33031         locator = locator||{};
33032         function build(key){
33033                 var fn = errorImpl[key];
33034                 if(!fn && isCallback){
33035                         fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
33036                 }
33037                 errorHandler[key] = fn && function(msg){
33038                         fn('[xmldom '+key+']\t'+msg+_locator(locator));
33039                 }||function(){};
33040         }
33041         build('warning');
33042         build('error');
33043         build('fatalError');
33044         return errorHandler;
33045   }
33046
33047   //console.log('#\n\n\n\n\n\n\n####')
33048   /**
33049    * +ContentHandler+ErrorHandler
33050    * +LexicalHandler+EntityResolver2
33051    * -DeclHandler-DTDHandler 
33052    * 
33053    * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
33054    * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
33055    * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
33056    */
33057   function DOMHandler() {
33058       this.cdata = false;
33059   }
33060   function position(locator,node){
33061         node.lineNumber = locator.lineNumber;
33062         node.columnNumber = locator.columnNumber;
33063   }
33064   /**
33065    * @see org.xml.sax.ContentHandler#startDocument
33066    * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
33067    */ 
33068   DOMHandler.prototype = {
33069         startDocument : function() {
33070         this.doc = new DOMImplementation().createDocument(null, null, null);
33071         if (this.locator) {
33072                 this.doc.documentURI = this.locator.systemId;
33073         }
33074         },
33075         startElement:function(namespaceURI, localName, qName, attrs) {
33076                 var doc = this.doc;
33077             var el = doc.createElementNS(namespaceURI, qName||localName);
33078             var len = attrs.length;
33079             appendElement(this, el);
33080             this.currentElement = el;
33081             
33082                 this.locator && position(this.locator,el);
33083             for (var i = 0 ; i < len; i++) {
33084                 var namespaceURI = attrs.getURI(i);
33085                 var value = attrs.getValue(i);
33086                 var qName = attrs.getQName(i);
33087                         var attr = doc.createAttributeNS(namespaceURI, qName);
33088                         this.locator &&position(attrs.getLocator(i),attr);
33089                         attr.value = attr.nodeValue = value;
33090                         el.setAttributeNode(attr);
33091             }
33092         },
33093         endElement:function(namespaceURI, localName, qName) {
33094                 var current = this.currentElement;
33095                 var tagName = current.tagName;
33096                 this.currentElement = current.parentNode;
33097         },
33098         startPrefixMapping:function(prefix, uri) {
33099         },
33100         endPrefixMapping:function(prefix) {
33101         },
33102         processingInstruction:function(target, data) {
33103             var ins = this.doc.createProcessingInstruction(target, data);
33104             this.locator && position(this.locator,ins);
33105             appendElement(this, ins);
33106         },
33107         ignorableWhitespace:function(ch, start, length) {
33108         },
33109         characters:function(chars, start, length) {
33110                 chars = _toString.apply(this,arguments);
33111                 //console.log(chars)
33112                 if(chars){
33113                         if (this.cdata) {
33114                                 var charNode = this.doc.createCDATASection(chars);
33115                         } else {
33116                                 var charNode = this.doc.createTextNode(chars);
33117                         }
33118                         if(this.currentElement){
33119                                 this.currentElement.appendChild(charNode);
33120                         }else if(/^\s*$/.test(chars)){
33121                                 this.doc.appendChild(charNode);
33122                                 //process xml
33123                         }
33124                         this.locator && position(this.locator,charNode);
33125                 }
33126         },
33127         skippedEntity:function(name) {
33128         },
33129         endDocument:function() {
33130                 this.doc.normalize();
33131         },
33132         setDocumentLocator:function (locator) {
33133             if(this.locator = locator){// && !('lineNumber' in locator)){
33134                 locator.lineNumber = 0;
33135             }
33136         },
33137         //LexicalHandler
33138         comment:function(chars, start, length) {
33139                 chars = _toString.apply(this,arguments);
33140             var comm = this.doc.createComment(chars);
33141             this.locator && position(this.locator,comm);
33142             appendElement(this, comm);
33143         },
33144         
33145         startCDATA:function() {
33146             //used in characters() methods
33147             this.cdata = true;
33148         },
33149         endCDATA:function() {
33150             this.cdata = false;
33151         },
33152         
33153         startDTD:function(name, publicId, systemId) {
33154                 var impl = this.doc.implementation;
33155             if (impl && impl.createDocumentType) {
33156                 var dt = impl.createDocumentType(name, publicId, systemId);
33157                 this.locator && position(this.locator,dt);
33158                 appendElement(this, dt);
33159             }
33160         },
33161         /**
33162          * @see org.xml.sax.ErrorHandler
33163          * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
33164          */
33165         warning:function(error) {
33166                 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
33167         },
33168         error:function(error) {
33169                 console.error('[xmldom error]\t'+error,_locator(this.locator));
33170         },
33171         fatalError:function(error) {
33172                 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
33173             throw error;
33174         }
33175   };
33176   function _locator(l){
33177         if(l){
33178                 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
33179         }
33180   }
33181   function _toString(chars,start,length){
33182         if(typeof chars == 'string'){
33183                 return chars.substr(start,length)
33184         }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
33185                 if(chars.length >= start+length || start){
33186                         return new java.lang.String(chars,start,length)+'';
33187                 }
33188                 return chars;
33189         }
33190   }
33191
33192   /*
33193    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
33194    * used method of org.xml.sax.ext.LexicalHandler:
33195    *  #comment(chars, start, length)
33196    *  #startCDATA()
33197    *  #endCDATA()
33198    *  #startDTD(name, publicId, systemId)
33199    *
33200    *
33201    * IGNORED method of org.xml.sax.ext.LexicalHandler:
33202    *  #endDTD()
33203    *  #startEntity(name)
33204    *  #endEntity(name)
33205    *
33206    *
33207    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
33208    * IGNORED method of org.xml.sax.ext.DeclHandler
33209    *    #attributeDecl(eName, aName, type, mode, value)
33210    *  #elementDecl(name, model)
33211    *  #externalEntityDecl(name, publicId, systemId)
33212    *  #internalEntityDecl(name, value)
33213    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
33214    * IGNORED method of org.xml.sax.EntityResolver2
33215    *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
33216    *  #resolveEntity(publicId, systemId)
33217    *  #getExternalSubset(name, baseURI)
33218    * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
33219    * IGNORED method of org.xml.sax.DTDHandler
33220    *  #notationDecl(name, publicId, systemId) {};
33221    *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
33222    */
33223   "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
33224         DOMHandler.prototype[key] = function(){return null};
33225   });
33226
33227   /* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
33228   function appendElement (hander,node) {
33229       if (!hander.currentElement) {
33230           hander.doc.appendChild(node);
33231       } else {
33232           hander.currentElement.appendChild(node);
33233       }
33234   }//appendChild and setAttributeNS are preformance key
33235
33236   //if(typeof require == 'function'){
33237         var XMLReader = sax.XMLReader;
33238         var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
33239         exports.XMLSerializer = dom.XMLSerializer ;
33240         exports.DOMParser = DOMParser;
33241   //}
33242   });
33243   var domParser_1 = domParser.DOMImplementation;
33244   var domParser_2 = domParser.XMLSerializer;
33245   var domParser_3 = domParser.DOMParser;
33246
33247   var togeojson = createCommonjsModule(function (module, exports) {
33248   var toGeoJSON = (function() {
33249
33250       var removeSpace = /\s*/g,
33251           trimSpace = /^\s*|\s*$/g,
33252           splitSpace = /\s+/;
33253       // generate a short, numeric hash of a string
33254       function okhash(x) {
33255           if (!x || !x.length) return 0;
33256           for (var i = 0, h = 0; i < x.length; i++) {
33257               h = ((h << 5) - h) + x.charCodeAt(i) | 0;
33258           } return h;
33259       }
33260       // all Y children of X
33261       function get(x, y) { return x.getElementsByTagName(y); }
33262       function attr(x, y) { return x.getAttribute(y); }
33263       function attrf(x, y) { return parseFloat(attr(x, y)); }
33264       // one Y child of X, if any, otherwise null
33265       function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
33266       // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
33267       function norm(el) { if (el.normalize) { el.normalize(); } return el; }
33268       // cast array x into numbers
33269       function numarray(x) {
33270           for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
33271           return o;
33272       }
33273       // get the content of a text node, if any
33274       function nodeVal(x) {
33275           if (x) { norm(x); }
33276           return (x && x.textContent) || '';
33277       }
33278       // get the contents of multiple text nodes, if present
33279       function getMulti(x, ys) {
33280           var o = {}, n, k;
33281           for (k = 0; k < ys.length; k++) {
33282               n = get1(x, ys[k]);
33283               if (n) o[ys[k]] = nodeVal(n);
33284           }
33285           return o;
33286       }
33287       // add properties of Y to X, overwriting if present in both
33288       function extend(x, y) { for (var k in y) x[k] = y[k]; }
33289       // get one coordinate from a coordinate array, if any
33290       function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
33291       // get all coordinates from a coordinate array as [[],[]]
33292       function coord(v) {
33293           var coords = v.replace(trimSpace, '').split(splitSpace),
33294               o = [];
33295           for (var i = 0; i < coords.length; i++) {
33296               o.push(coord1(coords[i]));
33297           }
33298           return o;
33299       }
33300       function coordPair(x) {
33301           var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
33302               ele = get1(x, 'ele'),
33303               // handle namespaced attribute in browser
33304               heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
33305               time = get1(x, 'time'),
33306               e;
33307           if (ele) {
33308               e = parseFloat(nodeVal(ele));
33309               if (!isNaN(e)) {
33310                   ll.push(e);
33311               }
33312           }
33313           return {
33314               coordinates: ll,
33315               time: time ? nodeVal(time) : null,
33316               heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
33317           };
33318       }
33319
33320       // create a new feature collection parent object
33321       function fc() {
33322           return {
33323               type: 'FeatureCollection',
33324               features: []
33325           };
33326       }
33327
33328       var serializer;
33329       if (typeof XMLSerializer !== 'undefined') {
33330           /* istanbul ignore next */
33331           serializer = new XMLSerializer();
33332       // only require xmldom in a node environment
33333       } else if (typeof process === 'object' && !process.browser) {
33334           serializer = new (domParser.XMLSerializer)();
33335       }
33336       function xml2str(str) {
33337           // IE9 will create a new XMLSerializer but it'll crash immediately.
33338           // This line is ignored because we don't run coverage tests in IE9
33339           /* istanbul ignore next */
33340           if (str.xml !== undefined) return str.xml;
33341           return serializer.serializeToString(str);
33342       }
33343
33344       var t = {
33345           kml: function(doc) {
33346
33347               var gj = fc(),
33348                   // styleindex keeps track of hashed styles in order to match features
33349                   styleIndex = {}, styleByHash = {},
33350                   // stylemapindex keeps track of style maps to expose in properties
33351                   styleMapIndex = {},
33352                   // atomic geospatial types supported by KML - MultiGeometry is
33353                   // handled separately
33354                   geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
33355                   // all root placemarks in the file
33356                   placemarks = get(doc, 'Placemark'),
33357                   styles = get(doc, 'Style'),
33358                   styleMaps = get(doc, 'StyleMap');
33359
33360               for (var k = 0; k < styles.length; k++) {
33361                   var hash = okhash(xml2str(styles[k])).toString(16);
33362                   styleIndex['#' + attr(styles[k], 'id')] = hash;
33363                   styleByHash[hash] = styles[k];
33364               }
33365               for (var l = 0; l < styleMaps.length; l++) {
33366                   styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
33367                   var pairs = get(styleMaps[l], 'Pair');
33368                   var pairsMap = {};
33369                   for (var m = 0; m < pairs.length; m++) {
33370                       pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
33371                   }
33372                   styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
33373
33374               }
33375               for (var j = 0; j < placemarks.length; j++) {
33376                   gj.features = gj.features.concat(getPlacemark(placemarks[j]));
33377               }
33378               function kmlColor(v) {
33379                   var color, opacity;
33380                   v = v || '';
33381                   if (v.substr(0, 1) === '#') { v = v.substr(1); }
33382                   if (v.length === 6 || v.length === 3) { color = v; }
33383                   if (v.length === 8) {
33384                       opacity = parseInt(v.substr(0, 2), 16) / 255;
33385                       color = '#' + v.substr(6, 2) +
33386                           v.substr(4, 2) +
33387                           v.substr(2, 2);
33388                   }
33389                   return [color, isNaN(opacity) ? undefined : opacity];
33390               }
33391               function gxCoord(v) { return numarray(v.split(' ')); }
33392               function gxCoords(root) {
33393                   var elems = get(root, 'coord', 'gx'), coords = [], times = [];
33394                   if (elems.length === 0) elems = get(root, 'gx:coord');
33395                   for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
33396                   var timeElems = get(root, 'when');
33397                   for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
33398                   return {
33399                       coords: coords,
33400                       times: times
33401                   };
33402               }
33403               function getGeometry(root) {
33404                   var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
33405                   if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
33406                   if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
33407                   if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
33408                   for (i = 0; i < geotypes.length; i++) {
33409                       geomNodes = get(root, geotypes[i]);
33410                       if (geomNodes) {
33411                           for (j = 0; j < geomNodes.length; j++) {
33412                               geomNode = geomNodes[j];
33413                               if (geotypes[i] === 'Point') {
33414                                   geoms.push({
33415                                       type: 'Point',
33416                                       coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
33417                                   });
33418                               } else if (geotypes[i] === 'LineString') {
33419                                   geoms.push({
33420                                       type: 'LineString',
33421                                       coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
33422                                   });
33423                               } else if (geotypes[i] === 'Polygon') {
33424                                   var rings = get(geomNode, 'LinearRing'),
33425                                       coords = [];
33426                                   for (k = 0; k < rings.length; k++) {
33427                                       coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
33428                                   }
33429                                   geoms.push({
33430                                       type: 'Polygon',
33431                                       coordinates: coords
33432                                   });
33433                               } else if (geotypes[i] === 'Track' ||
33434                                   geotypes[i] === 'gx:Track') {
33435                                   var track = gxCoords(geomNode);
33436                                   geoms.push({
33437                                       type: 'LineString',
33438                                       coordinates: track.coords
33439                                   });
33440                                   if (track.times.length) coordTimes.push(track.times);
33441                               }
33442                           }
33443                       }
33444                   }
33445                   return {
33446                       geoms: geoms,
33447                       coordTimes: coordTimes
33448                   };
33449               }
33450               function getPlacemark(root) {
33451                   var geomsAndTimes = getGeometry(root), i, properties = {},
33452                       name = nodeVal(get1(root, 'name')),
33453                       address = nodeVal(get1(root, 'address')),
33454                       styleUrl = nodeVal(get1(root, 'styleUrl')),
33455                       description = nodeVal(get1(root, 'description')),
33456                       timeSpan = get1(root, 'TimeSpan'),
33457                       timeStamp = get1(root, 'TimeStamp'),
33458                       extendedData = get1(root, 'ExtendedData'),
33459                       lineStyle = get1(root, 'LineStyle'),
33460                       polyStyle = get1(root, 'PolyStyle'),
33461                       visibility = get1(root, 'visibility');
33462
33463                   if (!geomsAndTimes.geoms.length) return [];
33464                   if (name) properties.name = name;
33465                   if (address) properties.address = address;
33466                   if (styleUrl) {
33467                       if (styleUrl[0] !== '#') {
33468                           styleUrl = '#' + styleUrl;
33469                       }
33470
33471                       properties.styleUrl = styleUrl;
33472                       if (styleIndex[styleUrl]) {
33473                           properties.styleHash = styleIndex[styleUrl];
33474                       }
33475                       if (styleMapIndex[styleUrl]) {
33476                           properties.styleMapHash = styleMapIndex[styleUrl];
33477                           properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
33478                       }
33479                       // Try to populate the lineStyle or polyStyle since we got the style hash
33480                       var style = styleByHash[properties.styleHash];
33481                       if (style) {
33482                           if (!lineStyle) lineStyle = get1(style, 'LineStyle');
33483                           if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
33484                       }
33485                   }
33486                   if (description) properties.description = description;
33487                   if (timeSpan) {
33488                       var begin = nodeVal(get1(timeSpan, 'begin'));
33489                       var end = nodeVal(get1(timeSpan, 'end'));
33490                       properties.timespan = { begin: begin, end: end };
33491                   }
33492                   if (timeStamp) {
33493                       properties.timestamp = nodeVal(get1(timeStamp, 'when'));
33494                   }
33495                   if (lineStyle) {
33496                       var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
33497                           color = linestyles[0],
33498                           opacity = linestyles[1],
33499                           width = parseFloat(nodeVal(get1(lineStyle, 'width')));
33500                       if (color) properties.stroke = color;
33501                       if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
33502                       if (!isNaN(width)) properties['stroke-width'] = width;
33503                   }
33504                   if (polyStyle) {
33505                       var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
33506                           pcolor = polystyles[0],
33507                           popacity = polystyles[1],
33508                           fill = nodeVal(get1(polyStyle, 'fill')),
33509                           outline = nodeVal(get1(polyStyle, 'outline'));
33510                       if (pcolor) properties.fill = pcolor;
33511                       if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
33512                       if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
33513                       if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
33514                   }
33515                   if (extendedData) {
33516                       var datas = get(extendedData, 'Data'),
33517                           simpleDatas = get(extendedData, 'SimpleData');
33518
33519                       for (i = 0; i < datas.length; i++) {
33520                           properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
33521                       }
33522                       for (i = 0; i < simpleDatas.length; i++) {
33523                           properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
33524                       }
33525                   }
33526                   if (visibility) {
33527                       properties.visibility = nodeVal(visibility);
33528                   }
33529                   if (geomsAndTimes.coordTimes.length) {
33530                       properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
33531                           geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
33532                   }
33533                   var feature = {
33534                       type: 'Feature',
33535                       geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
33536                           type: 'GeometryCollection',
33537                           geometries: geomsAndTimes.geoms
33538                       },
33539                       properties: properties
33540                   };
33541                   if (attr(root, 'id')) feature.id = attr(root, 'id');
33542                   return [feature];
33543               }
33544               return gj;
33545           },
33546           gpx: function(doc) {
33547               var i,
33548                   tracks = get(doc, 'trk'),
33549                   routes = get(doc, 'rte'),
33550                   waypoints = get(doc, 'wpt'),
33551                   // a feature collection
33552                   gj = fc(),
33553                   feature;
33554               for (i = 0; i < tracks.length; i++) {
33555                   feature = getTrack(tracks[i]);
33556                   if (feature) gj.features.push(feature);
33557               }
33558               for (i = 0; i < routes.length; i++) {
33559                   feature = getRoute(routes[i]);
33560                   if (feature) gj.features.push(feature);
33561               }
33562               for (i = 0; i < waypoints.length; i++) {
33563                   gj.features.push(getPoint(waypoints[i]));
33564               }
33565               function getPoints(node, pointname) {
33566                   var pts = get(node, pointname),
33567                       line = [],
33568                       times = [],
33569                       heartRates = [],
33570                       l = pts.length;
33571                   if (l < 2) return {};  // Invalid line in GeoJSON
33572                   for (var i = 0; i < l; i++) {
33573                       var c = coordPair(pts[i]);
33574                       line.push(c.coordinates);
33575                       if (c.time) times.push(c.time);
33576                       if (c.heartRate) heartRates.push(c.heartRate);
33577                   }
33578                   return {
33579                       line: line,
33580                       times: times,
33581                       heartRates: heartRates
33582                   };
33583               }
33584               function getTrack(node) {
33585                   var segments = get(node, 'trkseg'),
33586                       track = [],
33587                       times = [],
33588                       heartRates = [],
33589                       line;
33590                   for (var i = 0; i < segments.length; i++) {
33591                       line = getPoints(segments[i], 'trkpt');
33592                       if (line) {
33593                           if (line.line) track.push(line.line);
33594                           if (line.times && line.times.length) times.push(line.times);
33595                           if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
33596                       }
33597                   }
33598                   if (track.length === 0) return;
33599                   var properties = getProperties(node);
33600                   extend(properties, getLineStyle(get1(node, 'extensions')));
33601                   if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
33602                   if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
33603                   return {
33604                       type: 'Feature',
33605                       properties: properties,
33606                       geometry: {
33607                           type: track.length === 1 ? 'LineString' : 'MultiLineString',
33608                           coordinates: track.length === 1 ? track[0] : track
33609                       }
33610                   };
33611               }
33612               function getRoute(node) {
33613                   var line = getPoints(node, 'rtept');
33614                   if (!line.line) return;
33615                   var prop = getProperties(node);
33616                   extend(prop, getLineStyle(get1(node, 'extensions')));
33617                   var routeObj = {
33618                       type: 'Feature',
33619                       properties: prop,
33620                       geometry: {
33621                           type: 'LineString',
33622                           coordinates: line.line
33623                       }
33624                   };
33625                   return routeObj;
33626               }
33627               function getPoint(node) {
33628                   var prop = getProperties(node);
33629                   extend(prop, getMulti(node, ['sym']));
33630                   return {
33631                       type: 'Feature',
33632                       properties: prop,
33633                       geometry: {
33634                           type: 'Point',
33635                           coordinates: coordPair(node).coordinates
33636                       }
33637                   };
33638               }
33639               function getLineStyle(extensions) {
33640                   var style = {};
33641                   if (extensions) {
33642                       var lineStyle = get1(extensions, 'line');
33643                       if (lineStyle) {
33644                           var color = nodeVal(get1(lineStyle, 'color')),
33645                               opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
33646                               width = parseFloat(nodeVal(get1(lineStyle, 'width')));
33647                           if (color) style.stroke = color;
33648                           if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
33649                           // GPX width is in mm, convert to px with 96 px per inch
33650                           if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
33651                       }
33652                   }
33653                   return style;
33654               }
33655               function getProperties(node) {
33656                   var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
33657                       links = get(node, 'link');
33658                   if (links.length) prop.links = [];
33659                   for (var i = 0, link; i < links.length; i++) {
33660                       link = { href: attr(links[i], 'href') };
33661                       extend(link, getMulti(links[i], ['text', 'type']));
33662                       prop.links.push(link);
33663                   }
33664                   return prop;
33665               }
33666               return gj;
33667           }
33668       };
33669       return t;
33670   })();
33671
33672   module.exports = toGeoJSON;
33673   });
33674
33675   var _initialized = false;
33676   var _enabled = false;
33677   var _geojson;
33678
33679
33680   function svgData$$1(projection$$1, context, dispatch) {
33681       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
33682       var _showLabels = true;
33683       var detected = utilDetect();
33684       var layer = select(null);
33685       var _vtService;
33686       var _fileList;
33687       var _template;
33688       var _src;
33689
33690
33691       function init() {
33692           if (_initialized) return;  // run once
33693
33694           _geojson = {};
33695           _enabled = true;
33696
33697           function over() {
33698               event.stopPropagation();
33699               event.preventDefault();
33700               event.dataTransfer.dropEffect = 'copy';
33701           }
33702
33703           select('body')
33704               .attr('dropzone', 'copy')
33705               .on('drop.svgData', function() {
33706                   event.stopPropagation();
33707                   event.preventDefault();
33708                   if (!detected.filedrop) return;
33709                   drawData.fileList(event.dataTransfer.files);
33710               })
33711               .on('dragenter.svgData', over)
33712               .on('dragexit.svgData', over)
33713               .on('dragover.svgData', over);
33714
33715           _initialized = true;
33716       }
33717
33718
33719       function getService() {
33720           if (services.vectorTile && !_vtService) {
33721               _vtService = services.vectorTile;
33722               _vtService.event.on('loadedData', throttledRedraw);
33723           } else if (!services.vectorTile && _vtService) {
33724               _vtService = null;
33725           }
33726
33727           return _vtService;
33728       }
33729
33730
33731       function showLayer() {
33732           layerOn();
33733
33734           layer
33735               .style('opacity', 0)
33736               .transition()
33737               .duration(250)
33738               .style('opacity', 1)
33739               .on('end', function () { dispatch.call('change'); });
33740       }
33741
33742
33743       function hideLayer() {
33744           throttledRedraw.cancel();
33745
33746           layer
33747               .transition()
33748               .duration(250)
33749               .style('opacity', 0)
33750               .on('end', layerOff);
33751       }
33752
33753
33754       function layerOn() {
33755           layer.style('display', 'block');
33756       }
33757
33758
33759       function layerOff() {
33760           layer.selectAll('.viewfield-group').remove();
33761           layer.style('display', 'none');
33762       }
33763
33764
33765       // ensure that all geojson features in a collection have IDs
33766       function ensureIDs(gj) {
33767           if (!gj) return null;
33768
33769           if (gj.type === 'FeatureCollection') {
33770               for (var i = 0; i < gj.features.length; i++) {
33771                   ensureFeatureID(gj.features[i]);
33772               }
33773           } else {
33774               ensureFeatureID(gj);
33775           }
33776           return gj;
33777       }
33778
33779
33780       // ensure that each single Feature object has a unique ID
33781       function ensureFeatureID(feature) {
33782           if (!feature) return;
33783           feature.__featurehash__ = utilHashcode(fastJsonStableStringify(feature));
33784           return feature;
33785       }
33786
33787
33788       // Prefer an array of Features instead of a FeatureCollection
33789       function getFeatures(gj) {
33790           if (!gj) return [];
33791
33792           if (gj.type === 'FeatureCollection') {
33793               return gj.features;
33794           } else {
33795               return [gj];
33796           }
33797       }
33798
33799
33800       function featureKey(d) {
33801           return d.__featurehash__;
33802       }
33803
33804
33805       function isPolygon(d) {
33806           return d.geometry.type === 'Polygon' || d.geometry.type === 'MultiPolygon';
33807       }
33808
33809
33810       function clipPathID(d) {
33811           return 'data-' + d.__featurehash__ + '-clippath';
33812       }
33813
33814
33815       function featureClasses(d) {
33816           return [
33817               'data' + d.__featurehash__,
33818               d.geometry.type,
33819               isPolygon(d) ? 'area' : '',
33820               d.__layerID__ || ''
33821           ].filter(Boolean).join(' ');
33822       }
33823
33824
33825       function drawData(selection$$1) {
33826           var vtService = getService();
33827           var getPath = svgPath(projection$$1).geojson;
33828           var getAreaPath = svgPath(projection$$1, null, true).geojson;
33829           var hasData = drawData.hasData();
33830
33831           layer = selection$$1.selectAll('.layer-mapdata')
33832               .data(_enabled && hasData ? [0] : []);
33833
33834           layer.exit()
33835               .remove();
33836
33837           layer = layer.enter()
33838               .append('g')
33839               .attr('class', 'layer-mapdata')
33840               .merge(layer);
33841
33842           var surface = context.surface();
33843           if (!surface || surface.empty()) return;  // not ready to draw yet, starting up
33844
33845
33846           // Gather data
33847           var geoData, polygonData;
33848           if (_template && vtService) {   // fetch data from vector tile service
33849               var sourceID = _template;
33850               vtService.loadTiles(sourceID, _template, projection$$1);
33851               geoData = vtService.data(sourceID, projection$$1);
33852           } else {
33853               geoData = getFeatures(_geojson);
33854           }
33855           geoData = geoData.filter(getPath);
33856           polygonData = geoData.filter(isPolygon);
33857
33858
33859           // Draw clip paths for polygons
33860           var clipPaths = surface.selectAll('defs').selectAll('.clipPath-data')
33861              .data(polygonData, featureKey);
33862
33863           clipPaths.exit()
33864              .remove();
33865
33866           var clipPathsEnter = clipPaths.enter()
33867              .append('clipPath')
33868              .attr('class', 'clipPath-data')
33869              .attr('id', clipPathID);
33870
33871           clipPathsEnter
33872              .append('path');
33873
33874           clipPaths.merge(clipPathsEnter)
33875              .selectAll('path')
33876              .attr('d', getAreaPath);
33877
33878
33879           // Draw fill, shadow, stroke layers
33880           var datagroups = layer
33881               .selectAll('g.datagroup')
33882               .data(['fill', 'shadow', 'stroke']);
33883
33884           datagroups = datagroups.enter()
33885               .append('g')
33886               .attr('class', function(d) { return 'datagroup datagroup-' + d; })
33887               .merge(datagroups);
33888
33889
33890           // Draw paths
33891           var pathData = {
33892               fill: polygonData,
33893               shadow: geoData,
33894               stroke: geoData
33895           };
33896
33897           var paths = datagroups
33898               .selectAll('path')
33899               .data(function(layer) { return pathData[layer]; }, featureKey);
33900
33901           // exit
33902           paths.exit()
33903               .remove();
33904
33905           // enter/update
33906           paths = paths.enter()
33907               .append('path')
33908               .attr('class', function(d) {
33909                   var datagroup = this.parentNode.__data__;
33910                   return 'pathdata ' + datagroup + ' ' + featureClasses(d);
33911               })
33912               .attr('clip-path', function(d) {
33913                   var datagroup = this.parentNode.__data__;
33914                   return datagroup === 'fill' ? ('url(#' + clipPathID(d) + ')') : null;
33915               })
33916               .merge(paths)
33917               .attr('d', function(d) {
33918                   var datagroup = this.parentNode.__data__;
33919                   return datagroup === 'fill' ? getAreaPath(d) : getPath(d);
33920               });
33921
33922
33923           // Draw labels
33924           layer
33925               .call(drawLabels, 'label-halo', geoData)
33926               .call(drawLabels, 'label', geoData);
33927
33928
33929           function drawLabels(selection$$1, textClass, data) {
33930               var labelPath = d3_geoPath(projection$$1);
33931               var labelData = data.filter(function(d) {
33932                   return _showLabels && d.properties && (d.properties.desc || d.properties.name);
33933               });
33934
33935               var labels = selection$$1.selectAll('text.' + textClass)
33936                   .data(labelData, featureKey);
33937
33938               // exit
33939               labels.exit()
33940                   .remove();
33941
33942               // enter/update
33943               labels = labels.enter()
33944                   .append('text')
33945                   .attr('class', function(d) { return textClass + ' ' + featureClasses(d); })
33946                   .merge(labels)
33947                   .text(function(d) {
33948                       return d.properties.desc || d.properties.name;
33949                   })
33950                   .attr('x', function(d) {
33951                       var centroid = labelPath.centroid(d);
33952                       return centroid[0] + 11;
33953                   })
33954                   .attr('y', function(d) {
33955                       var centroid = labelPath.centroid(d);
33956                       return centroid[1];
33957                   });
33958           }
33959       }
33960
33961
33962       function getExtension(fileName) {
33963           if (!fileName) return;
33964
33965           var re = /\.(gpx|kml|(geo)?json)$/i;
33966           var match = fileName.toLowerCase().match(re);
33967           return match && match.length && match[0];
33968       }
33969
33970
33971       function xmlToDom(textdata) {
33972           return (new DOMParser()).parseFromString(textdata, 'text/xml');
33973       }
33974
33975
33976       drawData.setFile = function(extension, data) {
33977           _template = null;
33978           _fileList = null;
33979           _geojson = null;
33980           _src = null;
33981
33982           var gj;
33983           switch (extension) {
33984               case '.gpx':
33985                   gj = togeojson.gpx(xmlToDom(data));
33986                   break;
33987               case '.kml':
33988                   gj = togeojson.kml(xmlToDom(data));
33989                   break;
33990               case '.geojson':
33991               case '.json':
33992                   gj = JSON.parse(data);
33993                   break;
33994           }
33995
33996           if (!isEmpty(gj)) {
33997               _geojson = ensureIDs(gj);
33998               _src = extension + ' data file';
33999               this.fitZoom();
34000           }
34001
34002           dispatch.call('change');
34003           return this;
34004       };
34005
34006
34007       drawData.showLabels = function(val) {
34008           if (!arguments.length) return _showLabels;
34009
34010           _showLabels = val;
34011           return this;
34012       };
34013
34014
34015       drawData.enabled = function(val) {
34016           if (!arguments.length) return _enabled;
34017
34018           _enabled = val;
34019           if (_enabled) {
34020               showLayer();
34021           } else {
34022               hideLayer();
34023           }
34024
34025           dispatch.call('change');
34026           return this;
34027       };
34028
34029
34030       drawData.hasData = function() {
34031           return !!(_template || !isEmpty(_geojson));
34032       };
34033
34034
34035       drawData.template = function(val, src) {
34036           if (!arguments.length) return _template;
34037
34038           // test source against OSM imagery blacklists..
34039           var osm = context.connection();
34040           if (osm) {
34041               var blacklists = osm.imageryBlacklists();
34042               var fail = false;
34043               var tested = 0;
34044               var regex;
34045
34046               for (var i = 0; i < blacklists.length; i++) {
34047                   try {
34048                       regex = new RegExp(blacklists[i]);
34049                       fail = regex.test(val);
34050                       tested++;
34051                       if (fail) break;
34052                   } catch (e) {
34053                       /* noop */
34054                   }
34055               }
34056
34057               // ensure at least one test was run.
34058               if (!tested) {
34059                   regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
34060                   fail = regex.test(val);
34061               }
34062           }
34063
34064           _template = val;
34065           _fileList = null;
34066           _geojson = null;
34067
34068           // strip off the querystring/hash from the template,
34069           // it often includes the access token
34070           _src = src || ('vectortile:' + val.split(/[?#]/)[0]);
34071
34072           dispatch.call('change');
34073           return this;
34074       };
34075
34076
34077       drawData.geojson = function(gj, src) {
34078           if (!arguments.length) return _geojson;
34079
34080           _template = null;
34081           _fileList = null;
34082           _geojson = null;
34083           _src = null;
34084
34085           if (!isEmpty(gj)) {
34086               _geojson = ensureIDs(gj);
34087               _src = src || 'unknown.geojson';
34088           }
34089
34090           dispatch.call('change');
34091           return this;
34092       };
34093
34094
34095       drawData.fileList = function(fileList) {
34096           if (!arguments.length) return _fileList;
34097
34098           _template = null;
34099           _fileList = fileList;
34100           _geojson = null;
34101           _src = null;
34102
34103           if (!fileList || !fileList.length) return this;
34104           var f = fileList[0];
34105           var extension = getExtension(f.name);
34106           var reader = new FileReader();
34107           reader.onload = (function() {
34108               return function(e) {
34109                   drawData.setFile(extension, e.target.result);
34110               };
34111           })(f);
34112
34113           reader.readAsText(f);
34114
34115           return this;
34116       };
34117
34118
34119       drawData.url = function(url, defaultExtension) {
34120           _template = null;
34121           _fileList = null;
34122           _geojson = null;
34123           _src = null;
34124
34125           // strip off any querystring/hash from the url before checking extension
34126           var testUrl = url.split(/[?#]/)[0];
34127           var extension = getExtension(testUrl) || defaultExtension;
34128           if (extension) {
34129               _template = null;
34130               d3_text(url, function(err, data) {
34131                   if (err) return;
34132                   drawData.setFile(extension, data);
34133               });
34134           } else {
34135               drawData.template(url);
34136           }
34137
34138           return this;
34139       };
34140
34141
34142       drawData.getSrc = function() {
34143           return _src || '';
34144       };
34145
34146
34147       drawData.fitZoom = function() {
34148           var features = getFeatures(_geojson);
34149           if (!features.length) return;
34150
34151           var map = context.map();
34152           var viewport = map.trimmedExtent().polygon();
34153           var coords = reduce(features, function(coords, feature) {
34154               var c = feature.geometry.coordinates;
34155
34156               /* eslint-disable no-fallthrough */
34157               switch (feature.geometry.type) {
34158                   case 'Point':
34159                       c = [c];
34160                   case 'MultiPoint':
34161                   case 'LineString':
34162                       break;
34163
34164                   case 'MultiPolygon':
34165                       c = flatten(c);
34166                   case 'Polygon':
34167                   case 'MultiLineString':
34168                       c = flatten(c);
34169                       break;
34170               }
34171               /* eslint-enable no-fallthrough */
34172
34173               return union(coords, c);
34174           }, []);
34175
34176           if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
34177               var extent = geoExtent$$1(d3_geoBounds({ type: 'LineString', coordinates: coords }));
34178               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
34179           }
34180
34181           return this;
34182       };
34183
34184
34185       init();
34186       return drawData;
34187   }
34188
34189   function svgDebug$$1(projection, context) {
34190
34191       function drawDebug(selection$$1) {
34192           var showsTile = context.getDebug('tile');
34193           var showsCollision = context.getDebug('collision');
34194           var showsImagery = context.getDebug('imagery');
34195           var showsCommunity = context.getDebug('community');
34196           var showsImperial = context.getDebug('imperial');
34197           var showsDriveLeft = context.getDebug('driveLeft');
34198           var showsTouchTargets = context.getDebug('target');
34199
34200           var debugData = [];
34201           if (showsTile) {
34202               debugData.push({ class: 'red', label: 'tile' });
34203           }
34204           if (showsCollision) {
34205               debugData.push({ class: 'yellow', label: 'collision' });
34206           }
34207           if (showsImagery) {
34208               debugData.push({ class: 'orange', label: 'imagery' });
34209           }
34210           if (showsCommunity) {
34211               debugData.push({ class: 'blue', label: 'community' });
34212           }
34213           if (showsImperial) {
34214               debugData.push({ class: 'cyan', label: 'imperial' });
34215           }
34216           if (showsDriveLeft) {
34217               debugData.push({ class: 'green', label: 'driveLeft' });
34218           }
34219           if (showsTouchTargets) {
34220               debugData.push({ class: 'pink', label: 'touchTargets' });
34221           }
34222
34223
34224           var legend = select('#content')
34225               .selectAll('.debug-legend')
34226               .data(debugData.length ? [0] : []);
34227
34228           legend.exit()
34229               .remove();
34230
34231           legend = legend.enter()
34232               .append('div')
34233               .attr('class', 'fillD debug-legend')
34234               .merge(legend);
34235
34236
34237           var legendItems = legend.selectAll('.debug-legend-item')
34238               .data(debugData, function(d) { return d.label; });
34239
34240           legendItems.exit()
34241               .remove();
34242
34243           legendItems.enter()
34244               .append('span')
34245               .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
34246               .text(function(d) { return d.label; });
34247
34248
34249           var layer = selection$$1.selectAll('.layer-debug')
34250               .data(showsImagery || showsCommunity || showsImperial || showsDriveLeft ? [0] : []);
34251
34252           layer.exit()
34253               .remove();
34254
34255           layer = layer.enter()
34256               .append('g')
34257               .attr('class', 'layer-debug')
34258               .merge(layer);
34259
34260
34261           var extent = context.map().extent();
34262           var matchImagery = (showsImagery && data.imagery.query.bbox(extent.rectangle(), true)) || [];
34263           var features = matchImagery.map(function(d) { return data.imagery.features[d.id]; });
34264
34265           var imagery = layer.selectAll('path.debug-imagery')
34266               .data(features);
34267
34268           imagery.exit()
34269               .remove();
34270
34271           imagery.enter()
34272               .append('path')
34273               .attr('class', 'debug-imagery debug orange');
34274
34275
34276           var community = layer.selectAll('path.debug-community')
34277               .data(showsCommunity ? values$1(data.community.features) : []);
34278
34279           community.exit()
34280               .remove();
34281
34282           community.enter()
34283               .append('path')
34284               .attr('class', 'debug-community debug blue');
34285
34286
34287           var imperial = layer
34288               .selectAll('path.debug-imperial')
34289               .data(showsImperial ? [dataImperial] : []);
34290
34291           imperial.exit()
34292               .remove();
34293
34294           imperial.enter()
34295               .append('path')
34296               .attr('class', 'debug-imperial debug cyan');
34297
34298
34299           var driveLeft = layer
34300               .selectAll('path.debug-drive-left')
34301               .data(showsDriveLeft ? [dataDriveLeft] : []);
34302
34303           driveLeft.exit()
34304               .remove();
34305
34306           driveLeft.enter()
34307               .append('path')
34308               .attr('class', 'debug-drive-left debug green');
34309
34310
34311           // update
34312           layer.selectAll('path')
34313               .attr('d', svgPath(projection).geojson);
34314       }
34315
34316
34317       // This looks strange because `enabled` methods on other layers are
34318       // chainable getter/setters, and this one is just a getter.
34319       drawDebug.enabled = function() {
34320           if (!arguments.length) {
34321               return context.getDebug('tile') ||
34322                   context.getDebug('collision') ||
34323                   context.getDebug('imagery') ||
34324                   context.getDebug('imperial') ||
34325                   context.getDebug('driveLeft') ||
34326                   context.getDebug('target');
34327           } else {
34328               return this;
34329           }
34330       };
34331
34332
34333       return drawDebug;
34334   }
34335
34336   /*
34337       A standalone SVG element that contains only a `defs` sub-element. To be
34338       used once globally, since defs IDs must be unique within a document.
34339   */
34340   function svgDefs(context) {
34341
34342       function drawDefs(selection$$1) {
34343           var defs = selection$$1.append('defs');
34344
34345           // add markers
34346           defs
34347               .append('marker')
34348               .attr('id', 'oneway-marker')
34349               .attr('viewBox', '0 0 10 5')
34350               .attr('refX', 2.5)
34351               .attr('refY', 2.5)
34352               .attr('markerWidth', 2)
34353               .attr('markerHeight', 2)
34354               .attr('markerUnits', 'strokeWidth')
34355               .attr('orient', 'auto')
34356               .append('path')
34357               .attr('class', 'oneway-marker-path')
34358               .attr('d', 'M 5,3 L 0,3 L 0,2 L 5,2 L 5,0 L 10,2.5 L 5,5 z')
34359               .attr('stroke', 'none')
34360               .attr('fill', '#000')
34361               .attr('opacity', '0.75');
34362
34363           // SVG markers have to be given a colour where they're defined
34364           // (they can't inherit it from the line they're attached to),
34365           // so we need to manually define markers for each color of tag
34366           // (also, it's slightly nicer if we can control the
34367           // positioning for different tags)
34368           function addSidedMarker(name, color, offset) {
34369               defs
34370                   .append('marker')
34371                   .attr('id', 'sided-marker-' + name)
34372                   .attr('viewBox', '0 0 2 2')
34373                   .attr('refX', 1)
34374                   .attr('refY', -offset)
34375                   .attr('markerWidth', 1.5)
34376                   .attr('markerHeight', 1.5)
34377                   .attr('markerUnits', 'strokeWidth')
34378                   .attr('orient', 'auto')
34379                   .append('path')
34380                   .attr('class', 'sided-marker-path sided-marker-' + name + '-path')
34381                   .attr('d', 'M 0,0 L 1,1 L 2,0 z')
34382                   .attr('stroke', 'none')
34383                   .attr('fill', color);
34384           }
34385           addSidedMarker('natural', 'rgb(140, 208, 95)', 0);
34386           // for a coastline, the arrows are (somewhat unintuitively) on
34387           // the water side, so let's color them blue (with a gap) to
34388           // give a stronger indication
34389           addSidedMarker('coastline', '#77dede', 1);
34390           // barriers have a dashed line, and separating the triangle
34391           // from the line visually suits that
34392           addSidedMarker('barrier', '#ddd', 1);
34393           addSidedMarker('man_made', '#fff', 0);
34394
34395           defs
34396               .append('marker')
34397               .attr('id', 'viewfield-marker')
34398               .attr('viewBox', '0 0 16 16')
34399               .attr('refX', 8)
34400               .attr('refY', 16)
34401               .attr('markerWidth', 4)
34402               .attr('markerHeight', 4)
34403               .attr('markerUnits', 'strokeWidth')
34404               .attr('orient', 'auto')
34405               .append('path')
34406               .attr('class', 'viewfield-marker-path')
34407               .attr('d', 'M 6,14 C 8,13.4 8,13.4 10,14 L 16,3 C 12,0 4,0 0,3 z')
34408               .attr('fill', '#333')
34409               .attr('fill-opacity', '0.75')
34410               .attr('stroke', '#fff')
34411               .attr('stroke-width', '0.5px')
34412               .attr('stroke-opacity', '0.75');
34413
34414           defs
34415               .append('marker')
34416               .attr('id', 'viewfield-marker-wireframe')
34417               .attr('viewBox', '0 0 16 16')
34418               .attr('refX', 8)
34419               .attr('refY', 16)
34420               .attr('markerWidth', 4)
34421               .attr('markerHeight', 4)
34422               .attr('markerUnits', 'strokeWidth')
34423               .attr('orient', 'auto')
34424               .append('path')
34425               .attr('class', 'viewfield-marker-path')
34426               .attr('d', 'M 6,14 C 8,13.4 8,13.4 10,14 L 16,3 C 12,0 4,0 0,3 z')
34427               .attr('fill', 'none')
34428               .attr('stroke', '#fff')
34429               .attr('stroke-width', '0.5px')
34430               .attr('stroke-opacity', '0.75');
34431
34432           // add patterns
34433           var patterns = defs.selectAll('pattern')
34434               .data([
34435                   // pattern name, pattern image name
34436                   ['beach', 'dots'],
34437                   ['construction', 'construction'],
34438                   ['cemetery', 'cemetery'],
34439                   ['cemetery_christian', 'cemetery_christian'],
34440                   ['cemetery_buddhist', 'cemetery_buddhist'],
34441                   ['cemetery_muslim', 'cemetery_muslim'],
34442                   ['cemetery_jewish', 'cemetery_jewish'],
34443                   ['farmland', 'farmland'],
34444                   ['farmyard', 'farmyard'],
34445                   ['forest', 'forest'],
34446                   ['forest_broadleaved', 'forest_broadleaved'],
34447                   ['forest_needleleaved', 'forest_needleleaved'],
34448                   ['forest_leafless', 'forest_leafless'],
34449                   ['grass', 'grass'],
34450                   ['landfill', 'landfill'],
34451                   ['meadow', 'grass'],
34452                   ['orchard', 'orchard'],
34453                   ['pond', 'pond'],
34454                   ['quarry', 'quarry'],
34455                   ['scrub', 'bushes'],
34456                   ['vineyard', 'vineyard'],
34457                   ['waves', 'waves'],
34458                   ['wetland', 'wetland'],
34459                   ['wetland_marsh', 'wetland_marsh'],
34460                   ['wetland_swamp', 'wetland_swamp'],
34461                   ['wetland_bog', 'wetland_bog'],
34462                   ['wetland_reedbed', 'wetland_reedbed']
34463               ])
34464               .enter()
34465               .append('pattern')
34466               .attr('id', function (d) { return 'pattern-' + d[0]; })
34467               .attr('width', 32)
34468               .attr('height', 32)
34469               .attr('patternUnits', 'userSpaceOnUse');
34470
34471           patterns
34472               .append('rect')
34473               .attr('x', 0)
34474               .attr('y', 0)
34475               .attr('width', 32)
34476               .attr('height', 32)
34477               .attr('class', function (d) { return 'pattern-color-' + d[0]; });
34478
34479           patterns
34480               .append('image')
34481               .attr('x', 0)
34482               .attr('y', 0)
34483               .attr('width', 32)
34484               .attr('height', 32)
34485               .attr('xlink:href', function (d) {
34486                   return context.imagePath('pattern/' + d[1] + '.png');
34487               });
34488
34489           // add clip paths
34490           defs.selectAll('clipPath')
34491               .data([12, 18, 20, 32, 45])
34492               .enter()
34493               .append('clipPath')
34494               .attr('id', function (d) { return 'clip-square-' + d; })
34495               .append('rect')
34496               .attr('x', 0)
34497               .attr('y', 0)
34498               .attr('width', function (d) { return d; })
34499               .attr('height', function (d) { return d; });
34500
34501           // add symbol spritesheets
34502           defs
34503               .call(drawDefs.addSprites, [
34504                   'iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'community-sprite'
34505               ]);
34506       }
34507
34508
34509       drawDefs.addSprites = function(selection$$1, ids) {
34510           var spritesheets = selection$$1.selectAll('.spritesheet');
34511           var currData = spritesheets.data();
34512           var data = uniq(currData.concat(ids));
34513
34514           spritesheets
34515               .data(data)
34516               .enter()
34517               .append('g')
34518               .attr('class', function(d) { return 'spritesheet spritesheet-' + d; })
34519               .each(function(d) {
34520                   var url = context.imagePath(d + '.svg');
34521                   var node = select(this).node();
34522                   request(url)
34523                       .mimeType('image/svg+xml')
34524                       .response(function(xhr) { return xhr.responseXML; })
34525                       .get(function(err, svg) {
34526                           if (err) return;
34527                           node.appendChild(
34528                               select(svg.documentElement).attr('id', d).node()
34529                           );
34530                       });
34531               });
34532       };
34533
34534
34535       return drawDefs;
34536   }
34537
34538   function svgIcon(name, svgklass, useklass) {
34539       return function drawIcon(selection) {
34540           selection.selectAll('svg')
34541               .data([0])
34542               .enter()
34543               .append('svg')
34544               .attr('class', 'icon ' + (svgklass || ''))
34545               .append('use')
34546               .attr('xlink:href', name)
34547               .attr('class', useklass);
34548       };
34549   }
34550
34551   function svgLabels(projection$$1, context) {
34552       var path = d3_geoPath(projection$$1);
34553       var detected = utilDetect();
34554       var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
34555       var _rdrawn = rbush_1();
34556       var _rskipped = rbush_1();
34557       var _textWidthCache = {};
34558       var _entitybboxes = {};
34559
34560       // Listed from highest to lowest priority
34561       var labelStack = [
34562           ['line', 'aeroway', '*', 12],
34563           ['line', 'highway', 'motorway', 12],
34564           ['line', 'highway', 'trunk', 12],
34565           ['line', 'highway', 'primary', 12],
34566           ['line', 'highway', 'secondary', 12],
34567           ['line', 'highway', 'tertiary', 12],
34568           ['line', 'highway', '*', 12],
34569           ['line', 'railway', '*', 12],
34570           ['line', 'waterway', '*', 12],
34571           ['area', 'aeroway', '*', 12],
34572           ['area', 'amenity', '*', 12],
34573           ['area', 'building', '*', 12],
34574           ['area', 'historic', '*', 12],
34575           ['area', 'leisure', '*', 12],
34576           ['area', 'man_made', '*', 12],
34577           ['area', 'natural', '*', 12],
34578           ['area', 'shop', '*', 12],
34579           ['area', 'tourism', '*', 12],
34580           ['area', 'camp_site', '*', 12],
34581           ['point', 'aeroway', '*', 10],
34582           ['point', 'amenity', '*', 10],
34583           ['point', 'building', '*', 10],
34584           ['point', 'historic', '*', 10],
34585           ['point', 'leisure', '*', 10],
34586           ['point', 'man_made', '*', 10],
34587           ['point', 'natural', '*', 10],
34588           ['point', 'shop', '*', 10],
34589           ['point', 'tourism', '*', 10],
34590           ['point', 'camp_site', '*', 10],
34591           ['line', 'name', '*', 12],
34592           ['area', 'name', '*', 12],
34593           ['point', 'name', '*', 10]
34594       ];
34595
34596
34597       function blacklisted(preset) {
34598           var noIcons = ['building', 'landuse', 'natural'];
34599           return some(noIcons, function(s) {
34600               return preset.id.indexOf(s) >= 0;
34601           });
34602       }
34603
34604
34605       function get(array, prop) {
34606           return function(d, i) { return array[i][prop]; };
34607       }
34608
34609
34610       function textWidth(text, size, elem) {
34611           var c = _textWidthCache[size];
34612           if (!c) c = _textWidthCache[size] = {};
34613
34614           if (c[text]) {
34615               return c[text];
34616
34617           } else if (elem) {
34618               c[text] = elem.getComputedTextLength();
34619               return c[text];
34620
34621           } else {
34622               var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
34623               if (str === null) {
34624                   return size / 3 * 2 * text.length;
34625               } else {
34626                   return size / 3 * (2 * text.length + str.length);
34627               }
34628           }
34629       }
34630
34631
34632       function drawLinePaths(selection, entities, filter, classes, labels) {
34633           var paths = selection.selectAll('path')
34634               .filter(filter)
34635               .data(entities, osmEntity$$1.key);
34636
34637           // exit
34638           paths.exit()
34639               .remove();
34640
34641           // enter/update
34642           paths.enter()
34643               .append('path')
34644               .style('stroke-width', get(labels, 'font-size'))
34645               .attr('id', function(d) { return 'labelpath-' + d.id; })
34646               .attr('class', classes)
34647               .merge(paths)
34648               .attr('d', get(labels, 'lineString'));
34649       }
34650
34651
34652       function drawLineLabels(selection, entities, filter, classes, labels) {
34653           var texts = selection.selectAll('text.' + classes)
34654               .filter(filter)
34655               .data(entities, osmEntity$$1.key);
34656
34657           // exit
34658           texts.exit()
34659               .remove();
34660
34661           // enter
34662           texts.enter()
34663               .append('text')
34664               .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
34665               .attr('dy', baselineHack ? '0.35em' : null)
34666               .append('textPath')
34667               .attr('class', 'textpath');
34668
34669           // update
34670           selection.selectAll('text.' + classes).selectAll('.textpath')
34671               .filter(filter)
34672               .data(entities, osmEntity$$1.key)
34673               .attr('startOffset', '50%')
34674               .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
34675               .text(utilDisplayNameForPath);
34676       }
34677
34678
34679       function drawPointLabels(selection, entities, filter, classes, labels) {
34680           var texts = selection.selectAll('text.' + classes)
34681               .filter(filter)
34682               .data(entities, osmEntity$$1.key);
34683
34684           // exit
34685           texts.exit()
34686               .remove();
34687
34688           // enter/update
34689           texts.enter()
34690               .append('text')
34691               .attr('class', function(d, i) {
34692                   return classes + ' ' + labels[i].classes + ' ' + d.id;
34693               })
34694               .merge(texts)
34695               .attr('x', get(labels, 'x'))
34696               .attr('y', get(labels, 'y'))
34697               .style('text-anchor', get(labels, 'textAnchor'))
34698               .text(utilDisplayName)
34699               .each(function(d, i) {
34700                   textWidth(utilDisplayName(d), labels[i].height, this);
34701               });
34702       }
34703
34704
34705       function drawAreaLabels(selection, entities, filter, classes, labels) {
34706           entities = entities.filter(hasText);
34707           labels = labels.filter(hasText);
34708           drawPointLabels(selection, entities, filter, classes, labels);
34709
34710           function hasText(d, i) {
34711               return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
34712           }
34713       }
34714
34715
34716       function drawAreaIcons(selection, entities, filter, classes, labels) {
34717           var icons = selection.selectAll('use.' + classes)
34718               .filter(filter)
34719               .data(entities, osmEntity$$1.key);
34720
34721           // exit
34722           icons.exit()
34723               .remove();
34724
34725           // enter/update
34726           icons.enter()
34727               .append('use')
34728               .attr('class', 'icon ' + classes)
34729               .attr('width', '17px')
34730               .attr('height', '17px')
34731               .merge(icons)
34732               .attr('transform', get(labels, 'transform'))
34733               .attr('xlink:href', function(d) {
34734                   var preset = context.presets().match(d, context.graph());
34735                   var picon = preset && preset.icon;
34736
34737                   if (!picon) {
34738                       return '';
34739                   } else {
34740                       var isMaki = /^maki-/.test(picon);
34741                       return '#' + picon + (isMaki ? '-15' : '');
34742                   }
34743               });
34744       }
34745
34746
34747       function drawCollisionBoxes(selection, rtree, which) {
34748           var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
34749
34750           var gj = [];
34751           if (context.getDebug('collision')) {
34752               gj = rtree.all().map(function(d) {
34753                   return { type: 'Polygon', coordinates: [[
34754                       [d.minX, d.minY],
34755                       [d.maxX, d.minY],
34756                       [d.maxX, d.maxY],
34757                       [d.minX, d.maxY],
34758                       [d.minX, d.minY]
34759                   ]]};
34760               });
34761           }
34762
34763           var boxes = selection.selectAll('.' + which)
34764               .data(gj);
34765
34766           // exit
34767           boxes.exit()
34768               .remove();
34769
34770           // enter/update
34771           boxes.enter()
34772               .append('path')
34773               .attr('class', classes)
34774               .merge(boxes)
34775               .attr('d', d3_geoPath());
34776       }
34777
34778
34779       function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
34780           var wireframe = context.surface().classed('fill-wireframe');
34781           var zoom = geoScaleToZoom(projection$$1.scale());
34782
34783           var labelable = [];
34784           var renderNodeAs = {};
34785           var i, j, k, entity, geometry;
34786
34787           for (i = 0; i < labelStack.length; i++) {
34788               labelable.push([]);
34789           }
34790
34791           if (fullRedraw) {
34792               _rdrawn.clear();
34793               _rskipped.clear();
34794               _entitybboxes = {};
34795
34796           } else {
34797               for (i = 0; i < entities.length; i++) {
34798                   entity = entities[i];
34799                   var toRemove = []
34800                       .concat(_entitybboxes[entity.id] || [])
34801                       .concat(_entitybboxes[entity.id + 'I'] || []);
34802
34803                   for (j = 0; j < toRemove.length; j++) {
34804                       _rdrawn.remove(toRemove[j]);
34805                       _rskipped.remove(toRemove[j]);
34806                   }
34807               }
34808           }
34809
34810           // Loop through all the entities to do some preprocessing
34811           for (i = 0; i < entities.length; i++) {
34812               entity = entities[i];
34813               geometry = entity.geometry(graph);
34814
34815               // Insert collision boxes around interesting points/vertices
34816               if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
34817                   var hasDirections = entity.directions(graph, projection$$1).length;
34818                   var markerPadding;
34819
34820                   if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
34821                       renderNodeAs[entity.id] = 'point';
34822                       markerPadding = 20;   // extra y for marker height
34823                   } else {
34824                       renderNodeAs[entity.id] = 'vertex';
34825                       markerPadding = 0;
34826                   }
34827
34828                   var coord = projection$$1(entity.loc);
34829                   var nodePadding = 10;
34830                   var bbox = {
34831                       minX: coord[0] - nodePadding,
34832                       minY: coord[1] - nodePadding - markerPadding,
34833                       maxX: coord[0] + nodePadding,
34834                       maxY: coord[1] + nodePadding
34835                   };
34836
34837                   doInsert(bbox, entity.id + 'P');
34838               }
34839
34840               // From here on, treat vertices like points
34841               if (geometry === 'vertex') {
34842                   geometry = 'point';
34843               }
34844
34845               // Determine which entities are label-able
34846               var preset = geometry === 'area' && context.presets().match(entity, graph);
34847               var icon = preset && !blacklisted(preset) && preset.icon;
34848
34849               if (!icon && !utilDisplayName(entity))
34850                   continue;
34851
34852               for (k = 0; k < labelStack.length; k++) {
34853                   var matchGeom = labelStack[k][0];
34854                   var matchKey = labelStack[k][1];
34855                   var matchVal = labelStack[k][2];
34856                   var hasVal = entity.tags[matchKey];
34857
34858                   if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
34859                       labelable[k].push(entity);
34860                       break;
34861                   }
34862               }
34863           }
34864
34865           var positions = {
34866               point: [],
34867               line: [],
34868               area: []
34869           };
34870
34871           var labelled = {
34872               point: [],
34873               line: [],
34874               area: []
34875           };
34876
34877           // Try and find a valid label for labellable entities
34878           for (k = 0; k < labelable.length; k++) {
34879               var fontSize = labelStack[k][3];
34880
34881               for (i = 0; i < labelable[k].length; i++) {
34882                   entity = labelable[k][i];
34883                   geometry = entity.geometry(graph);
34884
34885                   var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
34886                   var name = getName(entity);
34887                   var width = name && textWidth(name, fontSize);
34888                   var p = null;
34889
34890                   if (geometry === 'point' || geometry === 'vertex') {
34891                       // no point or vertex labels in wireframe mode
34892                       // no vertex labels at low zooms (vertices have no icons)
34893                       if (wireframe) continue;
34894                       var renderAs = renderNodeAs[entity.id];
34895                       if (renderAs === 'vertex' && zoom < 17) continue;
34896
34897                       p = getPointLabel(entity, width, fontSize, renderAs);
34898
34899                   } else if (geometry === 'line') {
34900                       p = getLineLabel(entity, width, fontSize);
34901
34902                   } else if (geometry === 'area') {
34903                       p = getAreaLabel(entity, width, fontSize);
34904                   }
34905
34906                   if (p) {
34907                       if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
34908                       p.classes = geometry + ' tag-' + labelStack[k][1];
34909                       positions[geometry].push(p);
34910                       labelled[geometry].push(entity);
34911                   }
34912               }
34913           }
34914
34915
34916           function isInterestingVertex(entity) {
34917               var selectedIDs = context.selectedIDs();
34918
34919               return entity.hasInterestingTags() ||
34920                   entity.isEndpoint(graph) ||
34921                   entity.isConnected(graph) ||
34922                   selectedIDs.indexOf(entity.id) !== -1 ||
34923                   some(graph.parentWays(entity), function(parent) {
34924                       return selectedIDs.indexOf(parent.id) !== -1;
34925                   });
34926           }
34927
34928
34929           function getPointLabel(entity, width, height, geometry) {
34930               var y = (geometry === 'point' ? -12 : 0);
34931               var pointOffsets = {
34932                   ltr: [15, y, 'start'],
34933                   rtl: [-15, y, 'end']
34934               };
34935
34936               var coord = projection$$1(entity.loc);
34937               var textPadding = 2;
34938               var offset = pointOffsets[textDirection];
34939               var p = {
34940                   height: height,
34941                   width: width,
34942                   x: coord[0] + offset[0],
34943                   y: coord[1] + offset[1],
34944                   textAnchor: offset[2]
34945               };
34946
34947               // insert a collision box for the text label..
34948               var bbox;
34949               if (textDirection === 'rtl') {
34950                   bbox = {
34951                       minX: p.x - width - textPadding,
34952                       minY: p.y - (height / 2) - textPadding,
34953                       maxX: p.x + textPadding,
34954                       maxY: p.y + (height / 2) + textPadding
34955                   };
34956               } else {
34957                   bbox = {
34958                       minX: p.x - textPadding,
34959                       minY: p.y - (height / 2) - textPadding,
34960                       maxX: p.x + width + textPadding,
34961                       maxY: p.y + (height / 2) + textPadding
34962                   };
34963               }
34964
34965               if (tryInsert([bbox], entity.id, true)) {
34966                   return p;
34967               }
34968           }
34969
34970
34971           function getLineLabel(entity, width, height) {
34972               var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
34973               var points = map$3(graph.childNodes(entity), 'loc').map(projection$$1);
34974               var length = geoPathLength(points);
34975
34976               if (length < width + 20) return;
34977
34978               // todo: properly clip points to viewport
34979
34980               // % along the line to attempt to place the label
34981               var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
34982                                  25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
34983               var padding = 3;
34984
34985               for (var i = 0; i < lineOffsets.length; i++) {
34986                   var offset = lineOffsets[i];
34987                   var middle = offset / 100 * length;
34988                   var start = middle - width / 2;
34989
34990                   if (start < 0 || start + width > length) continue;
34991
34992                   // generate subpath and ignore paths that are invalid or don't cross viewport.
34993                   var sub = subpath(points, start, start + width);
34994                   if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
34995                       continue;
34996                   }
34997
34998                   var isReverse = reverse(sub);
34999                   if (isReverse) {
35000                       sub = sub.reverse();
35001                   }
35002
35003                   var bboxes = [];
35004                   var boxsize = (height + 2) / 2;
35005
35006                   for (var j = 0; j < sub.length - 1; j++) {
35007                       var a = sub[j];
35008                       var b = sub[j + 1];
35009
35010                       // split up the text into small collision boxes
35011                       var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
35012
35013                       for (var box = 0; box < num; box++) {
35014                           var p = geoVecInterp(a, b, box / num);
35015                           var x0 = p[0] - boxsize - padding;
35016                           var y0 = p[1] - boxsize - padding;
35017                           var x1 = p[0] + boxsize + padding;
35018                           var y1 = p[1] + boxsize + padding;
35019
35020                           bboxes.push({
35021                               minX: Math.min(x0, x1),
35022                               minY: Math.min(y0, y1),
35023                               maxX: Math.max(x0, x1),
35024                               maxY: Math.max(y0, y1)
35025                           });
35026                       }
35027                   }
35028
35029                   if (tryInsert(bboxes, entity.id, false)) {   // accept this one
35030                       return {
35031                           'font-size': height + 2,
35032                           lineString: lineString(sub),
35033                           startOffset: offset + '%'
35034                       };
35035                   }
35036               }
35037
35038               function reverse(p) {
35039                   var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
35040                   return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
35041               }
35042
35043               function lineString(points) {
35044                   return 'M' + points.join('L');
35045               }
35046
35047               function subpath(points, from, to) {
35048                   var sofar = 0;
35049                   var start, end, i0, i1;
35050
35051                   for (var i = 0; i < points.length - 1; i++) {
35052                       var a = points[i];
35053                       var b = points[i + 1];
35054                       var current = geoVecLength(a, b);
35055                       var portion;
35056                       if (!start && sofar + current >= from) {
35057                           portion = (from - sofar) / current;
35058                           start = [
35059                               a[0] + portion * (b[0] - a[0]),
35060                               a[1] + portion * (b[1] - a[1])
35061                           ];
35062                           i0 = i + 1;
35063                       }
35064                       if (!end && sofar + current >= to) {
35065                           portion = (to - sofar) / current;
35066                           end = [
35067                               a[0] + portion * (b[0] - a[0]),
35068                               a[1] + portion * (b[1] - a[1])
35069                           ];
35070                           i1 = i + 1;
35071                       }
35072                       sofar += current;
35073                   }
35074
35075                   var result = points.slice(i0, i1);
35076                   result.unshift(start);
35077                   result.push(end);
35078                   return result;
35079               }
35080           }
35081
35082
35083           function getAreaLabel(entity, width, height) {
35084               var centroid = path.centroid(entity.asGeoJSON(graph, true));
35085               var extent = entity.extent(graph);
35086               var areaWidth = projection$$1(extent[1])[0] - projection$$1(extent[0])[0];
35087
35088               if (isNaN(centroid[0]) || areaWidth < 20) return;
35089
35090               var preset = context.presets().match(entity, context.graph());
35091               var picon = preset && preset.icon;
35092               var iconSize = 17;
35093               var padding = 2;
35094               var p = {};
35095
35096               if (picon) {  // icon and label..
35097                   if (addIcon()) {
35098                       addLabel(iconSize + padding);
35099                       return p;
35100                   }
35101               } else {   // label only..
35102                   if (addLabel(0)) {
35103                       return p;
35104                   }
35105               }
35106
35107
35108               function addIcon() {
35109                   var iconX = centroid[0] - (iconSize / 2);
35110                   var iconY = centroid[1] - (iconSize / 2);
35111                   var bbox = {
35112                       minX: iconX,
35113                       minY: iconY,
35114                       maxX: iconX + iconSize,
35115                       maxY: iconY + iconSize
35116                   };
35117
35118                   if (tryInsert([bbox], entity.id + 'I', true)) {
35119                       p.transform = 'translate(' + iconX + ',' + iconY + ')';
35120                       return true;
35121                   }
35122                   return false;
35123               }
35124
35125               function addLabel(yOffset) {
35126                   if (width && areaWidth >= width + 20) {
35127                       var labelX = centroid[0];
35128                       var labelY = centroid[1] + yOffset;
35129                       var bbox = {
35130                           minX: labelX - (width / 2) - padding,
35131                           minY: labelY - (height / 2) - padding,
35132                           maxX: labelX + (width / 2) + padding,
35133                           maxY: labelY + (height / 2) + padding
35134                       };
35135
35136                       if (tryInsert([bbox], entity.id, true)) {
35137                           p.x = labelX;
35138                           p.y = labelY;
35139                           p.textAnchor = 'middle';
35140                           p.height = height;
35141                           return true;
35142                       }
35143                   }
35144                   return false;
35145               }
35146           }
35147
35148
35149           // force insert a singular bounding box
35150           // singular box only, no array, id better be unique
35151           function doInsert(bbox, id) {
35152               bbox.id = id;
35153
35154               var oldbox = _entitybboxes[id];
35155               if (oldbox) {
35156                   _rdrawn.remove(oldbox);
35157               }
35158               _entitybboxes[id] = bbox;
35159               _rdrawn.insert(bbox);
35160           }
35161
35162
35163           function tryInsert(bboxes, id, saveSkipped) {
35164               var skipped = false;
35165
35166               for (var i = 0; i < bboxes.length; i++) {
35167                   var bbox = bboxes[i];
35168                   bbox.id = id;
35169
35170                   // Check that label is visible
35171                   if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
35172                       skipped = true;
35173                       break;
35174                   }
35175                   if (_rdrawn.collides(bbox)) {
35176                       skipped = true;
35177                       break;
35178                   }
35179               }
35180
35181               _entitybboxes[id] = bboxes;
35182
35183               if (skipped) {
35184                   if (saveSkipped) {
35185                       _rskipped.load(bboxes);
35186                   }
35187               } else {
35188                   _rdrawn.load(bboxes);
35189               }
35190
35191               return !skipped;
35192           }
35193
35194
35195           var layer = selection.selectAll('.layer-osm.labels');
35196           layer.selectAll('.labels-group')
35197               .data(['halo', 'label', 'debug'])
35198               .enter()
35199               .append('g')
35200               .attr('class', function(d) { return 'labels-group ' + d; });
35201
35202           var halo = layer.selectAll('.labels-group.halo');
35203           var label = layer.selectAll('.labels-group.label');
35204           var debug = layer.selectAll('.labels-group.debug');
35205
35206           // points
35207           drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
35208           drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
35209
35210           // lines
35211           drawLinePaths(layer, labelled.line, filter, '', positions.line);
35212           drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
35213           drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
35214
35215           // areas
35216           drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
35217           drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
35218           drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
35219           drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
35220
35221           // debug
35222           drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
35223           drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
35224
35225           layer.call(filterLabels);
35226       }
35227
35228
35229       function filterLabels(selection) {
35230           var drawLayer = selection.selectAll('.layer-osm.labels');
35231           var layers = drawLayer.selectAll('.labels-group.halo, .labels-group.label');
35232
35233           layers.selectAll('.nolabel')
35234               .classed('nolabel', false);
35235
35236           var mouse = context.mouse();
35237           var graph = context.graph();
35238           var selectedIDs = context.selectedIDs();
35239           var ids = [];
35240           var pad, bbox;
35241
35242           // hide labels near the mouse
35243           if (mouse) {
35244               pad = 20;
35245               bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
35246               ids.push.apply(ids, map$3(_rdrawn.search(bbox), 'id'));
35247           }
35248
35249           // hide labels on selected nodes (they look weird when dragging / haloed)
35250           for (var i = 0; i < selectedIDs.length; i++) {
35251               var entity = graph.hasEntity(selectedIDs[i]);
35252               if (entity && entity.type === 'node') {
35253                   ids.push(selectedIDs[i]);
35254               }
35255           }
35256
35257           layers.selectAll(utilEntitySelector(ids))
35258               .classed('nolabel', true);
35259
35260
35261           // draw the mouse bbox if debugging is on..
35262           var debug = selection.selectAll('.labels-group.debug');
35263           var gj = [];
35264           if (context.getDebug('collision')) {
35265               gj = bbox ? [{
35266                   type: 'Polygon',
35267                   coordinates: [[
35268                       [bbox.minX, bbox.minY],
35269                       [bbox.maxX, bbox.minY],
35270                       [bbox.maxX, bbox.maxY],
35271                       [bbox.minX, bbox.maxY],
35272                       [bbox.minX, bbox.minY]
35273                   ]]
35274               }] : [];
35275           }
35276
35277           var box = debug.selectAll('.debug-mouse')
35278               .data(gj);
35279
35280           // exit
35281           box.exit()
35282               .remove();
35283
35284           // enter/update
35285           box.enter()
35286               .append('path')
35287               .attr('class', 'debug debug-mouse yellow')
35288               .merge(box)
35289               .attr('d', d3_geoPath());
35290       }
35291
35292
35293       var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
35294
35295
35296       drawLabels.observe = function(selection) {
35297           var listener = function() { throttleFilterLabels(selection); };
35298           selection.on('mousemove.hidelabels', listener);
35299           context.on('enter.hidelabels', listener);
35300       };
35301
35302
35303       drawLabels.off = function(selection) {
35304           throttleFilterLabels.cancel();
35305           selection.on('mousemove.hidelabels', null);
35306           context.on('enter.hidelabels', null);
35307       };
35308
35309
35310       return drawLabels;
35311   }
35312
35313   function svgStreetside$$1(projection, context, dispatch) {
35314       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
35315       var minZoom = 14;
35316       var minMarkerZoom = 16;
35317       var minViewfieldZoom = 18;
35318       var layer = select(null);
35319       var _viewerYaw = 0;
35320       var _selectedSequence = null;
35321       var _hoveredBubble = null;
35322       var _streetside;
35323
35324       /**
35325        * init().
35326        */
35327       function init() {
35328           if (svgStreetside$$1.initialized) return;  // run once
35329           svgStreetside$$1.enabled = false;
35330           svgStreetside$$1.initialized = true;
35331       }
35332
35333       /**
35334        * getService().
35335        */
35336       function getService() {
35337           if (services.streetside && !_streetside) {
35338               _streetside = services.streetside;
35339               _streetside.event
35340                   .on('viewerChanged', viewerChanged)
35341                   .on('loadedBubbles', throttledRedraw);
35342           } else if (!services.streetside && _streetside) {
35343               _streetside = null;
35344           }
35345
35346           return _streetside;
35347       }
35348
35349       /**
35350        * showLayer().
35351        */
35352       function showLayer() {
35353           var service = getService();
35354           if (!service) return;
35355
35356           service.loadViewer(context);
35357           editOn();
35358
35359           layer
35360               .style('opacity', 0)
35361               .transition()
35362               .duration(250)
35363               .style('opacity', 1)
35364               .on('end', function () { dispatch.call('change'); });
35365       }
35366
35367       /**
35368        * hideLayer().
35369        */
35370       function hideLayer() {
35371           var service = getService();
35372           if (service) {
35373               service.hideViewer();
35374           }
35375
35376           throttledRedraw.cancel();
35377
35378           layer
35379               .transition()
35380               .duration(250)
35381               .style('opacity', 0)
35382               .on('end', editOff);
35383       }
35384
35385       /**
35386        * editOn().
35387        */
35388       function editOn() {
35389           layer.style('display', 'block');
35390       }
35391
35392       /**
35393        * editOff().
35394        */
35395       function editOff() {
35396           layer.selectAll('.viewfield-group').remove();
35397           layer.style('display', 'none');
35398       }
35399
35400       /**
35401        * click() Handles 'bubble' point click event.
35402        */
35403       function click(d) {
35404           var service = getService();
35405           if (!service) return;
35406
35407           // try to preserve the viewer rotation when staying on the same sequence
35408           if (d.sequenceKey !== _selectedSequence) {
35409               _viewerYaw = 0;  // reset
35410           }
35411           _selectedSequence = d.sequenceKey;
35412
35413           service
35414               .selectImage(d)
35415               .then(function(r) {
35416                   if (r.status === 'ok'){
35417                       service.showViewer(_viewerYaw);
35418                   }
35419               });
35420
35421
35422           context.map().centerEase(d.loc);
35423       }
35424
35425       /**
35426        * mouseover().
35427        */
35428       function mouseover(d) {
35429           var service = getService();
35430           _hoveredBubble = d;
35431           if (service) service.setStyles(d, true);
35432       }
35433
35434       /**
35435        * mouseout().
35436        */
35437       function mouseout() {
35438           var service = getService();
35439           _hoveredBubble = null;
35440           if (service) service.setStyles(null, true);
35441       }
35442
35443       /**
35444        * transform().
35445        */
35446       function transform(d) {
35447           var t = svgPointTransform(projection)(d);
35448           var rot = d.ca + _viewerYaw;
35449           if (rot) {
35450               t += ' rotate(' + Math.floor(rot) + ',0,0)';
35451           }
35452           return t;
35453       }
35454
35455
35456       function viewerChanged() {
35457           var service = getService();
35458           if (!service) return;
35459
35460           var viewer = service.viewer();
35461           if (!viewer) return;
35462
35463           // update viewfield rotation
35464           _viewerYaw = viewer.getYaw();
35465
35466           // avoid updating if the map is currently transformed
35467           // e.g. during drags or easing.
35468           if (context.map().isTransformed()) return;
35469
35470           layer.selectAll('.viewfield-group.selected')
35471               .attr('transform', transform);
35472       }
35473
35474
35475       /**
35476        * update().
35477        */
35478       function update() {
35479           var viewer = select('#photoviewer');
35480           var selected = viewer.empty() ? undefined : viewer.datum();
35481           var z = ~~context.map().zoom();
35482           var showMarkers = (z >= minMarkerZoom);
35483           var showViewfields = (z >= minViewfieldZoom);
35484           var service = getService();
35485
35486           var sequences = (service ? service.sequences(projection) : []);
35487           var bubbles = (service && showMarkers ? service.bubbles(projection) : []);
35488
35489           var traces = layer.selectAll('.sequences').selectAll('.sequence')
35490               .data(sequences, function(d) { return d.properties.key; });
35491
35492           // exit
35493           traces.exit()
35494               .remove();
35495
35496           // enter/update
35497           traces = traces.enter()
35498               .append('path')
35499               .attr('class', 'sequence')
35500               .merge(traces)
35501               .attr('d', svgPath(projection).geojson);
35502
35503
35504           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
35505               .data(bubbles, function(d) {
35506                   // force reenter once bubbles are attached to a sequence
35507                   return d.key + (d.sequenceKey ? 'v1' : 'v0');
35508               });
35509
35510           // exit
35511           groups.exit()
35512               .remove();
35513
35514           // enter
35515           var groupsEnter = groups.enter()
35516               .append('g')
35517               .attr('class', 'viewfield-group')
35518               .on('mouseover', mouseover)
35519               .on('mouseout', mouseout)
35520               .on('click', click);
35521
35522           groupsEnter
35523               .append('g')
35524               .attr('class', 'viewfield-scale');
35525
35526           // update
35527           var markers = groups
35528               .merge(groupsEnter)
35529               .sort(function(a, b) {
35530                   return (a === selected) ? 1
35531                       : (b === selected) ? -1
35532                       : b.loc[1] - a.loc[1];
35533               })
35534               .attr('transform', transform)
35535               .select('.viewfield-scale');
35536
35537
35538           markers.selectAll('circle')
35539               .data([0])
35540               .enter()
35541               .append('circle')
35542               .attr('dx', '0')
35543               .attr('dy', '0')
35544               .attr('r', '6');
35545
35546           var viewfields = markers.selectAll('.viewfield')
35547               .data(showViewfields ? [0] : []);
35548
35549           viewfields.exit()
35550               .remove();
35551
35552           // viewfields may or may not be drawn...
35553           // but if they are, draw below the circles
35554           viewfields.enter()
35555               .insert('path', 'circle')
35556               .attr('class', 'viewfield')
35557               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
35558               .attr('d', viewfieldPath);
35559
35560
35561           if (service) {
35562               service.setStyles(_hoveredBubble, true);
35563           }
35564
35565
35566           function viewfieldPath() {
35567               var d = this.parentNode.__data__;
35568               if (d.pano) {
35569                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
35570               } else {
35571                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
35572               }
35573           }
35574
35575       }
35576
35577       /**
35578        * drawImages()
35579        * drawImages is the method that is returned (and that runs) everytime 'svgStreetside()' is called.
35580        * 'svgStreetside()' is called from index.js
35581        */
35582       function drawImages(selection$$1) {
35583           var enabled = svgStreetside$$1.enabled;
35584           var service = getService();
35585
35586           layer = selection$$1.selectAll('.layer-streetside-images')
35587               .data(service ? [0] : []);
35588
35589           layer.exit()
35590               .remove();
35591
35592           var layerEnter = layer.enter()
35593               .append('g')
35594               .attr('class', 'layer-streetside-images')
35595               .style('display', enabled ? 'block' : 'none');
35596
35597           layerEnter
35598               .append('g')
35599               .attr('class', 'sequences');
35600
35601           layerEnter
35602               .append('g')
35603               .attr('class', 'markers');
35604
35605           layer = layerEnter
35606               .merge(layer);
35607
35608           if (enabled) {
35609               if (service && ~~context.map().zoom() >= minZoom) {
35610                   editOn();
35611                   update();
35612                   service.loadBubbles(projection);
35613               } else {
35614                   editOff();
35615               }
35616           }
35617       }
35618
35619
35620       /**
35621        * drawImages.enabled().
35622        */
35623       drawImages.enabled = function(_) {
35624           if (!arguments.length) return svgStreetside$$1.enabled;
35625           svgStreetside$$1.enabled = _;
35626           if (svgStreetside$$1.enabled) {
35627               showLayer();
35628           } else {
35629               hideLayer();
35630           }
35631           dispatch.call('change');
35632           return this;
35633       };
35634
35635       /**
35636        * drawImages.supported().
35637        */
35638       drawImages.supported = function() {
35639           return !!getService();
35640       };
35641
35642       init();
35643
35644       return drawImages;
35645   }
35646
35647   function svgMapillaryImages$$1(projection, context, dispatch) {
35648       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
35649       var minZoom = 12;
35650       var minMarkerZoom = 16;
35651       var minViewfieldZoom = 18;
35652       var layer = select(null);
35653       var _mapillary;
35654       var viewerCompassAngle;
35655
35656
35657       function init() {
35658           if (svgMapillaryImages$$1.initialized) return;  // run once
35659           svgMapillaryImages$$1.enabled = false;
35660           svgMapillaryImages$$1.initialized = true;
35661       }
35662
35663
35664       function getService() {
35665           if (services.mapillary && !_mapillary) {
35666               _mapillary = services.mapillary;
35667               _mapillary.event.on('loadedImages', throttledRedraw);
35668               _mapillary.event.on('bearingChanged', function(e) {
35669                   viewerCompassAngle = e;
35670
35671                   // avoid updating if the map is currently transformed
35672                   // e.g. during drags or easing.
35673                   if (context.map().isTransformed()) return;
35674
35675                   layer.selectAll('.viewfield-group.selected')
35676                       .filter(function(d) {
35677                           return d.pano;
35678                       })
35679                       .attr('transform', transform);
35680               });
35681           } else if (!services.mapillary && _mapillary) {
35682               _mapillary = null;
35683           }
35684
35685           return _mapillary;
35686       }
35687
35688
35689       function showLayer() {
35690           var service = getService();
35691           if (!service) return;
35692
35693           service.loadViewer(context);
35694           editOn();
35695
35696           layer
35697               .style('opacity', 0)
35698               .transition()
35699               .duration(250)
35700               .style('opacity', 1)
35701               .on('end', function () { dispatch.call('change'); });
35702       }
35703
35704
35705       function hideLayer() {
35706           var service = getService();
35707           if (service) {
35708               service.hideViewer();
35709           }
35710
35711           throttledRedraw.cancel();
35712
35713           layer
35714               .transition()
35715               .duration(250)
35716               .style('opacity', 0)
35717               .on('end', editOff);
35718       }
35719
35720
35721       function editOn() {
35722           layer.style('display', 'block');
35723       }
35724
35725
35726       function editOff() {
35727           layer.selectAll('.viewfield-group').remove();
35728           layer.style('display', 'none');
35729       }
35730
35731
35732       function click(d) {
35733           var service = getService();
35734           if (!service) return;
35735
35736           service
35737               .selectImage(d)
35738               .updateViewer(d.key, context)
35739               .showViewer();
35740
35741           context.map().centerEase(d.loc);
35742       }
35743
35744
35745       function mouseover(d) {
35746           var service = getService();
35747           if (service) service.setStyles(d);
35748       }
35749
35750
35751       function mouseout() {
35752           var service = getService();
35753           if (service) service.setStyles(null);
35754       }
35755
35756
35757       function transform(d) {
35758           var t = svgPointTransform(projection)(d);
35759           if (d.pano && isNumber(viewerCompassAngle)) {
35760               t += ' rotate(' + Math.floor(viewerCompassAngle) + ',0,0)';
35761           } else if (d.ca) {
35762               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
35763           }
35764           return t;
35765       }
35766
35767
35768       function update() {
35769           var viewer = select('#photoviewer');
35770           var selected = viewer.empty() ? undefined : viewer.datum();
35771
35772           var z = ~~context.map().zoom();
35773           var showMarkers = (z >= minMarkerZoom);
35774           var showViewfields = (z >= minViewfieldZoom);
35775
35776           var service = getService();
35777           var sequences = (service ? service.sequences(projection) : []);
35778           var images = (service && showMarkers ? service.images(projection) : []);
35779
35780           var traces = layer.selectAll('.sequences').selectAll('.sequence')
35781               .data(sequences, function(d) { return d.properties.key; });
35782
35783           // exit
35784           traces.exit()
35785               .remove();
35786
35787           // enter/update
35788           traces = traces.enter()
35789               .append('path')
35790               .attr('class', 'sequence')
35791               .merge(traces)
35792               .attr('d', svgPath(projection).geojson);
35793
35794
35795           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
35796               .data(images, function(d) { return d.key; });
35797
35798           // exit
35799           groups.exit()
35800               .remove();
35801
35802           // enter
35803           var groupsEnter = groups.enter()
35804               .append('g')
35805               .attr('class', 'viewfield-group')
35806               .on('mouseover', mouseover)
35807               .on('mouseout', mouseout)
35808               .on('click', click);
35809
35810           groupsEnter
35811               .append('g')
35812               .attr('class', 'viewfield-scale');
35813
35814           // update
35815           var markers = groups
35816               .merge(groupsEnter)
35817               .sort(function(a, b) {
35818                   return (a === selected) ? 1
35819                       : (b === selected) ? -1
35820                       : b.loc[1] - a.loc[1];  // sort Y
35821               })
35822               .attr('transform', transform)
35823               .select('.viewfield-scale');
35824
35825
35826           markers.selectAll('circle')
35827               .data([0])
35828               .enter()
35829               .append('circle')
35830               .attr('dx', '0')
35831               .attr('dy', '0')
35832               .attr('r', '6');
35833
35834           var viewfields = markers.selectAll('.viewfield')
35835               .data(showViewfields ? [0] : []);
35836
35837           viewfields.exit()
35838               .remove();
35839
35840           viewfields.enter()               // viewfields may or may not be drawn...
35841               .insert('path', 'circle')    // but if they are, draw below the circles
35842               .attr('class', 'viewfield')
35843               .classed('pano', function() { return this.parentNode.__data__.pano; })
35844               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
35845               .attr('d', viewfieldPath);
35846
35847           function viewfieldPath() {
35848               var d = this.parentNode.__data__;
35849               if (d.pano) {
35850                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
35851               } else {
35852                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
35853               }
35854           }
35855       }
35856
35857
35858       function drawImages(selection$$1) {
35859           var enabled = svgMapillaryImages$$1.enabled;
35860           var service = getService();
35861
35862           layer = selection$$1.selectAll('.layer-mapillary-images')
35863               .data(service ? [0] : []);
35864
35865           layer.exit()
35866               .remove();
35867
35868           var layerEnter = layer.enter()
35869               .append('g')
35870               .attr('class', 'layer-mapillary-images')
35871               .style('display', enabled ? 'block' : 'none');
35872
35873           layerEnter
35874               .append('g')
35875               .attr('class', 'sequences');
35876
35877           layerEnter
35878               .append('g')
35879               .attr('class', 'markers');
35880
35881           layer = layerEnter
35882               .merge(layer);
35883
35884           if (enabled) {
35885               if (service && ~~context.map().zoom() >= minZoom) {
35886                   editOn();
35887                   update();
35888                   service.loadImages(projection);
35889               } else {
35890                   editOff();
35891               }
35892           }
35893       }
35894
35895
35896       drawImages.enabled = function(_) {
35897           if (!arguments.length) return svgMapillaryImages$$1.enabled;
35898           svgMapillaryImages$$1.enabled = _;
35899           if (svgMapillaryImages$$1.enabled) {
35900               showLayer();
35901           } else {
35902               hideLayer();
35903           }
35904           dispatch.call('change');
35905           return this;
35906       };
35907
35908
35909       drawImages.supported = function() {
35910           return !!getService();
35911       };
35912
35913
35914       init();
35915       return drawImages;
35916   }
35917
35918   function svgMapillarySigns$$1(projection, context, dispatch) {
35919       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
35920       var minZoom = 12;
35921       var layer = select(null);
35922       var _mapillary;
35923
35924
35925       function init() {
35926           if (svgMapillarySigns$$1.initialized) return;  // run once
35927           svgMapillarySigns$$1.enabled = false;
35928           svgMapillarySigns$$1.initialized = true;
35929       }
35930
35931
35932       function getService() {
35933           if (services.mapillary && !_mapillary) {
35934               _mapillary = services.mapillary;
35935               _mapillary.event.on('loadedSigns', throttledRedraw);
35936           } else if (!services.mapillary && _mapillary) {
35937               _mapillary = null;
35938           }
35939           return _mapillary;
35940       }
35941
35942
35943       function showLayer() {
35944           var service = getService();
35945           if (!service) return;
35946
35947           service.loadViewer(context);
35948           editOn();
35949       }
35950
35951
35952       function hideLayer() {
35953           throttledRedraw.cancel();
35954           editOff();
35955       }
35956
35957
35958       function editOn() {
35959           layer.style('display', 'block');
35960       }
35961
35962
35963       function editOff() {
35964           layer.selectAll('.icon-sign').remove();
35965           layer.style('display', 'none');
35966       }
35967
35968
35969       function click(d) {
35970           var service = getService();
35971           if (!service) return;
35972
35973           context.map().centerEase(d.loc);
35974
35975           var selected = service.getSelectedImage();
35976           var selectedImageKey = selected && selected.key;
35977           var imageKey;
35978
35979           // Pick one of the images the sign was detected in,
35980           // preference given to an image already selected.
35981           d.detections.forEach(function(detection) {
35982               if (!imageKey || selectedImageKey === detection.image_key) {
35983                   imageKey = detection.image_key;
35984               }
35985           });
35986
35987           service
35988               .selectImage(null, imageKey)
35989               .updateViewer(imageKey, context)
35990               .showViewer();
35991       }
35992
35993
35994       function update() {
35995           var service = getService();
35996           var data = (service ? service.signs(projection) : []);
35997           var viewer = select('#photoviewer');
35998           var selected = viewer.empty() ? undefined : viewer.datum();
35999           var selectedImageKey = selected && selected.key;
36000           var transform = svgPointTransform(projection);
36001
36002           var signs = layer.selectAll('.icon-sign')
36003               .data(data, function(d) { return d.key; });
36004
36005           // exit
36006           signs.exit()
36007               .remove();
36008
36009           // enter
36010           var enter = signs.enter()
36011               .append('use')
36012               .attr('class', 'icon-sign')
36013               .attr('width', '24px')
36014               .attr('height', '24px')
36015               .attr('x', '-12px')
36016               .attr('y', '-12px')
36017               .attr('xlink:href', function(d) { return '#' + d.value; })
36018               .classed('selected', function(d) {
36019                   return some(d.detections, function(detection) {
36020                       return detection.image_key === selectedImageKey;
36021                   });
36022               })
36023               .on('click', click);
36024
36025           // update
36026           signs
36027               .merge(enter)
36028               .sort(function(a, b) {
36029                   return (a === selected) ? 1
36030                       : (b === selected) ? -1
36031                       : b.loc[1] - a.loc[1];  // sort Y
36032               })
36033               .attr('transform', transform);
36034       }
36035
36036
36037       function drawSigns(selection$$1) {
36038           var enabled = svgMapillarySigns$$1.enabled;
36039           var service = getService();
36040
36041           layer = selection$$1.selectAll('.layer-mapillary-signs')
36042               .data(service ? [0] : []);
36043
36044           layer.exit()
36045               .remove();
36046
36047           layer = layer.enter()
36048               .append('g')
36049               .attr('class', 'layer-mapillary-signs')
36050               .style('display', enabled ? 'block' : 'none')
36051               .merge(layer);
36052
36053           if (enabled) {
36054               if (service && ~~context.map().zoom() >= minZoom) {
36055                   editOn();
36056                   update();
36057                   service.loadSigns(context, projection);
36058               } else {
36059                   editOff();
36060               }
36061           }
36062       }
36063
36064
36065       drawSigns.enabled = function(_) {
36066           if (!arguments.length) return svgMapillarySigns$$1.enabled;
36067           svgMapillarySigns$$1.enabled = _;
36068           if (svgMapillarySigns$$1.enabled) {
36069               showLayer();
36070           } else {
36071               hideLayer();
36072           }
36073           dispatch.call('change');
36074           return this;
36075       };
36076
36077
36078       drawSigns.supported = function() {
36079           return !!getService();
36080       };
36081
36082
36083       init();
36084       return drawSigns;
36085   }
36086
36087   function svgOpenstreetcamImages$$1(projection, context, dispatch) {
36088       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
36089       var minZoom = 12;
36090       var minMarkerZoom = 16;
36091       var minViewfieldZoom = 18;
36092       var layer = select(null);
36093       var _openstreetcam;
36094
36095
36096       function init() {
36097           if (svgOpenstreetcamImages$$1.initialized) return;  // run once
36098           svgOpenstreetcamImages$$1.enabled = false;
36099           svgOpenstreetcamImages$$1.initialized = true;
36100       }
36101
36102
36103       function getService() {
36104           if (services.openstreetcam && !_openstreetcam) {
36105               _openstreetcam = services.openstreetcam;
36106               _openstreetcam.event.on('loadedImages', throttledRedraw);
36107           } else if (!services.openstreetcam && _openstreetcam) {
36108               _openstreetcam = null;
36109           }
36110
36111           return _openstreetcam;
36112       }
36113
36114
36115       function showLayer() {
36116           var service = getService();
36117           if (!service) return;
36118
36119           service.loadViewer(context);
36120           editOn();
36121
36122           layer
36123               .style('opacity', 0)
36124               .transition()
36125               .duration(250)
36126               .style('opacity', 1)
36127               .on('end', function () { dispatch.call('change'); });
36128       }
36129
36130
36131       function hideLayer() {
36132           var service = getService();
36133           if (service) {
36134               service.hideViewer();
36135           }
36136
36137           throttledRedraw.cancel();
36138
36139           layer
36140               .transition()
36141               .duration(250)
36142               .style('opacity', 0)
36143               .on('end', editOff);
36144       }
36145
36146
36147       function editOn() {
36148           layer.style('display', 'block');
36149       }
36150
36151
36152       function editOff() {
36153           layer.selectAll('.viewfield-group').remove();
36154           layer.style('display', 'none');
36155       }
36156
36157
36158       function click(d) {
36159           var service = getService();
36160           if (!service) return;
36161
36162           service
36163               .selectImage(d)
36164               .updateViewer(d)
36165               .showViewer();
36166
36167           context.map().centerEase(d.loc);
36168       }
36169
36170
36171       function mouseover(d) {
36172           var service = getService();
36173           if (service) service.setStyles(d);
36174       }
36175
36176
36177       function mouseout() {
36178           var service = getService();
36179           if (service) service.setStyles(null);
36180       }
36181
36182
36183       function transform(d) {
36184           var t = svgPointTransform(projection)(d);
36185           if (d.ca) {
36186               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
36187           }
36188           return t;
36189       }
36190
36191
36192       function update() {
36193           var viewer = select('#photoviewer');
36194           var selected = viewer.empty() ? undefined : viewer.datum();
36195
36196           var z = ~~context.map().zoom();
36197           var showMarkers = (z >= minMarkerZoom);
36198           var showViewfields = (z >= minViewfieldZoom);
36199
36200           var service = getService();
36201           var sequences = (service ? service.sequences(projection) : []);
36202           var images = (service && showMarkers ? service.images(projection) : []);
36203
36204           var traces = layer.selectAll('.sequences').selectAll('.sequence')
36205               .data(sequences, function(d) { return d.properties.key; });
36206
36207           // exit
36208           traces.exit()
36209               .remove();
36210
36211           // enter/update
36212           traces = traces.enter()
36213               .append('path')
36214               .attr('class', 'sequence')
36215               .merge(traces)
36216               .attr('d', svgPath(projection).geojson);
36217
36218
36219           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
36220               .data(images, function(d) { return d.key; });
36221
36222           // exit
36223           groups.exit()
36224               .remove();
36225
36226           // enter
36227           var groupsEnter = groups.enter()
36228               .append('g')
36229               .attr('class', 'viewfield-group')
36230               .on('mouseover', mouseover)
36231               .on('mouseout', mouseout)
36232               .on('click', click);
36233
36234           groupsEnter
36235               .append('g')
36236               .attr('class', 'viewfield-scale');
36237
36238           // update
36239           var markers = groups
36240               .merge(groupsEnter)
36241               .sort(function(a, b) {
36242                   return (a === selected) ? 1
36243                       : (b === selected) ? -1
36244                       : b.loc[1] - a.loc[1];  // sort Y
36245               })
36246               .attr('transform', transform)
36247               .select('.viewfield-scale');
36248
36249
36250           markers.selectAll('circle')
36251               .data([0])
36252               .enter()
36253               .append('circle')
36254               .attr('dx', '0')
36255               .attr('dy', '0')
36256               .attr('r', '6');
36257
36258           var viewfields = markers.selectAll('.viewfield')
36259               .data(showViewfields ? [0] : []);
36260
36261           viewfields.exit()
36262               .remove();
36263
36264           viewfields.enter()               // viewfields may or may not be drawn...
36265               .insert('path', 'circle')    // but if they are, draw below the circles
36266               .attr('class', 'viewfield')
36267               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
36268               .attr('d', 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z');
36269       }
36270
36271
36272       function drawImages(selection$$1) {
36273           var enabled = svgOpenstreetcamImages$$1.enabled,
36274               service = getService();
36275
36276           layer = selection$$1.selectAll('.layer-openstreetcam-images')
36277               .data(service ? [0] : []);
36278
36279           layer.exit()
36280               .remove();
36281
36282           var layerEnter = layer.enter()
36283               .append('g')
36284               .attr('class', 'layer-openstreetcam-images')
36285               .style('display', enabled ? 'block' : 'none');
36286
36287           layerEnter
36288               .append('g')
36289               .attr('class', 'sequences');
36290
36291           layerEnter
36292               .append('g')
36293               .attr('class', 'markers');
36294
36295           layer = layerEnter
36296               .merge(layer);
36297
36298           if (enabled) {
36299               if (service && ~~context.map().zoom() >= minZoom) {
36300                   editOn();
36301                   update();
36302                   service.loadImages(projection);
36303               } else {
36304                   editOff();
36305               }
36306           }
36307       }
36308
36309
36310       drawImages.enabled = function(_) {
36311           if (!arguments.length) return svgOpenstreetcamImages$$1.enabled;
36312           svgOpenstreetcamImages$$1.enabled = _;
36313           if (svgOpenstreetcamImages$$1.enabled) {
36314               showLayer();
36315           } else {
36316               hideLayer();
36317           }
36318           dispatch.call('change');
36319           return this;
36320       };
36321
36322
36323       drawImages.supported = function() {
36324           return !!getService();
36325       };
36326
36327
36328       init();
36329       return drawImages;
36330   }
36331
36332   function svgOsm(projection, context, dispatch) {
36333       var enabled = true;
36334
36335
36336       function drawOsm(selection) {
36337           selection.selectAll('.layer-osm')
36338               .data(['covered', 'areas', 'lines', 'points', 'labels'])
36339               .enter()
36340               .append('g')
36341               .attr('class', function(d) { return 'layer-osm ' + d; });
36342
36343           selection.selectAll('.layer-osm.points').selectAll('.points-group')
36344               .data(['points', 'midpoints', 'vertices', 'turns'])
36345               .enter()
36346               .append('g')
36347               .attr('class', function(d) { return 'points-group ' + d; });
36348       }
36349
36350
36351       function showLayer() {
36352           var layer = context.surface().selectAll('.data-layer.osm');
36353           layer.interrupt();
36354
36355           layer
36356               .classed('disabled', false)
36357               .style('opacity', 0)
36358               .transition()
36359               .duration(250)
36360               .style('opacity', 1)
36361               .on('end interrupt', function () {
36362                   dispatch.call('change');
36363               });
36364       }
36365
36366
36367       function hideLayer() {
36368           var layer = context.surface().selectAll('.data-layer.osm');
36369           layer.interrupt();
36370
36371           layer
36372               .transition()
36373               .duration(250)
36374               .style('opacity', 0)
36375               .on('end interrupt', function () {
36376                   layer.classed('disabled', true);
36377                   dispatch.call('change');
36378               });
36379       }
36380
36381
36382       drawOsm.enabled = function(_) {
36383           if (!arguments.length) return enabled;
36384           enabled = _;
36385
36386           if (enabled) {
36387               showLayer();
36388           } else {
36389               hideLayer();
36390           }
36391
36392           dispatch.call('change');
36393           return this;
36394       };
36395
36396
36397       return drawOsm;
36398   }
36399
36400   function svgNotes$$1(projection, context, dispatch$$1) {
36401       if (!dispatch$$1) { dispatch$$1 = dispatch('change'); }
36402       var throttledRedraw = throttle(function () { dispatch$$1.call('change'); }, 1000);
36403       var minZoom = 12;
36404       var layer = select(null);
36405       var _notes;
36406
36407       function markerPath(selection$$1, klass) {
36408           selection$$1
36409               .attr('class', klass)
36410               .attr('transform', 'translate(-8, -22)')
36411               .attr('d', 'm17.5,0l-15,0c-1.37,0 -2.5,1.12 -2.5,2.5l0,11.25c0,1.37 1.12,2.5 2.5,2.5l3.75,0l0,3.28c0,0.38 0.43,0.6 0.75,0.37l4.87,-3.65l5.62,0c1.37,0 2.5,-1.12 2.5,-2.5l0,-11.25c0,-1.37 -1.12,-2.5 -2.5,-2.5z');
36412       }
36413
36414       function init() {
36415           if (svgNotes$$1.initialized) return;  // run once
36416           svgNotes$$1.enabled = false;
36417           svgNotes$$1.initialized = true;
36418       }
36419
36420       function editOn() {
36421           layer.style('display', 'block');
36422       }
36423
36424
36425       function editOff() {
36426           layer.selectAll('.note').remove();
36427           layer.style('display', 'none');
36428       }
36429
36430
36431       function getService() {
36432           if (services.osm && !_notes) {
36433               _notes = services.osm;
36434               _notes.on('loadedNotes', throttledRedraw);
36435           } else if (!services.osm && _notes) {
36436               _notes = null;
36437           }
36438
36439           return _notes;
36440       }
36441
36442
36443       function showLayer() {
36444           editOn();
36445
36446           layer
36447               .classed('disabled', false)
36448               .style('opacity', 0)
36449               .transition()
36450               .duration(250)
36451               .style('opacity', 1)
36452               .on('end interrupt', function () {
36453                   dispatch$$1.call('change');
36454               });
36455       }
36456
36457
36458       function hideLayer() {
36459           editOff();
36460
36461           throttledRedraw.cancel();
36462           layer.interrupt();
36463
36464           layer
36465               .transition()
36466               .duration(250)
36467               .style('opacity', 0)
36468               .on('end interrupt', function () {
36469                   layer.classed('disabled', true);
36470                   dispatch$$1.call('change');
36471               });
36472
36473       }
36474
36475
36476       function update() {
36477           var service = getService();
36478           var selectedID = context.selectedNoteID();
36479           var data = (service ? service.notes(projection) : []);
36480           var transform = svgPointTransform(projection);
36481           var notes = layer.selectAll('.note')
36482               .data(data, function(d) { return d.status + d.id; });
36483
36484           // exit
36485           notes.exit()
36486               .remove();
36487
36488           // enter
36489           var notesEnter = notes.enter()
36490               .append('g')
36491               .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; })
36492               .classed('new', function(d) { return d.id < 0; });
36493
36494           notesEnter
36495               .append('ellipse')
36496               .attr('cx', 0.5)
36497               .attr('cy', 1)
36498               .attr('rx', 6.5)
36499               .attr('ry', 3)
36500               .attr('class', 'stroke');
36501
36502           notesEnter
36503               .append('path')
36504               .call(markerPath, 'shadow');
36505
36506           notesEnter
36507               .append('use')
36508               .attr('class', 'note-fill')
36509               .attr('width', '20px')
36510               .attr('height', '20px')
36511               .attr('x', '-8px')
36512               .attr('y', '-22px')
36513               .attr('xlink:href', '#iD-icon-note');
36514
36515           notesEnter.selectAll('.note-annotation')
36516               .data(function(d) { return [d]; })
36517               .enter()
36518               .append('use')
36519               .attr('class', 'note-annotation')
36520               .attr('width', '10px')
36521               .attr('height', '10px')
36522               .attr('x', '-3px')
36523               .attr('y', '-19px')
36524               .attr('xlink:href', function(d) {
36525                   return '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
36526               });
36527
36528           // update
36529           notes
36530               .merge(notesEnter)
36531               .sort(function(a, b) {
36532                   return (a.id === selectedID) ? 1
36533                       : (b.id === selectedID) ? -1
36534                       : b.loc[1] - a.loc[1];  // sort Y
36535               })
36536               .classed('selected', function(d) { return d.id === selectedID; })
36537               .attr('transform', transform);
36538       }
36539
36540
36541       function drawNotes(selection$$1) {
36542           var enabled = svgNotes$$1.enabled;
36543           var service = getService();
36544
36545           layer = selection$$1.selectAll('.layer-notes')
36546               .data(service ? [0] : []);
36547
36548           layer.exit()
36549               .remove();
36550
36551           layer.enter()
36552               .append('g')
36553               .attr('class', 'layer-notes')
36554               .style('display', enabled ? 'block' : 'none')
36555               .merge(layer);
36556
36557           function dimensions() {
36558               return [window.innerWidth, window.innerHeight];
36559           }
36560
36561           if (enabled) {
36562               if (service && ~~context.map().zoom() >= minZoom) {
36563                   editOn();
36564                   service.loadNotes(projection, dimensions());
36565                   update();
36566               } else {
36567                   editOff();
36568               }
36569           }
36570       }
36571
36572       drawNotes.enabled = function(val) {
36573           if (!arguments.length) return svgNotes$$1.enabled;
36574
36575           svgNotes$$1.enabled = val;
36576           if (svgNotes$$1.enabled) {
36577               showLayer();
36578           } else {
36579               hideLayer();
36580               if (context.selectedNoteID()) {
36581                   context.enter(modeBrowse(context));
36582               }
36583           }
36584
36585           dispatch$$1.call('change');
36586           return this;
36587       };
36588
36589       init();
36590       return drawNotes;
36591   }
36592
36593   function svgTouch() {
36594
36595       function drawTouch(selection) {
36596           selection.selectAll('.layer-touch')
36597               .data(['areas', 'lines', 'points', 'turns', 'notes'])
36598               .enter()
36599               .append('g')
36600               .attr('class', function(d) { return 'layer-touch ' + d; });
36601       }
36602
36603       return drawTouch;
36604   }
36605
36606   function svgLayers(projection, context) {
36607       var dispatch$$1 = dispatch('change');
36608       var svg = select(null);
36609       var layers = [
36610           { id: 'osm', layer: svgOsm(projection, context, dispatch$$1) },
36611           { id: 'notes', layer: svgNotes$$1(projection, context, dispatch$$1) },
36612           { id: 'data', layer: svgData$$1(projection, context, dispatch$$1) },
36613           { id: 'streetside', layer: svgStreetside$$1(projection, context, dispatch$$1)},
36614           { id: 'mapillary-images', layer: svgMapillaryImages$$1(projection, context, dispatch$$1) },
36615           { id: 'mapillary-signs',  layer: svgMapillarySigns$$1(projection, context, dispatch$$1) },
36616           { id: 'openstreetcam-images', layer: svgOpenstreetcamImages$$1(projection, context, dispatch$$1) },
36617           { id: 'debug', layer: svgDebug$$1(projection, context, dispatch$$1) },
36618           { id: 'touch', layer: svgTouch(projection, context, dispatch$$1) }
36619       ];
36620
36621
36622       function drawLayers(selection$$1) {
36623           svg = selection$$1.selectAll('.surface')
36624               .data([0]);
36625
36626           svg = svg.enter()
36627               .append('svg')
36628               .attr('class', 'surface')
36629               .merge(svg);
36630
36631           var defs = svg.selectAll('.surface-defs')
36632               .data([0]);
36633
36634           defs.enter()
36635               .append('defs')
36636               .attr('class', 'surface-defs');
36637
36638           var groups = svg.selectAll('.data-layer')
36639               .data(layers);
36640
36641           groups.exit()
36642               .remove();
36643
36644           groups.enter()
36645               .append('g')
36646               .attr('class', function(d) { return 'data-layer ' + d.id; })
36647               .merge(groups)
36648               .each(function(d) { select(this).call(d.layer); });
36649       }
36650
36651
36652       drawLayers.all = function() {
36653           return layers;
36654       };
36655
36656
36657       drawLayers.layer = function(id) {
36658           var obj = find$1(layers, function(o) {return o.id === id;});
36659           return obj && obj.layer;
36660       };
36661
36662
36663       drawLayers.only = function(what) {
36664           var arr = [].concat(what);
36665           drawLayers.remove(difference(map$3(layers, 'id'), arr));
36666           return this;
36667       };
36668
36669
36670       drawLayers.remove = function(what) {
36671           var arr = [].concat(what);
36672           arr.forEach(function(id) {
36673               layers = reject(layers, function(o) {return o.id === id;});
36674           });
36675           dispatch$$1.call('change');
36676           return this;
36677       };
36678
36679
36680       drawLayers.add = function(what) {
36681           var arr = [].concat(what);
36682           arr.forEach(function(obj) {
36683               if ('id' in obj && 'layer' in obj) {
36684                   layers.push(obj);
36685               }
36686           });
36687           dispatch$$1.call('change');
36688           return this;
36689       };
36690
36691
36692       drawLayers.dimensions = function(_) {
36693           if (!arguments.length) return utilGetDimensions(svg);
36694           utilSetDimensions(svg, _);
36695           return this;
36696       };
36697
36698
36699       return utilRebind(drawLayers, dispatch$$1, 'on');
36700   }
36701
36702   function svgLines$$1(projection, context) {
36703       var detected = utilDetect();
36704
36705       var highway_stack = {
36706           motorway: 0,
36707           motorway_link: 1,
36708           trunk: 2,
36709           trunk_link: 3,
36710           primary: 4,
36711           primary_link: 5,
36712           secondary: 6,
36713           tertiary: 7,
36714           unclassified: 8,
36715           residential: 9,
36716           service: 10,
36717           footway: 11
36718       };
36719
36720
36721       function drawTargets(selection, graph, entities, filter$$1) {
36722           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
36723           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
36724           var getPath = svgPath(projection).geojson;
36725           var activeID = context.activeID();
36726
36727           // The targets and nopes will be MultiLineString sub-segments of the ways
36728           var data = { targets: [], nopes: [] };
36729
36730           entities.forEach(function(way) {
36731               var features = svgSegmentWay(way, graph, activeID);
36732               data.targets.push.apply(data.targets, features.passive);
36733               data.nopes.push.apply(data.nopes, features.active);
36734           });
36735
36736
36737           // Targets allow hover and vertex snapping
36738           var targetData = data.targets.filter(getPath);
36739           var targets = selection.selectAll('.line.target-allowed')
36740               .filter(function(d) { return filter$$1(d.properties.entity); })
36741               .data(targetData, function key(d) { return d.id; });
36742
36743           // exit
36744           targets.exit()
36745               .remove();
36746
36747           // enter/update
36748           targets.enter()
36749               .append('path')
36750               .merge(targets)
36751               .attr('d', getPath)
36752               .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
36753
36754
36755           // NOPE
36756           var nopeData = data.nopes.filter(getPath);
36757           var nopes = selection.selectAll('.line.target-nope')
36758               .filter(function(d) { return filter$$1(d.properties.entity); })
36759               .data(nopeData, function key(d) { return d.id; });
36760
36761           // exit
36762           nopes.exit()
36763               .remove();
36764
36765           // enter/update
36766           nopes.enter()
36767               .append('path')
36768               .merge(nopes)
36769               .attr('d', getPath)
36770               .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
36771       }
36772
36773
36774       function drawLines(selection, graph, entities, filter$$1) {
36775
36776           function waystack(a, b) {
36777               var selected = context.selectedIDs();
36778               var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
36779               var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
36780
36781               if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
36782               if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
36783               return scoreA - scoreB;
36784           }
36785
36786
36787           function drawLineGroup(selection, klass, isSelected) {
36788               // Note: Don't add `.selected` class in draw modes
36789               var mode = context.mode();
36790               var isDrawing = mode && /^draw/.test(mode.id);
36791               var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
36792
36793               var lines = selection
36794                   .selectAll('path')
36795                   .filter(filter$$1)
36796                   .data(getPathData(isSelected), osmEntity$$1.key);
36797
36798               lines.exit()
36799                   .remove();
36800
36801               // Optimization: Call expensive TagClasses only on enter selection. This
36802               // works because osmEntity.key is defined to include the entity v attribute.
36803               lines.enter()
36804                   .append('path')
36805                   .attr('class', function(d) {
36806                       var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
36807                       return 'way line ' + klass + ' ' + selectedClass + oldMPClass + d.id;
36808                   })
36809                   .call(svgTagClasses())
36810                   .merge(lines)
36811                   .sort(waystack)
36812                   .attr('d', getPath)
36813                   .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
36814
36815               return selection;
36816           }
36817
36818
36819           function getPathData(isSelected) {
36820               return function() {
36821                   var layer = this.parentNode.__data__;
36822                   var data = pathdata[layer] || [];
36823                   return data.filter(function(d) {
36824                       if (isSelected)
36825                           return context.selectedIDs().indexOf(d.id) !== -1;
36826                       else
36827                           return context.selectedIDs().indexOf(d.id) === -1;
36828                   });
36829               };
36830           }
36831
36832           function addMarkers(layergroup, pathclass, groupclass, groupdata, marker) {
36833               var markergroup = layergroup
36834                   .selectAll('g.' + groupclass)
36835                   .data([pathclass]);
36836
36837               markergroup = markergroup.enter()
36838                   .append('g')
36839                   .attr('class', groupclass)
36840                   .merge(markergroup);
36841
36842               var markers = markergroup
36843                   .selectAll('path')
36844                   .filter(filter$$1)
36845                   .data(
36846                       function data() { return groupdata[this.parentNode.__data__] || []; },
36847                       function key(d) { return [d.id, d.index]; }
36848                   );
36849
36850               markers.exit()
36851                   .remove();
36852
36853               markers = markers.enter()
36854                   .append('path')
36855                   .attr('class', pathclass)
36856                   .attr('marker-mid', marker)
36857                   .merge(markers)
36858                   .attr('d', function(d) { return d.d; });
36859
36860               if (detected.ie) {
36861                   markers.each(function() { this.parentNode.insertBefore(this, this); });
36862               }
36863           }
36864
36865
36866           var getPath = svgPath(projection, graph);
36867           var ways = [];
36868           var pathdata = {};
36869           var onewaydata = {};
36870           var sideddata = {};
36871           var oldMultiPolygonOuters = {};
36872
36873           for (var i = 0; i < entities.length; i++) {
36874               var entity = entities[i];
36875               var outer = osmSimpleMultipolygonOuterMember(entity, graph);
36876               if (outer) {
36877                   ways.push(entity.mergeTags(outer.tags));
36878                   oldMultiPolygonOuters[outer.id] = true;
36879               } else if (entity.geometry(graph) === 'line') {
36880                   ways.push(entity);
36881               }
36882           }
36883
36884           ways = ways.filter(getPath);
36885           pathdata = groupBy(ways, function(way) { return way.layer(); });
36886
36887           forOwn(pathdata, function(v, k) {
36888               var onewayArr = filter(v, function(d) { return d.isOneWay(); });
36889               var onewaySegments = svgMarkerSegments(
36890                   projection, graph, 35,
36891                   function shouldReverse(entity) { return entity.tags.oneway === '-1'; },
36892                   function bothDirections(entity) {
36893                       return entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating';
36894                   });
36895               onewaydata[k] = flatten(map$3(onewayArr, onewaySegments));
36896
36897               var sidedArr = filter(v, function(d) { return d.isSided(); });
36898               var sidedSegments = svgMarkerSegments(
36899                   projection, graph, 30,
36900                   function shouldReverse() { return false; },
36901                   function bothDirections() { return false; });
36902               sideddata[k] = flatten(map$3(sidedArr, sidedSegments));
36903           });
36904
36905
36906           var covered = selection.selectAll('.layer-osm.covered');     // under areas
36907           var uncovered = selection.selectAll('.layer-osm.lines');     // over areas
36908           var touchLayer = selection.selectAll('.layer-touch.lines');
36909
36910           // Draw lines..
36911           [covered, uncovered].forEach(function(selection) {
36912               var range$$1 = (selection === covered ? range(-10,0) : range(0,11));
36913               var layergroup = selection
36914                   .selectAll('g.layergroup')
36915                   .data(range$$1);
36916
36917               layergroup = layergroup.enter()
36918                   .append('g')
36919                   .attr('class', function(d) { return 'layergroup layer' + String(d); })
36920                   .merge(layergroup);
36921
36922               layergroup
36923                   .selectAll('g.linegroup')
36924                   .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
36925                   .enter()
36926                   .append('g')
36927                   .attr('class', function(d) { return 'linegroup line-' + d; });
36928
36929               layergroup.selectAll('g.line-shadow')
36930                   .call(drawLineGroup, 'shadow', false);
36931               layergroup.selectAll('g.line-casing')
36932                   .call(drawLineGroup, 'casing', false);
36933               layergroup.selectAll('g.line-stroke')
36934                   .call(drawLineGroup, 'stroke', false);
36935
36936               layergroup.selectAll('g.line-shadow-highlighted')
36937                   .call(drawLineGroup, 'shadow', true);
36938               layergroup.selectAll('g.line-casing-highlighted')
36939                   .call(drawLineGroup, 'casing', true);
36940               layergroup.selectAll('g.line-stroke-highlighted')
36941                   .call(drawLineGroup, 'stroke', true);
36942
36943               addMarkers(layergroup, 'oneway', 'onewaygroup', onewaydata, 'url(#oneway-marker)');
36944               addMarkers(layergroup, 'sided', 'sidedgroup', sideddata,
36945                          function marker(d) {
36946                              var category = graph.entity(d.id).sidednessIdentifier();
36947                              return 'url(#sided-marker-' + category + ')';
36948                          });
36949           });
36950
36951           // Draw touch targets..
36952           touchLayer
36953               .call(drawTargets, graph, ways, filter$$1);
36954       }
36955
36956
36957       return drawLines;
36958   }
36959
36960   function svgMidpoints$$1(projection, context) {
36961       var targetRadius = 8;
36962
36963       function drawTargets(selection, graph, entities, filter) {
36964           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
36965           var getTransform = svgPointTransform(projection).geojson;
36966
36967           var data = entities.map(function(midpoint) {
36968               return {
36969                   type: 'Feature',
36970                   id: midpoint.id,
36971                   properties: {
36972                       target: true,
36973                       entity: midpoint
36974                   },
36975                   geometry: {
36976                       type: 'Point',
36977                       coordinates: midpoint.loc
36978                   }
36979               };
36980           });
36981
36982           var targets = selection.selectAll('.midpoint.target')
36983               .filter(function(d) { return filter(d.properties.entity); })
36984               .data(data, function key(d) { return d.id; });
36985
36986           // exit
36987           targets.exit()
36988               .remove();
36989
36990           // enter/update
36991           targets.enter()
36992               .append('circle')
36993               .attr('r', targetRadius)
36994               .merge(targets)
36995               .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
36996               .attr('transform', getTransform);
36997       }
36998
36999
37000       function drawMidpoints(selection, graph, entities, filter, extent) {
37001           var drawLayer = selection.selectAll('.layer-osm.points .points-group.midpoints');
37002           var touchLayer = selection.selectAll('.layer-touch.points');
37003
37004           var mode = context.mode();
37005           if (mode && mode.id !== 'select') {
37006               drawLayer.selectAll('.midpoint').remove();
37007               touchLayer.selectAll('.midpoint.target').remove();
37008               return;
37009           }
37010
37011           var poly = extent.polygon();
37012           var midpoints = {};
37013
37014           for (var i = 0; i < entities.length; i++) {
37015               var entity = entities[i];
37016
37017               if (entity.type !== 'way') continue;
37018               if (!filter(entity)) continue;
37019               if (context.selectedIDs().indexOf(entity.id) < 0) continue;
37020
37021               var nodes = graph.childNodes(entity);
37022               for (var j = 0; j < nodes.length - 1; j++) {
37023                   var a = nodes[j];
37024                   var b = nodes[j + 1];
37025                   var id = [a.id, b.id].sort().join('-');
37026
37027                   if (midpoints[id]) {
37028                       midpoints[id].parents.push(entity);
37029                   } else if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
37030                       var point = geoVecInterp(a.loc, b.loc, 0.5);
37031                       var loc = null;
37032
37033                       if (extent.intersects(point)) {
37034                           loc = point;
37035                       } else {
37036                           for (var k = 0; k < 4; k++) {
37037                               point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
37038                               if (point &&
37039                                   geoVecLength(projection(a.loc), projection(point)) > 20 &&
37040                                   geoVecLength(projection(b.loc), projection(point)) > 20)
37041                               {
37042                                   loc = point;
37043                                   break;
37044                               }
37045                           }
37046                       }
37047
37048                       if (loc) {
37049                           midpoints[id] = {
37050                               type: 'midpoint',
37051                               id: id,
37052                               loc: loc,
37053                               edge: [a.id, b.id],
37054                               parents: [entity]
37055                           };
37056                       }
37057                   }
37058               }
37059           }
37060
37061
37062           function midpointFilter(d) {
37063               if (midpoints[d.id])
37064                   return true;
37065
37066               for (var i = 0; i < d.parents.length; i++) {
37067                   if (filter(d.parents[i])) {
37068                       return true;
37069                   }
37070               }
37071
37072               return false;
37073           }
37074
37075
37076           var groups = drawLayer.selectAll('.midpoint')
37077               .filter(midpointFilter)
37078               .data(values$1(midpoints), function(d) { return d.id; });
37079
37080           groups.exit()
37081               .remove();
37082
37083           var enter = groups.enter()
37084               .insert('g', ':first-child')
37085               .attr('class', 'midpoint');
37086
37087           enter
37088               .append('polygon')
37089               .attr('points', '-6,8 10,0 -6,-8')
37090               .attr('class', 'shadow');
37091
37092           enter
37093               .append('polygon')
37094               .attr('points', '-3,4 5,0 -3,-4')
37095               .attr('class', 'fill');
37096
37097           groups = groups
37098               .merge(enter)
37099               .attr('transform', function(d) {
37100                   var translate = svgPointTransform(projection);
37101                   var a = graph.entity(d.edge[0]);
37102                   var b = graph.entity(d.edge[1]);
37103                   var angle = geoAngle(a, b, projection) * (180 / Math.PI);
37104                   return translate(d) + ' rotate(' + angle + ')';
37105               })
37106               .call(svgTagClasses().tags(
37107                   function(d) { return d.parents[0].tags; }
37108               ));
37109
37110           // Propagate data bindings.
37111           groups.select('polygon.shadow');
37112           groups.select('polygon.fill');
37113
37114
37115           // Draw touch targets..
37116           touchLayer
37117               .call(drawTargets, graph, values$1(midpoints), midpointFilter);
37118       }
37119
37120       return drawMidpoints;
37121   }
37122
37123   // Touch targets control which other vertices we can drag a vertex onto.
37124   //
37125   // - the activeID - nope
37126   // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
37127   // - 2 away from the activeID - nope (would create a self intersecting segment)
37128   // - all others on a linear way - yes
37129   // - all others on a closed way - nope (would create a self intersecting polygon)
37130   //
37131   // returns
37132   // 0 = active vertex - no touch/connect
37133   // 1 = passive vertex - yes touch/connect
37134   // 2 = adjacent vertex - yes but pay attention segmenting a line here
37135   //
37136   function svgPassiveVertex(node, graph, activeID) {
37137       if (!activeID) return 1;
37138       if (activeID === node.id) return 0;
37139
37140       var parents = graph.parentWays(node);
37141
37142       for (var i = 0; i < parents.length; i++) {
37143           var nodes = parents[i].nodes;
37144           var isClosed = parents[i].isClosed();
37145           for (var j = 0; j < nodes.length; j++) {   // find this vertex, look nearby
37146               if (nodes[j] === node.id) {
37147                   var ix1 = j - 2;
37148                   var ix2 = j - 1;
37149                   var ix3 = j + 1;
37150                   var ix4 = j + 2;
37151
37152                   if (isClosed) {  // wraparound if needed
37153                       var max = nodes.length - 1;
37154                       if (ix1 < 0)   ix1 = max + ix1;
37155                       if (ix2 < 0)   ix2 = max + ix2;
37156                       if (ix3 > max) ix3 = ix3 - max;
37157                       if (ix4 > max) ix4 = ix4 - max;
37158                   }
37159
37160                   if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
37161                   else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
37162                   else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
37163                   else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
37164                   else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
37165               }
37166           }
37167       }
37168
37169       return 1;   // ok
37170   }
37171
37172
37173   function svgMarkerSegments(projection$$1, graph, dt,
37174                                     shouldReverse,
37175                                     bothDirections) {
37176       return function(entity) {
37177           var i = 0;
37178           var offset = dt;
37179           var segments = [];
37180           var clip = d3_geoIdentity().clipExtent(projection$$1.clipExtent()).stream;
37181           var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
37182           var a, b;
37183
37184           if (shouldReverse(entity)) {
37185               coordinates.reverse();
37186           }
37187
37188           geoStream({
37189               type: 'LineString',
37190               coordinates: coordinates
37191           }, projection$$1.stream(clip({
37192               lineStart: function() {},
37193               lineEnd: function() { a = null; },
37194               point: function(x, y) {
37195                   b = [x, y];
37196
37197                   if (a) {
37198                       var span = geoVecLength(a, b) - offset;
37199
37200                       if (span >= 0) {
37201                           var heading = geoVecAngle(a, b);
37202                           var dx = dt * Math.cos(heading);
37203                           var dy = dt * Math.sin(heading);
37204                           var p = [
37205                               a[0] + offset * Math.cos(heading),
37206                               a[1] + offset * Math.sin(heading)
37207                           ];
37208
37209                           // gather coordinates
37210                           var coord = [a, p];
37211                           for (span -= dt; span >= 0; span -= dt) {
37212                               p = geoVecAdd(p, [dx, dy]);
37213                               coord.push(p);
37214                           }
37215                           coord.push(b);
37216
37217                           // generate svg paths
37218                           var segment = '';
37219                           var j;
37220
37221                           for (j = 0; j < coord.length; j++) {
37222                               segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
37223                           }
37224                           segments.push({ id: entity.id, index: i++, d: segment });
37225
37226                           if (bothDirections(entity)) {
37227                               segment = '';
37228                               for (j = coord.length - 1; j >= 0; j--) {
37229                                   segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
37230                               }
37231                               segments.push({ id: entity.id, index: i++, d: segment });
37232                           }
37233                       }
37234
37235                       offset = -span;
37236                   }
37237
37238                   a = b;
37239               }
37240           })));
37241
37242           return segments;
37243       };
37244   }
37245
37246
37247   function svgPath(projection$$1, graph, isArea) {
37248
37249       // Explanation of magic numbers:
37250       // "padding" here allows space for strokes to extend beyond the viewport,
37251       // so that the stroke isn't drawn along the edge of the viewport when
37252       // the shape is clipped.
37253       //
37254       // When drawing lines, pad viewport by 5px.
37255       // When drawing areas, pad viewport by 65px in each direction to allow
37256       // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
37257
37258       var cache = {};
37259       var padding = isArea ? 65 : 5;
37260       var viewport = projection$$1.clipExtent();
37261       var paddedExtent = [
37262           [viewport[0][0] - padding, viewport[0][1] - padding],
37263           [viewport[1][0] + padding, viewport[1][1] + padding]
37264       ];
37265       var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
37266       var project = projection$$1.stream;
37267       var path = d3_geoPath()
37268           .projection({stream: function(output) { return project(clip(output)); }});
37269
37270       var svgpath = function(entity) {
37271           if (entity.id in cache) {
37272               return cache[entity.id];
37273           } else {
37274               return cache[entity.id] = path(entity.asGeoJSON(graph));
37275           }
37276       };
37277
37278       svgpath.geojson = function(d) {
37279           if (d.__featurehash__ !== undefined) {
37280               if (d.__featurehash__ in cache) {
37281                   return cache[d.__featurehash__];
37282               } else {
37283                   return cache[d.__featurehash__] = path(d);
37284               }
37285           } else {
37286               return path(d);
37287           }
37288       };
37289
37290       return svgpath;
37291   }
37292
37293
37294   function svgPointTransform(projection$$1) {
37295       var svgpoint = function(entity) {
37296           // http://jsperf.com/short-array-join
37297           var pt = projection$$1(entity.loc);
37298           return 'translate(' + pt[0] + ',' + pt[1] + ')';
37299       };
37300
37301       svgpoint.geojson = function(d) {
37302           return svgpoint(d.properties.entity);
37303       };
37304
37305       return svgpoint;
37306   }
37307
37308
37309   function svgRelationMemberTags(graph) {
37310       return function(entity) {
37311           var tags = entity.tags;
37312           graph.parentRelations(entity).forEach(function(relation) {
37313               var type = relation.tags.type;
37314               if (type === 'multipolygon' || type === 'boundary') {
37315                   tags = assignIn({}, relation.tags, tags);
37316               }
37317           });
37318           return tags;
37319       };
37320   }
37321
37322
37323   function svgSegmentWay(way, graph, activeID) {
37324       // When there is no activeID, we can memoize this expensive computation
37325       if (activeID === undefined) {
37326           return graph.transient(way, 'waySegments', getWaySegments);
37327       } else {
37328           return getWaySegments();
37329       }
37330
37331       function getWaySegments() {
37332           var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
37333           var features = { passive: [], active: [] };
37334           var start = {};
37335           var end = {};
37336           var node, type;
37337
37338           for (var i = 0; i < way.nodes.length; i++) {
37339               node = graph.entity(way.nodes[i]);
37340               type = svgPassiveVertex(node, graph, activeID);
37341               end = { node: node, type: type };
37342
37343               if (start.type !== undefined) {
37344                   if (start.node.id === activeID || end.node.id === activeID) ; else if (isActiveWay && (start.type === 2 || end.type === 2)) {   // one adjacent vertex
37345                       pushActive(start, end, i);
37346                   } else if (start.type === 0 && end.type === 0) {   // both active vertices
37347                       pushActive(start, end, i);
37348                   } else {
37349                       pushPassive(start, end, i);
37350                   }
37351               }
37352
37353               start = end;
37354           }
37355
37356           return features;
37357
37358           function pushActive(start, end, index) {
37359               features.active.push({
37360                   type: 'Feature',
37361                   id: way.id + '-' + index + '-nope',
37362                   properties: {
37363                       nope: true,
37364                       target: true,
37365                       entity: way,
37366                       nodes: [start.node, end.node],
37367                       index: index
37368                   },
37369                   geometry: {
37370                       type: 'LineString',
37371                       coordinates: [start.node.loc, end.node.loc]
37372                   }
37373               });
37374           }
37375
37376           function pushPassive(start, end, index) {
37377               features.passive.push({
37378                   type: 'Feature',
37379                   id: way.id + '-' + index,
37380                   properties: {
37381                       target: true,
37382                       entity: way,
37383                       nodes: [start.node, end.node],
37384                       index: index
37385                   },
37386                   geometry: {
37387                       type: 'LineString',
37388                       coordinates: [start.node.loc, end.node.loc]
37389                   }
37390               });
37391           }
37392       }
37393   }
37394
37395   function svgPoints$$1(projection, context) {
37396
37397       function markerPath(selection, klass) {
37398           selection
37399               .attr('class', klass)
37400               .attr('transform', 'translate(-8, -23)')
37401               .attr('d', 'M 17,8 C 17,13 11,21 8.5,23.5 C 6,21 0,13 0,8 C 0,4 4,-0.5 8.5,-0.5 C 13,-0.5 17,4 17,8 z');
37402       }
37403
37404       function sortY(a, b) {
37405           return b.loc[1] - a.loc[1];
37406       }
37407
37408
37409       // Avoid exit/enter if we're just moving stuff around.
37410       // The node will get a new version but we only need to run the update selection.
37411       function fastEntityKey(d) {
37412           var mode = context.mode();
37413           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
37414           return isMoving ? d.id : osmEntity$$1.key(d);
37415       }
37416
37417
37418       function drawTargets(selection, graph, entities, filter) {
37419           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
37420           var getTransform = svgPointTransform(projection).geojson;
37421           var activeID = context.activeID();
37422           var data = [];
37423
37424           entities.forEach(function(node) {
37425               if (activeID === node.id) return;   // draw no target on the activeID
37426
37427               data.push({
37428                   type: 'Feature',
37429                   id: node.id,
37430                   properties: {
37431                       target: true,
37432                       entity: node
37433                   },
37434                   geometry: node.asGeoJSON()
37435               });
37436           });
37437
37438           var targets = selection.selectAll('.point.target')
37439               .filter(function(d) { return filter(d.properties.entity); })
37440               .data(data, function key(d) { return d.id; });
37441
37442           // exit
37443           targets.exit()
37444               .remove();
37445
37446           // enter/update
37447           targets.enter()
37448               .append('rect')
37449               .attr('x', -10)
37450               .attr('y', -26)
37451               .attr('width', 20)
37452               .attr('height', 30)
37453               .merge(targets)
37454               .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
37455               .attr('transform', getTransform);
37456       }
37457
37458
37459       function drawPoints(selection, graph, entities, filter) {
37460           var wireframe = context.surface().classed('fill-wireframe');
37461           var zoom = geoScaleToZoom(projection.scale());
37462
37463           // Points with a direction will render as vertices at higher zooms..
37464           function renderAsPoint(entity) {
37465               return entity.geometry(graph) === 'point' &&
37466                   !(zoom >= 18 && entity.directions(graph, projection).length);
37467           }
37468
37469           // All points will render as vertices in wireframe mode too..
37470           var points = wireframe ? [] : entities.filter(renderAsPoint);
37471           points.sort(sortY);
37472
37473
37474           var drawLayer = selection.selectAll('.layer-osm.points .points-group.points');
37475           var touchLayer = selection.selectAll('.layer-touch.points');
37476
37477           // Draw points..
37478           var groups = drawLayer.selectAll('g.point')
37479               .filter(filter)
37480               .data(points, fastEntityKey);
37481
37482           groups.exit()
37483               .remove();
37484
37485           var enter = groups.enter()
37486               .append('g')
37487               .attr('class', function(d) { return 'node point ' + d.id; })
37488               .order();
37489
37490           enter
37491               .append('path')
37492               .call(markerPath, 'shadow');
37493
37494           enter
37495               .append('ellipse')
37496               .attr('cx', 0.5)
37497               .attr('cy', 1)
37498               .attr('rx', 6.5)
37499               .attr('ry', 3)
37500               .attr('class', 'stroke');
37501
37502           enter
37503               .append('path')
37504               .call(markerPath, 'stroke');
37505
37506           enter
37507               .append('use')
37508               .attr('transform', 'translate(-5, -19)')
37509               .attr('class', 'icon')
37510               .attr('width', '11px')
37511               .attr('height', '11px');
37512
37513           groups = groups
37514               .merge(enter)
37515               .attr('transform', svgPointTransform(projection))
37516               .call(svgTagClasses());
37517
37518           // Selecting the following implicitly
37519           // sets the data (point entity) on the element
37520           groups.select('.shadow');
37521           groups.select('.stroke');
37522           groups.select('.icon')
37523               .attr('xlink:href', function(entity) {
37524                   var preset = context.presets().match(entity, graph);
37525                   var picon = preset && preset.icon;
37526
37527                   if (!picon) {
37528                       return '';
37529                   } else {
37530                       var isMaki = /^maki-/.test(picon);
37531                       return '#' + picon + (isMaki ? '-11' : '');
37532                   }
37533               });
37534
37535
37536           // Draw touch targets..
37537           touchLayer
37538               .call(drawTargets, graph, points, filter);
37539       }
37540
37541
37542       return drawPoints;
37543   }
37544
37545   function svgTagClasses() {
37546       var primaries = [
37547           'building', 'highway', 'railway', 'waterway', 'aeroway',
37548           'motorway', 'boundary', 'power', 'amenity', 'natural', 'landuse',
37549           'leisure', 'military', 'place', 'man_made', 'route', 'attraction'
37550       ];
37551       var statuses = [
37552           'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
37553           'razed', 'demolished', 'obliterated', 'intermittent'
37554       ];
37555       var secondaries = [
37556           'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
37557           'surface', 'tracktype', 'footway', 'crossing', 'service', 'sport',
37558           'public_transport', 'location', 'parking'
37559       ];
37560       var tagClassRe = /^tag-/;
37561       var _tags = function(entity) { return entity.tags; };
37562
37563
37564       var tagClasses = function(selection$$1) {
37565           selection$$1.each(function tagClassesEach(entity) {
37566               var value = this.className;
37567               var classes, primary, status;
37568
37569               if (value.baseVal !== undefined) value = value.baseVal;
37570
37571               classes = value.trim().split(/\s+/).filter(function(name) {
37572                   return name.length && !tagClassRe.test(name);
37573               }).join(' ');
37574
37575               var t = _tags(entity), i, k, v;
37576
37577               // pick at most one primary classification tag..
37578               for (i = 0; i < primaries.length; i++) {
37579                   k = primaries[i];
37580                   v = t[k];
37581                   if (!v || v === 'no') continue;
37582
37583                   primary = k;
37584                   if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
37585                       status = v;
37586                       classes += ' tag-' + k;
37587                   } else {
37588                       classes += ' tag-' + k + ' tag-' + k + '-' + v;
37589                   }
37590
37591                   break;
37592               }
37593
37594               // add at most one status tag, only if relates to primary tag..
37595               if (!status) {
37596                   for (i = 0; i < statuses.length; i++) {
37597                       k = statuses[i];
37598                       v = t[k];
37599                       if (!v || v === 'no') continue;
37600
37601                       if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
37602                           status = k;
37603                       }
37604                       else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
37605                           status = k;
37606                       } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
37607                           status = k;
37608                           primary = v;
37609                           classes += ' tag-' + v;
37610                       }  // else ignore e.g.  `highway=path + abandoned=railway`
37611
37612                       if (status) break;
37613                   }
37614               }
37615
37616               if (status) {
37617                   classes += ' tag-status tag-status-' + status;
37618               }
37619
37620               // add any secondary (structure) tags
37621               for (i = 0; i < secondaries.length; i++) {
37622                   k = secondaries[i];
37623                   v = t[k];
37624                   if (!v || v === 'no') continue;
37625                   classes += ' tag-' + k + ' tag-' + k + '-' + v;
37626               }
37627
37628               // For highways, look for surface tagging..
37629               if (primary === 'highway' || primary === 'aeroway') {
37630                   var paved = (t.highway !== 'track');
37631                   for (k in t) {
37632                       v = t[k];
37633                       if (k in osmPavedTags) {
37634                           paved = !!osmPavedTags[k][v];
37635                           break;
37636                       }
37637                   }
37638                   if (!paved) {
37639                       classes += ' tag-unpaved';
37640                   }
37641               }
37642
37643               classes = classes.trim();
37644
37645               if (classes !== value) {
37646                   select(this).attr('class', classes);
37647               }
37648           });
37649       };
37650
37651
37652       tagClasses.tags = function(_) {
37653           if (!arguments.length) return _tags;
37654           _tags = _;
37655           return tagClasses;
37656       };
37657
37658       return tagClasses;
37659   }
37660
37661   function svgTurns(projection, context) {
37662
37663       function icon(turn) {
37664           var u = turn.u ? '-u' : '';
37665           if (turn.no) return '#iD-turn-no' + u;
37666           if (turn.only) return '#iD-turn-only' + u;
37667           return '#iD-turn-yes' + u;
37668       }
37669
37670       function drawTurns(selection, graph, turns) {
37671
37672           function turnTransform(d) {
37673               var pxRadius = 50;
37674               var toWay = graph.entity(d.to.way);
37675               var toPoints = graph.childNodes(toWay)
37676                   .map(function (n) { return n.loc; })
37677                   .map(projection);
37678               var toLength = geoPathLength(toPoints);
37679               var mid = toLength / 2;    // midpoint of destination way
37680
37681               var toNode = graph.entity(d.to.node);
37682               var toVertex = graph.entity(d.to.vertex);
37683               var a = geoAngle(toVertex, toNode, projection);
37684               var o = projection(toVertex.loc);
37685               var r = d.u ? 0                  // u-turn: no radius
37686                   : !toWay.__via ? pxRadius    // leaf way: put marker at pxRadius
37687                   : Math.min(mid, pxRadius);   // via way: prefer pxRadius, fallback to mid for very short ways
37688
37689               return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
37690                   'rotate(' + a * 180 / Math.PI + ')';
37691           }
37692
37693
37694           var drawLayer = selection.selectAll('.layer-osm.points .points-group.turns');
37695           var touchLayer = selection.selectAll('.layer-touch.turns');
37696
37697           // Draw turns..
37698           var groups = drawLayer.selectAll('g.turn')
37699               .data(turns, function(d) { return d.key; });
37700
37701           // exit
37702           groups.exit()
37703               .remove();
37704
37705           // enter
37706           var groupsEnter = groups.enter()
37707               .append('g')
37708               .attr('class', function(d) { return 'turn ' + d.key; });
37709
37710           var turnsEnter = groupsEnter
37711               .filter(function(d) { return !d.u; });
37712
37713           turnsEnter.append('rect')
37714               .attr('transform', 'translate(-22, -12)')
37715               .attr('width', '44')
37716               .attr('height', '24');
37717
37718           turnsEnter.append('use')
37719               .attr('transform', 'translate(-22, -12)')
37720               .attr('width', '44')
37721               .attr('height', '24');
37722
37723           var uEnter = groupsEnter
37724               .filter(function(d) { return d.u; });
37725
37726           uEnter.append('circle')
37727               .attr('r', '16');
37728
37729           uEnter.append('use')
37730               .attr('transform', 'translate(-16, -16)')
37731               .attr('width', '32')
37732               .attr('height', '32');
37733
37734           // update
37735           groups = groups
37736               .merge(groupsEnter)
37737               .attr('opacity', function(d) { return d.direct === false ? '0.7' : null; })
37738               .attr('transform', turnTransform);
37739
37740           groups.select('use')
37741               .attr('xlink:href', icon);
37742
37743           groups.select('rect');      // propagate bound data
37744           groups.select('circle');    // propagate bound data
37745
37746
37747           // Draw touch targets..
37748           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
37749           groups = touchLayer.selectAll('g.turn')
37750               .data(turns, function(d) { return d.key; });
37751
37752           // exit
37753           groups.exit()
37754               .remove();
37755
37756           // enter
37757           groupsEnter = groups.enter()
37758               .append('g')
37759               .attr('class', function(d) { return 'turn ' + d.key; });
37760
37761           turnsEnter = groupsEnter
37762               .filter(function(d) { return !d.u; });
37763
37764           turnsEnter.append('rect')
37765               .attr('class', 'target ' + fillClass)
37766               .attr('transform', 'translate(-22, -12)')
37767               .attr('width', '44')
37768               .attr('height', '24');
37769
37770           uEnter = groupsEnter
37771               .filter(function(d) { return d.u; });
37772
37773           uEnter.append('circle')
37774               .attr('class', 'target ' + fillClass)
37775               .attr('r', '16');
37776
37777           // update
37778           groups = groups
37779               .merge(groupsEnter)
37780               .attr('transform', turnTransform);
37781
37782           groups.select('rect');      // propagate bound data
37783           groups.select('circle');    // propagate bound data
37784
37785
37786           return this;
37787       }
37788
37789       return drawTurns;
37790   }
37791
37792   function svgVertices$$1(projection, context) {
37793       var radiuses = {
37794           //       z16-, z17,   z18+,  w/icon
37795           shadow: [6,    7.5,   7.5,   12],
37796           stroke: [2.5,  3.5,   3.5,   8],
37797           fill:   [1,    1.5,   1.5,   1.5]
37798       };
37799
37800       var _currHoverTarget;
37801       var _currPersistent = {};
37802       var _currHover = {};
37803       var _prevHover = {};
37804       var _currSelected = {};
37805       var _prevSelected = {};
37806       var _radii = {};
37807
37808
37809       function sortY(a, b) {
37810           return b.loc[1] - a.loc[1];
37811       }
37812
37813       // Avoid exit/enter if we're just moving stuff around.
37814       // The node will get a new version but we only need to run the update selection.
37815       function fastEntityKey(d) {
37816           var mode = context.mode();
37817           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
37818           return isMoving ? d.id : osmEntity$$1.key(d);
37819       }
37820
37821
37822       function draw(selection$$1, graph, vertices, sets, filter) {
37823           sets = sets || { selected: {}, important: {}, hovered: {} };
37824
37825           var icons = {};
37826           var directions = {};
37827           var wireframe = context.surface().classed('fill-wireframe');
37828           var zoom = geoScaleToZoom(projection.scale());
37829           var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
37830
37831
37832           function getIcon(d) {
37833               // always check latest entity, as fastEntityKey avoids enter/exit now
37834               var entity = graph.entity(d.id);
37835               if (entity.id in icons) return icons[entity.id];
37836
37837               icons[entity.id] =
37838                   entity.hasInterestingTags() &&
37839                   context.presets().match(entity, graph).icon;
37840               return icons[entity.id];
37841           }
37842
37843
37844           // memoize directions results, return false for empty arrays (for use in filter)
37845           function getDirections(entity) {
37846               if (entity.id in directions) return directions[entity.id];
37847
37848               var angles = entity.directions(graph, projection);
37849               directions[entity.id] = angles.length ? angles : false;
37850               return angles;
37851           }
37852
37853
37854           function updateAttributes(selection$$1) {
37855               ['shadow', 'stroke', 'fill'].forEach(function(klass) {
37856                   var rads = radiuses[klass];
37857                   selection$$1.selectAll('.' + klass)
37858                       .each(function(entity) {
37859                           var i = z && getIcon(entity);
37860                           var r = rads[i ? 3 : z];
37861
37862                           // slightly increase the size of unconnected endpoints #3775
37863                           if (entity.isEndpoint(graph) && !entity.isConnected(graph)) {
37864                               r += 1.5;
37865                           }
37866
37867                           if (klass === 'shadow') {   // remember this value, so we don't need to
37868                               _radii[entity.id] = r;  // recompute it when we draw the touch targets
37869                           }
37870
37871                           select(this)
37872                               .attr('r', r)
37873                               .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
37874                       });
37875               });
37876           }
37877
37878           vertices.sort(sortY);
37879
37880           var groups = selection$$1.selectAll('g.vertex')
37881               .filter(filter)
37882               .data(vertices, fastEntityKey);
37883
37884           // exit
37885           groups.exit()
37886               .remove();
37887
37888           // enter
37889           var enter = groups.enter()
37890               .append('g')
37891               .attr('class', function(d) { return 'node vertex ' + d.id; })
37892               .order();
37893
37894           enter
37895               .append('circle')
37896               .attr('class', 'shadow');
37897
37898           enter
37899               .append('circle')
37900               .attr('class', 'stroke');
37901
37902           // Vertices with tags get a fill.
37903           enter.filter(function(d) { return d.hasInterestingTags(); })
37904               .append('circle')
37905               .attr('class', 'fill');
37906
37907           // update
37908           groups = groups
37909               .merge(enter)
37910               .attr('transform', svgPointTransform(projection))
37911               .classed('sibling', function(d) { return d.id in sets.selected; })
37912               .classed('shared', function(d) { return graph.isShared(d); })
37913               .classed('endpoint', function(d) { return d.isEndpoint(graph); })
37914               .call(updateAttributes);
37915
37916
37917           // Vertices with icons get a `use`.
37918           var iconUse = groups
37919               .selectAll('.icon')
37920               .data(function data(d) { return zoom >= 17 && getIcon(d) ? [d] : []; }, fastEntityKey);
37921
37922           // exit
37923           iconUse.exit()
37924               .remove();
37925
37926           // enter
37927           iconUse.enter()
37928               .append('use')
37929               .attr('class', 'icon')
37930               .attr('width', '11px')
37931               .attr('height', '11px')
37932               .attr('transform', 'translate(-5.5, -5.5)')
37933               .attr('xlink:href', function(d) {
37934                   var picon = getIcon(d);
37935                   var isMaki = /^maki-/.test(picon);
37936                   return '#' + picon + (isMaki ? '-11' : '');
37937               });
37938
37939
37940           // Vertices with directions get viewfields
37941           var dgroups = groups
37942               .selectAll('.viewfieldgroup')
37943               .data(function data(d) { return zoom >= 18 && getDirections(d) ? [d] : []; }, fastEntityKey);
37944
37945           // exit
37946           dgroups.exit()
37947               .remove();
37948
37949           // enter/update
37950           dgroups = dgroups.enter()
37951               .insert('g', '.shadow')
37952               .attr('class', 'viewfieldgroup')
37953               .merge(dgroups);
37954
37955           var viewfields = dgroups.selectAll('.viewfield')
37956               .data(getDirections, function key(d) { return osmEntity$$1.key(d); });
37957
37958           // exit
37959           viewfields.exit()
37960               .remove();
37961
37962           // enter/update
37963           viewfields.enter()
37964               .append('path')
37965               .attr('class', 'viewfield')
37966               .attr('d', 'M0,0H0')
37967               .merge(viewfields)
37968               .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
37969               .attr('transform', function(d) { return 'rotate(' + d + ')'; });
37970       }
37971
37972
37973       function drawTargets(selection$$1, graph, entities, filter) {
37974           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
37975           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
37976           var getTransform = svgPointTransform(projection).geojson;
37977           var activeID = context.activeID();
37978           var data = { targets: [], nopes: [] };
37979
37980           entities.forEach(function(node) {
37981               if (activeID === node.id) return;   // draw no target on the activeID
37982
37983               var vertexType = svgPassiveVertex(node, graph, activeID);
37984               if (vertexType !== 0) {     // passive or adjacent - allow to connect
37985                   data.targets.push({
37986                       type: 'Feature',
37987                       id: node.id,
37988                       properties: {
37989                           target: true,
37990                           entity: node
37991                       },
37992                       geometry: node.asGeoJSON()
37993                   });
37994               } else {
37995                   data.nopes.push({
37996                       type: 'Feature',
37997                       id: node.id + '-nope',
37998                       properties: {
37999                           nope: true,
38000                           target: true,
38001                           entity: node
38002                       },
38003                       geometry: node.asGeoJSON()
38004                   });
38005               }
38006           });
38007
38008
38009           // Targets allow hover and vertex snapping
38010           var targets = selection$$1.selectAll('.vertex.target-allowed')
38011               .filter(function(d) { return filter(d.properties.entity); })
38012               .data(data.targets, function key(d) { return d.id; });
38013
38014           // exit
38015           targets.exit()
38016               .remove();
38017
38018           // enter/update
38019           targets.enter()
38020               .append('circle')
38021               .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
38022               .merge(targets)
38023               .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
38024               .attr('transform', getTransform);
38025
38026
38027           // NOPE
38028           var nopes = selection$$1.selectAll('.vertex.target-nope')
38029               .filter(function(d) { return filter(d.properties.entity); })
38030               .data(data.nopes, function key(d) { return d.id; });
38031
38032           // exit
38033           nopes.exit()
38034               .remove();
38035
38036           // enter/update
38037           nopes.enter()
38038               .append('circle')
38039               .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
38040               .merge(nopes)
38041               .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
38042               .attr('transform', getTransform);
38043       }
38044
38045
38046       // Points can also render as vertices:
38047       // 1. in wireframe mode or
38048       // 2. at higher zooms if they have a direction
38049       function renderAsVertex(entity, graph, wireframe, zoom) {
38050           var geometry = entity.geometry(graph);
38051           return geometry === 'vertex' || (geometry === 'point' && (
38052               wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
38053           ));
38054       }
38055
38056
38057       function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
38058           var results = {};
38059
38060           function addChildVertices(entity) {
38061               var geometry = entity.geometry(graph);
38062               if (!context.features().isHiddenFeature(entity, graph, geometry)) {
38063                   var i;
38064                   if (entity.type === 'way') {
38065                       for (i = 0; i < entity.nodes.length; i++) {
38066                           var child = graph.hasEntity(entity.nodes[i]);
38067                           if (child) {
38068                               addChildVertices(child);
38069                           }
38070                       }
38071                   } else if (entity.type === 'relation') {
38072                       for (i = 0; i < entity.members.length; i++) {
38073                           var member = graph.hasEntity(entity.members[i].id);
38074                           if (member) {
38075                               addChildVertices(member);
38076                           }
38077                       }
38078                   } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
38079                       results[entity.id] = entity;
38080                   }
38081               }
38082           }
38083
38084           ids.forEach(function(id) {
38085               var entity = graph.hasEntity(id);
38086               if (!entity) return;
38087
38088               if (entity.type === 'node') {
38089                   if (renderAsVertex(entity, graph, wireframe, zoom)) {
38090                       results[entity.id] = entity;
38091                       graph.parentWays(entity).forEach(function(entity) {
38092                           addChildVertices(entity);
38093                       });
38094                   }
38095               } else {  // way, relation
38096                   addChildVertices(entity);
38097               }
38098           });
38099
38100           return results;
38101       }
38102
38103
38104       function drawVertices(selection$$1, graph, entities, filter, extent, fullRedraw) {
38105           var wireframe = context.surface().classed('fill-wireframe');
38106           var zoom = geoScaleToZoom(projection.scale());
38107           var mode = context.mode();
38108           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
38109
38110           var drawLayer = selection$$1.selectAll('.layer-osm.points .points-group.vertices');
38111           var touchLayer = selection$$1.selectAll('.layer-touch.points');
38112
38113           if (fullRedraw) {
38114               _currPersistent = {};
38115               _radii = {};
38116           }
38117
38118           // Collect important vertices from the `entities` list..
38119           // (during a paritial redraw, it will not contain everything)
38120           for (var i = 0; i < entities.length; i++) {
38121               var entity = entities[i];
38122               var geometry = entity.geometry(graph);
38123               var keep = false;
38124
38125               // a point that looks like a vertex..
38126               if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
38127                   _currPersistent[entity.id] = entity;
38128                   keep = true;
38129
38130               // a vertex of some importance..
38131               } else if (geometry === 'vertex' &&
38132                   (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
38133                   _currPersistent[entity.id] = entity;
38134                   keep = true;
38135               }
38136
38137               // whatever this is, it's not a persistent vertex..
38138               if (!keep && !fullRedraw) {
38139                   delete _currPersistent[entity.id];
38140               }
38141           }
38142
38143           // 3 sets of vertices to consider:
38144           var sets = {
38145               persistent: _currPersistent,  // persistent = important vertices (render always)
38146               selected: _currSelected,      // selected + siblings of selected (render always)
38147               hovered: _currHover           // hovered + siblings of hovered (render only in draw modes)
38148           };
38149
38150           var all = assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
38151
38152           // Draw the vertices..
38153           // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
38154           // Adjust the filter function to expand the scope beyond whatever entities were passed in.
38155           var filterRendered = function(d) {
38156               return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
38157           };
38158           drawLayer
38159               .call(draw, graph, currentVisible(all), sets, filterRendered);
38160
38161           // Draw touch targets..
38162           // When drawing, render all targets (not just those affected by a partial redraw)
38163           var filterTouch = function(d) {
38164               return isMoving ? true : filterRendered(d);
38165           };
38166           touchLayer
38167               .call(drawTargets, graph, currentVisible(all), filterTouch);
38168
38169
38170           function currentVisible(which) {
38171               return Object.keys(which)
38172                   .map(graph.hasEntity, graph)     // the current version of this entity
38173                   .filter(function (entity) { return entity && entity.intersects(extent, graph); });
38174           }
38175       }
38176
38177
38178       // partial redraw - only update the selected items..
38179       drawVertices.drawSelected = function(selection$$1, graph, extent) {
38180           var wireframe = context.surface().classed('fill-wireframe');
38181           var zoom = geoScaleToZoom(projection.scale());
38182
38183           _prevSelected = _currSelected || {};
38184           _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
38185
38186           // note that drawVertices will add `_currSelected` automatically if needed..
38187           var filter = function(d) { return d.id in _prevSelected; };
38188           drawVertices(selection$$1, graph, values$1(_prevSelected), filter, extent, false);
38189       };
38190
38191
38192       // partial redraw - only update the hovered items..
38193       drawVertices.drawHover = function(selection$$1, graph, target, extent) {
38194           if (target === _currHoverTarget) return;  // continue only if something changed
38195
38196           var wireframe = context.surface().classed('fill-wireframe');
38197           var zoom = geoScaleToZoom(projection.scale());
38198
38199           _prevHover = _currHover || {};
38200           _currHoverTarget = target;
38201           var entity = target && target.properties && target.properties.entity;
38202
38203           if (entity) {
38204               _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
38205           } else {
38206               _currHover = {};
38207           }
38208
38209           // note that drawVertices will add `_currHover` automatically if needed..
38210           var filter = function(d) { return d.id in _prevHover; };
38211           drawVertices(selection$$1, graph, values$1(_prevHover), filter, extent, false);
38212       };
38213
38214       return drawVertices;
38215   }
38216
38217   /* global Mapillary:false */
38218
38219
38220   var apibase = 'https://a.mapillary.com/v3/';
38221   var viewercss = 'mapillary-js/mapillary.min.css';
38222   var viewerjs = 'mapillary-js/mapillary.min.js';
38223   var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
38224   var maxResults = 1000;
38225   var tileZoom = 14;
38226   var tiler = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
38227   var dispatch$1 = dispatch('loadedImages', 'loadedSigns', 'bearingChanged');
38228   var _mlyFallback = false;
38229   var _mlyCache;
38230   var _mlyClicks;
38231   var _mlySelectedImage;
38232   var _mlyViewer;
38233
38234
38235   function abortRequest(i) {
38236       i.abort();
38237   }
38238
38239
38240   function maxPageAtZoom(z) {
38241       if (z < 15)   return 2;
38242       if (z === 15) return 5;
38243       if (z === 16) return 10;
38244       if (z === 17) return 20;
38245       if (z === 18) return 40;
38246       if (z > 18)   return 80;
38247   }
38248
38249
38250   function loadTiles(which, url, projection) {
38251       var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
38252       var tiles = tiler.getTiles(projection);
38253
38254       // abort inflight requests that are no longer needed
38255       var cache = _mlyCache[which];
38256       forEach(cache.inflight, function(v, k) {
38257           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
38258
38259           if (!wanted) {
38260               abortRequest(v);
38261               delete cache.inflight[k];
38262           }
38263       });
38264
38265       tiles.forEach(function(tile) {
38266           loadNextTilePage(which, currZoom, url, tile);
38267       });
38268   }
38269
38270
38271   function loadNextTilePage(which, currZoom, url, tile) {
38272       var cache = _mlyCache[which];
38273       var rect = tile.extent.rectangle();
38274       var maxPages = maxPageAtZoom(currZoom);
38275       var nextPage = cache.nextPage[tile.id] || 0;
38276       var nextURL = cache.nextURL[tile.id] || url +
38277           utilQsString({
38278               per_page: maxResults,
38279               page: nextPage,
38280               client_id: clientId,
38281               bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
38282           });
38283
38284       if (nextPage > maxPages) return;
38285
38286       var id = tile.id + ',' + String(nextPage);
38287       if (cache.loaded[id] || cache.inflight[id]) return;
38288       cache.inflight[id] = request(nextURL)
38289           .mimeType('application/json')
38290           .response(function(xhr) {
38291               var linkHeader = xhr.getResponseHeader('Link');
38292               if (linkHeader) {
38293                   var pagination = parsePagination(xhr.getResponseHeader('Link'));
38294                   if (pagination.next) {
38295                       cache.nextURL[tile.id] = pagination.next;
38296                   }
38297               }
38298               return JSON.parse(xhr.responseText);
38299           })
38300           .get(function(err, data) {
38301               cache.loaded[id] = true;
38302               delete cache.inflight[id];
38303               if (err || !data.features || !data.features.length) return;
38304
38305               var features = data.features.map(function(feature) {
38306                   var loc = feature.geometry.coordinates;
38307                   var d;
38308
38309                   // An image (shown as a green dot on the map) is a single street photo with extra
38310                   // information such as location, camera angle (CA), camera model, and so on.
38311                   // Each image feature is a GeoJSON Point
38312                   if (which === 'images') {
38313                       d = {
38314                           loc: loc,
38315                           key: feature.properties.key,
38316                           ca: feature.properties.ca,
38317                           captured_at: feature.properties.captured_at,
38318                           captured_by: feature.properties.username,
38319                           pano: feature.properties.pano
38320                       };
38321
38322                       cache.forImageKey[d.key] = d;     // cache imageKey -> image
38323
38324                   // Mapillary organizes images as sequences. A sequence of images are continuously captured
38325                   // by a user at a give time. Sequences are shown on the map as green lines.
38326                   // Each sequence feature is a GeoJSON LineString
38327                   } else if (which === 'sequences') {
38328                       var sequenceKey = feature.properties.key;
38329                       cache.lineString[sequenceKey] = feature;           // cache sequenceKey -> lineString
38330                       feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
38331                           cache.forImageKey[imageKey] = sequenceKey;     // cache imageKey -> sequenceKey
38332                       });
38333                       return false;    // because no `d` data worth loading into an rbush
38334
38335                   // An image detection is a semantic pixel area on an image. The area could indicate
38336                   // sky, trees, sidewalk in the image. A detection can be a polygon, a bounding box, or a point.
38337                   // Each image_detection feature is a GeoJSON Point (located where the image was taken)
38338                   } else if (which === 'image_detections') {
38339                       d = {
38340                           key: feature.properties.key,
38341                           image_key: feature.properties.image_key,
38342                           value: feature.properties.value,
38343                           package: feature.properties.package,
38344                           shape: feature.properties.shape
38345                       };
38346
38347                       // cache imageKey -> image_detections
38348                       if (!cache.forImageKey[d.image_key]) {
38349                           cache.forImageKey[d.image_key] = [];
38350                       }
38351                       cache.forImageKey[d.image_key].push(d);
38352                       return false;    // because no `d` data worth loading into an rbush
38353
38354
38355                   // A map feature is a real world object that can be shown on a map. It could be any object
38356                   // recognized from images, manually added in images, or added on the map.
38357                   // Each map feature is a GeoJSON Point (located where the feature is)
38358                   } else if (which === 'map_features') {
38359                       d = {
38360                           loc: loc,
38361                           key: feature.properties.key,
38362                           value: feature.properties.value,
38363                           package: feature.properties.package,
38364                           detections: feature.properties.detections
38365                       };
38366                   }
38367
38368                   return {
38369                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
38370                   };
38371
38372               }).filter(Boolean);
38373
38374               if (cache.rtree && features) {
38375                   cache.rtree.load(features);
38376               }
38377
38378               if (which === 'images' || which === 'sequences') {
38379                   dispatch$1.call('loadedImages');
38380               } else if (which === 'map_features') {
38381                   dispatch$1.call('loadedSigns');
38382               }
38383
38384               if (data.features.length === maxResults) {  // more pages to load
38385                   cache.nextPage[tile.id] = nextPage + 1;
38386                   loadNextTilePage(which, currZoom, url, tile);
38387               } else {
38388                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
38389               }
38390           });
38391   }
38392
38393   // extract links to pages of API results
38394   function parsePagination(links) {
38395       return links.split(',').map(function(rel) {
38396           var elements = rel.split(';');
38397           if (elements.length === 2) {
38398               return [
38399                   /<(.+)>/.exec(elements[0])[1],
38400                   /rel="(.+)"/.exec(elements[1])[1]
38401               ];
38402           } else {
38403               return ['',''];
38404           }
38405       }).reduce(function(pagination, val) {
38406           pagination[val[1]] = val[0];
38407           return pagination;
38408       }, {});
38409   }
38410
38411
38412   // partition viewport into higher zoom tiles
38413   function partitionViewport(projection) {
38414       var z = geoScaleToZoom(projection.scale());
38415       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
38416       var tiler = utilTiler().zoomExtent([z2, z2]);
38417
38418       return tiler.getTiles(projection)
38419           .map(function(tile) { return tile.extent; });
38420   }
38421
38422
38423   // no more than `limit` results per partition.
38424   function searchLimited(limit, projection, rtree) {
38425       limit = limit || 5;
38426
38427       return partitionViewport(projection)
38428           .reduce(function(result, extent) {
38429               var found = rtree.search(extent.bbox())
38430                   .slice(0, limit)
38431                   .map(function(d) { return d.data; });
38432
38433               return (found.length ? result.concat(found) : result);
38434           }, []);
38435   }
38436
38437
38438
38439   var serviceMapillary = {
38440
38441       init: function() {
38442           if (!_mlyCache) {
38443               this.reset();
38444           }
38445
38446           this.event = utilRebind(this, dispatch$1, 'on');
38447       },
38448
38449       reset: function() {
38450           var cache = _mlyCache;
38451
38452           if (cache) {
38453               if (cache.images && cache.images.inflight) {
38454                   forEach(cache.images.inflight, abortRequest);
38455               }
38456               if (cache.image_detections && cache.image_detections.inflight) {
38457                   forEach(cache.image_detections.inflight, abortRequest);
38458               }
38459               if (cache.map_features && cache.map_features.inflight) {
38460                   forEach(cache.map_features.inflight, abortRequest);
38461               }
38462               if (cache.sequences && cache.sequences.inflight) {
38463                   forEach(cache.sequences.inflight, abortRequest);
38464               }
38465           }
38466
38467           _mlyCache = {
38468               images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
38469               image_detections: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, forImageKey: {} },
38470               map_features: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
38471               sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} }
38472           };
38473
38474           _mlySelectedImage = null;
38475           _mlyClicks = [];
38476       },
38477
38478
38479       images: function(projection) {
38480           var limit = 5;
38481           return searchLimited(limit, projection, _mlyCache.images.rtree);
38482       },
38483
38484
38485       signs: function(projection) {
38486           var limit = 5;
38487           return searchLimited(limit, projection, _mlyCache.map_features.rtree);
38488       },
38489
38490
38491       sequences: function(projection) {
38492           var viewport = projection.clipExtent();
38493           var min = [viewport[0][0], viewport[1][1]];
38494           var max = [viewport[1][0], viewport[0][1]];
38495           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
38496           var sequenceKeys = {};
38497
38498           // all sequences for images in viewport
38499           _mlyCache.images.rtree.search(bbox)
38500               .forEach(function(d) {
38501                   var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
38502                   if (sequenceKey) {
38503                       sequenceKeys[sequenceKey] = true;
38504                   }
38505               });
38506
38507           // Return lineStrings for the sequences
38508           return Object.keys(sequenceKeys).map(function(sequenceKey) {
38509               return _mlyCache.sequences.lineString[sequenceKey];
38510           });
38511       },
38512
38513
38514       signsSupported: function() {
38515           return true;
38516       },
38517
38518
38519       loadImages: function(projection) {
38520           loadTiles('images', apibase + 'images?', projection);
38521           loadTiles('sequences', apibase + 'sequences?', projection);
38522       },
38523
38524
38525       loadSigns: function(context, projection) {
38526           // if we are looking at signs, we'll actually need to fetch images too
38527           loadTiles('images', apibase + 'images?', projection);
38528           loadTiles('map_features', apibase + 'map_features?layers=trafficsigns&min_nbr_image_detections=1&', projection);
38529           loadTiles('image_detections', apibase + 'image_detections?layers=trafficsigns&', projection);
38530       },
38531
38532
38533       loadViewer: function(context) {
38534           // add mly-wrapper
38535           var wrap = select('#photoviewer').selectAll('.mly-wrapper')
38536               .data([0]);
38537
38538           wrap.enter()
38539               .append('div')
38540               .attr('id', 'mly')
38541               .attr('class', 'photo-wrapper mly-wrapper')
38542               .classed('hide', true);
38543
38544           // load mapillary-viewercss
38545           select('head').selectAll('#mapillary-viewercss')
38546               .data([0])
38547               .enter()
38548               .append('link')
38549               .attr('id', 'mapillary-viewercss')
38550               .attr('rel', 'stylesheet')
38551               .attr('href', context.asset(viewercss));
38552
38553           // load mapillary-viewerjs
38554           select('head').selectAll('#mapillary-viewerjs')
38555               .data([0])
38556               .enter()
38557               .append('script')
38558               .attr('id', 'mapillary-viewerjs')
38559               .attr('src', context.asset(viewerjs));
38560
38561           // load mapillary signs sprite
38562           var defs = context.container().select('defs');
38563           defs.call(svgDefs(context).addSprites, ['mapillary-sprite']);
38564
38565           // Register viewer resize handler
38566           context.ui().photoviewer.on('resize', function() {
38567               if (_mlyViewer) {
38568                   _mlyViewer.resize();
38569               }
38570           });
38571       },
38572
38573
38574       showViewer: function() {
38575           var wrap = select('#photoviewer')
38576               .classed('hide', false);
38577
38578           var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
38579
38580           if (isHidden && _mlyViewer) {
38581               wrap
38582                   .selectAll('.photo-wrapper:not(.mly-wrapper)')
38583                   .classed('hide', true);
38584
38585               wrap
38586                   .selectAll('.photo-wrapper.mly-wrapper')
38587                   .classed('hide', false);
38588
38589               _mlyViewer.resize();
38590           }
38591
38592           return this;
38593       },
38594
38595
38596       hideViewer: function() {
38597           _mlySelectedImage = null;
38598
38599           if (!_mlyFallback && _mlyViewer) {
38600               _mlyViewer.getComponent('sequence').stop();
38601           }
38602
38603           var viewer = select('#photoviewer');
38604           if (!viewer.empty()) viewer.datum(null);
38605
38606           viewer
38607               .classed('hide', true)
38608               .selectAll('.photo-wrapper')
38609               .classed('hide', true);
38610
38611           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
38612               .classed('selected', false);
38613
38614           return this.setStyles(null, true);
38615       },
38616
38617
38618       parsePagination: parsePagination,
38619
38620
38621       updateViewer: function(imageKey, context) {
38622           if (!imageKey) return this;
38623
38624           if (!_mlyViewer) {
38625               this.initViewer(imageKey, context);
38626           } else {
38627               _mlyViewer.moveToKey(imageKey)
38628                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
38629           }
38630
38631           return this;
38632       },
38633
38634
38635       initViewer: function(imageKey, context) {
38636           var that = this;
38637           if (window.Mapillary && imageKey) {
38638               var opts = {
38639                   baseImageSize: 320,
38640                   component: {
38641                       cover: false,
38642                       keyboard: false,
38643                       tag: true
38644                   }
38645               };
38646
38647               // Disable components requiring WebGL support
38648               if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
38649                   _mlyFallback = true;
38650                   opts.component = {
38651                       cover: false,
38652                       direction: false,
38653                       imagePlane: false,
38654                       keyboard: false,
38655                       mouse: false,
38656                       sequence: false,
38657                       tag: false,
38658                       image: true,        // fallback
38659                       navigation: true    // fallback
38660                   };
38661               }
38662
38663               _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
38664               _mlyViewer.on('nodechanged', nodeChanged);
38665               _mlyViewer.on('bearingchanged', bearingChanged);
38666               _mlyViewer.moveToKey(imageKey)
38667                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
38668           }
38669
38670           // nodeChanged: called after the viewer has changed images and is ready.
38671           //
38672           // There is some logic here to batch up clicks into a _mlyClicks array
38673           // because the user might click on a lot of markers quickly and nodechanged
38674           // may be called out of order asychronously.
38675           //
38676           // Clicks are added to the array in `selectedImage` and removed here.
38677           //
38678           function nodeChanged(node) {
38679               if (!_mlyFallback) {
38680                   _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
38681               }
38682
38683               var clicks = _mlyClicks;
38684               var index = clicks.indexOf(node.key);
38685               var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
38686
38687               if (index > -1) {              // `nodechanged` initiated from clicking on a marker..
38688                   clicks.splice(index, 1);   // remove the click
38689                   // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
38690                   // one more time to update the detections and attribution..
38691                   if (node.key === selectedKey) {
38692                       that.selectImage(_mlySelectedImage, node.key, true);
38693                   }
38694               } else {             // `nodechanged` initiated from the Mapillary viewer controls..
38695                   var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
38696                   context.map().centerEase(loc);
38697                   that.selectImage(undefined, node.key, true);
38698               }
38699           }
38700
38701           function bearingChanged(e) {
38702               dispatch$1.call('bearingChanged', undefined, e);
38703           }
38704       },
38705
38706
38707       // Pass the image datum itself in `d` or the `imageKey` string.
38708       // This allows images to be selected from places that dont have access
38709       // to the full image datum (like the street signs layer or the js viewer)
38710       selectImage: function(d, imageKey, fromViewer) {
38711           if (!d && imageKey) {
38712               // If the user clicked on something that's not an image marker, we
38713               // might get in here.. Cache lookup can fail, e.g. if the user
38714               // clicked a streetsign, but images are loading slowly asynchronously.
38715               // We'll try to carry on anyway if there is no datum.  There just
38716               // might be a delay before user sees detections, captured_at, etc.
38717               d = _mlyCache.images.forImageKey[imageKey];
38718           }
38719
38720           _mlySelectedImage = d;
38721           var viewer = select('#photoviewer');
38722           if (!viewer.empty()) viewer.datum(d);
38723
38724           imageKey = (d && d.key) || imageKey;
38725           if (!fromViewer && imageKey) {
38726               _mlyClicks.push(imageKey);
38727           }
38728
38729           this.setStyles(null, true);
38730
38731           // if signs signs are shown, highlight the ones that appear in this image
38732           d3_selectAll('.layer-mapillary-signs .icon-sign')
38733               .classed('selected', function(d) {
38734                   return some(d.detections, function(detection) {
38735                       return detection.image_key === imageKey;
38736                   });
38737               });
38738
38739           if (d) {
38740               this.updateDetections(d);
38741           }
38742
38743           return this;
38744       },
38745
38746
38747       getSelectedImage: function() {
38748           return _mlySelectedImage;
38749       },
38750
38751
38752       getSequenceKeyForImage: function(d) {
38753           var imageKey = d && d.key;
38754           return imageKey && _mlyCache.sequences.forImageKey[imageKey];
38755       },
38756
38757
38758       setStyles: function(hovered, reset) {
38759           if (reset) {  // reset all layers
38760               d3_selectAll('.viewfield-group')
38761                   .classed('highlighted', false)
38762                   .classed('hovered', false)
38763                   .classed('selected', false);
38764
38765               d3_selectAll('.sequence')
38766                   .classed('highlighted', false)
38767                   .classed('selected', false);
38768           }
38769
38770           var hoveredImageKey = hovered && hovered.key;
38771           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
38772           var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
38773           var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
38774
38775           var viewer = select('#photoviewer');
38776           var selected = viewer.empty() ? undefined : viewer.datum();
38777           var selectedImageKey = selected && selected.key;
38778           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
38779           var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
38780           var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
38781
38782           // highlight sibling viewfields on either the selected or the hovered sequences
38783           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
38784
38785           d3_selectAll('.layer-mapillary-images .viewfield-group')
38786               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
38787               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
38788               .classed('selected', function(d) { return d.key === selectedImageKey; });
38789
38790           d3_selectAll('.layer-mapillary-images .sequence')
38791               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
38792               .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
38793
38794           // update viewfields if needed
38795           d3_selectAll('.viewfield-group .viewfield')
38796               .attr('d', viewfieldPath);
38797
38798           function viewfieldPath() {
38799               var d = this.parentNode.__data__;
38800               if (d.pano && d.key !== selectedImageKey) {
38801                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
38802               } else {
38803                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
38804               }
38805           }
38806
38807           return this;
38808       },
38809
38810
38811       updateDetections: function(d) {
38812           if (!_mlyViewer || _mlyFallback) return;
38813
38814           var imageKey = d && d.key;
38815           if (!imageKey) return;
38816
38817           var detections = _mlyCache.image_detections.forImageKey[imageKey] || [];
38818           detections.forEach(function(data) {
38819               var tag = makeTag(data);
38820               if (tag) {
38821                   var tagComponent = _mlyViewer.getComponent('tag');
38822                   tagComponent.add([tag]);
38823               }
38824           });
38825
38826           function makeTag(data) {
38827               var valueParts = data.value.split('--');
38828               if (valueParts.length !== 3) return;
38829
38830               var text = valueParts[1].replace(/-/g, ' ');
38831               var tag;
38832
38833               // Currently only two shapes <Polygon|Point>
38834               if (data.shape.type === 'Polygon') {
38835                   var polygonGeometry = new Mapillary
38836                       .TagComponent
38837                       .PolygonGeometry(data.shape.coordinates[0]);
38838
38839                   tag = new Mapillary.TagComponent.OutlineTag(
38840                       data.key,
38841                       polygonGeometry,
38842                       {
38843                           text: text,
38844                           textColor: 0xffff00,
38845                           lineColor: 0xffff00,
38846                           lineWidth: 2,
38847                           fillColor: 0xffff00,
38848                           fillOpacity: 0.3,
38849                       }
38850                   );
38851
38852               } else if (data.shape.type === 'Point') {
38853                   var pointGeometry = new Mapillary
38854                       .TagComponent
38855                       .PointGeometry(data.shape.coordinates[0]);
38856
38857                   tag = new Mapillary.TagComponent.SpotTag(
38858                       data.key,
38859                       pointGeometry,
38860                       {
38861                           text: text,
38862                           color: 0xffff00,
38863                           textColor: 0xffff00
38864                       }
38865                   );
38866               }
38867
38868               return tag;
38869           }
38870       },
38871
38872
38873       cache: function() {
38874           return _mlyCache;
38875       }
38876
38877   };
38878
38879   var apibase$1 = 'https://nominatim.openstreetmap.org/',
38880       inflight = {},
38881       nominatimCache;
38882
38883
38884   var serviceNominatim = {
38885
38886       init: function() {
38887           inflight = {};
38888           nominatimCache = rbush_1();
38889       },
38890
38891       reset: function() {
38892           forEach(inflight, function(req) { req.abort(); });
38893           inflight = {};
38894           nominatimCache = rbush_1();
38895       },
38896
38897
38898       countryCode: function (location, callback) {
38899           this.reverse(location, function(err, result) {
38900               if (err) {
38901                   return callback(err);
38902               } else if (result.address) {
38903                   return callback(null, result.address.country_code);
38904               } else {
38905                   return callback('Unable to geocode', null);
38906               }
38907           });
38908       },
38909
38910
38911       reverse: function (location, callback) {
38912           var cached = nominatimCache.search(
38913               { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
38914           );
38915
38916           if (cached.length > 0) {
38917               return callback(null, cached[0].data);
38918           }
38919
38920           var params = { zoom: 13, format: 'json', addressdetails: 1, lat: location[1], lon: location[0] };
38921           var url = apibase$1 + 'reverse?' + utilQsString(params);
38922           if (inflight[url]) return;
38923
38924           inflight[url] = d3_json(url, function(err, result) {
38925               delete inflight[url];
38926
38927               if (err) {
38928                   return callback(err);
38929               } else if (result && result.error) {
38930                   return callback(result.error);
38931               }
38932
38933               var extent = geoExtent$$1(location).padByMeters(200);
38934               nominatimCache.insert(assign(extent.bbox(), {data: result}));
38935
38936               callback(null, result);
38937           });
38938       },
38939
38940
38941       search: function (val, callback) {
38942           var searchVal = encodeURIComponent(val);
38943           var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
38944           if (inflight[url]) return;
38945
38946           inflight[url] = d3_json(url, function(err, result) {
38947               delete inflight[url];
38948               callback(err, result);
38949           });
38950       }
38951
38952   };
38953
38954   var apibase$2 = 'https://openstreetcam.org';
38955   var maxResults$1 = 1000;
38956   var tileZoom$1 = 14;
38957   var tiler$1 = utilTiler().zoomExtent([tileZoom$1, tileZoom$1]).skipNullIsland(true);
38958   var dispatch$2 = dispatch('loadedImages');
38959   var imgZoom = d3_zoom()
38960       .extent([[0, 0], [320, 240]])
38961       .translateExtent([[0, 0], [320, 240]])
38962       .scaleExtent([1, 15])
38963       .on('zoom', zoomPan);
38964   var _oscCache;
38965   var _oscSelectedImage;
38966
38967
38968   function abortRequest$1(i) {
38969       i.abort();
38970   }
38971
38972
38973   function maxPageAtZoom$1(z) {
38974       if (z < 15)   return 2;
38975       if (z === 15) return 5;
38976       if (z === 16) return 10;
38977       if (z === 17) return 20;
38978       if (z === 18) return 40;
38979       if (z > 18)   return 80;
38980   }
38981
38982
38983   function loadTiles$1(which, url, projection) {
38984       var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
38985       var tiles = tiler$1.getTiles(projection);
38986
38987       // abort inflight requests that are no longer needed
38988       var cache = _oscCache[which];
38989       forEach(cache.inflight, function(v, k) {
38990           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
38991
38992           if (!wanted) {
38993               abortRequest$1(v);
38994               delete cache.inflight[k];
38995           }
38996       });
38997
38998       tiles.forEach(function(tile) {
38999           loadNextTilePage$1(which, currZoom, url, tile);
39000       });
39001   }
39002
39003
39004   function loadNextTilePage$1(which, currZoom, url, tile) {
39005       var cache = _oscCache[which];
39006       var bbox = tile.extent.bbox();
39007       var maxPages = maxPageAtZoom$1(currZoom);
39008       var nextPage = cache.nextPage[tile.id] || 1;
39009       var params = utilQsString({
39010           ipp: maxResults$1,
39011           page: nextPage,
39012           // client_id: clientId,
39013           bbTopLeft: [bbox.maxY, bbox.minX].join(','),
39014           bbBottomRight: [bbox.minY, bbox.maxX].join(',')
39015       }, true);
39016
39017       if (nextPage > maxPages) return;
39018
39019       var id = tile.id + ',' + String(nextPage);
39020       if (cache.loaded[id] || cache.inflight[id]) return;
39021
39022       cache.inflight[id] = request(url)
39023           .mimeType('application/json')
39024           .header('Content-type', 'application/x-www-form-urlencoded')
39025           .response(function(xhr) { return JSON.parse(xhr.responseText); })
39026           .post(params, function(err, data) {
39027               cache.loaded[id] = true;
39028               delete cache.inflight[id];
39029               if (err || !data.currentPageItems || !data.currentPageItems.length) return;
39030
39031               function localeDateString(s) {
39032                   if (!s) return null;
39033                   var detected = utilDetect();
39034                   var options = { day: 'numeric', month: 'short', year: 'numeric' };
39035                   var d = new Date(s);
39036                   if (isNaN(d.getTime())) return null;
39037                   return d.toLocaleDateString(detected.locale, options);
39038               }
39039
39040               var features = data.currentPageItems.map(function(item) {
39041                   var loc = [+item.lng, +item.lat];
39042                   var d;
39043
39044                   if (which === 'images') {
39045                       d = {
39046                           loc: loc,
39047                           key: item.id,
39048                           ca: +item.heading,
39049                           captured_at: localeDateString(item.shot_date || item.date_added),
39050                           captured_by: item.username,
39051                           imagePath: item.lth_name,
39052                           sequence_id: item.sequence_id,
39053                           sequence_index: +item.sequence_index
39054                       };
39055
39056                       // cache sequence info
39057                       var seq = _oscCache.sequences[d.sequence_id];
39058                       if (!seq) {
39059                           seq = { rotation: 0, images: [] };
39060                           _oscCache.sequences[d.sequence_id] = seq;
39061                       }
39062                       seq.images[d.sequence_index] = d;
39063                   }
39064
39065                   return {
39066                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
39067                   };
39068               });
39069
39070               cache.rtree.load(features);
39071
39072               if (which === 'images') {
39073                   dispatch$2.call('loadedImages');
39074               }
39075
39076               if (data.currentPageItems.length === maxResults$1) {  // more pages to load
39077                   cache.nextPage[tile.id] = nextPage + 1;
39078                   loadNextTilePage$1(which, currZoom, url, tile);
39079               } else {
39080                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
39081               }
39082           });
39083   }
39084
39085
39086   // partition viewport into higher zoom tiles
39087   function partitionViewport$1(projection) {
39088       var z = geoScaleToZoom(projection.scale());
39089       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
39090       var tiler = utilTiler().zoomExtent([z2, z2]);
39091
39092       return tiler.getTiles(projection)
39093           .map(function(tile) { return tile.extent; });
39094   }
39095
39096
39097   // no more than `limit` results per partition.
39098   function searchLimited$1(limit, projection, rtree) {
39099       limit = limit || 5;
39100
39101       return partitionViewport$1(projection)
39102           .reduce(function(result, extent) {
39103               var found = rtree.search(extent.bbox())
39104                   .slice(0, limit)
39105                   .map(function(d) { return d.data; });
39106
39107               return (found.length ? result.concat(found) : result);
39108           }, []);
39109   }
39110
39111
39112   function zoomPan() {
39113       var t = event.transform;
39114       select('#photoviewer .osc-image-wrap')
39115           .call(utilSetTransform, t.x, t.y, t.k);
39116   }
39117
39118
39119   var serviceOpenstreetcam = {
39120
39121       init: function() {
39122           if (!_oscCache) {
39123               this.reset();
39124           }
39125
39126           this.event = utilRebind(this, dispatch$2, 'on');
39127       },
39128
39129       reset: function() {
39130           var cache = _oscCache;
39131
39132           if (cache) {
39133               if (cache.images && cache.images.inflight) {
39134                   forEach(cache.images.inflight, abortRequest$1);
39135               }
39136           }
39137
39138           _oscCache = {
39139               images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
39140               sequences: {}
39141           };
39142
39143           _oscSelectedImage = null;
39144       },
39145
39146
39147       images: function(projection) {
39148           var limit = 5;
39149           return searchLimited$1(limit, projection, _oscCache.images.rtree);
39150       },
39151
39152
39153       sequences: function(projection) {
39154           var viewport = projection.clipExtent();
39155           var min = [viewport[0][0], viewport[1][1]];
39156           var max = [viewport[1][0], viewport[0][1]];
39157           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
39158           var sequenceKeys = {};
39159
39160           // all sequences for images in viewport
39161           _oscCache.images.rtree.search(bbox)
39162               .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
39163
39164           // make linestrings from those sequences
39165           var lineStrings = [];
39166           Object.keys(sequenceKeys)
39167               .forEach(function(sequenceKey) {
39168                   var seq = _oscCache.sequences[sequenceKey];
39169                   var images = seq && seq.images;
39170                   if (images) {
39171                       lineStrings.push({
39172                           type: 'LineString',
39173                           coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
39174                           properties: { key: sequenceKey }
39175                       });
39176                   }
39177               });
39178           return lineStrings;
39179       },
39180
39181
39182       loadImages: function(projection) {
39183           var url = apibase$2 + '/1.0/list/nearby-photos/';
39184           loadTiles$1('images', url, projection);
39185       },
39186
39187
39188       loadViewer: function(context) {
39189           var that = this;
39190
39191           // add osc-wrapper
39192           var wrap = select('#photoviewer').selectAll('.osc-wrapper')
39193               .data([0]);
39194
39195           var wrapEnter = wrap.enter()
39196               .append('div')
39197               .attr('class', 'photo-wrapper osc-wrapper')
39198               .classed('hide', true)
39199               .call(imgZoom)
39200               .on('dblclick.zoom', null);
39201
39202           wrapEnter
39203               .append('div')
39204               .attr('class', 'photo-attribution fillD');
39205
39206           var controlsEnter = wrapEnter
39207               .append('div')
39208               .attr('class', 'photo-controls-wrap')
39209               .append('div')
39210               .attr('class', 'photo-controls');
39211
39212           controlsEnter
39213               .append('button')
39214               .on('click.back', step(-1))
39215               .text('◄');
39216
39217           controlsEnter
39218               .append('button')
39219               .on('click.rotate-ccw', rotate(-90))
39220               .text('⤿');
39221
39222           controlsEnter
39223               .append('button')
39224               .on('click.rotate-cw', rotate(90))
39225               .text('⤾');
39226
39227           controlsEnter
39228               .append('button')
39229               .on('click.forward', step(1))
39230               .text('►');
39231
39232           wrapEnter
39233               .append('div')
39234               .attr('class', 'osc-image-wrap');
39235
39236
39237           // Register viewer resize handler
39238           context.ui().photoviewer.on('resize', function(dimensions) {
39239               imgZoom = d3_zoom()
39240                   .extent([[0, 0], dimensions])
39241                   .translateExtent([[0, 0], dimensions])
39242                   .scaleExtent([1, 15])
39243                   .on('zoom', zoomPan);
39244           });
39245
39246
39247           function rotate(deg) {
39248               return function() {
39249                   if (!_oscSelectedImage) return;
39250                   var sequenceKey = _oscSelectedImage.sequence_id;
39251                   var sequence = _oscCache.sequences[sequenceKey];
39252                   if (!sequence) return;
39253
39254                   var r = sequence.rotation || 0;
39255                   r += deg;
39256
39257                   if (r > 180) r -= 360;
39258                   if (r < -180) r += 360;
39259                   sequence.rotation = r;
39260
39261                   var wrap = select('#photoviewer .osc-wrapper');
39262
39263                   wrap
39264                       .transition()
39265                       .duration(100)
39266                       .call(imgZoom.transform, identity$7);
39267
39268                   wrap.selectAll('.osc-image')
39269                       .transition()
39270                       .duration(100)
39271                       .style('transform', 'rotate(' + r + 'deg)');
39272               };
39273           }
39274
39275           function step(stepBy) {
39276               return function() {
39277                   if (!_oscSelectedImage) return;
39278                   var sequenceKey = _oscSelectedImage.sequence_id;
39279                   var sequence = _oscCache.sequences[sequenceKey];
39280                   if (!sequence) return;
39281
39282                   var nextIndex = _oscSelectedImage.sequence_index + stepBy;
39283                   var nextImage = sequence.images[nextIndex];
39284                   if (!nextImage) return;
39285
39286                   context.map().centerEase(nextImage.loc);
39287
39288                   that
39289                       .selectImage(nextImage)
39290                       .updateViewer(nextImage);
39291               };
39292           }
39293       },
39294
39295
39296       showViewer: function() {
39297           var viewer = select('#photoviewer')
39298               .classed('hide', false);
39299
39300           var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
39301
39302           if (isHidden) {
39303               viewer
39304                   .selectAll('.photo-wrapper:not(.osc-wrapper)')
39305                   .classed('hide', true);
39306
39307               viewer
39308                   .selectAll('.photo-wrapper.osc-wrapper')
39309                   .classed('hide', false);
39310           }
39311
39312           return this;
39313       },
39314
39315
39316       hideViewer: function() {
39317           _oscSelectedImage = null;
39318
39319           var viewer = select('#photoviewer');
39320           if (!viewer.empty()) viewer.datum(null);
39321
39322           viewer
39323               .classed('hide', true)
39324               .selectAll('.photo-wrapper')
39325               .classed('hide', true);
39326
39327           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
39328               .classed('selected', false);
39329
39330           return this.setStyles(null, true);
39331       },
39332
39333
39334       updateViewer: function(d) {
39335           var wrap = select('#photoviewer .osc-wrapper');
39336           var imageWrap = wrap.selectAll('.osc-image-wrap');
39337           var attribution = wrap.selectAll('.photo-attribution').html('');
39338
39339           wrap
39340               .transition()
39341               .duration(100)
39342               .call(imgZoom.transform, identity$7);
39343
39344           imageWrap
39345               .selectAll('.osc-image')
39346               .remove();
39347
39348           if (d) {
39349               var sequence = _oscCache.sequences[d.sequence_id];
39350               var r = (sequence && sequence.rotation) || 0;
39351
39352               imageWrap
39353                   .append('img')
39354                   .attr('class', 'osc-image')
39355                   .attr('src', apibase$2 + '/' + d.imagePath)
39356                   .style('transform', 'rotate(' + r + 'deg)');
39357
39358               if (d.captured_by) {
39359                   attribution
39360                       .append('a')
39361                       .attr('class', 'captured_by')
39362                       .attr('target', '_blank')
39363                       .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
39364                       .text('@' + d.captured_by);
39365
39366                   attribution
39367                       .append('span')
39368                       .text('|');
39369               }
39370
39371               if (d.captured_at) {
39372                   attribution
39373                       .append('span')
39374                       .attr('class', 'captured_at')
39375                       .text(d.captured_at);
39376
39377                   attribution
39378                       .append('span')
39379                       .text('|');
39380               }
39381
39382               attribution
39383                   .append('a')
39384                   .attr('class', 'image-link')
39385                   .attr('target', '_blank')
39386                   .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
39387                   .text('openstreetcam.org');
39388           }
39389           return this;
39390       },
39391
39392
39393       selectImage: function(d) {
39394           _oscSelectedImage = d;
39395           var viewer = select('#photoviewer');
39396           if (!viewer.empty()) viewer.datum(d);
39397
39398           this.setStyles(null, true);
39399
39400           d3_selectAll('.icon-sign')
39401               .classed('selected', false);
39402
39403           return this;
39404       },
39405
39406
39407       getSelectedImage: function() {
39408           return _oscSelectedImage;
39409       },
39410
39411
39412       getSequenceKeyForImage: function(d) {
39413           return d && d.sequence_id;
39414       },
39415
39416
39417       setStyles: function(hovered, reset) {
39418           if (reset) {  // reset all layers
39419               d3_selectAll('.viewfield-group')
39420                   .classed('highlighted', false)
39421                   .classed('hovered', false)
39422                   .classed('selected', false);
39423
39424               d3_selectAll('.sequence')
39425                   .classed('highlighted', false)
39426                   .classed('selected', false);
39427           }
39428
39429           var hoveredImageKey = hovered && hovered.key;
39430           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
39431           var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
39432           var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
39433
39434           var viewer = select('#photoviewer');
39435           var selected = viewer.empty() ? undefined : viewer.datum();
39436           var selectedImageKey = selected && selected.key;
39437           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
39438           var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
39439           var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
39440
39441           // highlight sibling viewfields on either the selected or the hovered sequences
39442           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
39443
39444           d3_selectAll('.layer-openstreetcam-images .viewfield-group')
39445               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
39446               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
39447               .classed('selected', function(d) { return d.key === selectedImageKey; });
39448
39449           d3_selectAll('.layer-openstreetcam-images .sequence')
39450               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
39451               .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
39452
39453           // update viewfields if needed
39454           d3_selectAll('.viewfield-group .viewfield')
39455               .attr('d', viewfieldPath);
39456
39457           function viewfieldPath() {
39458               var d = this.parentNode.__data__;
39459               if (d.pano && d.key !== selectedImageKey) {
39460                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
39461               } else {
39462                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
39463               }
39464           }
39465
39466           return this;
39467       },
39468
39469
39470       cache: function() {
39471           return _oscCache;
39472       }
39473
39474   };
39475
39476   /* Built-in method references for those with the same name as other `lodash` methods. */
39477   var nativeCeil = Math.ceil,
39478       nativeMax$4 = Math.max;
39479
39480   /**
39481    * Creates an array of elements split into groups the length of `size`.
39482    * If `array` can't be split evenly, the final chunk will be the remaining
39483    * elements.
39484    *
39485    * @static
39486    * @memberOf _
39487    * @since 3.0.0
39488    * @category Array
39489    * @param {Array} array The array to process.
39490    * @param {number} [size=1] The length of each chunk
39491    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
39492    * @returns {Array} Returns the new array of chunks.
39493    * @example
39494    *
39495    * _.chunk(['a', 'b', 'c', 'd'], 2);
39496    * // => [['a', 'b'], ['c', 'd']]
39497    *
39498    * _.chunk(['a', 'b', 'c', 'd'], 3);
39499    * // => [['a', 'b', 'c'], ['d']]
39500    */
39501   function chunk(array, size, guard) {
39502     if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
39503       size = 1;
39504     } else {
39505       size = nativeMax$4(toInteger(size), 0);
39506     }
39507     var length = array == null ? 0 : array.length;
39508     if (!length || size < 1) {
39509       return [];
39510     }
39511     var index = 0,
39512         resIndex = 0,
39513         result = Array(nativeCeil(length / size));
39514
39515     while (index < length) {
39516       result[resIndex++] = baseSlice(array, index, (index += size));
39517     }
39518     return result;
39519   }
39520
39521   var hashes = createCommonjsModule(function (module, exports) {
39522   /**
39523    * jshashes - https://github.com/h2non/jshashes
39524    * Released under the "New BSD" license
39525    *
39526    * Algorithms specification:
39527    *
39528    * MD5 - http://www.ietf.org/rfc/rfc1321.txt
39529    * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
39530    * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
39531    * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
39532    * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
39533    * HMAC - http://www.ietf.org/rfc/rfc2104.txt
39534    */
39535   (function() {
39536     var Hashes;
39537
39538     function utf8Encode(str) {
39539       var x, y, output = '',
39540         i = -1,
39541         l;
39542
39543       if (str && str.length) {
39544         l = str.length;
39545         while ((i += 1) < l) {
39546           /* Decode utf-16 surrogate pairs */
39547           x = str.charCodeAt(i);
39548           y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
39549           if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
39550             x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
39551             i += 1;
39552           }
39553           /* Encode output as utf-8 */
39554           if (x <= 0x7F) {
39555             output += String.fromCharCode(x);
39556           } else if (x <= 0x7FF) {
39557             output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
39558               0x80 | (x & 0x3F));
39559           } else if (x <= 0xFFFF) {
39560             output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
39561               0x80 | ((x >>> 6) & 0x3F),
39562               0x80 | (x & 0x3F));
39563           } else if (x <= 0x1FFFFF) {
39564             output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
39565               0x80 | ((x >>> 12) & 0x3F),
39566               0x80 | ((x >>> 6) & 0x3F),
39567               0x80 | (x & 0x3F));
39568           }
39569         }
39570       }
39571       return output;
39572     }
39573
39574     function utf8Decode(str) {
39575       var i, ac, c1, c2, c3, arr = [],
39576         l;
39577       i = ac = c1 = c2 = c3 = 0;
39578
39579       if (str && str.length) {
39580         l = str.length;
39581         str += '';
39582
39583         while (i < l) {
39584           c1 = str.charCodeAt(i);
39585           ac += 1;
39586           if (c1 < 128) {
39587             arr[ac] = String.fromCharCode(c1);
39588             i += 1;
39589           } else if (c1 > 191 && c1 < 224) {
39590             c2 = str.charCodeAt(i + 1);
39591             arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
39592             i += 2;
39593           } else {
39594             c2 = str.charCodeAt(i + 1);
39595             c3 = str.charCodeAt(i + 2);
39596             arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
39597             i += 3;
39598           }
39599         }
39600       }
39601       return arr.join('');
39602     }
39603
39604     /**
39605      * Add integers, wrapping at 2^32. This uses 16-bit operations internally
39606      * to work around bugs in some JS interpreters.
39607      */
39608
39609     function safe_add(x, y) {
39610       var lsw = (x & 0xFFFF) + (y & 0xFFFF),
39611         msw = (x >> 16) + (y >> 16) + (lsw >> 16);
39612       return (msw << 16) | (lsw & 0xFFFF);
39613     }
39614
39615     /**
39616      * Bitwise rotate a 32-bit number to the left.
39617      */
39618
39619     function bit_rol(num, cnt) {
39620       return (num << cnt) | (num >>> (32 - cnt));
39621     }
39622
39623     /**
39624      * Convert a raw string to a hex string
39625      */
39626
39627     function rstr2hex(input, hexcase) {
39628       var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
39629         output = '',
39630         x, i = 0,
39631         l = input.length;
39632       for (; i < l; i += 1) {
39633         x = input.charCodeAt(i);
39634         output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
39635       }
39636       return output;
39637     }
39638
39639     /**
39640      * Convert an array of big-endian words to a string
39641      */
39642
39643     function binb2rstr(input) {
39644       var i, l = input.length * 32,
39645         output = '';
39646       for (i = 0; i < l; i += 8) {
39647         output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
39648       }
39649       return output;
39650     }
39651
39652     /**
39653      * Convert an array of little-endian words to a string
39654      */
39655
39656     function binl2rstr(input) {
39657       var i, l = input.length * 32,
39658         output = '';
39659       for (i = 0; i < l; i += 8) {
39660         output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
39661       }
39662       return output;
39663     }
39664
39665     /**
39666      * Convert a raw string to an array of little-endian words
39667      * Characters >255 have their high-byte silently ignored.
39668      */
39669
39670     function rstr2binl(input) {
39671       var i, l = input.length * 8,
39672         output = Array(input.length >> 2),
39673         lo = output.length;
39674       for (i = 0; i < lo; i += 1) {
39675         output[i] = 0;
39676       }
39677       for (i = 0; i < l; i += 8) {
39678         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
39679       }
39680       return output;
39681     }
39682
39683     /**
39684      * Convert a raw string to an array of big-endian words
39685      * Characters >255 have their high-byte silently ignored.
39686      */
39687
39688     function rstr2binb(input) {
39689       var i, l = input.length * 8,
39690         output = Array(input.length >> 2),
39691         lo = output.length;
39692       for (i = 0; i < lo; i += 1) {
39693         output[i] = 0;
39694       }
39695       for (i = 0; i < l; i += 8) {
39696         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
39697       }
39698       return output;
39699     }
39700
39701     /**
39702      * Convert a raw string to an arbitrary string encoding
39703      */
39704
39705     function rstr2any(input, encoding) {
39706       var divisor = encoding.length,
39707         remainders = Array(),
39708         i, q, x, ld, quotient, dividend, output, full_length;
39709
39710       /* Convert to an array of 16-bit big-endian values, forming the dividend */
39711       dividend = Array(Math.ceil(input.length / 2));
39712       ld = dividend.length;
39713       for (i = 0; i < ld; i += 1) {
39714         dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
39715       }
39716
39717       /**
39718        * Repeatedly perform a long division. The binary array forms the dividend,
39719        * the length of the encoding is the divisor. Once computed, the quotient
39720        * forms the dividend for the next step. We stop when the dividend is zerHashes.
39721        * All remainders are stored for later use.
39722        */
39723       while (dividend.length > 0) {
39724         quotient = Array();
39725         x = 0;
39726         for (i = 0; i < dividend.length; i += 1) {
39727           x = (x << 16) + dividend[i];
39728           q = Math.floor(x / divisor);
39729           x -= q * divisor;
39730           if (quotient.length > 0 || q > 0) {
39731             quotient[quotient.length] = q;
39732           }
39733         }
39734         remainders[remainders.length] = x;
39735         dividend = quotient;
39736       }
39737
39738       /* Convert the remainders to the output string */
39739       output = '';
39740       for (i = remainders.length - 1; i >= 0; i--) {
39741         output += encoding.charAt(remainders[i]);
39742       }
39743
39744       /* Append leading zero equivalents */
39745       full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
39746       for (i = output.length; i < full_length; i += 1) {
39747         output = encoding[0] + output;
39748       }
39749       return output;
39750     }
39751
39752     /**
39753      * Convert a raw string to a base-64 string
39754      */
39755
39756     function rstr2b64(input, b64pad) {
39757       var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
39758         output = '',
39759         len = input.length,
39760         i, j, triplet;
39761       b64pad = b64pad || '=';
39762       for (i = 0; i < len; i += 3) {
39763         triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
39764         for (j = 0; j < 4; j += 1) {
39765           if (i * 8 + j * 6 > input.length * 8) {
39766             output += b64pad;
39767           } else {
39768             output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
39769           }
39770         }
39771       }
39772       return output;
39773     }
39774
39775     Hashes = {
39776       /**
39777        * @property {String} version
39778        * @readonly
39779        */
39780       VERSION: '1.0.6',
39781       /**
39782        * @member Hashes
39783        * @class Base64
39784        * @constructor
39785        */
39786       Base64: function() {
39787         // private properties
39788         var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
39789           pad = '=', // default pad according with the RFC standard
39790           utf8 = true; // by default enable UTF-8 support encoding
39791
39792         // public method for encoding
39793         this.encode = function(input) {
39794           var i, j, triplet,
39795             output = '',
39796             len = input.length;
39797
39798           pad = pad || '=';
39799           input = (utf8) ? utf8Encode(input) : input;
39800
39801           for (i = 0; i < len; i += 3) {
39802             triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
39803             for (j = 0; j < 4; j += 1) {
39804               if (i * 8 + j * 6 > len * 8) {
39805                 output += pad;
39806               } else {
39807                 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
39808               }
39809             }
39810           }
39811           return output;
39812         };
39813
39814         // public method for decoding
39815         this.decode = function(input) {
39816           // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
39817           var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
39818             dec = '',
39819             arr = [];
39820           if (!input) {
39821             return input;
39822           }
39823
39824           i = ac = 0;
39825           input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
39826           //input += '';
39827
39828           do { // unpack four hexets into three octets using index points in b64
39829             h1 = tab.indexOf(input.charAt(i += 1));
39830             h2 = tab.indexOf(input.charAt(i += 1));
39831             h3 = tab.indexOf(input.charAt(i += 1));
39832             h4 = tab.indexOf(input.charAt(i += 1));
39833
39834             bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
39835
39836             o1 = bits >> 16 & 0xff;
39837             o2 = bits >> 8 & 0xff;
39838             o3 = bits & 0xff;
39839             ac += 1;
39840
39841             if (h3 === 64) {
39842               arr[ac] = String.fromCharCode(o1);
39843             } else if (h4 === 64) {
39844               arr[ac] = String.fromCharCode(o1, o2);
39845             } else {
39846               arr[ac] = String.fromCharCode(o1, o2, o3);
39847             }
39848           } while (i < input.length);
39849
39850           dec = arr.join('');
39851           dec = (utf8) ? utf8Decode(dec) : dec;
39852
39853           return dec;
39854         };
39855
39856         // set custom pad string
39857         this.setPad = function(str) {
39858           pad = str || pad;
39859           return this;
39860         };
39861         // set custom tab string characters
39862         this.setTab = function(str) {
39863           tab = str || tab;
39864           return this;
39865         };
39866         this.setUTF8 = function(bool) {
39867           if (typeof bool === 'boolean') {
39868             utf8 = bool;
39869           }
39870           return this;
39871         };
39872       },
39873
39874       /**
39875        * CRC-32 calculation
39876        * @member Hashes
39877        * @method CRC32
39878        * @static
39879        * @param {String} str Input String
39880        * @return {String}
39881        */
39882       CRC32: function(str) {
39883         var crc = 0,
39884           x = 0,
39885           y = 0,
39886           table, i, iTop;
39887         str = utf8Encode(str);
39888
39889         table = [
39890           '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
39891           '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
39892           '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
39893           '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
39894           'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
39895           '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
39896           'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
39897           '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
39898           'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
39899           '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
39900           'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
39901           '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
39902           'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
39903           '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
39904           '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
39905           '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
39906           '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
39907           'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
39908           '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
39909           'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
39910           '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
39911           'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
39912           '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
39913           'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
39914           '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
39915           'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
39916         ].join('');
39917
39918         crc = crc ^ (-1);
39919         for (i = 0, iTop = str.length; i < iTop; i += 1) {
39920           y = (crc ^ str.charCodeAt(i)) & 0xFF;
39921           x = '0x' + table.substr(y * 9, 8);
39922           crc = (crc >>> 8) ^ x;
39923         }
39924         // always return a positive number (that's what >>> 0 does)
39925         return (crc ^ (-1)) >>> 0;
39926       },
39927       /**
39928        * @member Hashes
39929        * @class MD5
39930        * @constructor
39931        * @param {Object} [config]
39932        *
39933        * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
39934        * Digest Algorithm, as defined in RFC 1321.
39935        * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
39936        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
39937        * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
39938        */
39939       MD5: function(options) {
39940         /**
39941          * Private config properties. You may need to tweak these to be compatible with
39942          * the server-side, but the defaults work in most cases.
39943          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
39944          */
39945         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
39946           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
39947           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
39948
39949         // privileged (public) methods
39950         this.hex = function(s) {
39951           return rstr2hex(rstr(s, utf8), hexcase);
39952         };
39953         this.b64 = function(s) {
39954           return rstr2b64(rstr(s), b64pad);
39955         };
39956         this.any = function(s, e) {
39957           return rstr2any(rstr(s, utf8), e);
39958         };
39959         this.raw = function(s) {
39960           return rstr(s, utf8);
39961         };
39962         this.hex_hmac = function(k, d) {
39963           return rstr2hex(rstr_hmac(k, d), hexcase);
39964         };
39965         this.b64_hmac = function(k, d) {
39966           return rstr2b64(rstr_hmac(k, d), b64pad);
39967         };
39968         this.any_hmac = function(k, d, e) {
39969           return rstr2any(rstr_hmac(k, d), e);
39970         };
39971         /**
39972          * Perform a simple self-test to see if the VM is working
39973          * @return {String} Hexadecimal hash sample
39974          */
39975         this.vm_test = function() {
39976           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
39977         };
39978         /**
39979          * Enable/disable uppercase hexadecimal returned string
39980          * @param {Boolean}
39981          * @return {Object} this
39982          */
39983         this.setUpperCase = function(a) {
39984           if (typeof a === 'boolean') {
39985             hexcase = a;
39986           }
39987           return this;
39988         };
39989         /**
39990          * Defines a base64 pad string
39991          * @param {String} Pad
39992          * @return {Object} this
39993          */
39994         this.setPad = function(a) {
39995           b64pad = a || b64pad;
39996           return this;
39997         };
39998         /**
39999          * Defines a base64 pad string
40000          * @param {Boolean}
40001          * @return {Object} [this]
40002          */
40003         this.setUTF8 = function(a) {
40004           if (typeof a === 'boolean') {
40005             utf8 = a;
40006           }
40007           return this;
40008         };
40009
40010         // private methods
40011
40012         /**
40013          * Calculate the MD5 of a raw string
40014          */
40015
40016         function rstr(s) {
40017           s = (utf8) ? utf8Encode(s) : s;
40018           return binl2rstr(binl(rstr2binl(s), s.length * 8));
40019         }
40020
40021         /**
40022          * Calculate the HMAC-MD5, of a key and some data (raw strings)
40023          */
40024
40025         function rstr_hmac(key, data) {
40026           var bkey, ipad, opad, hash, i;
40027
40028           key = (utf8) ? utf8Encode(key) : key;
40029           data = (utf8) ? utf8Encode(data) : data;
40030           bkey = rstr2binl(key);
40031           if (bkey.length > 16) {
40032             bkey = binl(bkey, key.length * 8);
40033           }
40034
40035           ipad = Array(16), opad = Array(16);
40036           for (i = 0; i < 16; i += 1) {
40037             ipad[i] = bkey[i] ^ 0x36363636;
40038             opad[i] = bkey[i] ^ 0x5C5C5C5C;
40039           }
40040           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
40041           return binl2rstr(binl(opad.concat(hash), 512 + 128));
40042         }
40043
40044         /**
40045          * Calculate the MD5 of an array of little-endian words, and a bit length.
40046          */
40047
40048         function binl(x, len) {
40049           var i, olda, oldb, oldc, oldd,
40050             a = 1732584193,
40051             b = -271733879,
40052             c = -1732584194,
40053             d = 271733878;
40054
40055           /* append padding */
40056           x[len >> 5] |= 0x80 << ((len) % 32);
40057           x[(((len + 64) >>> 9) << 4) + 14] = len;
40058
40059           for (i = 0; i < x.length; i += 16) {
40060             olda = a;
40061             oldb = b;
40062             oldc = c;
40063             oldd = d;
40064
40065             a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
40066             d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
40067             c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
40068             b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
40069             a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
40070             d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
40071             c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
40072             b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
40073             a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
40074             d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
40075             c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
40076             b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
40077             a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
40078             d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
40079             c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
40080             b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
40081
40082             a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
40083             d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
40084             c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
40085             b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
40086             a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
40087             d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
40088             c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
40089             b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
40090             a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
40091             d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
40092             c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
40093             b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
40094             a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
40095             d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
40096             c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
40097             b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
40098
40099             a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
40100             d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
40101             c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
40102             b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
40103             a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
40104             d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
40105             c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
40106             b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
40107             a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
40108             d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
40109             c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
40110             b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
40111             a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
40112             d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
40113             c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
40114             b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
40115
40116             a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
40117             d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
40118             c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
40119             b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
40120             a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
40121             d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
40122             c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
40123             b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
40124             a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
40125             d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
40126             c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
40127             b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
40128             a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
40129             d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
40130             c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
40131             b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
40132
40133             a = safe_add(a, olda);
40134             b = safe_add(b, oldb);
40135             c = safe_add(c, oldc);
40136             d = safe_add(d, oldd);
40137           }
40138           return Array(a, b, c, d);
40139         }
40140
40141         /**
40142          * These functions implement the four basic operations the algorithm uses.
40143          */
40144
40145         function md5_cmn(q, a, b, x, s, t) {
40146           return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
40147         }
40148
40149         function md5_ff(a, b, c, d, x, s, t) {
40150           return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
40151         }
40152
40153         function md5_gg(a, b, c, d, x, s, t) {
40154           return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
40155         }
40156
40157         function md5_hh(a, b, c, d, x, s, t) {
40158           return md5_cmn(b ^ c ^ d, a, b, x, s, t);
40159         }
40160
40161         function md5_ii(a, b, c, d, x, s, t) {
40162           return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
40163         }
40164       },
40165       /**
40166        * @member Hashes
40167        * @class Hashes.SHA1
40168        * @param {Object} [config]
40169        * @constructor
40170        *
40171        * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
40172        * Version 2.2 Copyright Paul Johnston 2000 - 2009.
40173        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
40174        * See http://pajhome.org.uk/crypt/md5 for details.
40175        */
40176       SHA1: function(options) {
40177         /**
40178          * Private config properties. You may need to tweak these to be compatible with
40179          * the server-side, but the defaults work in most cases.
40180          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
40181          */
40182         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
40183           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
40184           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
40185
40186         // public methods
40187         this.hex = function(s) {
40188           return rstr2hex(rstr(s, utf8), hexcase);
40189         };
40190         this.b64 = function(s) {
40191           return rstr2b64(rstr(s, utf8), b64pad);
40192         };
40193         this.any = function(s, e) {
40194           return rstr2any(rstr(s, utf8), e);
40195         };
40196         this.raw = function(s) {
40197           return rstr(s, utf8);
40198         };
40199         this.hex_hmac = function(k, d) {
40200           return rstr2hex(rstr_hmac(k, d));
40201         };
40202         this.b64_hmac = function(k, d) {
40203           return rstr2b64(rstr_hmac(k, d), b64pad);
40204         };
40205         this.any_hmac = function(k, d, e) {
40206           return rstr2any(rstr_hmac(k, d), e);
40207         };
40208         /**
40209          * Perform a simple self-test to see if the VM is working
40210          * @return {String} Hexadecimal hash sample
40211          * @public
40212          */
40213         this.vm_test = function() {
40214           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
40215         };
40216         /**
40217          * @description Enable/disable uppercase hexadecimal returned string
40218          * @param {boolean}
40219          * @return {Object} this
40220          * @public
40221          */
40222         this.setUpperCase = function(a) {
40223           if (typeof a === 'boolean') {
40224             hexcase = a;
40225           }
40226           return this;
40227         };
40228         /**
40229          * @description Defines a base64 pad string
40230          * @param {string} Pad
40231          * @return {Object} this
40232          * @public
40233          */
40234         this.setPad = function(a) {
40235           b64pad = a || b64pad;
40236           return this;
40237         };
40238         /**
40239          * @description Defines a base64 pad string
40240          * @param {boolean}
40241          * @return {Object} this
40242          * @public
40243          */
40244         this.setUTF8 = function(a) {
40245           if (typeof a === 'boolean') {
40246             utf8 = a;
40247           }
40248           return this;
40249         };
40250
40251         // private methods
40252
40253         /**
40254          * Calculate the SHA-512 of a raw string
40255          */
40256
40257         function rstr(s) {
40258           s = (utf8) ? utf8Encode(s) : s;
40259           return binb2rstr(binb(rstr2binb(s), s.length * 8));
40260         }
40261
40262         /**
40263          * Calculate the HMAC-SHA1 of a key and some data (raw strings)
40264          */
40265
40266         function rstr_hmac(key, data) {
40267           var bkey, ipad, opad, i, hash;
40268           key = (utf8) ? utf8Encode(key) : key;
40269           data = (utf8) ? utf8Encode(data) : data;
40270           bkey = rstr2binb(key);
40271
40272           if (bkey.length > 16) {
40273             bkey = binb(bkey, key.length * 8);
40274           }
40275           ipad = Array(16), opad = Array(16);
40276           for (i = 0; i < 16; i += 1) {
40277             ipad[i] = bkey[i] ^ 0x36363636;
40278             opad[i] = bkey[i] ^ 0x5C5C5C5C;
40279           }
40280           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
40281           return binb2rstr(binb(opad.concat(hash), 512 + 160));
40282         }
40283
40284         /**
40285          * Calculate the SHA-1 of an array of big-endian words, and a bit length
40286          */
40287
40288         function binb(x, len) {
40289           var i, j, t, olda, oldb, oldc, oldd, olde,
40290             w = Array(80),
40291             a = 1732584193,
40292             b = -271733879,
40293             c = -1732584194,
40294             d = 271733878,
40295             e = -1009589776;
40296
40297           /* append padding */
40298           x[len >> 5] |= 0x80 << (24 - len % 32);
40299           x[((len + 64 >> 9) << 4) + 15] = len;
40300
40301           for (i = 0; i < x.length; i += 16) {
40302             olda = a;
40303             oldb = b;
40304             oldc = c;
40305             oldd = d;
40306             olde = e;
40307
40308             for (j = 0; j < 80; j += 1) {
40309               if (j < 16) {
40310                 w[j] = x[i + j];
40311               } else {
40312                 w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
40313               }
40314               t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
40315                 safe_add(safe_add(e, w[j]), sha1_kt(j)));
40316               e = d;
40317               d = c;
40318               c = bit_rol(b, 30);
40319               b = a;
40320               a = t;
40321             }
40322
40323             a = safe_add(a, olda);
40324             b = safe_add(b, oldb);
40325             c = safe_add(c, oldc);
40326             d = safe_add(d, oldd);
40327             e = safe_add(e, olde);
40328           }
40329           return Array(a, b, c, d, e);
40330         }
40331
40332         /**
40333          * Perform the appropriate triplet combination function for the current
40334          * iteration
40335          */
40336
40337         function sha1_ft(t, b, c, d) {
40338           if (t < 20) {
40339             return (b & c) | ((~b) & d);
40340           }
40341           if (t < 40) {
40342             return b ^ c ^ d;
40343           }
40344           if (t < 60) {
40345             return (b & c) | (b & d) | (c & d);
40346           }
40347           return b ^ c ^ d;
40348         }
40349
40350         /**
40351          * Determine the appropriate additive constant for the current iteration
40352          */
40353
40354         function sha1_kt(t) {
40355           return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
40356             (t < 60) ? -1894007588 : -899497514;
40357         }
40358       },
40359       /**
40360        * @class Hashes.SHA256
40361        * @param {config}
40362        *
40363        * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
40364        * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
40365        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
40366        * See http://pajhome.org.uk/crypt/md5 for details.
40367        * Also http://anmar.eu.org/projects/jssha2/
40368        */
40369       SHA256: function(options) {
40370         /**
40371          * Private properties configuration variables. You may need to tweak these to be compatible with
40372          * the server-side, but the defaults work in most cases.
40373          * @see this.setUpperCase() method
40374          * @see this.setPad() method
40375          */
40376         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
40377           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
40378           /* base-64 pad character. Default '=' for strict RFC compliance   */
40379           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
40380           /* enable/disable utf8 encoding */
40381           sha256_K;
40382
40383         /* privileged (public) methods */
40384         this.hex = function(s) {
40385           return rstr2hex(rstr(s, utf8));
40386         };
40387         this.b64 = function(s) {
40388           return rstr2b64(rstr(s, utf8), b64pad);
40389         };
40390         this.any = function(s, e) {
40391           return rstr2any(rstr(s, utf8), e);
40392         };
40393         this.raw = function(s) {
40394           return rstr(s, utf8);
40395         };
40396         this.hex_hmac = function(k, d) {
40397           return rstr2hex(rstr_hmac(k, d));
40398         };
40399         this.b64_hmac = function(k, d) {
40400           return rstr2b64(rstr_hmac(k, d), b64pad);
40401         };
40402         this.any_hmac = function(k, d, e) {
40403           return rstr2any(rstr_hmac(k, d), e);
40404         };
40405         /**
40406          * Perform a simple self-test to see if the VM is working
40407          * @return {String} Hexadecimal hash sample
40408          * @public
40409          */
40410         this.vm_test = function() {
40411           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
40412         };
40413         /**
40414          * Enable/disable uppercase hexadecimal returned string
40415          * @param {boolean}
40416          * @return {Object} this
40417          * @public
40418          */
40419         this.setUpperCase = function(a) {
40420           if (typeof a === 'boolean') {
40421             hexcase = a;
40422           }
40423           return this;
40424         };
40425         /**
40426          * @description Defines a base64 pad string
40427          * @param {string} Pad
40428          * @return {Object} this
40429          * @public
40430          */
40431         this.setPad = function(a) {
40432           b64pad = a || b64pad;
40433           return this;
40434         };
40435         /**
40436          * Defines a base64 pad string
40437          * @param {boolean}
40438          * @return {Object} this
40439          * @public
40440          */
40441         this.setUTF8 = function(a) {
40442           if (typeof a === 'boolean') {
40443             utf8 = a;
40444           }
40445           return this;
40446         };
40447
40448         // private methods
40449
40450         /**
40451          * Calculate the SHA-512 of a raw string
40452          */
40453
40454         function rstr(s, utf8) {
40455           s = (utf8) ? utf8Encode(s) : s;
40456           return binb2rstr(binb(rstr2binb(s), s.length * 8));
40457         }
40458
40459         /**
40460          * Calculate the HMAC-sha256 of a key and some data (raw strings)
40461          */
40462
40463         function rstr_hmac(key, data) {
40464           key = (utf8) ? utf8Encode(key) : key;
40465           data = (utf8) ? utf8Encode(data) : data;
40466           var hash, i = 0,
40467             bkey = rstr2binb(key),
40468             ipad = Array(16),
40469             opad = Array(16);
40470
40471           if (bkey.length > 16) {
40472             bkey = binb(bkey, key.length * 8);
40473           }
40474
40475           for (; i < 16; i += 1) {
40476             ipad[i] = bkey[i] ^ 0x36363636;
40477             opad[i] = bkey[i] ^ 0x5C5C5C5C;
40478           }
40479
40480           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
40481           return binb2rstr(binb(opad.concat(hash), 512 + 256));
40482         }
40483
40484         /*
40485          * Main sha256 function, with its support functions
40486          */
40487
40488         function sha256_S(X, n) {
40489           return (X >>> n) | (X << (32 - n));
40490         }
40491
40492         function sha256_R(X, n) {
40493           return (X >>> n);
40494         }
40495
40496         function sha256_Ch(x, y, z) {
40497           return ((x & y) ^ ((~x) & z));
40498         }
40499
40500         function sha256_Maj(x, y, z) {
40501           return ((x & y) ^ (x & z) ^ (y & z));
40502         }
40503
40504         function sha256_Sigma0256(x) {
40505           return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
40506         }
40507
40508         function sha256_Sigma1256(x) {
40509           return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
40510         }
40511
40512         function sha256_Gamma0256(x) {
40513           return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
40514         }
40515
40516         function sha256_Gamma1256(x) {
40517           return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
40518         }
40519
40520         sha256_K = [
40521           1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
40522           1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
40523           264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
40524           113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
40525           1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
40526           430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
40527           1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
40528         ];
40529
40530         function binb(m, l) {
40531           var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
40532             1359893119, -1694144372, 528734635, 1541459225
40533           ];
40534           var W = new Array(64);
40535           var a, b, c, d, e, f, g, h;
40536           var i, j, T1, T2;
40537
40538           /* append padding */
40539           m[l >> 5] |= 0x80 << (24 - l % 32);
40540           m[((l + 64 >> 9) << 4) + 15] = l;
40541
40542           for (i = 0; i < m.length; i += 16) {
40543             a = HASH[0];
40544             b = HASH[1];
40545             c = HASH[2];
40546             d = HASH[3];
40547             e = HASH[4];
40548             f = HASH[5];
40549             g = HASH[6];
40550             h = HASH[7];
40551
40552             for (j = 0; j < 64; j += 1) {
40553               if (j < 16) {
40554                 W[j] = m[j + i];
40555               } else {
40556                 W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
40557                   sha256_Gamma0256(W[j - 15])), W[j - 16]);
40558               }
40559
40560               T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
40561                 sha256_K[j]), W[j]);
40562               T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
40563               h = g;
40564               g = f;
40565               f = e;
40566               e = safe_add(d, T1);
40567               d = c;
40568               c = b;
40569               b = a;
40570               a = safe_add(T1, T2);
40571             }
40572
40573             HASH[0] = safe_add(a, HASH[0]);
40574             HASH[1] = safe_add(b, HASH[1]);
40575             HASH[2] = safe_add(c, HASH[2]);
40576             HASH[3] = safe_add(d, HASH[3]);
40577             HASH[4] = safe_add(e, HASH[4]);
40578             HASH[5] = safe_add(f, HASH[5]);
40579             HASH[6] = safe_add(g, HASH[6]);
40580             HASH[7] = safe_add(h, HASH[7]);
40581           }
40582           return HASH;
40583         }
40584
40585       },
40586
40587       /**
40588        * @class Hashes.SHA512
40589        * @param {config}
40590        *
40591        * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
40592        * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
40593        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
40594        * See http://pajhome.org.uk/crypt/md5 for details.
40595        */
40596       SHA512: function(options) {
40597         /**
40598          * Private properties configuration variables. You may need to tweak these to be compatible with
40599          * the server-side, but the defaults work in most cases.
40600          * @see this.setUpperCase() method
40601          * @see this.setPad() method
40602          */
40603         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
40604           /* hexadecimal output case format. false - lowercase; true - uppercase  */
40605           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
40606           /* base-64 pad character. Default '=' for strict RFC compliance   */
40607           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
40608           /* enable/disable utf8 encoding */
40609           sha512_k;
40610
40611         /* privileged (public) methods */
40612         this.hex = function(s) {
40613           return rstr2hex(rstr(s));
40614         };
40615         this.b64 = function(s) {
40616           return rstr2b64(rstr(s), b64pad);
40617         };
40618         this.any = function(s, e) {
40619           return rstr2any(rstr(s), e);
40620         };
40621         this.raw = function(s) {
40622           return rstr(s, utf8);
40623         };
40624         this.hex_hmac = function(k, d) {
40625           return rstr2hex(rstr_hmac(k, d));
40626         };
40627         this.b64_hmac = function(k, d) {
40628           return rstr2b64(rstr_hmac(k, d), b64pad);
40629         };
40630         this.any_hmac = function(k, d, e) {
40631           return rstr2any(rstr_hmac(k, d), e);
40632         };
40633         /**
40634          * Perform a simple self-test to see if the VM is working
40635          * @return {String} Hexadecimal hash sample
40636          * @public
40637          */
40638         this.vm_test = function() {
40639           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
40640         };
40641         /**
40642          * @description Enable/disable uppercase hexadecimal returned string
40643          * @param {boolean}
40644          * @return {Object} this
40645          * @public
40646          */
40647         this.setUpperCase = function(a) {
40648           if (typeof a === 'boolean') {
40649             hexcase = a;
40650           }
40651           return this;
40652         };
40653         /**
40654          * @description Defines a base64 pad string
40655          * @param {string} Pad
40656          * @return {Object} this
40657          * @public
40658          */
40659         this.setPad = function(a) {
40660           b64pad = a || b64pad;
40661           return this;
40662         };
40663         /**
40664          * @description Defines a base64 pad string
40665          * @param {boolean}
40666          * @return {Object} this
40667          * @public
40668          */
40669         this.setUTF8 = function(a) {
40670           if (typeof a === 'boolean') {
40671             utf8 = a;
40672           }
40673           return this;
40674         };
40675
40676         /* private methods */
40677
40678         /**
40679          * Calculate the SHA-512 of a raw string
40680          */
40681
40682         function rstr(s) {
40683           s = (utf8) ? utf8Encode(s) : s;
40684           return binb2rstr(binb(rstr2binb(s), s.length * 8));
40685         }
40686         /*
40687          * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
40688          */
40689
40690         function rstr_hmac(key, data) {
40691           key = (utf8) ? utf8Encode(key) : key;
40692           data = (utf8) ? utf8Encode(data) : data;
40693
40694           var hash, i = 0,
40695             bkey = rstr2binb(key),
40696             ipad = Array(32),
40697             opad = Array(32);
40698
40699           if (bkey.length > 32) {
40700             bkey = binb(bkey, key.length * 8);
40701           }
40702
40703           for (; i < 32; i += 1) {
40704             ipad[i] = bkey[i] ^ 0x36363636;
40705             opad[i] = bkey[i] ^ 0x5C5C5C5C;
40706           }
40707
40708           hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
40709           return binb2rstr(binb(opad.concat(hash), 1024 + 512));
40710         }
40711
40712         /**
40713          * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
40714          */
40715
40716         function binb(x, len) {
40717           var j, i, l,
40718             W = new Array(80),
40719             hash = new Array(16),
40720             //Initial hash values
40721             H = [
40722               new int64(0x6a09e667, -205731576),
40723               new int64(-1150833019, -2067093701),
40724               new int64(0x3c6ef372, -23791573),
40725               new int64(-1521486534, 0x5f1d36f1),
40726               new int64(0x510e527f, -1377402159),
40727               new int64(-1694144372, 0x2b3e6c1f),
40728               new int64(0x1f83d9ab, -79577749),
40729               new int64(0x5be0cd19, 0x137e2179)
40730             ],
40731             T1 = new int64(0, 0),
40732             T2 = new int64(0, 0),
40733             a = new int64(0, 0),
40734             b = new int64(0, 0),
40735             c = new int64(0, 0),
40736             d = new int64(0, 0),
40737             e = new int64(0, 0),
40738             f = new int64(0, 0),
40739             g = new int64(0, 0),
40740             h = new int64(0, 0),
40741             //Temporary variables not specified by the document
40742             s0 = new int64(0, 0),
40743             s1 = new int64(0, 0),
40744             Ch = new int64(0, 0),
40745             Maj = new int64(0, 0),
40746             r1 = new int64(0, 0),
40747             r2 = new int64(0, 0),
40748             r3 = new int64(0, 0);
40749
40750           if (sha512_k === undefined) {
40751             //SHA512 constants
40752             sha512_k = [
40753               new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
40754               new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
40755               new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
40756               new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
40757               new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
40758               new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
40759               new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
40760               new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
40761               new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
40762               new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
40763               new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
40764               new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
40765               new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
40766               new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
40767               new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
40768               new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
40769               new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
40770               new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
40771               new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
40772               new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
40773               new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
40774               new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
40775               new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
40776               new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
40777               new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
40778               new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
40779               new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
40780               new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
40781               new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
40782               new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
40783               new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
40784               new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
40785               new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
40786               new int64(-354779690, -840897762), new int64(-176337025, -294727304),
40787               new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
40788               new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
40789               new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
40790               new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
40791               new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
40792               new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
40793             ];
40794           }
40795
40796           for (i = 0; i < 80; i += 1) {
40797             W[i] = new int64(0, 0);
40798           }
40799
40800           // append padding to the source string. The format is described in the FIPS.
40801           x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
40802           x[((len + 128 >> 10) << 5) + 31] = len;
40803           l = x.length;
40804           for (i = 0; i < l; i += 32) { //32 dwords is the block size
40805             int64copy(a, H[0]);
40806             int64copy(b, H[1]);
40807             int64copy(c, H[2]);
40808             int64copy(d, H[3]);
40809             int64copy(e, H[4]);
40810             int64copy(f, H[5]);
40811             int64copy(g, H[6]);
40812             int64copy(h, H[7]);
40813
40814             for (j = 0; j < 16; j += 1) {
40815               W[j].h = x[i + 2 * j];
40816               W[j].l = x[i + 2 * j + 1];
40817             }
40818
40819             for (j = 16; j < 80; j += 1) {
40820               //sigma1
40821               int64rrot(r1, W[j - 2], 19);
40822               int64revrrot(r2, W[j - 2], 29);
40823               int64shr(r3, W[j - 2], 6);
40824               s1.l = r1.l ^ r2.l ^ r3.l;
40825               s1.h = r1.h ^ r2.h ^ r3.h;
40826               //sigma0
40827               int64rrot(r1, W[j - 15], 1);
40828               int64rrot(r2, W[j - 15], 8);
40829               int64shr(r3, W[j - 15], 7);
40830               s0.l = r1.l ^ r2.l ^ r3.l;
40831               s0.h = r1.h ^ r2.h ^ r3.h;
40832
40833               int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
40834             }
40835
40836             for (j = 0; j < 80; j += 1) {
40837               //Ch
40838               Ch.l = (e.l & f.l) ^ (~e.l & g.l);
40839               Ch.h = (e.h & f.h) ^ (~e.h & g.h);
40840
40841               //Sigma1
40842               int64rrot(r1, e, 14);
40843               int64rrot(r2, e, 18);
40844               int64revrrot(r3, e, 9);
40845               s1.l = r1.l ^ r2.l ^ r3.l;
40846               s1.h = r1.h ^ r2.h ^ r3.h;
40847
40848               //Sigma0
40849               int64rrot(r1, a, 28);
40850               int64revrrot(r2, a, 2);
40851               int64revrrot(r3, a, 7);
40852               s0.l = r1.l ^ r2.l ^ r3.l;
40853               s0.h = r1.h ^ r2.h ^ r3.h;
40854
40855               //Maj
40856               Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
40857               Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
40858
40859               int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
40860               int64add(T2, s0, Maj);
40861
40862               int64copy(h, g);
40863               int64copy(g, f);
40864               int64copy(f, e);
40865               int64add(e, d, T1);
40866               int64copy(d, c);
40867               int64copy(c, b);
40868               int64copy(b, a);
40869               int64add(a, T1, T2);
40870             }
40871             int64add(H[0], H[0], a);
40872             int64add(H[1], H[1], b);
40873             int64add(H[2], H[2], c);
40874             int64add(H[3], H[3], d);
40875             int64add(H[4], H[4], e);
40876             int64add(H[5], H[5], f);
40877             int64add(H[6], H[6], g);
40878             int64add(H[7], H[7], h);
40879           }
40880
40881           //represent the hash as an array of 32-bit dwords
40882           for (i = 0; i < 8; i += 1) {
40883             hash[2 * i] = H[i].h;
40884             hash[2 * i + 1] = H[i].l;
40885           }
40886           return hash;
40887         }
40888
40889         //A constructor for 64-bit numbers
40890
40891         function int64(h, l) {
40892           this.h = h;
40893           this.l = l;
40894           //this.toString = int64toString;
40895         }
40896
40897         //Copies src into dst, assuming both are 64-bit numbers
40898
40899         function int64copy(dst, src) {
40900           dst.h = src.h;
40901           dst.l = src.l;
40902         }
40903
40904         //Right-rotates a 64-bit number by shift
40905         //Won't handle cases of shift>=32
40906         //The function revrrot() is for that
40907
40908         function int64rrot(dst, x, shift) {
40909           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
40910           dst.h = (x.h >>> shift) | (x.l << (32 - shift));
40911         }
40912
40913         //Reverses the dwords of the source and then rotates right by shift.
40914         //This is equivalent to rotation by 32+shift
40915
40916         function int64revrrot(dst, x, shift) {
40917           dst.l = (x.h >>> shift) | (x.l << (32 - shift));
40918           dst.h = (x.l >>> shift) | (x.h << (32 - shift));
40919         }
40920
40921         //Bitwise-shifts right a 64-bit number by shift
40922         //Won't handle shift>=32, but it's never needed in SHA512
40923
40924         function int64shr(dst, x, shift) {
40925           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
40926           dst.h = (x.h >>> shift);
40927         }
40928
40929         //Adds two 64-bit numbers
40930         //Like the original implementation, does not rely on 32-bit operations
40931
40932         function int64add(dst, x, y) {
40933           var w0 = (x.l & 0xffff) + (y.l & 0xffff);
40934           var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
40935           var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
40936           var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
40937           dst.l = (w0 & 0xffff) | (w1 << 16);
40938           dst.h = (w2 & 0xffff) | (w3 << 16);
40939         }
40940
40941         //Same, except with 4 addends. Works faster than adding them one by one.
40942
40943         function int64add4(dst, a, b, c, d) {
40944           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
40945           var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
40946           var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
40947           var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
40948           dst.l = (w0 & 0xffff) | (w1 << 16);
40949           dst.h = (w2 & 0xffff) | (w3 << 16);
40950         }
40951
40952         //Same, except with 5 addends
40953
40954         function int64add5(dst, a, b, c, d, e) {
40955           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
40956             w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
40957             w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
40958             w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
40959           dst.l = (w0 & 0xffff) | (w1 << 16);
40960           dst.h = (w2 & 0xffff) | (w3 << 16);
40961         }
40962       },
40963       /**
40964        * @class Hashes.RMD160
40965        * @constructor
40966        * @param {Object} [config]
40967        *
40968        * A JavaScript implementation of the RIPEMD-160 Algorithm
40969        * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
40970        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
40971        * See http://pajhome.org.uk/crypt/md5 for details.
40972        * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
40973        */
40974       RMD160: function(options) {
40975         /**
40976          * Private properties configuration variables. You may need to tweak these to be compatible with
40977          * the server-side, but the defaults work in most cases.
40978          * @see this.setUpperCase() method
40979          * @see this.setPad() method
40980          */
40981         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
40982           /* hexadecimal output case format. false - lowercase; true - uppercase  */
40983           b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
40984           /* base-64 pad character. Default '=' for strict RFC compliance   */
40985           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
40986           /* enable/disable utf8 encoding */
40987           rmd160_r1 = [
40988             0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
40989             7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
40990             3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
40991             1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
40992             4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
40993           ],
40994           rmd160_r2 = [
40995             5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
40996             6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
40997             15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
40998             8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
40999             12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
41000           ],
41001           rmd160_s1 = [
41002             11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
41003             7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
41004             11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
41005             11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
41006             9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
41007           ],
41008           rmd160_s2 = [
41009             8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
41010             9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
41011             9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
41012             15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
41013             8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
41014           ];
41015
41016         /* privileged (public) methods */
41017         this.hex = function(s) {
41018           return rstr2hex(rstr(s, utf8));
41019         };
41020         this.b64 = function(s) {
41021           return rstr2b64(rstr(s, utf8), b64pad);
41022         };
41023         this.any = function(s, e) {
41024           return rstr2any(rstr(s, utf8), e);
41025         };
41026         this.raw = function(s) {
41027           return rstr(s, utf8);
41028         };
41029         this.hex_hmac = function(k, d) {
41030           return rstr2hex(rstr_hmac(k, d));
41031         };
41032         this.b64_hmac = function(k, d) {
41033           return rstr2b64(rstr_hmac(k, d), b64pad);
41034         };
41035         this.any_hmac = function(k, d, e) {
41036           return rstr2any(rstr_hmac(k, d), e);
41037         };
41038         /**
41039          * Perform a simple self-test to see if the VM is working
41040          * @return {String} Hexadecimal hash sample
41041          * @public
41042          */
41043         this.vm_test = function() {
41044           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
41045         };
41046         /**
41047          * @description Enable/disable uppercase hexadecimal returned string
41048          * @param {boolean}
41049          * @return {Object} this
41050          * @public
41051          */
41052         this.setUpperCase = function(a) {
41053           if (typeof a === 'boolean') {
41054             hexcase = a;
41055           }
41056           return this;
41057         };
41058         /**
41059          * @description Defines a base64 pad string
41060          * @param {string} Pad
41061          * @return {Object} this
41062          * @public
41063          */
41064         this.setPad = function(a) {
41065           if (typeof a !== 'undefined') {
41066             b64pad = a;
41067           }
41068           return this;
41069         };
41070         /**
41071          * @description Defines a base64 pad string
41072          * @param {boolean}
41073          * @return {Object} this
41074          * @public
41075          */
41076         this.setUTF8 = function(a) {
41077           if (typeof a === 'boolean') {
41078             utf8 = a;
41079           }
41080           return this;
41081         };
41082
41083         /* private methods */
41084
41085         /**
41086          * Calculate the rmd160 of a raw string
41087          */
41088
41089         function rstr(s) {
41090           s = (utf8) ? utf8Encode(s) : s;
41091           return binl2rstr(binl(rstr2binl(s), s.length * 8));
41092         }
41093
41094         /**
41095          * Calculate the HMAC-rmd160 of a key and some data (raw strings)
41096          */
41097
41098         function rstr_hmac(key, data) {
41099           key = (utf8) ? utf8Encode(key) : key;
41100           data = (utf8) ? utf8Encode(data) : data;
41101           var i, hash,
41102             bkey = rstr2binl(key),
41103             ipad = Array(16),
41104             opad = Array(16);
41105
41106           if (bkey.length > 16) {
41107             bkey = binl(bkey, key.length * 8);
41108           }
41109
41110           for (i = 0; i < 16; i += 1) {
41111             ipad[i] = bkey[i] ^ 0x36363636;
41112             opad[i] = bkey[i] ^ 0x5C5C5C5C;
41113           }
41114           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
41115           return binl2rstr(binl(opad.concat(hash), 512 + 160));
41116         }
41117
41118         /**
41119          * Convert an array of little-endian words to a string
41120          */
41121
41122         function binl2rstr(input) {
41123           var i, output = '',
41124             l = input.length * 32;
41125           for (i = 0; i < l; i += 8) {
41126             output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
41127           }
41128           return output;
41129         }
41130
41131         /**
41132          * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
41133          */
41134
41135         function binl(x, len) {
41136           var T, j, i, l,
41137             h0 = 0x67452301,
41138             h1 = 0xefcdab89,
41139             h2 = 0x98badcfe,
41140             h3 = 0x10325476,
41141             h4 = 0xc3d2e1f0,
41142             A1, B1, C1, D1, E1,
41143             A2, B2, C2, D2, E2;
41144
41145           /* append padding */
41146           x[len >> 5] |= 0x80 << (len % 32);
41147           x[(((len + 64) >>> 9) << 4) + 14] = len;
41148           l = x.length;
41149
41150           for (i = 0; i < l; i += 16) {
41151             A1 = A2 = h0;
41152             B1 = B2 = h1;
41153             C1 = C2 = h2;
41154             D1 = D2 = h3;
41155             E1 = E2 = h4;
41156             for (j = 0; j <= 79; j += 1) {
41157               T = safe_add(A1, rmd160_f(j, B1, C1, D1));
41158               T = safe_add(T, x[i + rmd160_r1[j]]);
41159               T = safe_add(T, rmd160_K1(j));
41160               T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
41161               A1 = E1;
41162               E1 = D1;
41163               D1 = bit_rol(C1, 10);
41164               C1 = B1;
41165               B1 = T;
41166               T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
41167               T = safe_add(T, x[i + rmd160_r2[j]]);
41168               T = safe_add(T, rmd160_K2(j));
41169               T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
41170               A2 = E2;
41171               E2 = D2;
41172               D2 = bit_rol(C2, 10);
41173               C2 = B2;
41174               B2 = T;
41175             }
41176
41177             T = safe_add(h1, safe_add(C1, D2));
41178             h1 = safe_add(h2, safe_add(D1, E2));
41179             h2 = safe_add(h3, safe_add(E1, A2));
41180             h3 = safe_add(h4, safe_add(A1, B2));
41181             h4 = safe_add(h0, safe_add(B1, C2));
41182             h0 = T;
41183           }
41184           return [h0, h1, h2, h3, h4];
41185         }
41186
41187         // specific algorithm methods
41188
41189         function rmd160_f(j, x, y, z) {
41190           return (0 <= j && j <= 15) ? (x ^ y ^ z) :
41191             (16 <= j && j <= 31) ? (x & y) | (~x & z) :
41192             (32 <= j && j <= 47) ? (x | ~y) ^ z :
41193             (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
41194             (64 <= j && j <= 79) ? x ^ (y | ~z) :
41195             'rmd160_f: j out of range';
41196         }
41197
41198         function rmd160_K1(j) {
41199           return (0 <= j && j <= 15) ? 0x00000000 :
41200             (16 <= j && j <= 31) ? 0x5a827999 :
41201             (32 <= j && j <= 47) ? 0x6ed9eba1 :
41202             (48 <= j && j <= 63) ? 0x8f1bbcdc :
41203             (64 <= j && j <= 79) ? 0xa953fd4e :
41204             'rmd160_K1: j out of range';
41205         }
41206
41207         function rmd160_K2(j) {
41208           return (0 <= j && j <= 15) ? 0x50a28be6 :
41209             (16 <= j && j <= 31) ? 0x5c4dd124 :
41210             (32 <= j && j <= 47) ? 0x6d703ef3 :
41211             (48 <= j && j <= 63) ? 0x7a6d76e9 :
41212             (64 <= j && j <= 79) ? 0x00000000 :
41213             'rmd160_K2: j out of range';
41214         }
41215       }
41216     };
41217
41218     // exposes Hashes
41219     (function(window, undefined) {
41220       var freeExports = false;
41221       {
41222         freeExports = exports;
41223         if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
41224           window = commonjsGlobal;
41225         }
41226       }
41227
41228       if (typeof undefined === 'function' && typeof undefined.amd === 'object' && undefined.amd) {
41229         // define as an anonymous module, so, through path mapping, it can be aliased
41230         undefined(function() {
41231           return Hashes;
41232         });
41233       } else if (freeExports) {
41234         // in Node.js or RingoJS v0.8.0+
41235         if (module && module.exports === freeExports) {
41236           module.exports = Hashes;
41237         }
41238         // in Narwhal or RingoJS v0.7.0-
41239         else {
41240           freeExports.Hashes = Hashes;
41241         }
41242       } else {
41243         // in a browser or Rhino
41244         window.Hashes = Hashes;
41245       }
41246     }(this));
41247   }()); // IIFE
41248   });
41249
41250   var immutable = extend$2;
41251
41252   var hasOwnProperty$g = Object.prototype.hasOwnProperty;
41253
41254   function extend$2() {
41255       var target = {};
41256
41257       for (var i = 0; i < arguments.length; i++) {
41258           var source = arguments[i];
41259
41260           for (var key in source) {
41261               if (hasOwnProperty$g.call(source, key)) {
41262                   target[key] = source[key];
41263               }
41264           }
41265       }
41266
41267       return target
41268   }
41269
41270   var sha1 = new hashes.SHA1();
41271
41272   var ohauth = {};
41273
41274   ohauth.qsString = function(obj) {
41275       return Object.keys(obj).sort().map(function(key) {
41276           return ohauth.percentEncode(key) + '=' +
41277               ohauth.percentEncode(obj[key]);
41278       }).join('&');
41279   };
41280
41281   ohauth.stringQs = function(str) {
41282       return str.split('&').filter(function (pair) {
41283           return pair !== '';
41284       }).reduce(function(obj, pair){
41285           var parts = pair.split('=');
41286           obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
41287               '' : decodeURIComponent(parts[1]);
41288           return obj;
41289       }, {});
41290   };
41291
41292   ohauth.rawxhr = function(method, url, data, headers, callback) {
41293       var xhr = new XMLHttpRequest(),
41294           twoHundred = /^20\d$/;
41295       xhr.onreadystatechange = function() {
41296           if (4 === xhr.readyState && 0 !== xhr.status) {
41297               if (twoHundred.test(xhr.status)) callback(null, xhr);
41298               else return callback(xhr, null);
41299           }
41300       };
41301       xhr.onerror = function(e) { return callback(e, null); };
41302       xhr.open(method, url, true);
41303       for (var h in headers) xhr.setRequestHeader(h, headers[h]);
41304       xhr.send(data);
41305       return xhr;
41306   };
41307
41308   ohauth.xhr = function(method, url, auth, data, options, callback) {
41309       var headers = (options && options.header) || {
41310           'Content-Type': 'application/x-www-form-urlencoded'
41311       };
41312       headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
41313       return ohauth.rawxhr(method, url, data, headers, callback);
41314   };
41315
41316   ohauth.nonce = function() {
41317       for (var o = ''; o.length < 6;) {
41318           o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
41319       }
41320       return o;
41321   };
41322
41323   ohauth.authHeader = function(obj) {
41324       return Object.keys(obj).sort().map(function(key) {
41325           return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
41326       }).join(', ');
41327   };
41328
41329   ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
41330
41331   ohauth.percentEncode = function(s) {
41332       return encodeURIComponent(s)
41333           .replace(/\!/g, '%21').replace(/\'/g, '%27')
41334           .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
41335   };
41336
41337   ohauth.baseString = function(method, url, params) {
41338       if (params.oauth_signature) delete params.oauth_signature;
41339       return [
41340           method,
41341           ohauth.percentEncode(url),
41342           ohauth.percentEncode(ohauth.qsString(params))].join('&');
41343   };
41344
41345   ohauth.signature = function(oauth_secret, token_secret, baseString) {
41346       return sha1.b64_hmac(
41347           ohauth.percentEncode(oauth_secret) + '&' +
41348           ohauth.percentEncode(token_secret),
41349           baseString);
41350   };
41351
41352   /**
41353    * Takes an options object for configuration (consumer_key,
41354    * consumer_secret, version, signature_method, token, token_secret)
41355    * and returns a function that generates the Authorization header
41356    * for given data.
41357    *
41358    * The returned function takes these parameters:
41359    * - method: GET/POST/...
41360    * - uri: full URI with protocol, port, path and query string
41361    * - extra_params: any extra parameters (that are passed in the POST data),
41362    *   can be an object or a from-urlencoded string.
41363    *
41364    * Returned function returns full OAuth header with "OAuth" string in it.
41365    */
41366
41367   ohauth.headerGenerator = function(options) {
41368       options = options || {};
41369       var consumer_key = options.consumer_key || '',
41370           consumer_secret = options.consumer_secret || '',
41371           signature_method = options.signature_method || 'HMAC-SHA1',
41372           version = options.version || '1.0',
41373           token = options.token || '',
41374           token_secret = options.token_secret || '';
41375
41376       return function(method, uri, extra_params) {
41377           method = method.toUpperCase();
41378           if (typeof extra_params === 'string' && extra_params.length > 0) {
41379               extra_params = ohauth.stringQs(extra_params);
41380           }
41381
41382           var uri_parts = uri.split('?', 2),
41383           base_uri = uri_parts[0];
41384
41385           var query_params = uri_parts.length === 2 ?
41386               ohauth.stringQs(uri_parts[1]) : {};
41387
41388           var oauth_params = {
41389               oauth_consumer_key: consumer_key,
41390               oauth_signature_method: signature_method,
41391               oauth_version: version,
41392               oauth_timestamp: ohauth.timestamp(),
41393               oauth_nonce: ohauth.nonce()
41394           };
41395
41396           if (token) oauth_params.oauth_token = token;
41397
41398           var all_params = immutable({}, oauth_params, query_params, extra_params),
41399               base_str = ohauth.baseString(method, base_uri, all_params);
41400
41401           oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
41402
41403           return 'OAuth ' + ohauth.authHeader(oauth_params);
41404       };
41405   };
41406
41407   var ohauth_1 = ohauth;
41408
41409   var resolveUrl = createCommonjsModule(function (module, exports) {
41410   // Copyright 2014 Simon Lydell
41411   // X11 (“MIT”) Licensed. (See LICENSE.)
41412
41413   void (function(root, factory) {
41414     {
41415       module.exports = factory();
41416     }
41417   }(commonjsGlobal, function() {
41418
41419     function resolveUrl(/* ...urls */) {
41420       var numUrls = arguments.length;
41421
41422       if (numUrls === 0) {
41423         throw new Error("resolveUrl requires at least one argument; got none.")
41424       }
41425
41426       var base = document.createElement("base");
41427       base.href = arguments[0];
41428
41429       if (numUrls === 1) {
41430         return base.href
41431       }
41432
41433       var head = document.getElementsByTagName("head")[0];
41434       head.insertBefore(base, head.firstChild);
41435
41436       var a = document.createElement("a");
41437       var resolved;
41438
41439       for (var index = 1; index < numUrls; index++) {
41440         a.href = arguments[index];
41441         resolved = a.href;
41442         base.href = resolved;
41443       }
41444
41445       head.removeChild(base);
41446
41447       return resolved
41448     }
41449
41450     return resolveUrl
41451
41452   }));
41453   });
41454
41455   var assign$1 = make_assign();
41456   var create$2 = make_create();
41457   var trim = make_trim();
41458   var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
41459
41460   var util = {
41461         assign: assign$1,
41462         create: create$2,
41463         trim: trim,
41464         bind: bind,
41465         slice: slice$7,
41466         each: each,
41467         map: map$4,
41468         pluck: pluck,
41469         isList: isList,
41470         isFunction: isFunction$1,
41471         isObject: isObject$1,
41472         Global: Global
41473   };
41474
41475   function make_assign() {
41476         if (Object.assign) {
41477                 return Object.assign
41478         } else {
41479                 return function shimAssign(obj, props1, props2, etc) {
41480                         for (var i = 1; i < arguments.length; i++) {
41481                                 each(Object(arguments[i]), function(val, key) {
41482                                         obj[key] = val;
41483                                 });
41484                         }                       
41485                         return obj
41486                 }
41487         }
41488   }
41489
41490   function make_create() {
41491         if (Object.create) {
41492                 return function create(obj, assignProps1, assignProps2, etc) {
41493                         var assignArgsList = slice$7(arguments, 1);
41494                         return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
41495                 }
41496         } else {
41497                 function F() {} // eslint-disable-line no-inner-declarations
41498                 return function create(obj, assignProps1, assignProps2, etc) {
41499                         var assignArgsList = slice$7(arguments, 1);
41500                         F.prototype = obj;
41501                         return assign$1.apply(this, [new F()].concat(assignArgsList))
41502                 }
41503         }
41504   }
41505
41506   function make_trim() {
41507         if (String.prototype.trim) {
41508                 return function trim(str) {
41509                         return String.prototype.trim.call(str)
41510                 }
41511         } else {
41512                 return function trim(str) {
41513                         return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
41514                 }
41515         }
41516   }
41517
41518   function bind(obj, fn) {
41519         return function() {
41520                 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
41521         }
41522   }
41523
41524   function slice$7(arr, index) {
41525         return Array.prototype.slice.call(arr, index || 0)
41526   }
41527
41528   function each(obj, fn) {
41529         pluck(obj, function(val, key) {
41530                 fn(val, key);
41531                 return false
41532         });
41533   }
41534
41535   function map$4(obj, fn) {
41536         var res = (isList(obj) ? [] : {});
41537         pluck(obj, function(v, k) {
41538                 res[k] = fn(v, k);
41539                 return false
41540         });
41541         return res
41542   }
41543
41544   function pluck(obj, fn) {
41545         if (isList(obj)) {
41546                 for (var i=0; i<obj.length; i++) {
41547                         if (fn(obj[i], i)) {
41548                                 return obj[i]
41549                         }
41550                 }
41551         } else {
41552                 for (var key in obj) {
41553                         if (obj.hasOwnProperty(key)) {
41554                                 if (fn(obj[key], key)) {
41555                                         return obj[key]
41556                                 }
41557                         }
41558                 }
41559         }
41560   }
41561
41562   function isList(val) {
41563         return (val != null && typeof val != 'function' && typeof val.length == 'number')
41564   }
41565
41566   function isFunction$1(val) {
41567         return val && {}.toString.call(val) === '[object Function]'
41568   }
41569
41570   function isObject$1(val) {
41571         return val && {}.toString.call(val) === '[object Object]'
41572   }
41573
41574   var slice$8 = util.slice;
41575   var pluck$1 = util.pluck;
41576   var each$1 = util.each;
41577   var bind$1 = util.bind;
41578   var create$3 = util.create;
41579   var isList$1 = util.isList;
41580   var isFunction$2 = util.isFunction;
41581   var isObject$2 = util.isObject;
41582
41583   var storeEngine = {
41584         createStore: createStore
41585   };
41586
41587   var storeAPI = {
41588         version: '2.0.12',
41589         enabled: false,
41590         
41591         // get returns the value of the given key. If that value
41592         // is undefined, it returns optionalDefaultValue instead.
41593         get: function(key, optionalDefaultValue) {
41594                 var data = this.storage.read(this._namespacePrefix + key);
41595                 return this._deserialize(data, optionalDefaultValue)
41596         },
41597
41598         // set will store the given value at key and returns value.
41599         // Calling set with value === undefined is equivalent to calling remove.
41600         set: function(key, value) {
41601                 if (value === undefined) {
41602                         return this.remove(key)
41603                 }
41604                 this.storage.write(this._namespacePrefix + key, this._serialize(value));
41605                 return value
41606         },
41607
41608         // remove deletes the key and value stored at the given key.
41609         remove: function(key) {
41610                 this.storage.remove(this._namespacePrefix + key);
41611         },
41612
41613         // each will call the given callback once for each key-value pair
41614         // in this store.
41615         each: function(callback) {
41616                 var self = this;
41617                 this.storage.each(function(val, namespacedKey) {
41618                         callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
41619                 });
41620         },
41621
41622         // clearAll will remove all the stored key-value pairs in this store.
41623         clearAll: function() {
41624                 this.storage.clearAll();
41625         },
41626
41627         // additional functionality that can't live in plugins
41628         // ---------------------------------------------------
41629
41630         // hasNamespace returns true if this store instance has the given namespace.
41631         hasNamespace: function(namespace) {
41632                 return (this._namespacePrefix == '__storejs_'+namespace+'_')
41633         },
41634
41635         // createStore creates a store.js instance with the first
41636         // functioning storage in the list of storage candidates,
41637         // and applies the the given mixins to the instance.
41638         createStore: function() {
41639                 return createStore.apply(this, arguments)
41640         },
41641         
41642         addPlugin: function(plugin) {
41643                 this._addPlugin(plugin);
41644         },
41645         
41646         namespace: function(namespace) {
41647                 return createStore(this.storage, this.plugins, namespace)
41648         }
41649   };
41650
41651   function _warn() {
41652         var _console = (typeof console == 'undefined' ? null : console);
41653         if (!_console) { return }
41654         var fn = (_console.warn ? _console.warn : _console.log);
41655         fn.apply(_console, arguments);
41656   }
41657
41658   function createStore(storages, plugins, namespace) {
41659         if (!namespace) {
41660                 namespace = '';
41661         }
41662         if (storages && !isList$1(storages)) {
41663                 storages = [storages];
41664         }
41665         if (plugins && !isList$1(plugins)) {
41666                 plugins = [plugins];
41667         }
41668
41669         var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
41670         var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
41671         var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
41672         if (!legalNamespaces.test(namespace)) {
41673                 throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
41674         }
41675         
41676         var _privateStoreProps = {
41677                 _namespacePrefix: namespacePrefix,
41678                 _namespaceRegexp: namespaceRegexp,
41679
41680                 _testStorage: function(storage) {
41681                         try {
41682                                 var testStr = '__storejs__test__';
41683                                 storage.write(testStr, testStr);
41684                                 var ok = (storage.read(testStr) === testStr);
41685                                 storage.remove(testStr);
41686                                 return ok
41687                         } catch(e) {
41688                                 return false
41689                         }
41690                 },
41691
41692                 _assignPluginFnProp: function(pluginFnProp, propName) {
41693                         var oldFn = this[propName];
41694                         this[propName] = function pluginFn() {
41695                                 var args = slice$8(arguments, 0);
41696                                 var self = this;
41697
41698                                 // super_fn calls the old function which was overwritten by
41699                                 // this mixin.
41700                                 function super_fn() {
41701                                         if (!oldFn) { return }
41702                                         each$1(arguments, function(arg, i) {
41703                                                 args[i] = arg;
41704                                         });
41705                                         return oldFn.apply(self, args)
41706                                 }
41707
41708                                 // Give mixing function access to super_fn by prefixing all mixin function
41709                                 // arguments with super_fn.
41710                                 var newFnArgs = [super_fn].concat(args);
41711
41712                                 return pluginFnProp.apply(self, newFnArgs)
41713                         };
41714                 },
41715
41716                 _serialize: function(obj) {
41717                         return JSON.stringify(obj)
41718                 },
41719
41720                 _deserialize: function(strVal, defaultVal) {
41721                         if (!strVal) { return defaultVal }
41722                         // It is possible that a raw string value has been previously stored
41723                         // in a storage without using store.js, meaning it will be a raw
41724                         // string value instead of a JSON serialized string. By defaulting
41725                         // to the raw string value in case of a JSON parse error, we allow
41726                         // for past stored values to be forwards-compatible with store.js
41727                         var val = '';
41728                         try { val = JSON.parse(strVal); }
41729                         catch(e) { val = strVal; }
41730
41731                         return (val !== undefined ? val : defaultVal)
41732                 },
41733                 
41734                 _addStorage: function(storage) {
41735                         if (this.enabled) { return }
41736                         if (this._testStorage(storage)) {
41737                                 this.storage = storage;
41738                                 this.enabled = true;
41739                         }
41740                 },
41741
41742                 _addPlugin: function(plugin) {
41743                         var self = this;
41744
41745                         // If the plugin is an array, then add all plugins in the array.
41746                         // This allows for a plugin to depend on other plugins.
41747                         if (isList$1(plugin)) {
41748                                 each$1(plugin, function(plugin) {
41749                                         self._addPlugin(plugin);
41750                                 });
41751                                 return
41752                         }
41753
41754                         // Keep track of all plugins we've seen so far, so that we
41755                         // don't add any of them twice.
41756                         var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
41757                                 return (plugin === seenPlugin)
41758                         });
41759                         if (seenPlugin) {
41760                                 return
41761                         }
41762                         this.plugins.push(plugin);
41763
41764                         // Check that the plugin is properly formed
41765                         if (!isFunction$2(plugin)) {
41766                                 throw new Error('Plugins must be function values that return objects')
41767                         }
41768
41769                         var pluginProperties = plugin.call(this);
41770                         if (!isObject$2(pluginProperties)) {
41771                                 throw new Error('Plugins must return an object of function properties')
41772                         }
41773
41774                         // Add the plugin function properties to this store instance.
41775                         each$1(pluginProperties, function(pluginFnProp, propName) {
41776                                 if (!isFunction$2(pluginFnProp)) {
41777                                         throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
41778                                 }
41779                                 self._assignPluginFnProp(pluginFnProp, propName);
41780                         });
41781                 },
41782                 
41783                 // Put deprecated properties in the private API, so as to not expose it to accidential
41784                 // discovery through inspection of the store object.
41785                 
41786                 // Deprecated: addStorage
41787                 addStorage: function(storage) {
41788                         _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
41789                         this._addStorage(storage);
41790                 }
41791         };
41792
41793         var store = create$3(_privateStoreProps, storeAPI, {
41794                 plugins: []
41795         });
41796         store.raw = {};
41797         each$1(store, function(prop, propName) {
41798                 if (isFunction$2(prop)) {
41799                         store.raw[propName] = bind$1(store, prop);                      
41800                 }
41801         });
41802         each$1(storages, function(storage) {
41803                 store._addStorage(storage);
41804         });
41805         each$1(plugins, function(plugin) {
41806                 store._addPlugin(plugin);
41807         });
41808         return store
41809   }
41810
41811   var Global$1 = util.Global;
41812
41813   var localStorage_1 = {
41814         name: 'localStorage',
41815         read: read,
41816         write: write,
41817         each: each$2,
41818         remove: remove$2,
41819         clearAll: clearAll,
41820   };
41821
41822   function localStorage$1() {
41823         return Global$1.localStorage
41824   }
41825
41826   function read(key) {
41827         return localStorage$1().getItem(key)
41828   }
41829
41830   function write(key, data) {
41831         return localStorage$1().setItem(key, data)
41832   }
41833
41834   function each$2(fn) {
41835         for (var i = localStorage$1().length - 1; i >= 0; i--) {
41836                 var key = localStorage$1().key(i);
41837                 fn(read(key), key);
41838         }
41839   }
41840
41841   function remove$2(key) {
41842         return localStorage$1().removeItem(key)
41843   }
41844
41845   function clearAll() {
41846         return localStorage$1().clear()
41847   }
41848
41849   // oldFF-globalStorage provides storage for Firefox
41850   // versions 6 and 7, where no localStorage, etc
41851   // is available.
41852
41853
41854   var Global$2 = util.Global;
41855
41856   var oldFFGlobalStorage = {
41857         name: 'oldFF-globalStorage',
41858         read: read$1,
41859         write: write$1,
41860         each: each$3,
41861         remove: remove$3,
41862         clearAll: clearAll$1,
41863   };
41864
41865   var globalStorage = Global$2.globalStorage;
41866
41867   function read$1(key) {
41868         return globalStorage[key]
41869   }
41870
41871   function write$1(key, data) {
41872         globalStorage[key] = data;
41873   }
41874
41875   function each$3(fn) {
41876         for (var i = globalStorage.length - 1; i >= 0; i--) {
41877                 var key = globalStorage.key(i);
41878                 fn(globalStorage[key], key);
41879         }
41880   }
41881
41882   function remove$3(key) {
41883         return globalStorage.removeItem(key)
41884   }
41885
41886   function clearAll$1() {
41887         each$3(function(key, _) {
41888                 delete globalStorage[key];
41889         });
41890   }
41891
41892   // oldIE-userDataStorage provides storage for Internet Explorer
41893   // versions 6 and 7, where no localStorage, sessionStorage, etc
41894   // is available.
41895
41896
41897   var Global$3 = util.Global;
41898
41899   var oldIEUserDataStorage = {
41900         name: 'oldIE-userDataStorage',
41901         write: write$2,
41902         read: read$2,
41903         each: each$4,
41904         remove: remove$4,
41905         clearAll: clearAll$2,
41906   };
41907
41908   var storageName = 'storejs';
41909   var doc = Global$3.document;
41910   var _withStorageEl = _makeIEStorageElFunction();
41911   var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
41912
41913   function write$2(unfixedKey, data) {
41914         if (disable) { return }
41915         var fixedKey = fixKey(unfixedKey);
41916         _withStorageEl(function(storageEl) {
41917                 storageEl.setAttribute(fixedKey, data);
41918                 storageEl.save(storageName);
41919         });
41920   }
41921
41922   function read$2(unfixedKey) {
41923         if (disable) { return }
41924         var fixedKey = fixKey(unfixedKey);
41925         var res = null;
41926         _withStorageEl(function(storageEl) {
41927                 res = storageEl.getAttribute(fixedKey);
41928         });
41929         return res
41930   }
41931
41932   function each$4(callback) {
41933         _withStorageEl(function(storageEl) {
41934                 var attributes = storageEl.XMLDocument.documentElement.attributes;
41935                 for (var i=attributes.length-1; i>=0; i--) {
41936                         var attr = attributes[i];
41937                         callback(storageEl.getAttribute(attr.name), attr.name);
41938                 }
41939         });
41940   }
41941
41942   function remove$4(unfixedKey) {
41943         var fixedKey = fixKey(unfixedKey);
41944         _withStorageEl(function(storageEl) {
41945                 storageEl.removeAttribute(fixedKey);
41946                 storageEl.save(storageName);
41947         });
41948   }
41949
41950   function clearAll$2() {
41951         _withStorageEl(function(storageEl) {
41952                 var attributes = storageEl.XMLDocument.documentElement.attributes;
41953                 storageEl.load(storageName);
41954                 for (var i=attributes.length-1; i>=0; i--) {
41955                         storageEl.removeAttribute(attributes[i].name);
41956                 }
41957                 storageEl.save(storageName);
41958         });
41959   }
41960
41961   // Helpers
41962   //////////
41963
41964   // In IE7, keys cannot start with a digit or contain certain chars.
41965   // See https://github.com/marcuswestin/store.js/issues/40
41966   // See https://github.com/marcuswestin/store.js/issues/83
41967   var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
41968   function fixKey(key) {
41969         return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
41970   }
41971
41972   function _makeIEStorageElFunction() {
41973         if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
41974                 return null
41975         }
41976         var scriptTag = 'script',
41977                 storageOwner,
41978                 storageContainer,
41979                 storageEl;
41980
41981         // Since #userData storage applies only to specific paths, we need to
41982         // somehow link our data to a specific path.  We choose /favicon.ico
41983         // as a pretty safe option, since all browsers already make a request to
41984         // this URL anyway and being a 404 will not hurt us here.  We wrap an
41985         // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
41986         // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
41987         // since the iframe access rules appear to allow direct access and
41988         // manipulation of the document element, even for a 404 page.  This
41989         // document can be used instead of the current document (which would
41990         // have been limited to the current path) to perform #userData storage.
41991         try {
41992                 /* global ActiveXObject */
41993                 storageContainer = new ActiveXObject('htmlfile');
41994                 storageContainer.open();
41995                 storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
41996                 storageContainer.close();
41997                 storageOwner = storageContainer.w.frames[0].document;
41998                 storageEl = storageOwner.createElement('div');
41999         } catch(e) {
42000                 // somehow ActiveXObject instantiation failed (perhaps some special
42001                 // security settings or otherwse), fall back to per-path storage
42002                 storageEl = doc.createElement('div');
42003                 storageOwner = doc.body;
42004         }
42005
42006         return function(storeFunction) {
42007                 var args = [].slice.call(arguments, 0);
42008                 args.unshift(storageEl);
42009                 // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
42010                 // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
42011                 storageOwner.appendChild(storageEl);
42012                 storageEl.addBehavior('#default#userData');
42013                 storageEl.load(storageName);
42014                 storeFunction.apply(this, args);
42015                 storageOwner.removeChild(storageEl);
42016                 return
42017         }
42018   }
42019
42020   // cookieStorage is useful Safari private browser mode, where localStorage
42021   // doesn't work but cookies do. This implementation is adopted from
42022   // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
42023
42024
42025   var Global$4 = util.Global;
42026   var trim$1 = util.trim;
42027
42028   var cookieStorage = {
42029         name: 'cookieStorage',
42030         read: read$3,
42031         write: write$3,
42032         each: each$5,
42033         remove: remove$5,
42034         clearAll: clearAll$3,
42035   };
42036
42037   var doc$1 = Global$4.document;
42038
42039   function read$3(key) {
42040         if (!key || !_has(key)) { return null }
42041         var regexpStr = "(?:^|.*;\\s*)" +
42042                 escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
42043                 "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
42044         return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
42045   }
42046
42047   function each$5(callback) {
42048         var cookies = doc$1.cookie.split(/; ?/g);
42049         for (var i = cookies.length - 1; i >= 0; i--) {
42050                 if (!trim$1(cookies[i])) {
42051                         continue
42052                 }
42053                 var kvp = cookies[i].split('=');
42054                 var key = unescape(kvp[0]);
42055                 var val = unescape(kvp[1]);
42056                 callback(val, key);
42057         }
42058   }
42059
42060   function write$3(key, data) {
42061         if(!key) { return }
42062         doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
42063   }
42064
42065   function remove$5(key) {
42066         if (!key || !_has(key)) {
42067                 return
42068         }
42069         doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
42070   }
42071
42072   function clearAll$3() {
42073         each$5(function(_, key) {
42074                 remove$5(key);
42075         });
42076   }
42077
42078   function _has(key) {
42079         return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
42080   }
42081
42082   var Global$5 = util.Global;
42083
42084   var sessionStorage_1 = {
42085         name: 'sessionStorage',
42086         read: read$4,
42087         write: write$4,
42088         each: each$6,
42089         remove: remove$6,
42090         clearAll: clearAll$4
42091   };
42092
42093   function sessionStorage() {
42094         return Global$5.sessionStorage
42095   }
42096
42097   function read$4(key) {
42098         return sessionStorage().getItem(key)
42099   }
42100
42101   function write$4(key, data) {
42102         return sessionStorage().setItem(key, data)
42103   }
42104
42105   function each$6(fn) {
42106         for (var i = sessionStorage().length - 1; i >= 0; i--) {
42107                 var key = sessionStorage().key(i);
42108                 fn(read$4(key), key);
42109         }
42110   }
42111
42112   function remove$6(key) {
42113         return sessionStorage().removeItem(key)
42114   }
42115
42116   function clearAll$4() {
42117         return sessionStorage().clear()
42118   }
42119
42120   // memoryStorage is a useful last fallback to ensure that the store
42121   // is functions (meaning store.get(), store.set(), etc will all function).
42122   // However, stored values will not persist when the browser navigates to
42123   // a new page or reloads the current page.
42124
42125   var memoryStorage_1 = {
42126         name: 'memoryStorage',
42127         read: read$5,
42128         write: write$5,
42129         each: each$7,
42130         remove: remove$7,
42131         clearAll: clearAll$5,
42132   };
42133
42134   var memoryStorage = {};
42135
42136   function read$5(key) {
42137         return memoryStorage[key]
42138   }
42139
42140   function write$5(key, data) {
42141         memoryStorage[key] = data;
42142   }
42143
42144   function each$7(callback) {
42145         for (var key in memoryStorage) {
42146                 if (memoryStorage.hasOwnProperty(key)) {
42147                         callback(memoryStorage[key], key);
42148                 }
42149         }
42150   }
42151
42152   function remove$7(key) {
42153         delete memoryStorage[key];
42154   }
42155
42156   function clearAll$5(key) {
42157         memoryStorage = {};
42158   }
42159
42160   var all = [
42161         // Listed in order of usage preference
42162         localStorage_1,
42163         oldFFGlobalStorage,
42164         oldIEUserDataStorage,
42165         cookieStorage,
42166         sessionStorage_1,
42167         memoryStorage_1
42168   ];
42169
42170   /* eslint-disable */
42171
42172   //  json2.js
42173   //  2016-10-28
42174   //  Public Domain.
42175   //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
42176   //  See http://www.JSON.org/js.html
42177   //  This code should be minified before deployment.
42178   //  See http://javascript.crockford.com/jsmin.html
42179
42180   //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
42181   //  NOT CONTROL.
42182
42183   //  This file creates a global JSON object containing two methods: stringify
42184   //  and parse. This file provides the ES5 JSON capability to ES3 systems.
42185   //  If a project might run on IE8 or earlier, then this file should be included.
42186   //  This file does nothing on ES5 systems.
42187
42188   //      JSON.stringify(value, replacer, space)
42189   //          value       any JavaScript value, usually an object or array.
42190   //          replacer    an optional parameter that determines how object
42191   //                      values are stringified for objects. It can be a
42192   //                      function or an array of strings.
42193   //          space       an optional parameter that specifies the indentation
42194   //                      of nested structures. If it is omitted, the text will
42195   //                      be packed without extra whitespace. If it is a number,
42196   //                      it will specify the number of spaces to indent at each
42197   //                      level. If it is a string (such as "\t" or "&nbsp;"),
42198   //                      it contains the characters used to indent at each level.
42199   //          This method produces a JSON text from a JavaScript value.
42200   //          When an object value is found, if the object contains a toJSON
42201   //          method, its toJSON method will be called and the result will be
42202   //          stringified. A toJSON method does not serialize: it returns the
42203   //          value represented by the name/value pair that should be serialized,
42204   //          or undefined if nothing should be serialized. The toJSON method
42205   //          will be passed the key associated with the value, and this will be
42206   //          bound to the value.
42207
42208   //          For example, this would serialize Dates as ISO strings.
42209
42210   //              Date.prototype.toJSON = function (key) {
42211   //                  function f(n) {
42212   //                      // Format integers to have at least two digits.
42213   //                      return (n < 10)
42214   //                          ? "0" + n
42215   //                          : n;
42216   //                  }
42217   //                  return this.getUTCFullYear()   + "-" +
42218   //                       f(this.getUTCMonth() + 1) + "-" +
42219   //                       f(this.getUTCDate())      + "T" +
42220   //                       f(this.getUTCHours())     + ":" +
42221   //                       f(this.getUTCMinutes())   + ":" +
42222   //                       f(this.getUTCSeconds())   + "Z";
42223   //              };
42224
42225   //          You can provide an optional replacer method. It will be passed the
42226   //          key and value of each member, with this bound to the containing
42227   //          object. The value that is returned from your method will be
42228   //          serialized. If your method returns undefined, then the member will
42229   //          be excluded from the serialization.
42230
42231   //          If the replacer parameter is an array of strings, then it will be
42232   //          used to select the members to be serialized. It filters the results
42233   //          such that only members with keys listed in the replacer array are
42234   //          stringified.
42235
42236   //          Values that do not have JSON representations, such as undefined or
42237   //          functions, will not be serialized. Such values in objects will be
42238   //          dropped; in arrays they will be replaced with null. You can use
42239   //          a replacer function to replace those with JSON values.
42240
42241   //          JSON.stringify(undefined) returns undefined.
42242
42243   //          The optional space parameter produces a stringification of the
42244   //          value that is filled with line breaks and indentation to make it
42245   //          easier to read.
42246
42247   //          If the space parameter is a non-empty string, then that string will
42248   //          be used for indentation. If the space parameter is a number, then
42249   //          the indentation will be that many spaces.
42250
42251   //          Example:
42252
42253   //          text = JSON.stringify(["e", {pluribus: "unum"}]);
42254   //          // text is '["e",{"pluribus":"unum"}]'
42255
42256   //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
42257   //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
42258
42259   //          text = JSON.stringify([new Date()], function (key, value) {
42260   //              return this[key] instanceof Date
42261   //                  ? "Date(" + this[key] + ")"
42262   //                  : value;
42263   //          });
42264   //          // text is '["Date(---current time---)"]'
42265
42266   //      JSON.parse(text, reviver)
42267   //          This method parses a JSON text to produce an object or array.
42268   //          It can throw a SyntaxError exception.
42269
42270   //          The optional reviver parameter is a function that can filter and
42271   //          transform the results. It receives each of the keys and values,
42272   //          and its return value is used instead of the original value.
42273   //          If it returns what it received, then the structure is not modified.
42274   //          If it returns undefined then the member is deleted.
42275
42276   //          Example:
42277
42278   //          // Parse the text. Values that look like ISO date strings will
42279   //          // be converted to Date objects.
42280
42281   //          myData = JSON.parse(text, function (key, value) {
42282   //              var a;
42283   //              if (typeof value === "string") {
42284   //                  a =
42285   //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
42286   //                  if (a) {
42287   //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
42288   //                          +a[5], +a[6]));
42289   //                  }
42290   //              }
42291   //              return value;
42292   //          });
42293
42294   //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
42295   //              var d;
42296   //              if (typeof value === "string" &&
42297   //                      value.slice(0, 5) === "Date(" &&
42298   //                      value.slice(-1) === ")") {
42299   //                  d = new Date(value.slice(5, -1));
42300   //                  if (d) {
42301   //                      return d;
42302   //                  }
42303   //              }
42304   //              return value;
42305   //          });
42306
42307   //  This is a reference implementation. You are free to copy, modify, or
42308   //  redistribute.
42309
42310   /*jslint
42311       eval, for, this
42312   */
42313
42314   /*property
42315       JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
42316       getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
42317       lastIndex, length, parse, prototype, push, replace, slice, stringify,
42318       test, toJSON, toString, valueOf
42319   */
42320
42321
42322   // Create a JSON object only if one does not already exist. We create the
42323   // methods in a closure to avoid creating global variables.
42324
42325   if (typeof JSON !== "object") {
42326       JSON = {};
42327   }
42328
42329   (function () {
42330
42331       var rx_one = /^[\],:{}\s]*$/;
42332       var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
42333       var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
42334       var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
42335       var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
42336       var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
42337
42338       function f(n) {
42339           // Format integers to have at least two digits.
42340           return n < 10
42341               ? "0" + n
42342               : n;
42343       }
42344
42345       function this_value() {
42346           return this.valueOf();
42347       }
42348
42349       if (typeof Date.prototype.toJSON !== "function") {
42350
42351           Date.prototype.toJSON = function () {
42352
42353               return isFinite(this.valueOf())
42354                   ? this.getUTCFullYear() + "-" +
42355                           f(this.getUTCMonth() + 1) + "-" +
42356                           f(this.getUTCDate()) + "T" +
42357                           f(this.getUTCHours()) + ":" +
42358                           f(this.getUTCMinutes()) + ":" +
42359                           f(this.getUTCSeconds()) + "Z"
42360                   : null;
42361           };
42362
42363           Boolean.prototype.toJSON = this_value;
42364           Number.prototype.toJSON = this_value;
42365           String.prototype.toJSON = this_value;
42366       }
42367
42368       var gap;
42369       var indent;
42370       var meta;
42371       var rep;
42372
42373
42374       function quote(string) {
42375
42376   // If the string contains no control characters, no quote characters, and no
42377   // backslash characters, then we can safely slap some quotes around it.
42378   // Otherwise we must also replace the offending characters with safe escape
42379   // sequences.
42380
42381           rx_escapable.lastIndex = 0;
42382           return rx_escapable.test(string)
42383               ? "\"" + string.replace(rx_escapable, function (a) {
42384                   var c = meta[a];
42385                   return typeof c === "string"
42386                       ? c
42387                       : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
42388               }) + "\""
42389               : "\"" + string + "\"";
42390       }
42391
42392
42393       function str(key, holder) {
42394
42395   // Produce a string from holder[key].
42396
42397           var i;          // The loop counter.
42398           var k;          // The member key.
42399           var v;          // The member value.
42400           var length;
42401           var mind = gap;
42402           var partial;
42403           var value = holder[key];
42404
42405   // If the value has a toJSON method, call it to obtain a replacement value.
42406
42407           if (value && typeof value === "object" &&
42408                   typeof value.toJSON === "function") {
42409               value = value.toJSON(key);
42410           }
42411
42412   // If we were called with a replacer function, then call the replacer to
42413   // obtain a replacement value.
42414
42415           if (typeof rep === "function") {
42416               value = rep.call(holder, key, value);
42417           }
42418
42419   // What happens next depends on the value's type.
42420
42421           switch (typeof value) {
42422           case "string":
42423               return quote(value);
42424
42425           case "number":
42426
42427   // JSON numbers must be finite. Encode non-finite numbers as null.
42428
42429               return isFinite(value)
42430                   ? String(value)
42431                   : "null";
42432
42433           case "boolean":
42434           case "null":
42435
42436   // If the value is a boolean or null, convert it to a string. Note:
42437   // typeof null does not produce "null". The case is included here in
42438   // the remote chance that this gets fixed someday.
42439
42440               return String(value);
42441
42442   // If the type is "object", we might be dealing with an object or an array or
42443   // null.
42444
42445           case "object":
42446
42447   // Due to a specification blunder in ECMAScript, typeof null is "object",
42448   // so watch out for that case.
42449
42450               if (!value) {
42451                   return "null";
42452               }
42453
42454   // Make an array to hold the partial results of stringifying this object value.
42455
42456               gap += indent;
42457               partial = [];
42458
42459   // Is the value an array?
42460
42461               if (Object.prototype.toString.apply(value) === "[object Array]") {
42462
42463   // The value is an array. Stringify every element. Use null as a placeholder
42464   // for non-JSON values.
42465
42466                   length = value.length;
42467                   for (i = 0; i < length; i += 1) {
42468                       partial[i] = str(i, value) || "null";
42469                   }
42470
42471   // Join all of the elements together, separated with commas, and wrap them in
42472   // brackets.
42473
42474                   v = partial.length === 0
42475                       ? "[]"
42476                       : gap
42477                           ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
42478                           : "[" + partial.join(",") + "]";
42479                   gap = mind;
42480                   return v;
42481               }
42482
42483   // If the replacer is an array, use it to select the members to be stringified.
42484
42485               if (rep && typeof rep === "object") {
42486                   length = rep.length;
42487                   for (i = 0; i < length; i += 1) {
42488                       if (typeof rep[i] === "string") {
42489                           k = rep[i];
42490                           v = str(k, value);
42491                           if (v) {
42492                               partial.push(quote(k) + (
42493                                   gap
42494                                       ? ": "
42495                                       : ":"
42496                               ) + v);
42497                           }
42498                       }
42499                   }
42500               } else {
42501
42502   // Otherwise, iterate through all of the keys in the object.
42503
42504                   for (k in value) {
42505                       if (Object.prototype.hasOwnProperty.call(value, k)) {
42506                           v = str(k, value);
42507                           if (v) {
42508                               partial.push(quote(k) + (
42509                                   gap
42510                                       ? ": "
42511                                       : ":"
42512                               ) + v);
42513                           }
42514                       }
42515                   }
42516               }
42517
42518   // Join all of the member texts together, separated with commas,
42519   // and wrap them in braces.
42520
42521               v = partial.length === 0
42522                   ? "{}"
42523                   : gap
42524                       ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
42525                       : "{" + partial.join(",") + "}";
42526               gap = mind;
42527               return v;
42528           }
42529       }
42530
42531   // If the JSON object does not yet have a stringify method, give it one.
42532
42533       if (typeof JSON.stringify !== "function") {
42534           meta = {    // table of character substitutions
42535               "\b": "\\b",
42536               "\t": "\\t",
42537               "\n": "\\n",
42538               "\f": "\\f",
42539               "\r": "\\r",
42540               "\"": "\\\"",
42541               "\\": "\\\\"
42542           };
42543           JSON.stringify = function (value, replacer, space) {
42544
42545   // The stringify method takes a value and an optional replacer, and an optional
42546   // space parameter, and returns a JSON text. The replacer can be a function
42547   // that can replace values, or an array of strings that will select the keys.
42548   // A default replacer method can be provided. Use of the space parameter can
42549   // produce text that is more easily readable.
42550
42551               var i;
42552               gap = "";
42553               indent = "";
42554
42555   // If the space parameter is a number, make an indent string containing that
42556   // many spaces.
42557
42558               if (typeof space === "number") {
42559                   for (i = 0; i < space; i += 1) {
42560                       indent += " ";
42561                   }
42562
42563   // If the space parameter is a string, it will be used as the indent string.
42564
42565               } else if (typeof space === "string") {
42566                   indent = space;
42567               }
42568
42569   // If there is a replacer, it must be a function or an array.
42570   // Otherwise, throw an error.
42571
42572               rep = replacer;
42573               if (replacer && typeof replacer !== "function" &&
42574                       (typeof replacer !== "object" ||
42575                       typeof replacer.length !== "number")) {
42576                   throw new Error("JSON.stringify");
42577               }
42578
42579   // Make a fake root object containing our value under the key of "".
42580   // Return the result of stringifying the value.
42581
42582               return str("", {"": value});
42583           };
42584       }
42585
42586
42587   // If the JSON object does not yet have a parse method, give it one.
42588
42589       if (typeof JSON.parse !== "function") {
42590           JSON.parse = function (text, reviver) {
42591
42592   // The parse method takes a text and an optional reviver function, and returns
42593   // a JavaScript value if the text is a valid JSON text.
42594
42595               var j;
42596
42597               function walk(holder, key) {
42598
42599   // The walk method is used to recursively walk the resulting structure so
42600   // that modifications can be made.
42601
42602                   var k;
42603                   var v;
42604                   var value = holder[key];
42605                   if (value && typeof value === "object") {
42606                       for (k in value) {
42607                           if (Object.prototype.hasOwnProperty.call(value, k)) {
42608                               v = walk(value, k);
42609                               if (v !== undefined) {
42610                                   value[k] = v;
42611                               } else {
42612                                   delete value[k];
42613                               }
42614                           }
42615                       }
42616                   }
42617                   return reviver.call(holder, key, value);
42618               }
42619
42620
42621   // Parsing happens in four stages. In the first stage, we replace certain
42622   // Unicode characters with escape sequences. JavaScript handles many characters
42623   // incorrectly, either silently deleting them, or treating them as line endings.
42624
42625               text = String(text);
42626               rx_dangerous.lastIndex = 0;
42627               if (rx_dangerous.test(text)) {
42628                   text = text.replace(rx_dangerous, function (a) {
42629                       return "\\u" +
42630                               ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
42631                   });
42632               }
42633
42634   // In the second stage, we run the text against regular expressions that look
42635   // for non-JSON patterns. We are especially concerned with "()" and "new"
42636   // because they can cause invocation, and "=" because it can cause mutation.
42637   // But just to be safe, we want to reject all unexpected forms.
42638
42639   // We split the second stage into 4 regexp operations in order to work around
42640   // crippling inefficiencies in IE's and Safari's regexp engines. First we
42641   // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
42642   // replace all simple value tokens with "]" characters. Third, we delete all
42643   // open brackets that follow a colon or comma or that begin the text. Finally,
42644   // we look to see that the remaining characters are only whitespace or "]" or
42645   // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
42646
42647               if (
42648                   rx_one.test(
42649                       text
42650                           .replace(rx_two, "@")
42651                           .replace(rx_three, "]")
42652                           .replace(rx_four, "")
42653                   )
42654               ) {
42655
42656   // In the third stage we use the eval function to compile the text into a
42657   // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
42658   // in JavaScript: it can begin a block or an object literal. We wrap the text
42659   // in parens to eliminate the ambiguity.
42660
42661                   j = eval("(" + text + ")");
42662
42663   // In the optional fourth stage, we recursively walk the new structure, passing
42664   // each name/value pair to a reviver function for possible transformation.
42665
42666                   return (typeof reviver === "function")
42667                       ? walk({"": j}, "")
42668                       : j;
42669               }
42670
42671   // If the text is not JSON parseable, then a SyntaxError is thrown.
42672
42673               throw new SyntaxError("JSON.parse");
42674           };
42675       }
42676   }());
42677
42678   var json2 = json2Plugin;
42679
42680   function json2Plugin() {
42681         
42682         return {}
42683   }
42684
42685   var plugins = [json2];
42686
42687   var store_legacy = storeEngine.createStore(all, plugins);
42688
42689   // # osm-auth
42690   //
42691   // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
42692   // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
42693   // does not support custom headers, which this uses everywhere.
42694   var osmAuth = function(o) {
42695
42696       var oauth = {};
42697
42698       // authenticated users will also have a request token secret, but it's
42699       // not used in transactions with the server
42700       oauth.authenticated = function() {
42701           return !!(token('oauth_token') && token('oauth_token_secret'));
42702       };
42703
42704       oauth.logout = function() {
42705           token('oauth_token', '');
42706           token('oauth_token_secret', '');
42707           token('oauth_request_token_secret', '');
42708           return oauth;
42709       };
42710
42711       // TODO: detect lack of click event
42712       oauth.authenticate = function(callback) {
42713           if (oauth.authenticated()) return callback();
42714
42715           oauth.logout();
42716
42717           // ## Getting a request token
42718           var params = timenonce(getAuth(o)),
42719               url = o.url + '/oauth/request_token';
42720
42721           params.oauth_signature = ohauth_1.signature(
42722               o.oauth_secret, '',
42723               ohauth_1.baseString('POST', url, params));
42724
42725           if (!o.singlepage) {
42726               // Create a 600x550 popup window in the center of the screen
42727               var w = 600, h = 550,
42728                   settings = [
42729                       ['width', w], ['height', h],
42730                       ['left', screen.width / 2 - w / 2],
42731                       ['top', screen.height / 2 - h / 2]].map(function(x) {
42732                           return x.join('=');
42733                       }).join(','),
42734                   popup = window.open('about:blank', 'oauth_window', settings);
42735           }
42736
42737           // Request a request token. When this is complete, the popup
42738           // window is redirected to OSM's authorization page.
42739           ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
42740           o.loading();
42741
42742           function reqTokenDone(err, xhr) {
42743               o.done();
42744               if (err) return callback(err);
42745               var resp = ohauth_1.stringQs(xhr.response);
42746               token('oauth_request_token_secret', resp.oauth_token_secret);
42747               var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
42748                   oauth_token: resp.oauth_token,
42749                   oauth_callback: resolveUrl(o.landing)
42750               });
42751
42752               if (o.singlepage) {
42753                   location.href = authorize_url;
42754               } else {
42755                   popup.location = authorize_url;
42756               }
42757           }
42758
42759           // Called by a function in a landing page, in the popup window. The
42760           // window closes itself.
42761           window.authComplete = function(token) {
42762               var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
42763               get_access_token(oauth_token.oauth_token);
42764               delete window.authComplete;
42765           };
42766
42767           // ## Getting an request token
42768           //
42769           // At this point we have an `oauth_token`, brought in from a function
42770           // call on a landing page popup.
42771           function get_access_token(oauth_token) {
42772               var url = o.url + '/oauth/access_token',
42773                   params = timenonce(getAuth(o)),
42774                   request_token_secret = token('oauth_request_token_secret');
42775               params.oauth_token = oauth_token;
42776               params.oauth_signature = ohauth_1.signature(
42777                   o.oauth_secret,
42778                   request_token_secret,
42779                   ohauth_1.baseString('POST', url, params));
42780
42781               // ## Getting an access token
42782               //
42783               // The final token required for authentication. At this point
42784               // we have a `request token secret`
42785               ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
42786               o.loading();
42787           }
42788
42789           function accessTokenDone(err, xhr) {
42790               o.done();
42791               if (err) return callback(err);
42792               var access_token = ohauth_1.stringQs(xhr.response);
42793               token('oauth_token', access_token.oauth_token);
42794               token('oauth_token_secret', access_token.oauth_token_secret);
42795               callback(null, oauth);
42796           }
42797       };
42798
42799       oauth.bootstrapToken = function(oauth_token, callback) {
42800           // ## Getting an request token
42801           // At this point we have an `oauth_token`, brought in from a function
42802           // call on a landing page popup.
42803           function get_access_token(oauth_token) {
42804               var url = o.url + '/oauth/access_token',
42805                   params = timenonce(getAuth(o)),
42806                   request_token_secret = token('oauth_request_token_secret');
42807               params.oauth_token = oauth_token;
42808               params.oauth_signature = ohauth_1.signature(
42809                   o.oauth_secret,
42810                   request_token_secret,
42811                   ohauth_1.baseString('POST', url, params));
42812
42813               // ## Getting an access token
42814               // The final token required for authentication. At this point
42815               // we have a `request token secret`
42816               ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
42817               o.loading();
42818           }
42819
42820           function accessTokenDone(err, xhr) {
42821               o.done();
42822               if (err) return callback(err);
42823               var access_token = ohauth_1.stringQs(xhr.response);
42824               token('oauth_token', access_token.oauth_token);
42825               token('oauth_token_secret', access_token.oauth_token_secret);
42826               callback(null, oauth);
42827           }
42828
42829           get_access_token(oauth_token);
42830       };
42831
42832       // # xhr
42833       //
42834       // A single XMLHttpRequest wrapper that does authenticated calls if the
42835       // user has logged in.
42836       oauth.xhr = function(options, callback) {
42837           if (!oauth.authenticated()) {
42838               if (o.auto) {
42839                   return oauth.authenticate(run);
42840               } else {
42841                   callback('not authenticated', null);
42842                   return;
42843               }
42844           } else {
42845               return run();
42846           }
42847
42848           function run() {
42849               var params = timenonce(getAuth(o)),
42850                   oauth_token_secret = token('oauth_token_secret'),
42851                   url = (options.prefix !== false) ? o.url + options.path : options.path,
42852                   url_parts = url.replace(/#.*$/, '').split('?', 2),
42853                   base_url = url_parts[0],
42854                   query = (url_parts.length === 2) ? url_parts[1] : '';
42855
42856               // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
42857               if ((!options.options || !options.options.header ||
42858                   options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
42859                   options.content) {
42860                   params = immutable(params, ohauth_1.stringQs(options.content));
42861               }
42862
42863               params.oauth_token = token('oauth_token');
42864               params.oauth_signature = ohauth_1.signature(
42865                   o.oauth_secret,
42866                   oauth_token_secret,
42867                   ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
42868               );
42869
42870               return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
42871           }
42872
42873           function done(err, xhr) {
42874               if (err) return callback(err);
42875               else if (xhr.responseXML) return callback(err, xhr.responseXML);
42876               else return callback(err, xhr.response);
42877           }
42878       };
42879
42880       // pre-authorize this object, if we can just get a token and token_secret
42881       // from the start
42882       oauth.preauth = function(c) {
42883           if (!c) return;
42884           if (c.oauth_token) token('oauth_token', c.oauth_token);
42885           if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
42886           return oauth;
42887       };
42888
42889       oauth.options = function(_) {
42890           if (!arguments.length) return o;
42891
42892           o = _;
42893           o.url = o.url || 'https://www.openstreetmap.org';
42894           o.landing = o.landing || 'land.html';
42895           o.singlepage = o.singlepage || false;
42896
42897           // Optional loading and loading-done functions for nice UI feedback.
42898           // by default, no-ops
42899           o.loading = o.loading || function() {};
42900           o.done = o.done || function() {};
42901
42902           return oauth.preauth(o);
42903       };
42904
42905       // 'stamp' an authentication object from `getAuth()`
42906       // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
42907       // and timestamp
42908       function timenonce(o) {
42909           o.oauth_timestamp = ohauth_1.timestamp();
42910           o.oauth_nonce = ohauth_1.nonce();
42911           return o;
42912       }
42913
42914       // get/set tokens. These are prefixed with the base URL so that `osm-auth`
42915       // can be used with multiple APIs and the keys in `localStorage`
42916       // will not clash
42917       var token;
42918
42919       if (store_legacy.enabled) {
42920           token = function (x, y) {
42921               if (arguments.length === 1) return store_legacy.get(o.url + x);
42922               else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
42923           };
42924       } else {
42925           var storage = {};
42926           token = function (x, y) {
42927               if (arguments.length === 1) return storage[o.url + x];
42928               else if (arguments.length === 2) return storage[o.url + x] = y;
42929           };
42930       }
42931
42932       // Get an authentication object. If you just add and remove properties
42933       // from a single object, you'll need to use `delete` to make sure that
42934       // it doesn't contain undesired properties for authentication
42935       function getAuth(o) {
42936           return {
42937               oauth_consumer_key: o.oauth_consumer_key,
42938               oauth_signature_method: 'HMAC-SHA1'
42939           };
42940       }
42941
42942       // potentially pre-authorize
42943       oauth.options(o);
42944
42945       return oauth;
42946   };
42947
42948   var JXON = new (function () {
42949     var
42950       sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
42951       aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
42952
42953     function parseText (sValue) {
42954       if (rIsNull.test(sValue)) { return null; }
42955       if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
42956       if (isFinite(sValue)) { return parseFloat(sValue); }
42957       if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
42958       return sValue;
42959     }
42960
42961     function EmptyTree () { }
42962     EmptyTree.prototype.toString = function () { return 'null'; };
42963     EmptyTree.prototype.valueOf = function () { return null; };
42964
42965     function objectify (vValue) {
42966       return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
42967     }
42968
42969     function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
42970       var
42971         nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
42972         bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
42973
42974       var
42975         sProp, vContent, nLength = 0, sCollectedTxt = '',
42976         vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
42977
42978       if (bChildren) {
42979         for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
42980           oNode = oParentNode.childNodes.item(nItem);
42981           if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
42982           else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
42983           else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
42984         }
42985       }
42986
42987       var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
42988
42989       if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
42990
42991       for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
42992         sProp = aCache[nElId].nodeName.toLowerCase();
42993         vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
42994         if (vResult.hasOwnProperty(sProp)) {
42995           if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
42996           vResult[sProp].push(vContent);
42997         } else {
42998           vResult[sProp] = vContent;
42999           nLength++;
43000         }
43001       }
43002
43003       if (bAttributes) {
43004         var
43005           nAttrLen = oParentNode.attributes.length,
43006           sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
43007
43008         for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
43009           oAttrib = oParentNode.attributes.item(nAttrib);
43010           oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
43011         }
43012
43013         if (bNesteAttr) {
43014           if (bFreeze) { Object.freeze(oAttrParent); }
43015           vResult[sAttributesProp] = oAttrParent;
43016           nLength -= nAttrLen - 1;
43017         }
43018       }
43019
43020       if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
43021         vResult[sValueProp] = vBuiltVal;
43022       } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
43023         vResult = vBuiltVal;
43024       }
43025
43026       if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
43027
43028       aCache.length = nLevelStart;
43029
43030       return vResult;
43031     }
43032
43033     function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
43034       var vValue, oChild;
43035
43036       if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
43037         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
43038       } else if (oParentObj.constructor === Date) {
43039         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
43040       }
43041
43042       for (var sName in oParentObj) {
43043         vValue = oParentObj[sName];
43044         if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
43045         if (sName === sValueProp) {
43046           if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
43047         } else if (sName === sAttributesProp) { /* verbosity level is 3 */
43048           for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
43049         } else if (sName.charAt(0) === sAttrPref) {
43050           oParentEl.setAttribute(sName.slice(1), vValue);
43051         } else if (vValue.constructor === Array) {
43052           for (var nItem = 0; nItem < vValue.length; nItem++) {
43053             oChild = oXMLDoc.createElement(sName);
43054             loadObjTree(oXMLDoc, oChild, vValue[nItem]);
43055             oParentEl.appendChild(oChild);
43056           }
43057         } else {
43058           oChild = oXMLDoc.createElement(sName);
43059           if (vValue instanceof Object) {
43060             loadObjTree(oXMLDoc, oChild, vValue);
43061           } else if (vValue !== null && vValue !== true) {
43062             oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
43063           }
43064           oParentEl.appendChild(oChild);
43065        }
43066      }
43067     }
43068
43069     this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
43070       var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
43071       return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
43072     };
43073
43074     this.unbuild = function (oObjTree) {    
43075       var oNewDoc = document.implementation.createDocument('', '', null);
43076       loadObjTree(oNewDoc, oNewDoc, oObjTree);
43077       return oNewDoc;
43078     };
43079
43080     this.stringify = function (oObjTree) {
43081       return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
43082     };
43083   })();
43084
43085   // var myObject = JXON.build(doc);
43086   // we got our javascript object! try: alert(JSON.stringify(myObject));
43087
43088   // var newDoc = JXON.unbuild(myObject);
43089   // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
43090
43091   var tiler$2 = utilTiler();
43092   var dispatch$3 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes');
43093   var urlroot = 'https://www.openstreetmap.org';
43094   var oauth = osmAuth({
43095       url: urlroot,
43096       oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
43097       oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
43098       loading: authLoading,
43099       done: authDone
43100   });
43101
43102   var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
43103   var _tileCache = { loaded: {}, inflight: {}, seen: {} };
43104   var _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, rtree: rbush_1() };
43105   var _userCache = { toLoad: {}, user: {} };
43106   var _changeset = {};
43107
43108   var _connectionID = 1;
43109   var _tileZoom = 16;
43110   var _noteZoom = 12;
43111   var _rateLimitError;
43112   var _userChangesets;
43113   var _userDetails;
43114   var _off;
43115
43116
43117   function authLoading() {
43118       dispatch$3.call('authLoading');
43119   }
43120
43121
43122   function authDone() {
43123       dispatch$3.call('authDone');
43124   }
43125
43126
43127   function abortRequest$2(i) {
43128       if (i) {
43129           i.abort();
43130       }
43131   }
43132
43133
43134   function abortUnwantedRequests(cache, tiles) {
43135       forEach(cache.inflight, function(v, k) {
43136           var wanted = find$1(tiles, function(tile) { return k === tile.id; });
43137           if (!wanted) {
43138               abortRequest$2(v);
43139               delete cache.inflight[k];
43140           }
43141       });
43142   }
43143
43144
43145   function getLoc(attrs) {
43146       var lon = attrs.lon && attrs.lon.value;
43147       var lat = attrs.lat && attrs.lat.value;
43148       return [parseFloat(lon), parseFloat(lat)];
43149   }
43150
43151
43152   function getNodes(obj) {
43153       var elems = obj.getElementsByTagName('nd');
43154       var nodes = new Array(elems.length);
43155       for (var i = 0, l = elems.length; i < l; i++) {
43156           nodes[i] = 'n' + elems[i].attributes.ref.value;
43157       }
43158       return nodes;
43159   }
43160
43161
43162   function getTags(obj) {
43163       var elems = obj.getElementsByTagName('tag');
43164       var tags = {};
43165       for (var i = 0, l = elems.length; i < l; i++) {
43166           var attrs = elems[i].attributes;
43167           tags[attrs.k.value] = attrs.v.value;
43168       }
43169
43170       return tags;
43171   }
43172
43173
43174   function getMembers(obj) {
43175       var elems = obj.getElementsByTagName('member');
43176       var members = new Array(elems.length);
43177       for (var i = 0, l = elems.length; i < l; i++) {
43178           var attrs = elems[i].attributes;
43179           members[i] = {
43180               id: attrs.type.value[0] + attrs.ref.value,
43181               type: attrs.type.value,
43182               role: attrs.role.value
43183           };
43184       }
43185       return members;
43186   }
43187
43188
43189   function getVisible(attrs) {
43190       return (!attrs.visible || attrs.visible.value !== 'false');
43191   }
43192
43193
43194   function parseComments(comments) {
43195       var parsedComments = [];
43196
43197       // for each comment
43198       for (var i = 0; i < comments.length; i++) {
43199           var comment = comments[i];
43200           if (comment.nodeName === 'comment') {
43201               var childNodes = comment.childNodes;
43202               var parsedComment = {};
43203
43204               for (var j = 0; j < childNodes.length; j++) {
43205                   var node = childNodes[j];
43206                   var nodeName = node.nodeName;
43207                   if (nodeName === '#text') continue;
43208                   parsedComment[nodeName] = node.textContent;
43209
43210                   if (nodeName === 'uid') {
43211                       var uid = node.textContent;
43212                       if (uid && !_userCache.user[uid]) {
43213                           _userCache.toLoad[uid] = true;
43214                       }
43215                   }
43216               }
43217
43218               if (parsedComment) {
43219                   parsedComments.push(parsedComment);
43220               }
43221           }
43222       }
43223       return parsedComments;
43224   }
43225
43226
43227   function encodeNoteRtree(note) {
43228       return {
43229           minX: note.loc[0],
43230           minY: note.loc[1],
43231           maxX: note.loc[0],
43232           maxY: note.loc[1],
43233           data: note
43234       };
43235   }
43236
43237
43238   var parsers = {
43239       node: function nodeData(obj, uid) {
43240           var attrs = obj.attributes;
43241           return new osmNode({
43242               id: uid,
43243               visible: getVisible(attrs),
43244               version: attrs.version.value,
43245               changeset: attrs.changeset && attrs.changeset.value,
43246               timestamp: attrs.timestamp && attrs.timestamp.value,
43247               user: attrs.user && attrs.user.value,
43248               uid: attrs.uid && attrs.uid.value,
43249               loc: getLoc(attrs),
43250               tags: getTags(obj)
43251           });
43252       },
43253
43254       way: function wayData(obj, uid) {
43255           var attrs = obj.attributes;
43256           return new osmWay({
43257               id: uid,
43258               visible: getVisible(attrs),
43259               version: attrs.version.value,
43260               changeset: attrs.changeset && attrs.changeset.value,
43261               timestamp: attrs.timestamp && attrs.timestamp.value,
43262               user: attrs.user && attrs.user.value,
43263               uid: attrs.uid && attrs.uid.value,
43264               tags: getTags(obj),
43265               nodes: getNodes(obj),
43266           });
43267       },
43268
43269       relation: function relationData(obj, uid) {
43270           var attrs = obj.attributes;
43271           return new osmRelation({
43272               id: uid,
43273               visible: getVisible(attrs),
43274               version: attrs.version.value,
43275               changeset: attrs.changeset && attrs.changeset.value,
43276               timestamp: attrs.timestamp && attrs.timestamp.value,
43277               user: attrs.user && attrs.user.value,
43278               uid: attrs.uid && attrs.uid.value,
43279               tags: getTags(obj),
43280               members: getMembers(obj)
43281           });
43282       },
43283
43284       note: function parseNote(obj, uid) {
43285           var attrs = obj.attributes;
43286           var childNodes = obj.childNodes;
43287           var props = {};
43288
43289           props.id = uid;
43290           props.loc = getLoc(attrs);
43291
43292           // if notes are coincident, move them apart slightly
43293           var coincident = false;
43294           var epsilon = 0.00001;
43295           do {
43296               if (coincident) {
43297                   props.loc = geoVecAdd(props.loc, [epsilon, epsilon]);
43298               }
43299               var bbox = geoExtent$$1(props.loc).bbox();
43300               coincident = _noteCache.rtree.search(bbox).length;
43301           } while (coincident);
43302
43303           // parse note contents
43304           for (var i = 0; i < childNodes.length; i++) {
43305               var node = childNodes[i];
43306               var nodeName = node.nodeName;
43307               if (nodeName === '#text') continue;
43308
43309               // if the element is comments, parse the comments
43310               if (nodeName === 'comments') {
43311                   props[nodeName] = parseComments(node.childNodes);
43312               } else {
43313                   props[nodeName] = node.textContent;
43314               }
43315           }
43316
43317           var note = new osmNote(props);
43318           var item = encodeNoteRtree(note);
43319           _noteCache.note[note.id] = note;
43320           _noteCache.rtree.insert(item);
43321
43322           return note;
43323       },
43324
43325       user: function parseUser(obj, uid) {
43326           var attrs = obj.attributes;
43327           var user = {
43328               id: uid,
43329               display_name: attrs.display_name && attrs.display_name.value,
43330               account_created: attrs.account_created && attrs.account_created.value,
43331               changesets_count: 0
43332           };
43333
43334           var img = obj.getElementsByTagName('img');
43335           if (img && img[0] && img[0].getAttribute('href')) {
43336               user.image_url = img[0].getAttribute('href');
43337           }
43338
43339           var changesets = obj.getElementsByTagName('changesets');
43340           if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
43341               user.changesets_count = changesets[0].getAttribute('count');
43342           }
43343
43344           _userCache.user[uid] = user;
43345           delete _userCache.toLoad[uid];
43346           return user;
43347       }
43348   };
43349
43350
43351   function parseXML(xml$$1, callback, options) {
43352       options = assignIn({ skipSeen: true }, options);
43353       if (!xml$$1 || !xml$$1.childNodes) {
43354           return callback({ message: 'No XML', status: -1 });
43355       }
43356
43357       var root = xml$$1.childNodes[0];
43358       var children = root.childNodes;
43359       utilIdleWorker(children, parseChild, done);
43360
43361
43362       function done(results) {
43363           callback(null, results);
43364       }
43365
43366       function parseChild(child) {
43367           var parser = parsers[child.nodeName];
43368           if (!parser) return null;
43369
43370           var uid;
43371           if (child.nodeName === 'user') {
43372               uid = child.attributes.id.value;
43373               if (options.skipSeen && _userCache.user[uid]) {
43374                   delete _userCache.toLoad[uid];
43375                   return null;
43376               }
43377
43378           } else if (child.nodeName === 'note') {
43379               uid = child.getElementsByTagName('id')[0].textContent;
43380
43381           } else {
43382               uid = osmEntity$$1.id.fromOSM(child.nodeName, child.attributes.id.value);
43383               if (options.skipSeen) {
43384                   if (_tileCache.seen[uid]) return null;  // avoid reparsing a "seen" entity
43385                   _tileCache.seen[uid] = true;
43386               }
43387           }
43388
43389           return parser(child, uid);
43390       }
43391   }
43392
43393
43394   // replace or remove note from rtree
43395   function updateRtree(item, replace) {
43396       _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; });
43397
43398       if (replace) {
43399           _noteCache.rtree.insert(item);
43400       }
43401   }
43402
43403
43404   function wrapcb(thisArg, callback, cid) {
43405       return function(err, result) {
43406           if (err) {
43407               // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
43408               if (err.status === 400 || err.status === 401 || err.status === 403) {
43409                   thisArg.logout();
43410               }
43411               return callback.call(thisArg, err);
43412
43413           } else if (thisArg.getConnectionId() !== cid) {
43414               return callback.call(thisArg, { message: 'Connection Switched', status: -1 });
43415
43416           } else {
43417               return callback.call(thisArg, err, result);
43418           }
43419       };
43420   }
43421
43422
43423   var serviceOsm = {
43424
43425       init: function() {
43426           utilRebind(this, dispatch$3, 'on');
43427       },
43428
43429
43430       reset: function() {
43431           _connectionID++;
43432           _userChangesets = undefined;
43433           _userDetails = undefined;
43434           _rateLimitError = undefined;
43435
43436           forEach(_tileCache.inflight, abortRequest$2);
43437           forEach(_noteCache.inflight, abortRequest$2);
43438           forEach(_noteCache.inflightPost, abortRequest$2);
43439           if (_changeset.inflight) abortRequest$2(_changeset.inflight);
43440
43441           _tileCache = { loaded: {}, inflight: {}, seen: {} };
43442           _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, rtree: rbush_1() };
43443           _userCache = { toLoad: {}, user: {} };
43444           _changeset = {};
43445
43446           return this;
43447       },
43448
43449
43450       getConnectionId: function() {
43451           return _connectionID;
43452       },
43453
43454
43455       changesetURL: function(changesetID) {
43456           return urlroot + '/changeset/' + changesetID;
43457       },
43458
43459
43460       changesetsURL: function(center, zoom) {
43461           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
43462           return urlroot + '/history#map=' +
43463               Math.floor(zoom) + '/' +
43464               center[1].toFixed(precision) + '/' +
43465               center[0].toFixed(precision);
43466       },
43467
43468
43469       entityURL: function(entity) {
43470           return urlroot + '/' + entity.type + '/' + entity.osmId();
43471       },
43472
43473
43474       historyURL: function(entity) {
43475           return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
43476       },
43477
43478
43479       userURL: function(username) {
43480           return urlroot + '/user/' + username;
43481       },
43482
43483
43484       noteURL: function(note) {
43485           return urlroot + '/note/' + note.id;
43486       },
43487
43488
43489       // Generic method to load data from the OSM API
43490       // Can handle either auth or unauth calls.
43491       loadFromAPI: function(path, callback, options) {
43492           options = assignIn({ skipSeen: true }, options);
43493           var that = this;
43494           var cid = _connectionID;
43495
43496           function done(err, xml$$1) {
43497               if (that.getConnectionId() !== cid) {
43498                   if (callback) callback({ message: 'Connection Switched', status: -1 });
43499                   return;
43500               }
43501
43502               var isAuthenticated = that.authenticated();
43503
43504               // 400 Bad Request, 401 Unauthorized, 403 Forbidden
43505               // Logout and retry the request..
43506               if (isAuthenticated && err && (err.status === 400 || err.status === 401 || err.status === 403)) {
43507                   that.logout();
43508                   that.loadFromAPI(path, callback, options);
43509
43510               // else, no retry..
43511               } else {
43512                   // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
43513                   // Set the rateLimitError flag and trigger a warning..
43514                   if (!isAuthenticated && !_rateLimitError && err &&
43515                           (err.status === 509 || err.status === 429)) {
43516                       _rateLimitError = err;
43517                       dispatch$3.call('change');
43518                   }
43519
43520                   if (callback) {
43521                       if (err) {
43522                           return callback(err);
43523                       } else {
43524                           return parseXML(xml$$1, callback, options);
43525                       }
43526                   }
43527               }
43528           }
43529
43530           if (this.authenticated()) {
43531               return oauth.xhr({ method: 'GET', path: path }, done);
43532           } else {
43533               var url = urlroot + path;
43534               return d3_xml(url).get(done);
43535           }
43536       },
43537
43538
43539       // Load a single entity by id (ways and relations use the `/full` call)
43540       // GET /api/0.6/node/#id
43541       // GET /api/0.6/[way|relation]/#id/full
43542       loadEntity: function(id, callback) {
43543           var type = osmEntity$$1.id.type(id);
43544           var osmID = osmEntity$$1.id.toOSM(id);
43545           var options = { skipSeen: false };
43546
43547           this.loadFromAPI(
43548               '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
43549               function(err, entities) {
43550                   if (callback) callback(err, { data: entities });
43551               },
43552               options
43553           );
43554       },
43555
43556
43557       // Load a single entity with a specific version
43558       // GET /api/0.6/[node|way|relation]/#id/#version
43559       loadEntityVersion: function(id, version, callback) {
43560           var type = osmEntity$$1.id.type(id);
43561           var osmID = osmEntity$$1.id.toOSM(id);
43562           var options = { skipSeen: false };
43563
43564           this.loadFromAPI(
43565               '/api/0.6/' + type + '/' + osmID + '/' + version,
43566               function(err, entities) {
43567                   if (callback) callback(err, { data: entities });
43568               },
43569               options
43570           );
43571       },
43572
43573
43574       // Load multiple entities in chunks
43575       // (note: callback may be called multiple times)
43576       // GET /api/0.6/[nodes|ways|relations]?#parameters
43577       loadMultiple: function(ids, callback) {
43578           var that = this;
43579
43580           forEach(groupBy(uniq(ids), osmEntity$$1.id.type), function(v, k) {
43581               var type = k + 's';
43582               var osmIDs = map$3(v, osmEntity$$1.id.toOSM);
43583               var options = { skipSeen: false };
43584
43585               forEach(chunk(osmIDs, 150), function(arr) {
43586                   that.loadFromAPI(
43587                       '/api/0.6/' + type + '?' + type + '=' + arr.join(),
43588                       function(err, entities) {
43589                           if (callback) callback(err, { data: entities });
43590                       },
43591                       options
43592                   );
43593               });
43594           });
43595       },
43596
43597
43598       // Create, upload, and close a changeset
43599       // PUT /api/0.6/changeset/create
43600       // POST /api/0.6/changeset/#id/upload
43601       // PUT /api/0.6/changeset/#id/close
43602       putChangeset: function(changeset, changes, callback) {
43603           var cid = _connectionID;
43604
43605           if (_changeset.inflight) {
43606               return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
43607
43608           } else if (_changeset.open) {   // reuse existing open changeset..
43609               return createdChangeset.call(this, null, _changeset.open);
43610
43611           } else {   // Open a new changeset..
43612               var options = {
43613                   method: 'PUT',
43614                   path: '/api/0.6/changeset/create',
43615                   options: { header: { 'Content-Type': 'text/xml' } },
43616                   content: JXON.stringify(changeset.asJXON())
43617               };
43618               _changeset.inflight = oauth.xhr(
43619                   options,
43620                   wrapcb(this, createdChangeset, cid)
43621               );
43622           }
43623
43624
43625           function createdChangeset(err, changesetID) {
43626               _changeset.inflight = null;
43627               if (err) { return callback(err, changeset); }
43628
43629               _changeset.open = changesetID;
43630               changeset = changeset.update({ id: changesetID });
43631
43632               // Upload the changeset..
43633               var options = {
43634                   method: 'POST',
43635                   path: '/api/0.6/changeset/' + changesetID + '/upload',
43636                   options: { header: { 'Content-Type': 'text/xml' } },
43637                   content: JXON.stringify(changeset.osmChangeJXON(changes))
43638               };
43639               _changeset.inflight = oauth.xhr(
43640                   options,
43641                   wrapcb(this, uploadedChangeset, cid)
43642               );
43643           }
43644
43645
43646           function uploadedChangeset(err) {
43647               _changeset.inflight = null;
43648               if (err) return callback(err, changeset);
43649
43650               // Upload was successful, safe to call the callback.
43651               // Add delay to allow for postgres replication #1646 #2678
43652               window.setTimeout(function() { callback(null, changeset); }, 2500);
43653               _changeset.open = null;
43654
43655               // At this point, we don't really care if the connection was switched..
43656               // Only try to close the changeset if we're still talking to the same server.
43657               if (this.getConnectionId() === cid) {
43658                   // Still attempt to close changeset, but ignore response because #2667
43659                   oauth.xhr({
43660                       method: 'PUT',
43661                       path: '/api/0.6/changeset/' + changeset.id + '/close',
43662                       options: { header: { 'Content-Type': 'text/xml' } }
43663                   }, function() { return true; });
43664               }
43665           }
43666       },
43667
43668
43669       // Load multiple users in chunks
43670       // (note: callback may be called multiple times)
43671       // GET /api/0.6/users?users=#id1,#id2,...,#idn
43672       loadUsers: function(uids, callback) {
43673           var toLoad = [];
43674           var cached = [];
43675
43676           uniq(uids).forEach(function(uid) {
43677               if (_userCache.user[uid]) {
43678                   delete _userCache.toLoad[uid];
43679                   cached.push(_userCache.user[uid]);
43680               } else {
43681                   toLoad.push(uid);
43682               }
43683           });
43684
43685           if (cached.length || !this.authenticated()) {
43686               callback(undefined, cached);
43687               if (!this.authenticated()) return;  // require auth
43688           }
43689
43690           chunk(toLoad, 150).forEach(function(arr) {
43691               oauth.xhr(
43692                   { method: 'GET', path: '/api/0.6/users?users=' + arr.join() },
43693                   wrapcb(this, done, _connectionID)
43694               );
43695           }.bind(this));
43696
43697           function done(err, xml$$1) {
43698               if (err) { return callback(err); }
43699
43700               var options = { skipSeen: true };
43701               return parseXML(xml$$1, function(err, results) {
43702                   if (err) {
43703                       return callback(err);
43704                   } else {
43705                       return callback(undefined, results);
43706                   }
43707               }, options);
43708           }
43709       },
43710
43711
43712       // Load a given user by id
43713       // GET /api/0.6/user/#id
43714       loadUser: function(uid, callback) {
43715           if (_userCache.user[uid] || !this.authenticated()) {   // require auth
43716               delete _userCache.toLoad[uid];
43717               return callback(undefined, _userCache.user[uid]);
43718           }
43719
43720           oauth.xhr(
43721               { method: 'GET', path: '/api/0.6/user/' + uid },
43722               wrapcb(this, done, _connectionID)
43723           );
43724
43725           function done(err, xml$$1) {
43726               if (err) { return callback(err); }
43727
43728               var options = { skipSeen: true };
43729               return parseXML(xml$$1, function(err, results) {
43730                   if (err) {
43731                       return callback(err);
43732                   } else {
43733                       return callback(undefined, results[0]);
43734                   }
43735               }, options);
43736           }
43737       },
43738
43739
43740       // Load the details of the logged-in user
43741       // GET /api/0.6/user/details
43742       userDetails: function(callback) {
43743           if (_userDetails) {    // retrieve cached
43744               return callback(undefined, _userDetails);
43745           }
43746
43747           oauth.xhr(
43748               { method: 'GET', path: '/api/0.6/user/details' },
43749               wrapcb(this, done, _connectionID)
43750           );
43751
43752           function done(err, xml$$1) {
43753               if (err) { return callback(err); }
43754
43755               var options = { skipSeen: false };
43756               return parseXML(xml$$1, function(err, results) {
43757                   if (err) {
43758                       return callback(err);
43759                   } else {
43760                       _userDetails = results[0];
43761                       return callback(undefined, _userDetails);
43762                   }
43763               }, options);
43764           }
43765       },
43766
43767
43768       // Load previous changesets for the logged in user
43769       // GET /api/0.6/changesets?user=#id
43770       userChangesets: function(callback) {
43771           if (_userChangesets) {    // retrieve cached
43772               return callback(undefined, _userChangesets);
43773           }
43774
43775           this.userDetails(
43776               wrapcb(this, gotDetails, _connectionID)
43777           );
43778
43779
43780           function gotDetails(err, user) {
43781               if (err) { return callback(err); }
43782
43783               oauth.xhr(
43784                   { method: 'GET', path: '/api/0.6/changesets?user=' + user.id },
43785                   wrapcb(this, done, _connectionID)
43786               );
43787           }
43788
43789           function done(err, xml$$1) {
43790               if (err) { return callback(err); }
43791
43792               _userChangesets = Array.prototype.map.call(
43793                   xml$$1.getElementsByTagName('changeset'),
43794                   function (changeset) { return { tags: getTags(changeset) }; }
43795               ).filter(function (changeset) {
43796                   var comment = changeset.tags.comment;
43797                   return comment && comment !== '';
43798               });
43799
43800               return callback(undefined, _userChangesets);
43801           }
43802       },
43803
43804
43805       // Fetch the status of the OSM API
43806       // GET /api/capabilities
43807       status: function(callback) {
43808           d3_xml(urlroot + '/api/capabilities').get(
43809               wrapcb(this, done, _connectionID)
43810           );
43811
43812           function done(err, xml$$1) {
43813               if (err) { return callback(err); }
43814
43815               // update blacklists
43816               var elements = xml$$1.getElementsByTagName('blacklist');
43817               var regexes = [];
43818               for (var i = 0; i < elements.length; i++) {
43819                   var regex = elements[i].getAttribute('regex');  // needs unencode?
43820                   if (regex) {
43821                       regexes.push(regex);
43822                   }
43823               }
43824               if (regexes.length) {
43825                   _blacklists = regexes;
43826               }
43827
43828               if (_rateLimitError) {
43829                   return callback(_rateLimitError, 'rateLimited');
43830               } else {
43831                   var apiStatus = xml$$1.getElementsByTagName('status');
43832                   var val = apiStatus[0].getAttribute('api');
43833                   return callback(undefined, val);
43834               }
43835           }
43836       },
43837
43838
43839       // Load data (entities) from the API in tiles
43840       // GET /api/0.6/map?bbox=
43841       loadTiles: function(projection, callback) {
43842           if (_off) return;
43843
43844           var that = this;
43845           var path = '/api/0.6/map?bbox=';
43846
43847           // determine the needed tiles to cover the view
43848           var tiles = tiler$2.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
43849
43850           // abort inflight requests that are no longer needed
43851           var hadRequests = !isEmpty(_tileCache.inflight);
43852           abortUnwantedRequests(_tileCache, tiles);
43853           if (hadRequests && isEmpty(_tileCache.inflight)) {
43854               dispatch$3.call('loaded');    // stop the spinner
43855           }
43856
43857           // issue new requests..
43858           tiles.forEach(function(tile) {
43859               if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
43860               if (isEmpty(_tileCache.inflight)) {
43861                   dispatch$3.call('loading');   // start the spinner
43862               }
43863
43864               var options = { skipSeen: true };
43865               _tileCache.inflight[tile.id] = that.loadFromAPI(
43866                   path + tile.extent.toParam(),
43867                   function(err, parsed) {
43868                       delete _tileCache.inflight[tile.id];
43869                       if (!err) {
43870                           _tileCache.loaded[tile.id] = true;
43871                       }
43872                       if (callback) {
43873                           callback(err, assignIn({ data: parsed }, tile));
43874                       }
43875                       if (isEmpty(_tileCache.inflight)) {
43876                           dispatch$3.call('loaded');     // stop the spinner
43877                       }
43878                   },
43879                   options
43880               );
43881           });
43882       },
43883
43884
43885       // Load notes from the API in tiles
43886       // GET /api/0.6/notes?bbox=
43887       loadNotes: function(projection, noteOptions) {
43888           noteOptions = assignIn({ limit: 10000, closed: 7 }, noteOptions);
43889           if (_off) return;
43890
43891           var that = this;
43892           var path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox=';
43893           var throttleLoadUsers = throttle(function() {
43894               var uids = Object.keys(_userCache.toLoad);
43895               if (!uids.length) return;
43896               that.loadUsers(uids, function() {});  // eagerly load user details
43897           }, 750);
43898
43899           // determine the needed tiles to cover the view
43900           var tiles = tiler$2.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection);
43901
43902           // abort inflight requests that are no longer needed
43903           abortUnwantedRequests(_noteCache, tiles);
43904
43905           // issue new requests..
43906           tiles.forEach(function(tile) {
43907               if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) return;
43908
43909               var options = { skipSeen: false };
43910               _noteCache.inflight[tile.id] = that.loadFromAPI(
43911                   path + tile.extent.toParam(),
43912                   function(err) {
43913                       delete _noteCache.inflight[tile.id];
43914                       if (!err) {
43915                           _noteCache.loaded[tile.id] = true;
43916                       }
43917                       throttleLoadUsers();
43918                       dispatch$3.call('loadedNotes');
43919                   },
43920                   options
43921               );
43922           });
43923       },
43924
43925
43926       // Create a note
43927       // POST /api/0.6/notes?params
43928       postNoteCreate: function(note, callback) {
43929           if (!this.authenticated()) {
43930               return callback({ message: 'Not Authenticated', status: -3 }, note);
43931           }
43932           if (_noteCache.inflightPost[note.id]) {
43933               return callback({ message: 'Note update already inflight', status: -2 }, note);
43934           }
43935
43936           if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required
43937
43938           var comment = note.newComment;
43939           if (note.newCategory && note.newCategory !== 'None') { comment += ' #' + note.newCategory; }
43940
43941           var path = '/api/0.6/notes?' + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment });
43942
43943           _noteCache.inflightPost[note.id] = oauth.xhr(
43944               { method: 'POST', path: path },
43945               wrapcb(this, done, _connectionID)
43946           );
43947
43948
43949           function done(err, xml$$1) {
43950               delete _noteCache.inflightPost[note.id];
43951               if (err) { return callback(err); }
43952
43953               // we get the updated note back, remove from caches and reparse..
43954               this.removeNote(note);
43955
43956               var options = { skipSeen: false };
43957               return parseXML(xml$$1, function(err, results) {
43958                   if (err) {
43959                       return callback(err);
43960                   } else {
43961                       return callback(undefined, results[0]);
43962                   }
43963               }, options);
43964           }
43965       },
43966
43967
43968       // Update a note
43969       // POST /api/0.6/notes/#id/comment?text=comment
43970       // POST /api/0.6/notes/#id/close?text=comment
43971       // POST /api/0.6/notes/#id/reopen?text=comment
43972       postNoteUpdate: function(note, newStatus, callback) {
43973           if (!this.authenticated()) {
43974               return callback({ message: 'Not Authenticated', status: -3 }, note);
43975           }
43976           if (_noteCache.inflightPost[note.id]) {
43977               return callback({ message: 'Note update already inflight', status: -2 }, note);
43978           }
43979
43980           var action;
43981           if (note.status !== 'closed' && newStatus === 'closed') {
43982               action = 'close';
43983           } else if (note.status !== 'open' && newStatus === 'open') {
43984               action = 'reopen';
43985           } else {
43986               action = 'comment';
43987               if (!note.newComment) return; // when commenting, comment required
43988           }
43989
43990           var path = '/api/0.6/notes/' + note.id + '/' + action;
43991           if (note.newComment) {
43992               path += '?' + utilQsString({ text: note.newComment });
43993           }
43994
43995           _noteCache.inflightPost[note.id] = oauth.xhr(
43996               { method: 'POST', path: path },
43997               wrapcb(this, done, _connectionID)
43998           );
43999
44000
44001           function done(err, xml$$1) {
44002               delete _noteCache.inflightPost[note.id];
44003               if (err) { return callback(err); }
44004
44005               // we get the updated note back, remove from caches and reparse..
44006               this.removeNote(note);
44007
44008               var options = { skipSeen: false };
44009               return parseXML(xml$$1, function(err, results) {
44010                   if (err) {
44011                       return callback(err);
44012                   } else {
44013                       return callback(undefined, results[0]);
44014                   }
44015               }, options);
44016           }
44017       },
44018
44019
44020       switch: function(options) {
44021           urlroot = options.urlroot;
44022
44023           oauth.options(assignIn({
44024               url: urlroot,
44025               loading: authLoading,
44026               done: authDone
44027           }, options));
44028
44029           this.reset();
44030           this.userChangesets(function() {});  // eagerly load user details/changesets
44031           dispatch$3.call('change');
44032           return this;
44033       },
44034
44035
44036       toggle: function(_) {
44037           _off = !_;
44038           return this;
44039       },
44040
44041
44042       isChangesetInflight: function() {
44043           return !!_changeset.inflight;
44044       },
44045
44046
44047       // get/set cached data
44048       // This is used to save/restore the state when entering/exiting the walkthrough
44049       // Also used for testing purposes.
44050       caches: function(obj) {
44051           if (!arguments.length) {
44052               return {
44053                   tile: cloneDeep(_tileCache),
44054                   note: cloneDeep(_noteCache),
44055                   user: cloneDeep(_userCache)
44056               };
44057           }
44058
44059           // access caches directly for testing (e.g., loading notes rtree)
44060           if (obj === 'get') {
44061               return {
44062                   tile: _tileCache,
44063                   note: _noteCache,
44064                   user: _userCache
44065               };
44066           }
44067
44068           if (obj.tile) {
44069               _tileCache = obj.tile;
44070               _tileCache.inflight = {};
44071           }
44072           if (obj.note) {
44073               _noteCache = obj.note;
44074               _noteCache.inflight = {};
44075               _noteCache.inflightPost = {};
44076           }
44077           if (obj.user) {
44078               _userCache = obj.user;
44079           }
44080
44081           return this;
44082       },
44083
44084
44085       logout: function() {
44086           _userChangesets = undefined;
44087           _userDetails = undefined;
44088           oauth.logout();
44089           dispatch$3.call('change');
44090           return this;
44091       },
44092
44093
44094       authenticated: function() {
44095           return oauth.authenticated();
44096       },
44097
44098
44099       authenticate: function(callback) {
44100           var that = this;
44101           var cid = _connectionID;
44102           _userChangesets = undefined;
44103           _userDetails = undefined;
44104
44105           function done(err, res) {
44106               if (err) {
44107                   if (callback) callback(err);
44108                   return;
44109               }
44110               if (that.getConnectionId() !== cid) {
44111                   if (callback) callback({ message: 'Connection Switched', status: -1 });
44112                   return;
44113               }
44114               _rateLimitError = undefined;
44115               dispatch$3.call('change');
44116               if (callback) callback(err, res);
44117               that.userChangesets(function() {});  // eagerly load user details/changesets
44118           }
44119
44120           return oauth.authenticate(done);
44121       },
44122
44123
44124       imageryBlacklists: function() {
44125           return _blacklists;
44126       },
44127
44128
44129       tileZoom: function(_) {
44130           if (!arguments.length) return _tileZoom;
44131           _tileZoom = _;
44132           return this;
44133       },
44134
44135
44136       // get all cached notes covering the viewport
44137       notes: function(projection) {
44138           var viewport = projection.clipExtent();
44139           var min = [viewport[0][0], viewport[1][1]];
44140           var max = [viewport[1][0], viewport[0][1]];
44141           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
44142
44143           return _noteCache.rtree.search(bbox)
44144               .map(function(d) { return d.data; });
44145       },
44146
44147
44148       // get a single note from the cache
44149       getNote: function(id) {
44150           return _noteCache.note[id];
44151       },
44152
44153
44154       // remove a single note from the cache
44155       removeNote: function(note) {
44156           if (!(note instanceof osmNote) || !note.id) return;
44157
44158           delete _noteCache.note[note.id];
44159           updateRtree(encodeNoteRtree(note), false);  // false = remove
44160       },
44161
44162
44163       // replace a single note in the cache
44164       replaceNote: function(note) {
44165           if (!(note instanceof osmNote) || !note.id) return;
44166
44167           _noteCache.note[note.id] = note;
44168           updateRtree(encodeNoteRtree(note), true);  // true = replace
44169           return note;
44170       }
44171
44172   };
44173
44174   var jsonpCache = {};
44175   window.jsonpCache = jsonpCache;
44176
44177   function jsonpRequest(url, callback) {
44178       var request = {
44179           abort: function() {}
44180       };
44181
44182       if (window.JSONP_FIX) {
44183           if (window.JSONP_DELAY === 0) {
44184               callback(window.JSONP_FIX);
44185           } else {
44186               var t = window.setTimeout(function() {
44187                   callback(window.JSONP_FIX);
44188               }, window.JSONP_DELAY || 0);
44189
44190               request.abort = function() { window.clearTimeout(t); };
44191           }
44192
44193           return request;
44194       }
44195
44196       function rand() {
44197           var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
44198           var c = '';
44199           var i = -1;
44200           while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
44201           return c;
44202       }
44203
44204       function create$$1(url) {
44205           var e = url.match(/callback=(\w+)/);
44206           var c = e ? e[1] : rand();
44207
44208           jsonpCache[c] = function(data) {
44209               if (jsonpCache[c]) {
44210                   callback(data);
44211               }
44212               finalize();
44213           };
44214
44215           function finalize() {
44216               delete jsonpCache[c];
44217               script.remove();
44218           }
44219
44220           request.abort = finalize;
44221           return 'jsonpCache.' + c;
44222       }
44223
44224       var cb = create$$1(url);
44225
44226       var script = select('head')
44227           .append('script')
44228           .attr('type', 'text/javascript')
44229           .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
44230
44231       return request;
44232   }
44233
44234   var q = createCommonjsModule(function (module, exports) {
44235   // vim:ts=4:sts=4:sw=4:
44236   /*!
44237    *
44238    * Copyright 2009-2017 Kris Kowal under the terms of the MIT
44239    * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
44240    *
44241    * With parts by Tyler Close
44242    * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
44243    * at http://www.opensource.org/licenses/mit-license.html
44244    * Forked at ref_send.js version: 2009-05-11
44245    *
44246    * With parts by Mark Miller
44247    * Copyright (C) 2011 Google Inc.
44248    *
44249    * Licensed under the Apache License, Version 2.0 (the "License");
44250    * you may not use this file except in compliance with the License.
44251    * You may obtain a copy of the License at
44252    *
44253    * http://www.apache.org/licenses/LICENSE-2.0
44254    *
44255    * Unless required by applicable law or agreed to in writing, software
44256    * distributed under the License is distributed on an "AS IS" BASIS,
44257    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
44258    * See the License for the specific language governing permissions and
44259    * limitations under the License.
44260    *
44261    */
44262
44263   (function (definition) {
44264
44265       // This file will function properly as a <script> tag, or a module
44266       // using CommonJS and NodeJS or RequireJS module formats.  In
44267       // Common/Node/RequireJS, the module exports the Q API and when
44268       // executed as a simple <script>, it creates a Q global instead.
44269
44270       // Montage Require
44271       if (typeof bootstrap === "function") {
44272           bootstrap("promise", definition);
44273
44274       // CommonJS
44275       } else {
44276           module.exports = definition();
44277
44278       // RequireJS
44279       }
44280
44281   })(function () {
44282
44283   var hasStacks = false;
44284   try {
44285       throw new Error();
44286   } catch (e) {
44287       hasStacks = !!e.stack;
44288   }
44289
44290   // All code after this point will be filtered from stack traces reported
44291   // by Q.
44292   var qStartingLine = captureLine();
44293   var qFileName;
44294
44295   // shims
44296
44297   // used for fallback in "allResolved"
44298   var noop = function () {};
44299
44300   // Use the fastest possible means to execute a task in a future turn
44301   // of the event loop.
44302   var nextTick =(function () {
44303       // linked list of tasks (single, with head node)
44304       var head = {task: void 0, next: null};
44305       var tail = head;
44306       var flushing = false;
44307       var requestTick = void 0;
44308       var isNodeJS = false;
44309       // queue for late tasks, used by unhandled rejection tracking
44310       var laterQueue = [];
44311
44312       function flush() {
44313           /* jshint loopfunc: true */
44314           var task, domain;
44315
44316           while (head.next) {
44317               head = head.next;
44318               task = head.task;
44319               head.task = void 0;
44320               domain = head.domain;
44321
44322               if (domain) {
44323                   head.domain = void 0;
44324                   domain.enter();
44325               }
44326               runSingle(task, domain);
44327
44328           }
44329           while (laterQueue.length) {
44330               task = laterQueue.pop();
44331               runSingle(task);
44332           }
44333           flushing = false;
44334       }
44335       // runs a single function in the async queue
44336       function runSingle(task, domain) {
44337           try {
44338               task();
44339
44340           } catch (e) {
44341               if (isNodeJS) {
44342                   // In node, uncaught exceptions are considered fatal errors.
44343                   // Re-throw them synchronously to interrupt flushing!
44344
44345                   // Ensure continuation if the uncaught exception is suppressed
44346                   // listening "uncaughtException" events (as domains does).
44347                   // Continue in next event to avoid tick recursion.
44348                   if (domain) {
44349                       domain.exit();
44350                   }
44351                   setTimeout(flush, 0);
44352                   if (domain) {
44353                       domain.enter();
44354                   }
44355
44356                   throw e;
44357
44358               } else {
44359                   // In browsers, uncaught exceptions are not fatal.
44360                   // Re-throw them asynchronously to avoid slow-downs.
44361                   setTimeout(function () {
44362                       throw e;
44363                   }, 0);
44364               }
44365           }
44366
44367           if (domain) {
44368               domain.exit();
44369           }
44370       }
44371
44372       nextTick = function (task) {
44373           tail = tail.next = {
44374               task: task,
44375               domain: isNodeJS && process.domain,
44376               next: null
44377           };
44378
44379           if (!flushing) {
44380               flushing = true;
44381               requestTick();
44382           }
44383       };
44384
44385       if (typeof process === "object" &&
44386           process.toString() === "[object process]" && process.nextTick) {
44387           // Ensure Q is in a real Node environment, with a `process.nextTick`.
44388           // To see through fake Node environments:
44389           // * Mocha test runner - exposes a `process` global without a `nextTick`
44390           // * Browserify - exposes a `process.nexTick` function that uses
44391           //   `setTimeout`. In this case `setImmediate` is preferred because
44392           //    it is faster. Browserify's `process.toString()` yields
44393           //   "[object Object]", while in a real Node environment
44394           //   `process.toString()` yields "[object process]".
44395           isNodeJS = true;
44396
44397           requestTick = function () {
44398               process.nextTick(flush);
44399           };
44400
44401       } else if (typeof setImmediate === "function") {
44402           // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
44403           if (typeof window !== "undefined") {
44404               requestTick = setImmediate.bind(window, flush);
44405           } else {
44406               requestTick = function () {
44407                   setImmediate(flush);
44408               };
44409           }
44410
44411       } else if (typeof MessageChannel !== "undefined") {
44412           // modern browsers
44413           // http://www.nonblocking.io/2011/06/windownexttick.html
44414           var channel = new MessageChannel();
44415           // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
44416           // working message ports the first time a page loads.
44417           channel.port1.onmessage = function () {
44418               requestTick = requestPortTick;
44419               channel.port1.onmessage = flush;
44420               flush();
44421           };
44422           var requestPortTick = function () {
44423               // Opera requires us to provide a message payload, regardless of
44424               // whether we use it.
44425               channel.port2.postMessage(0);
44426           };
44427           requestTick = function () {
44428               setTimeout(flush, 0);
44429               requestPortTick();
44430           };
44431
44432       } else {
44433           // old browsers
44434           requestTick = function () {
44435               setTimeout(flush, 0);
44436           };
44437       }
44438       // runs a task after all other tasks have been run
44439       // this is useful for unhandled rejection tracking that needs to happen
44440       // after all `then`d tasks have been run.
44441       nextTick.runAfter = function (task) {
44442           laterQueue.push(task);
44443           if (!flushing) {
44444               flushing = true;
44445               requestTick();
44446           }
44447       };
44448       return nextTick;
44449   })();
44450
44451   // Attempt to make generics safe in the face of downstream
44452   // modifications.
44453   // There is no situation where this is necessary.
44454   // If you need a security guarantee, these primordials need to be
44455   // deeply frozen anyway, and if you don’t need a security guarantee,
44456   // this is just plain paranoid.
44457   // However, this **might** have the nice side-effect of reducing the size of
44458   // the minified code by reducing x.call() to merely x()
44459   // See Mark Miller’s explanation of what this does.
44460   // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
44461   var call = Function.call;
44462   function uncurryThis(f) {
44463       return function () {
44464           return call.apply(f, arguments);
44465       };
44466   }
44467   // This is equivalent, but slower:
44468   // uncurryThis = Function_bind.bind(Function_bind.call);
44469   // http://jsperf.com/uncurrythis
44470
44471   var array_slice = uncurryThis(Array.prototype.slice);
44472
44473   var array_reduce = uncurryThis(
44474       Array.prototype.reduce || function (callback, basis) {
44475           var index = 0,
44476               length = this.length;
44477           // concerning the initial value, if one is not provided
44478           if (arguments.length === 1) {
44479               // seek to the first value in the array, accounting
44480               // for the possibility that is is a sparse array
44481               do {
44482                   if (index in this) {
44483                       basis = this[index++];
44484                       break;
44485                   }
44486                   if (++index >= length) {
44487                       throw new TypeError();
44488                   }
44489               } while (1);
44490           }
44491           // reduce
44492           for (; index < length; index++) {
44493               // account for the possibility that the array is sparse
44494               if (index in this) {
44495                   basis = callback(basis, this[index], index);
44496               }
44497           }
44498           return basis;
44499       }
44500   );
44501
44502   var array_indexOf = uncurryThis(
44503       Array.prototype.indexOf || function (value) {
44504           // not a very good shim, but good enough for our one use of it
44505           for (var i = 0; i < this.length; i++) {
44506               if (this[i] === value) {
44507                   return i;
44508               }
44509           }
44510           return -1;
44511       }
44512   );
44513
44514   var array_map = uncurryThis(
44515       Array.prototype.map || function (callback, thisp) {
44516           var self = this;
44517           var collect = [];
44518           array_reduce(self, function (undefined, value, index) {
44519               collect.push(callback.call(thisp, value, index, self));
44520           }, void 0);
44521           return collect;
44522       }
44523   );
44524
44525   var object_create = Object.create || function (prototype) {
44526       function Type() { }
44527       Type.prototype = prototype;
44528       return new Type();
44529   };
44530
44531   var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
44532       obj[prop] = descriptor.value;
44533       return obj;
44534   };
44535
44536   var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
44537
44538   var object_keys = Object.keys || function (object) {
44539       var keys = [];
44540       for (var key in object) {
44541           if (object_hasOwnProperty(object, key)) {
44542               keys.push(key);
44543           }
44544       }
44545       return keys;
44546   };
44547
44548   var object_toString = uncurryThis(Object.prototype.toString);
44549
44550   function isObject(value) {
44551       return value === Object(value);
44552   }
44553
44554   // generator related shims
44555
44556   // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
44557   function isStopIteration(exception) {
44558       return (
44559           object_toString(exception) === "[object StopIteration]" ||
44560           exception instanceof QReturnValue
44561       );
44562   }
44563
44564   // FIXME: Remove this helper and Q.return once ES6 generators are in
44565   // SpiderMonkey.
44566   var QReturnValue;
44567   if (typeof ReturnValue !== "undefined") {
44568       QReturnValue = ReturnValue;
44569   } else {
44570       QReturnValue = function (value) {
44571           this.value = value;
44572       };
44573   }
44574
44575   // long stack traces
44576
44577   var STACK_JUMP_SEPARATOR = "From previous event:";
44578
44579   function makeStackTraceLong(error, promise) {
44580       // If possible, transform the error stack trace by removing Node and Q
44581       // cruft, then concatenating with the stack trace of `promise`. See #57.
44582       if (hasStacks &&
44583           promise.stack &&
44584           typeof error === "object" &&
44585           error !== null &&
44586           error.stack
44587       ) {
44588           var stacks = [];
44589           for (var p = promise; !!p; p = p.source) {
44590               if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
44591                   object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
44592                   stacks.unshift(p.stack);
44593               }
44594           }
44595           stacks.unshift(error.stack);
44596
44597           var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
44598           var stack = filterStackString(concatedStacks);
44599           object_defineProperty(error, "stack", {value: stack, configurable: true});
44600       }
44601   }
44602
44603   function filterStackString(stackString) {
44604       var lines = stackString.split("\n");
44605       var desiredLines = [];
44606       for (var i = 0; i < lines.length; ++i) {
44607           var line = lines[i];
44608
44609           if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
44610               desiredLines.push(line);
44611           }
44612       }
44613       return desiredLines.join("\n");
44614   }
44615
44616   function isNodeFrame(stackLine) {
44617       return stackLine.indexOf("(module.js:") !== -1 ||
44618              stackLine.indexOf("(node.js:") !== -1;
44619   }
44620
44621   function getFileNameAndLineNumber(stackLine) {
44622       // Named functions: "at functionName (filename:lineNumber:columnNumber)"
44623       // In IE10 function name can have spaces ("Anonymous function") O_o
44624       var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
44625       if (attempt1) {
44626           return [attempt1[1], Number(attempt1[2])];
44627       }
44628
44629       // Anonymous functions: "at filename:lineNumber:columnNumber"
44630       var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
44631       if (attempt2) {
44632           return [attempt2[1], Number(attempt2[2])];
44633       }
44634
44635       // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
44636       var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
44637       if (attempt3) {
44638           return [attempt3[1], Number(attempt3[2])];
44639       }
44640   }
44641
44642   function isInternalFrame(stackLine) {
44643       var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
44644
44645       if (!fileNameAndLineNumber) {
44646           return false;
44647       }
44648
44649       var fileName = fileNameAndLineNumber[0];
44650       var lineNumber = fileNameAndLineNumber[1];
44651
44652       return fileName === qFileName &&
44653           lineNumber >= qStartingLine &&
44654           lineNumber <= qEndingLine;
44655   }
44656
44657   // discover own file name and line number range for filtering stack
44658   // traces
44659   function captureLine() {
44660       if (!hasStacks) {
44661           return;
44662       }
44663
44664       try {
44665           throw new Error();
44666       } catch (e) {
44667           var lines = e.stack.split("\n");
44668           var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
44669           var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
44670           if (!fileNameAndLineNumber) {
44671               return;
44672           }
44673
44674           qFileName = fileNameAndLineNumber[0];
44675           return fileNameAndLineNumber[1];
44676       }
44677   }
44678
44679   function deprecate(callback, name, alternative) {
44680       return function () {
44681           if (typeof console !== "undefined" &&
44682               typeof console.warn === "function") {
44683               console.warn(name + " is deprecated, use " + alternative +
44684                            " instead.", new Error("").stack);
44685           }
44686           return callback.apply(callback, arguments);
44687       };
44688   }
44689
44690   // end of shims
44691   // beginning of real work
44692
44693   /**
44694    * Constructs a promise for an immediate reference, passes promises through, or
44695    * coerces promises from different systems.
44696    * @param value immediate reference or promise
44697    */
44698   function Q(value) {
44699       // If the object is already a Promise, return it directly.  This enables
44700       // the resolve function to both be used to created references from objects,
44701       // but to tolerably coerce non-promises to promises.
44702       if (value instanceof Promise) {
44703           return value;
44704       }
44705
44706       // assimilate thenables
44707       if (isPromiseAlike(value)) {
44708           return coerce(value);
44709       } else {
44710           return fulfill(value);
44711       }
44712   }
44713   Q.resolve = Q;
44714
44715   /**
44716    * Performs a task in a future turn of the event loop.
44717    * @param {Function} task
44718    */
44719   Q.nextTick = nextTick;
44720
44721   /**
44722    * Controls whether or not long stack traces will be on
44723    */
44724   Q.longStackSupport = false;
44725
44726   /**
44727    * The counter is used to determine the stopping point for building
44728    * long stack traces. In makeStackTraceLong we walk backwards through
44729    * the linked list of promises, only stacks which were created before
44730    * the rejection are concatenated.
44731    */
44732   var longStackCounter = 1;
44733
44734   // enable long stacks if Q_DEBUG is set
44735   if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
44736       Q.longStackSupport = true;
44737   }
44738
44739   /**
44740    * Constructs a {promise, resolve, reject} object.
44741    *
44742    * `resolve` is a callback to invoke with a more resolved value for the
44743    * promise. To fulfill the promise, invoke `resolve` with any value that is
44744    * not a thenable. To reject the promise, invoke `resolve` with a rejected
44745    * thenable, or invoke `reject` with the reason directly. To resolve the
44746    * promise to another thenable, thus putting it in the same state, invoke
44747    * `resolve` with that other thenable.
44748    */
44749   Q.defer = defer;
44750   function defer() {
44751       // if "messages" is an "Array", that indicates that the promise has not yet
44752       // been resolved.  If it is "undefined", it has been resolved.  Each
44753       // element of the messages array is itself an array of complete arguments to
44754       // forward to the resolved promise.  We coerce the resolution value to a
44755       // promise using the `resolve` function because it handles both fully
44756       // non-thenable values and other thenables gracefully.
44757       var messages = [], progressListeners = [], resolvedPromise;
44758
44759       var deferred = object_create(defer.prototype);
44760       var promise = object_create(Promise.prototype);
44761
44762       promise.promiseDispatch = function (resolve, op, operands) {
44763           var args = array_slice(arguments);
44764           if (messages) {
44765               messages.push(args);
44766               if (op === "when" && operands[1]) { // progress operand
44767                   progressListeners.push(operands[1]);
44768               }
44769           } else {
44770               Q.nextTick(function () {
44771                   resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
44772               });
44773           }
44774       };
44775
44776       // XXX deprecated
44777       promise.valueOf = function () {
44778           if (messages) {
44779               return promise;
44780           }
44781           var nearerValue = nearer(resolvedPromise);
44782           if (isPromise(nearerValue)) {
44783               resolvedPromise = nearerValue; // shorten chain
44784           }
44785           return nearerValue;
44786       };
44787
44788       promise.inspect = function () {
44789           if (!resolvedPromise) {
44790               return { state: "pending" };
44791           }
44792           return resolvedPromise.inspect();
44793       };
44794
44795       if (Q.longStackSupport && hasStacks) {
44796           try {
44797               throw new Error();
44798           } catch (e) {
44799               // NOTE: don't try to use `Error.captureStackTrace` or transfer the
44800               // accessor around; that causes memory leaks as per GH-111. Just
44801               // reify the stack trace as a string ASAP.
44802               //
44803               // At the same time, cut off the first line; it's always just
44804               // "[object Promise]\n", as per the `toString`.
44805               promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
44806               promise.stackCounter = longStackCounter++;
44807           }
44808       }
44809
44810       // NOTE: we do the checks for `resolvedPromise` in each method, instead of
44811       // consolidating them into `become`, since otherwise we'd create new
44812       // promises with the lines `become(whatever(value))`. See e.g. GH-252.
44813
44814       function become(newPromise) {
44815           resolvedPromise = newPromise;
44816
44817           if (Q.longStackSupport && hasStacks) {
44818               // Only hold a reference to the new promise if long stacks
44819               // are enabled to reduce memory usage
44820               promise.source = newPromise;
44821           }
44822
44823           array_reduce(messages, function (undefined, message) {
44824               Q.nextTick(function () {
44825                   newPromise.promiseDispatch.apply(newPromise, message);
44826               });
44827           }, void 0);
44828
44829           messages = void 0;
44830           progressListeners = void 0;
44831       }
44832
44833       deferred.promise = promise;
44834       deferred.resolve = function (value) {
44835           if (resolvedPromise) {
44836               return;
44837           }
44838
44839           become(Q(value));
44840       };
44841
44842       deferred.fulfill = function (value) {
44843           if (resolvedPromise) {
44844               return;
44845           }
44846
44847           become(fulfill(value));
44848       };
44849       deferred.reject = function (reason) {
44850           if (resolvedPromise) {
44851               return;
44852           }
44853
44854           become(reject(reason));
44855       };
44856       deferred.notify = function (progress) {
44857           if (resolvedPromise) {
44858               return;
44859           }
44860
44861           array_reduce(progressListeners, function (undefined, progressListener) {
44862               Q.nextTick(function () {
44863                   progressListener(progress);
44864               });
44865           }, void 0);
44866       };
44867
44868       return deferred;
44869   }
44870
44871   /**
44872    * Creates a Node-style callback that will resolve or reject the deferred
44873    * promise.
44874    * @returns a nodeback
44875    */
44876   defer.prototype.makeNodeResolver = function () {
44877       var self = this;
44878       return function (error, value) {
44879           if (error) {
44880               self.reject(error);
44881           } else if (arguments.length > 2) {
44882               self.resolve(array_slice(arguments, 1));
44883           } else {
44884               self.resolve(value);
44885           }
44886       };
44887   };
44888
44889   /**
44890    * @param resolver {Function} a function that returns nothing and accepts
44891    * the resolve, reject, and notify functions for a deferred.
44892    * @returns a promise that may be resolved with the given resolve and reject
44893    * functions, or rejected by a thrown exception in resolver
44894    */
44895   Q.Promise = promise; // ES6
44896   Q.promise = promise;
44897   function promise(resolver) {
44898       if (typeof resolver !== "function") {
44899           throw new TypeError("resolver must be a function.");
44900       }
44901       var deferred = defer();
44902       try {
44903           resolver(deferred.resolve, deferred.reject, deferred.notify);
44904       } catch (reason) {
44905           deferred.reject(reason);
44906       }
44907       return deferred.promise;
44908   }
44909
44910   promise.race = race; // ES6
44911   promise.all = all; // ES6
44912   promise.reject = reject; // ES6
44913   promise.resolve = Q; // ES6
44914
44915   // XXX experimental.  This method is a way to denote that a local value is
44916   // serializable and should be immediately dispatched to a remote upon request,
44917   // instead of passing a reference.
44918   Q.passByCopy = function (object) {
44919       //freeze(object);
44920       //passByCopies.set(object, true);
44921       return object;
44922   };
44923
44924   Promise.prototype.passByCopy = function () {
44925       //freeze(object);
44926       //passByCopies.set(object, true);
44927       return this;
44928   };
44929
44930   /**
44931    * If two promises eventually fulfill to the same value, promises that value,
44932    * but otherwise rejects.
44933    * @param x {Any*}
44934    * @param y {Any*}
44935    * @returns {Any*} a promise for x and y if they are the same, but a rejection
44936    * otherwise.
44937    *
44938    */
44939   Q.join = function (x, y) {
44940       return Q(x).join(y);
44941   };
44942
44943   Promise.prototype.join = function (that) {
44944       return Q([this, that]).spread(function (x, y) {
44945           if (x === y) {
44946               // TODO: "===" should be Object.is or equiv
44947               return x;
44948           } else {
44949               throw new Error("Q can't join: not the same: " + x + " " + y);
44950           }
44951       });
44952   };
44953
44954   /**
44955    * Returns a promise for the first of an array of promises to become settled.
44956    * @param answers {Array[Any*]} promises to race
44957    * @returns {Any*} the first promise to be settled
44958    */
44959   Q.race = race;
44960   function race(answerPs) {
44961       return promise(function (resolve, reject) {
44962           // Switch to this once we can assume at least ES5
44963           // answerPs.forEach(function (answerP) {
44964           //     Q(answerP).then(resolve, reject);
44965           // });
44966           // Use this in the meantime
44967           for (var i = 0, len = answerPs.length; i < len; i++) {
44968               Q(answerPs[i]).then(resolve, reject);
44969           }
44970       });
44971   }
44972
44973   Promise.prototype.race = function () {
44974       return this.then(Q.race);
44975   };
44976
44977   /**
44978    * Constructs a Promise with a promise descriptor object and optional fallback
44979    * function.  The descriptor contains methods like when(rejected), get(name),
44980    * set(name, value), post(name, args), and delete(name), which all
44981    * return either a value, a promise for a value, or a rejection.  The fallback
44982    * accepts the operation name, a resolver, and any further arguments that would
44983    * have been forwarded to the appropriate method above had a method been
44984    * provided with the proper name.  The API makes no guarantees about the nature
44985    * of the returned object, apart from that it is usable whereever promises are
44986    * bought and sold.
44987    */
44988   Q.makePromise = Promise;
44989   function Promise(descriptor, fallback, inspect) {
44990       if (fallback === void 0) {
44991           fallback = function (op) {
44992               return reject(new Error(
44993                   "Promise does not support operation: " + op
44994               ));
44995           };
44996       }
44997       if (inspect === void 0) {
44998           inspect = function () {
44999               return {state: "unknown"};
45000           };
45001       }
45002
45003       var promise = object_create(Promise.prototype);
45004
45005       promise.promiseDispatch = function (resolve, op, args) {
45006           var result;
45007           try {
45008               if (descriptor[op]) {
45009                   result = descriptor[op].apply(promise, args);
45010               } else {
45011                   result = fallback.call(promise, op, args);
45012               }
45013           } catch (exception) {
45014               result = reject(exception);
45015           }
45016           if (resolve) {
45017               resolve(result);
45018           }
45019       };
45020
45021       promise.inspect = inspect;
45022
45023       // XXX deprecated `valueOf` and `exception` support
45024       if (inspect) {
45025           var inspected = inspect();
45026           if (inspected.state === "rejected") {
45027               promise.exception = inspected.reason;
45028           }
45029
45030           promise.valueOf = function () {
45031               var inspected = inspect();
45032               if (inspected.state === "pending" ||
45033                   inspected.state === "rejected") {
45034                   return promise;
45035               }
45036               return inspected.value;
45037           };
45038       }
45039
45040       return promise;
45041   }
45042
45043   Promise.prototype.toString = function () {
45044       return "[object Promise]";
45045   };
45046
45047   Promise.prototype.then = function (fulfilled, rejected, progressed) {
45048       var self = this;
45049       var deferred = defer();
45050       var done = false;   // ensure the untrusted promise makes at most a
45051                           // single call to one of the callbacks
45052
45053       function _fulfilled(value) {
45054           try {
45055               return typeof fulfilled === "function" ? fulfilled(value) : value;
45056           } catch (exception) {
45057               return reject(exception);
45058           }
45059       }
45060
45061       function _rejected(exception) {
45062           if (typeof rejected === "function") {
45063               makeStackTraceLong(exception, self);
45064               try {
45065                   return rejected(exception);
45066               } catch (newException) {
45067                   return reject(newException);
45068               }
45069           }
45070           return reject(exception);
45071       }
45072
45073       function _progressed(value) {
45074           return typeof progressed === "function" ? progressed(value) : value;
45075       }
45076
45077       Q.nextTick(function () {
45078           self.promiseDispatch(function (value) {
45079               if (done) {
45080                   return;
45081               }
45082               done = true;
45083
45084               deferred.resolve(_fulfilled(value));
45085           }, "when", [function (exception) {
45086               if (done) {
45087                   return;
45088               }
45089               done = true;
45090
45091               deferred.resolve(_rejected(exception));
45092           }]);
45093       });
45094
45095       // Progress propagator need to be attached in the current tick.
45096       self.promiseDispatch(void 0, "when", [void 0, function (value) {
45097           var newValue;
45098           var threw = false;
45099           try {
45100               newValue = _progressed(value);
45101           } catch (e) {
45102               threw = true;
45103               if (Q.onerror) {
45104                   Q.onerror(e);
45105               } else {
45106                   throw e;
45107               }
45108           }
45109
45110           if (!threw) {
45111               deferred.notify(newValue);
45112           }
45113       }]);
45114
45115       return deferred.promise;
45116   };
45117
45118   Q.tap = function (promise, callback) {
45119       return Q(promise).tap(callback);
45120   };
45121
45122   /**
45123    * Works almost like "finally", but not called for rejections.
45124    * Original resolution value is passed through callback unaffected.
45125    * Callback may return a promise that will be awaited for.
45126    * @param {Function} callback
45127    * @returns {Q.Promise}
45128    * @example
45129    * doSomething()
45130    *   .then(...)
45131    *   .tap(console.log)
45132    *   .then(...);
45133    */
45134   Promise.prototype.tap = function (callback) {
45135       callback = Q(callback);
45136
45137       return this.then(function (value) {
45138           return callback.fcall(value).thenResolve(value);
45139       });
45140   };
45141
45142   /**
45143    * Registers an observer on a promise.
45144    *
45145    * Guarantees:
45146    *
45147    * 1. that fulfilled and rejected will be called only once.
45148    * 2. that either the fulfilled callback or the rejected callback will be
45149    *    called, but not both.
45150    * 3. that fulfilled and rejected will not be called in this turn.
45151    *
45152    * @param value      promise or immediate reference to observe
45153    * @param fulfilled  function to be called with the fulfilled value
45154    * @param rejected   function to be called with the rejection exception
45155    * @param progressed function to be called on any progress notifications
45156    * @return promise for the return value from the invoked callback
45157    */
45158   Q.when = when;
45159   function when(value, fulfilled, rejected, progressed) {
45160       return Q(value).then(fulfilled, rejected, progressed);
45161   }
45162
45163   Promise.prototype.thenResolve = function (value) {
45164       return this.then(function () { return value; });
45165   };
45166
45167   Q.thenResolve = function (promise, value) {
45168       return Q(promise).thenResolve(value);
45169   };
45170
45171   Promise.prototype.thenReject = function (reason) {
45172       return this.then(function () { throw reason; });
45173   };
45174
45175   Q.thenReject = function (promise, reason) {
45176       return Q(promise).thenReject(reason);
45177   };
45178
45179   /**
45180    * If an object is not a promise, it is as "near" as possible.
45181    * If a promise is rejected, it is as "near" as possible too.
45182    * If it’s a fulfilled promise, the fulfillment value is nearer.
45183    * If it’s a deferred promise and the deferred has been resolved, the
45184    * resolution is "nearer".
45185    * @param object
45186    * @returns most resolved (nearest) form of the object
45187    */
45188
45189   // XXX should we re-do this?
45190   Q.nearer = nearer;
45191   function nearer(value) {
45192       if (isPromise(value)) {
45193           var inspected = value.inspect();
45194           if (inspected.state === "fulfilled") {
45195               return inspected.value;
45196           }
45197       }
45198       return value;
45199   }
45200
45201   /**
45202    * @returns whether the given object is a promise.
45203    * Otherwise it is a fulfilled value.
45204    */
45205   Q.isPromise = isPromise;
45206   function isPromise(object) {
45207       return object instanceof Promise;
45208   }
45209
45210   Q.isPromiseAlike = isPromiseAlike;
45211   function isPromiseAlike(object) {
45212       return isObject(object) && typeof object.then === "function";
45213   }
45214
45215   /**
45216    * @returns whether the given object is a pending promise, meaning not
45217    * fulfilled or rejected.
45218    */
45219   Q.isPending = isPending;
45220   function isPending(object) {
45221       return isPromise(object) && object.inspect().state === "pending";
45222   }
45223
45224   Promise.prototype.isPending = function () {
45225       return this.inspect().state === "pending";
45226   };
45227
45228   /**
45229    * @returns whether the given object is a value or fulfilled
45230    * promise.
45231    */
45232   Q.isFulfilled = isFulfilled;
45233   function isFulfilled(object) {
45234       return !isPromise(object) || object.inspect().state === "fulfilled";
45235   }
45236
45237   Promise.prototype.isFulfilled = function () {
45238       return this.inspect().state === "fulfilled";
45239   };
45240
45241   /**
45242    * @returns whether the given object is a rejected promise.
45243    */
45244   Q.isRejected = isRejected;
45245   function isRejected(object) {
45246       return isPromise(object) && object.inspect().state === "rejected";
45247   }
45248
45249   Promise.prototype.isRejected = function () {
45250       return this.inspect().state === "rejected";
45251   };
45252
45253   //// BEGIN UNHANDLED REJECTION TRACKING
45254
45255   // This promise library consumes exceptions thrown in handlers so they can be
45256   // handled by a subsequent promise.  The exceptions get added to this array when
45257   // they are created, and removed when they are handled.  Note that in ES6 or
45258   // shimmed environments, this would naturally be a `Set`.
45259   var unhandledReasons = [];
45260   var unhandledRejections = [];
45261   var reportedUnhandledRejections = [];
45262   var trackUnhandledRejections = true;
45263
45264   function resetUnhandledRejections() {
45265       unhandledReasons.length = 0;
45266       unhandledRejections.length = 0;
45267
45268       if (!trackUnhandledRejections) {
45269           trackUnhandledRejections = true;
45270       }
45271   }
45272
45273   function trackRejection(promise, reason) {
45274       if (!trackUnhandledRejections) {
45275           return;
45276       }
45277       if (typeof process === "object" && typeof process.emit === "function") {
45278           Q.nextTick.runAfter(function () {
45279               if (array_indexOf(unhandledRejections, promise) !== -1) {
45280                   process.emit("unhandledRejection", reason, promise);
45281                   reportedUnhandledRejections.push(promise);
45282               }
45283           });
45284       }
45285
45286       unhandledRejections.push(promise);
45287       if (reason && typeof reason.stack !== "undefined") {
45288           unhandledReasons.push(reason.stack);
45289       } else {
45290           unhandledReasons.push("(no stack) " + reason);
45291       }
45292   }
45293
45294   function untrackRejection(promise) {
45295       if (!trackUnhandledRejections) {
45296           return;
45297       }
45298
45299       var at = array_indexOf(unhandledRejections, promise);
45300       if (at !== -1) {
45301           if (typeof process === "object" && typeof process.emit === "function") {
45302               Q.nextTick.runAfter(function () {
45303                   var atReport = array_indexOf(reportedUnhandledRejections, promise);
45304                   if (atReport !== -1) {
45305                       process.emit("rejectionHandled", unhandledReasons[at], promise);
45306                       reportedUnhandledRejections.splice(atReport, 1);
45307                   }
45308               });
45309           }
45310           unhandledRejections.splice(at, 1);
45311           unhandledReasons.splice(at, 1);
45312       }
45313   }
45314
45315   Q.resetUnhandledRejections = resetUnhandledRejections;
45316
45317   Q.getUnhandledReasons = function () {
45318       // Make a copy so that consumers can't interfere with our internal state.
45319       return unhandledReasons.slice();
45320   };
45321
45322   Q.stopUnhandledRejectionTracking = function () {
45323       resetUnhandledRejections();
45324       trackUnhandledRejections = false;
45325   };
45326
45327   resetUnhandledRejections();
45328
45329   //// END UNHANDLED REJECTION TRACKING
45330
45331   /**
45332    * Constructs a rejected promise.
45333    * @param reason value describing the failure
45334    */
45335   Q.reject = reject;
45336   function reject(reason) {
45337       var rejection = Promise({
45338           "when": function (rejected) {
45339               // note that the error has been handled
45340               if (rejected) {
45341                   untrackRejection(this);
45342               }
45343               return rejected ? rejected(reason) : this;
45344           }
45345       }, function fallback() {
45346           return this;
45347       }, function inspect() {
45348           return { state: "rejected", reason: reason };
45349       });
45350
45351       // Note that the reason has not been handled.
45352       trackRejection(rejection, reason);
45353
45354       return rejection;
45355   }
45356
45357   /**
45358    * Constructs a fulfilled promise for an immediate reference.
45359    * @param value immediate reference
45360    */
45361   Q.fulfill = fulfill;
45362   function fulfill(value) {
45363       return Promise({
45364           "when": function () {
45365               return value;
45366           },
45367           "get": function (name) {
45368               return value[name];
45369           },
45370           "set": function (name, rhs) {
45371               value[name] = rhs;
45372           },
45373           "delete": function (name) {
45374               delete value[name];
45375           },
45376           "post": function (name, args) {
45377               // Mark Miller proposes that post with no name should apply a
45378               // promised function.
45379               if (name === null || name === void 0) {
45380                   return value.apply(void 0, args);
45381               } else {
45382                   return value[name].apply(value, args);
45383               }
45384           },
45385           "apply": function (thisp, args) {
45386               return value.apply(thisp, args);
45387           },
45388           "keys": function () {
45389               return object_keys(value);
45390           }
45391       }, void 0, function inspect() {
45392           return { state: "fulfilled", value: value };
45393       });
45394   }
45395
45396   /**
45397    * Converts thenables to Q promises.
45398    * @param promise thenable promise
45399    * @returns a Q promise
45400    */
45401   function coerce(promise) {
45402       var deferred = defer();
45403       Q.nextTick(function () {
45404           try {
45405               promise.then(deferred.resolve, deferred.reject, deferred.notify);
45406           } catch (exception) {
45407               deferred.reject(exception);
45408           }
45409       });
45410       return deferred.promise;
45411   }
45412
45413   /**
45414    * Annotates an object such that it will never be
45415    * transferred away from this process over any promise
45416    * communication channel.
45417    * @param object
45418    * @returns promise a wrapping of that object that
45419    * additionally responds to the "isDef" message
45420    * without a rejection.
45421    */
45422   Q.master = master;
45423   function master(object) {
45424       return Promise({
45425           "isDef": function () {}
45426       }, function fallback(op, args) {
45427           return dispatch(object, op, args);
45428       }, function () {
45429           return Q(object).inspect();
45430       });
45431   }
45432
45433   /**
45434    * Spreads the values of a promised array of arguments into the
45435    * fulfillment callback.
45436    * @param fulfilled callback that receives variadic arguments from the
45437    * promised array
45438    * @param rejected callback that receives the exception if the promise
45439    * is rejected.
45440    * @returns a promise for the return value or thrown exception of
45441    * either callback.
45442    */
45443   Q.spread = spread;
45444   function spread(value, fulfilled, rejected) {
45445       return Q(value).spread(fulfilled, rejected);
45446   }
45447
45448   Promise.prototype.spread = function (fulfilled, rejected) {
45449       return this.all().then(function (array) {
45450           return fulfilled.apply(void 0, array);
45451       }, rejected);
45452   };
45453
45454   /**
45455    * The async function is a decorator for generator functions, turning
45456    * them into asynchronous generators.  Although generators are only part
45457    * of the newest ECMAScript 6 drafts, this code does not cause syntax
45458    * errors in older engines.  This code should continue to work and will
45459    * in fact improve over time as the language improves.
45460    *
45461    * ES6 generators are currently part of V8 version 3.19 with the
45462    * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
45463    * for longer, but under an older Python-inspired form.  This function
45464    * works on both kinds of generators.
45465    *
45466    * Decorates a generator function such that:
45467    *  - it may yield promises
45468    *  - execution will continue when that promise is fulfilled
45469    *  - the value of the yield expression will be the fulfilled value
45470    *  - it returns a promise for the return value (when the generator
45471    *    stops iterating)
45472    *  - the decorated function returns a promise for the return value
45473    *    of the generator or the first rejected promise among those
45474    *    yielded.
45475    *  - if an error is thrown in the generator, it propagates through
45476    *    every following yield until it is caught, or until it escapes
45477    *    the generator function altogether, and is translated into a
45478    *    rejection for the promise returned by the decorated generator.
45479    */
45480   Q.async = async;
45481   function async(makeGenerator) {
45482       return function () {
45483           // when verb is "send", arg is a value
45484           // when verb is "throw", arg is an exception
45485           function continuer(verb, arg) {
45486               var result;
45487
45488               // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
45489               // engine that has a deployed base of browsers that support generators.
45490               // However, SM's generators use the Python-inspired semantics of
45491               // outdated ES6 drafts.  We would like to support ES6, but we'd also
45492               // like to make it possible to use generators in deployed browsers, so
45493               // we also support Python-style generators.  At some point we can remove
45494               // this block.
45495
45496               if (typeof StopIteration === "undefined") {
45497                   // ES6 Generators
45498                   try {
45499                       result = generator[verb](arg);
45500                   } catch (exception) {
45501                       return reject(exception);
45502                   }
45503                   if (result.done) {
45504                       return Q(result.value);
45505                   } else {
45506                       return when(result.value, callback, errback);
45507                   }
45508               } else {
45509                   // SpiderMonkey Generators
45510                   // FIXME: Remove this case when SM does ES6 generators.
45511                   try {
45512                       result = generator[verb](arg);
45513                   } catch (exception) {
45514                       if (isStopIteration(exception)) {
45515                           return Q(exception.value);
45516                       } else {
45517                           return reject(exception);
45518                       }
45519                   }
45520                   return when(result, callback, errback);
45521               }
45522           }
45523           var generator = makeGenerator.apply(this, arguments);
45524           var callback = continuer.bind(continuer, "next");
45525           var errback = continuer.bind(continuer, "throw");
45526           return callback();
45527       };
45528   }
45529
45530   /**
45531    * The spawn function is a small wrapper around async that immediately
45532    * calls the generator and also ends the promise chain, so that any
45533    * unhandled errors are thrown instead of forwarded to the error
45534    * handler. This is useful because it's extremely common to run
45535    * generators at the top-level to work with libraries.
45536    */
45537   Q.spawn = spawn;
45538   function spawn(makeGenerator) {
45539       Q.done(Q.async(makeGenerator)());
45540   }
45541
45542   // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
45543   /**
45544    * Throws a ReturnValue exception to stop an asynchronous generator.
45545    *
45546    * This interface is a stop-gap measure to support generator return
45547    * values in older Firefox/SpiderMonkey.  In browsers that support ES6
45548    * generators like Chromium 29, just use "return" in your generator
45549    * functions.
45550    *
45551    * @param value the return value for the surrounding generator
45552    * @throws ReturnValue exception with the value.
45553    * @example
45554    * // ES6 style
45555    * Q.async(function* () {
45556    *      var foo = yield getFooPromise();
45557    *      var bar = yield getBarPromise();
45558    *      return foo + bar;
45559    * })
45560    * // Older SpiderMonkey style
45561    * Q.async(function () {
45562    *      var foo = yield getFooPromise();
45563    *      var bar = yield getBarPromise();
45564    *      Q.return(foo + bar);
45565    * })
45566    */
45567   Q["return"] = _return;
45568   function _return(value) {
45569       throw new QReturnValue(value);
45570   }
45571
45572   /**
45573    * The promised function decorator ensures that any promise arguments
45574    * are settled and passed as values (`this` is also settled and passed
45575    * as a value).  It will also ensure that the result of a function is
45576    * always a promise.
45577    *
45578    * @example
45579    * var add = Q.promised(function (a, b) {
45580    *     return a + b;
45581    * });
45582    * add(Q(a), Q(B));
45583    *
45584    * @param {function} callback The function to decorate
45585    * @returns {function} a function that has been decorated.
45586    */
45587   Q.promised = promised;
45588   function promised(callback) {
45589       return function () {
45590           return spread([this, all(arguments)], function (self, args) {
45591               return callback.apply(self, args);
45592           });
45593       };
45594   }
45595
45596   /**
45597    * sends a message to a value in a future turn
45598    * @param object* the recipient
45599    * @param op the name of the message operation, e.g., "when",
45600    * @param args further arguments to be forwarded to the operation
45601    * @returns result {Promise} a promise for the result of the operation
45602    */
45603   Q.dispatch = dispatch;
45604   function dispatch(object, op, args) {
45605       return Q(object).dispatch(op, args);
45606   }
45607
45608   Promise.prototype.dispatch = function (op, args) {
45609       var self = this;
45610       var deferred = defer();
45611       Q.nextTick(function () {
45612           self.promiseDispatch(deferred.resolve, op, args);
45613       });
45614       return deferred.promise;
45615   };
45616
45617   /**
45618    * Gets the value of a property in a future turn.
45619    * @param object    promise or immediate reference for target object
45620    * @param name      name of property to get
45621    * @return promise for the property value
45622    */
45623   Q.get = function (object, key) {
45624       return Q(object).dispatch("get", [key]);
45625   };
45626
45627   Promise.prototype.get = function (key) {
45628       return this.dispatch("get", [key]);
45629   };
45630
45631   /**
45632    * Sets the value of a property in a future turn.
45633    * @param object    promise or immediate reference for object object
45634    * @param name      name of property to set
45635    * @param value     new value of property
45636    * @return promise for the return value
45637    */
45638   Q.set = function (object, key, value) {
45639       return Q(object).dispatch("set", [key, value]);
45640   };
45641
45642   Promise.prototype.set = function (key, value) {
45643       return this.dispatch("set", [key, value]);
45644   };
45645
45646   /**
45647    * Deletes a property in a future turn.
45648    * @param object    promise or immediate reference for target object
45649    * @param name      name of property to delete
45650    * @return promise for the return value
45651    */
45652   Q.del = // XXX legacy
45653   Q["delete"] = function (object, key) {
45654       return Q(object).dispatch("delete", [key]);
45655   };
45656
45657   Promise.prototype.del = // XXX legacy
45658   Promise.prototype["delete"] = function (key) {
45659       return this.dispatch("delete", [key]);
45660   };
45661
45662   /**
45663    * Invokes a method in a future turn.
45664    * @param object    promise or immediate reference for target object
45665    * @param name      name of method to invoke
45666    * @param value     a value to post, typically an array of
45667    *                  invocation arguments for promises that
45668    *                  are ultimately backed with `resolve` values,
45669    *                  as opposed to those backed with URLs
45670    *                  wherein the posted value can be any
45671    *                  JSON serializable object.
45672    * @return promise for the return value
45673    */
45674   // bound locally because it is used by other methods
45675   Q.mapply = // XXX As proposed by "Redsandro"
45676   Q.post = function (object, name, args) {
45677       return Q(object).dispatch("post", [name, args]);
45678   };
45679
45680   Promise.prototype.mapply = // XXX As proposed by "Redsandro"
45681   Promise.prototype.post = function (name, args) {
45682       return this.dispatch("post", [name, args]);
45683   };
45684
45685   /**
45686    * Invokes a method in a future turn.
45687    * @param object    promise or immediate reference for target object
45688    * @param name      name of method to invoke
45689    * @param ...args   array of invocation arguments
45690    * @return promise for the return value
45691    */
45692   Q.send = // XXX Mark Miller's proposed parlance
45693   Q.mcall = // XXX As proposed by "Redsandro"
45694   Q.invoke = function (object, name /*...args*/) {
45695       return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
45696   };
45697
45698   Promise.prototype.send = // XXX Mark Miller's proposed parlance
45699   Promise.prototype.mcall = // XXX As proposed by "Redsandro"
45700   Promise.prototype.invoke = function (name /*...args*/) {
45701       return this.dispatch("post", [name, array_slice(arguments, 1)]);
45702   };
45703
45704   /**
45705    * Applies the promised function in a future turn.
45706    * @param object    promise or immediate reference for target function
45707    * @param args      array of application arguments
45708    */
45709   Q.fapply = function (object, args) {
45710       return Q(object).dispatch("apply", [void 0, args]);
45711   };
45712
45713   Promise.prototype.fapply = function (args) {
45714       return this.dispatch("apply", [void 0, args]);
45715   };
45716
45717   /**
45718    * Calls the promised function in a future turn.
45719    * @param object    promise or immediate reference for target function
45720    * @param ...args   array of application arguments
45721    */
45722   Q["try"] =
45723   Q.fcall = function (object /* ...args*/) {
45724       return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
45725   };
45726
45727   Promise.prototype.fcall = function (/*...args*/) {
45728       return this.dispatch("apply", [void 0, array_slice(arguments)]);
45729   };
45730
45731   /**
45732    * Binds the promised function, transforming return values into a fulfilled
45733    * promise and thrown errors into a rejected one.
45734    * @param object    promise or immediate reference for target function
45735    * @param ...args   array of application arguments
45736    */
45737   Q.fbind = function (object /*...args*/) {
45738       var promise = Q(object);
45739       var args = array_slice(arguments, 1);
45740       return function fbound() {
45741           return promise.dispatch("apply", [
45742               this,
45743               args.concat(array_slice(arguments))
45744           ]);
45745       };
45746   };
45747   Promise.prototype.fbind = function (/*...args*/) {
45748       var promise = this;
45749       var args = array_slice(arguments);
45750       return function fbound() {
45751           return promise.dispatch("apply", [
45752               this,
45753               args.concat(array_slice(arguments))
45754           ]);
45755       };
45756   };
45757
45758   /**
45759    * Requests the names of the owned properties of a promised
45760    * object in a future turn.
45761    * @param object    promise or immediate reference for target object
45762    * @return promise for the keys of the eventually settled object
45763    */
45764   Q.keys = function (object) {
45765       return Q(object).dispatch("keys", []);
45766   };
45767
45768   Promise.prototype.keys = function () {
45769       return this.dispatch("keys", []);
45770   };
45771
45772   /**
45773    * Turns an array of promises into a promise for an array.  If any of
45774    * the promises gets rejected, the whole array is rejected immediately.
45775    * @param {Array*} an array (or promise for an array) of values (or
45776    * promises for values)
45777    * @returns a promise for an array of the corresponding values
45778    */
45779   // By Mark Miller
45780   // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
45781   Q.all = all;
45782   function all(promises) {
45783       return when(promises, function (promises) {
45784           var pendingCount = 0;
45785           var deferred = defer();
45786           array_reduce(promises, function (undefined, promise, index) {
45787               var snapshot;
45788               if (
45789                   isPromise(promise) &&
45790                   (snapshot = promise.inspect()).state === "fulfilled"
45791               ) {
45792                   promises[index] = snapshot.value;
45793               } else {
45794                   ++pendingCount;
45795                   when(
45796                       promise,
45797                       function (value) {
45798                           promises[index] = value;
45799                           if (--pendingCount === 0) {
45800                               deferred.resolve(promises);
45801                           }
45802                       },
45803                       deferred.reject,
45804                       function (progress) {
45805                           deferred.notify({ index: index, value: progress });
45806                       }
45807                   );
45808               }
45809           }, void 0);
45810           if (pendingCount === 0) {
45811               deferred.resolve(promises);
45812           }
45813           return deferred.promise;
45814       });
45815   }
45816
45817   Promise.prototype.all = function () {
45818       return all(this);
45819   };
45820
45821   /**
45822    * Returns the first resolved promise of an array. Prior rejected promises are
45823    * ignored.  Rejects only if all promises are rejected.
45824    * @param {Array*} an array containing values or promises for values
45825    * @returns a promise fulfilled with the value of the first resolved promise,
45826    * or a rejected promise if all promises are rejected.
45827    */
45828   Q.any = any;
45829
45830   function any(promises) {
45831       if (promises.length === 0) {
45832           return Q.resolve();
45833       }
45834
45835       var deferred = Q.defer();
45836       var pendingCount = 0;
45837       array_reduce(promises, function (prev, current, index) {
45838           var promise = promises[index];
45839
45840           pendingCount++;
45841
45842           when(promise, onFulfilled, onRejected, onProgress);
45843           function onFulfilled(result) {
45844               deferred.resolve(result);
45845           }
45846           function onRejected(err) {
45847               pendingCount--;
45848               if (pendingCount === 0) {
45849                   var rejection = err || new Error("" + err);
45850
45851                   rejection.message = ("Q can't get fulfillment value from any promise, all " +
45852                       "promises were rejected. Last error message: " + rejection.message);
45853
45854                   deferred.reject(rejection);
45855               }
45856           }
45857           function onProgress(progress) {
45858               deferred.notify({
45859                   index: index,
45860                   value: progress
45861               });
45862           }
45863       }, undefined);
45864
45865       return deferred.promise;
45866   }
45867
45868   Promise.prototype.any = function () {
45869       return any(this);
45870   };
45871
45872   /**
45873    * Waits for all promises to be settled, either fulfilled or
45874    * rejected.  This is distinct from `all` since that would stop
45875    * waiting at the first rejection.  The promise returned by
45876    * `allResolved` will never be rejected.
45877    * @param promises a promise for an array (or an array) of promises
45878    * (or values)
45879    * @return a promise for an array of promises
45880    */
45881   Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
45882   function allResolved(promises) {
45883       return when(promises, function (promises) {
45884           promises = array_map(promises, Q);
45885           return when(all(array_map(promises, function (promise) {
45886               return when(promise, noop, noop);
45887           })), function () {
45888               return promises;
45889           });
45890       });
45891   }
45892
45893   Promise.prototype.allResolved = function () {
45894       return allResolved(this);
45895   };
45896
45897   /**
45898    * @see Promise#allSettled
45899    */
45900   Q.allSettled = allSettled;
45901   function allSettled(promises) {
45902       return Q(promises).allSettled();
45903   }
45904
45905   /**
45906    * Turns an array of promises into a promise for an array of their states (as
45907    * returned by `inspect`) when they have all settled.
45908    * @param {Array[Any*]} values an array (or promise for an array) of values (or
45909    * promises for values)
45910    * @returns {Array[State]} an array of states for the respective values.
45911    */
45912   Promise.prototype.allSettled = function () {
45913       return this.then(function (promises) {
45914           return all(array_map(promises, function (promise) {
45915               promise = Q(promise);
45916               function regardless() {
45917                   return promise.inspect();
45918               }
45919               return promise.then(regardless, regardless);
45920           }));
45921       });
45922   };
45923
45924   /**
45925    * Captures the failure of a promise, giving an oportunity to recover
45926    * with a callback.  If the given promise is fulfilled, the returned
45927    * promise is fulfilled.
45928    * @param {Any*} promise for something
45929    * @param {Function} callback to fulfill the returned promise if the
45930    * given promise is rejected
45931    * @returns a promise for the return value of the callback
45932    */
45933   Q.fail = // XXX legacy
45934   Q["catch"] = function (object, rejected) {
45935       return Q(object).then(void 0, rejected);
45936   };
45937
45938   Promise.prototype.fail = // XXX legacy
45939   Promise.prototype["catch"] = function (rejected) {
45940       return this.then(void 0, rejected);
45941   };
45942
45943   /**
45944    * Attaches a listener that can respond to progress notifications from a
45945    * promise's originating deferred. This listener receives the exact arguments
45946    * passed to ``deferred.notify``.
45947    * @param {Any*} promise for something
45948    * @param {Function} callback to receive any progress notifications
45949    * @returns the given promise, unchanged
45950    */
45951   Q.progress = progress;
45952   function progress(object, progressed) {
45953       return Q(object).then(void 0, void 0, progressed);
45954   }
45955
45956   Promise.prototype.progress = function (progressed) {
45957       return this.then(void 0, void 0, progressed);
45958   };
45959
45960   /**
45961    * Provides an opportunity to observe the settling of a promise,
45962    * regardless of whether the promise is fulfilled or rejected.  Forwards
45963    * the resolution to the returned promise when the callback is done.
45964    * The callback can return a promise to defer completion.
45965    * @param {Any*} promise
45966    * @param {Function} callback to observe the resolution of the given
45967    * promise, takes no arguments.
45968    * @returns a promise for the resolution of the given promise when
45969    * ``fin`` is done.
45970    */
45971   Q.fin = // XXX legacy
45972   Q["finally"] = function (object, callback) {
45973       return Q(object)["finally"](callback);
45974   };
45975
45976   Promise.prototype.fin = // XXX legacy
45977   Promise.prototype["finally"] = function (callback) {
45978       if (!callback || typeof callback.apply !== "function") {
45979           throw new Error("Q can't apply finally callback");
45980       }
45981       callback = Q(callback);
45982       return this.then(function (value) {
45983           return callback.fcall().then(function () {
45984               return value;
45985           });
45986       }, function (reason) {
45987           // TODO attempt to recycle the rejection with "this".
45988           return callback.fcall().then(function () {
45989               throw reason;
45990           });
45991       });
45992   };
45993
45994   /**
45995    * Terminates a chain of promises, forcing rejections to be
45996    * thrown as exceptions.
45997    * @param {Any*} promise at the end of a chain of promises
45998    * @returns nothing
45999    */
46000   Q.done = function (object, fulfilled, rejected, progress) {
46001       return Q(object).done(fulfilled, rejected, progress);
46002   };
46003
46004   Promise.prototype.done = function (fulfilled, rejected, progress) {
46005       var onUnhandledError = function (error) {
46006           // forward to a future turn so that ``when``
46007           // does not catch it and turn it into a rejection.
46008           Q.nextTick(function () {
46009               makeStackTraceLong(error, promise);
46010               if (Q.onerror) {
46011                   Q.onerror(error);
46012               } else {
46013                   throw error;
46014               }
46015           });
46016       };
46017
46018       // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
46019       var promise = fulfilled || rejected || progress ?
46020           this.then(fulfilled, rejected, progress) :
46021           this;
46022
46023       if (typeof process === "object" && process && process.domain) {
46024           onUnhandledError = process.domain.bind(onUnhandledError);
46025       }
46026
46027       promise.then(void 0, onUnhandledError);
46028   };
46029
46030   /**
46031    * Causes a promise to be rejected if it does not get fulfilled before
46032    * some milliseconds time out.
46033    * @param {Any*} promise
46034    * @param {Number} milliseconds timeout
46035    * @param {Any*} custom error message or Error object (optional)
46036    * @returns a promise for the resolution of the given promise if it is
46037    * fulfilled before the timeout, otherwise rejected.
46038    */
46039   Q.timeout = function (object, ms, error) {
46040       return Q(object).timeout(ms, error);
46041   };
46042
46043   Promise.prototype.timeout = function (ms, error) {
46044       var deferred = defer();
46045       var timeoutId = setTimeout(function () {
46046           if (!error || "string" === typeof error) {
46047               error = new Error(error || "Timed out after " + ms + " ms");
46048               error.code = "ETIMEDOUT";
46049           }
46050           deferred.reject(error);
46051       }, ms);
46052
46053       this.then(function (value) {
46054           clearTimeout(timeoutId);
46055           deferred.resolve(value);
46056       }, function (exception) {
46057           clearTimeout(timeoutId);
46058           deferred.reject(exception);
46059       }, deferred.notify);
46060
46061       return deferred.promise;
46062   };
46063
46064   /**
46065    * Returns a promise for the given value (or promised value), some
46066    * milliseconds after it resolved. Passes rejections immediately.
46067    * @param {Any*} promise
46068    * @param {Number} milliseconds
46069    * @returns a promise for the resolution of the given promise after milliseconds
46070    * time has elapsed since the resolution of the given promise.
46071    * If the given promise rejects, that is passed immediately.
46072    */
46073   Q.delay = function (object, timeout) {
46074       if (timeout === void 0) {
46075           timeout = object;
46076           object = void 0;
46077       }
46078       return Q(object).delay(timeout);
46079   };
46080
46081   Promise.prototype.delay = function (timeout) {
46082       return this.then(function (value) {
46083           var deferred = defer();
46084           setTimeout(function () {
46085               deferred.resolve(value);
46086           }, timeout);
46087           return deferred.promise;
46088       });
46089   };
46090
46091   /**
46092    * Passes a continuation to a Node function, which is called with the given
46093    * arguments provided as an array, and returns a promise.
46094    *
46095    *      Q.nfapply(FS.readFile, [__filename])
46096    *      .then(function (content) {
46097    *      })
46098    *
46099    */
46100   Q.nfapply = function (callback, args) {
46101       return Q(callback).nfapply(args);
46102   };
46103
46104   Promise.prototype.nfapply = function (args) {
46105       var deferred = defer();
46106       var nodeArgs = array_slice(args);
46107       nodeArgs.push(deferred.makeNodeResolver());
46108       this.fapply(nodeArgs).fail(deferred.reject);
46109       return deferred.promise;
46110   };
46111
46112   /**
46113    * Passes a continuation to a Node function, which is called with the given
46114    * arguments provided individually, and returns a promise.
46115    * @example
46116    * Q.nfcall(FS.readFile, __filename)
46117    * .then(function (content) {
46118    * })
46119    *
46120    */
46121   Q.nfcall = function (callback /*...args*/) {
46122       var args = array_slice(arguments, 1);
46123       return Q(callback).nfapply(args);
46124   };
46125
46126   Promise.prototype.nfcall = function (/*...args*/) {
46127       var nodeArgs = array_slice(arguments);
46128       var deferred = defer();
46129       nodeArgs.push(deferred.makeNodeResolver());
46130       this.fapply(nodeArgs).fail(deferred.reject);
46131       return deferred.promise;
46132   };
46133
46134   /**
46135    * Wraps a NodeJS continuation passing function and returns an equivalent
46136    * version that returns a promise.
46137    * @example
46138    * Q.nfbind(FS.readFile, __filename)("utf-8")
46139    * .then(console.log)
46140    * .done()
46141    */
46142   Q.nfbind =
46143   Q.denodeify = function (callback /*...args*/) {
46144       if (callback === undefined) {
46145           throw new Error("Q can't wrap an undefined function");
46146       }
46147       var baseArgs = array_slice(arguments, 1);
46148       return function () {
46149           var nodeArgs = baseArgs.concat(array_slice(arguments));
46150           var deferred = defer();
46151           nodeArgs.push(deferred.makeNodeResolver());
46152           Q(callback).fapply(nodeArgs).fail(deferred.reject);
46153           return deferred.promise;
46154       };
46155   };
46156
46157   Promise.prototype.nfbind =
46158   Promise.prototype.denodeify = function (/*...args*/) {
46159       var args = array_slice(arguments);
46160       args.unshift(this);
46161       return Q.denodeify.apply(void 0, args);
46162   };
46163
46164   Q.nbind = function (callback, thisp /*...args*/) {
46165       var baseArgs = array_slice(arguments, 2);
46166       return function () {
46167           var nodeArgs = baseArgs.concat(array_slice(arguments));
46168           var deferred = defer();
46169           nodeArgs.push(deferred.makeNodeResolver());
46170           function bound() {
46171               return callback.apply(thisp, arguments);
46172           }
46173           Q(bound).fapply(nodeArgs).fail(deferred.reject);
46174           return deferred.promise;
46175       };
46176   };
46177
46178   Promise.prototype.nbind = function (/*thisp, ...args*/) {
46179       var args = array_slice(arguments, 0);
46180       args.unshift(this);
46181       return Q.nbind.apply(void 0, args);
46182   };
46183
46184   /**
46185    * Calls a method of a Node-style object that accepts a Node-style
46186    * callback with a given array of arguments, plus a provided callback.
46187    * @param object an object that has the named method
46188    * @param {String} name name of the method of object
46189    * @param {Array} args arguments to pass to the method; the callback
46190    * will be provided by Q and appended to these arguments.
46191    * @returns a promise for the value or error
46192    */
46193   Q.nmapply = // XXX As proposed by "Redsandro"
46194   Q.npost = function (object, name, args) {
46195       return Q(object).npost(name, args);
46196   };
46197
46198   Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
46199   Promise.prototype.npost = function (name, args) {
46200       var nodeArgs = array_slice(args || []);
46201       var deferred = defer();
46202       nodeArgs.push(deferred.makeNodeResolver());
46203       this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
46204       return deferred.promise;
46205   };
46206
46207   /**
46208    * Calls a method of a Node-style object that accepts a Node-style
46209    * callback, forwarding the given variadic arguments, plus a provided
46210    * callback argument.
46211    * @param object an object that has the named method
46212    * @param {String} name name of the method of object
46213    * @param ...args arguments to pass to the method; the callback will
46214    * be provided by Q and appended to these arguments.
46215    * @returns a promise for the value or error
46216    */
46217   Q.nsend = // XXX Based on Mark Miller's proposed "send"
46218   Q.nmcall = // XXX Based on "Redsandro's" proposal
46219   Q.ninvoke = function (object, name /*...args*/) {
46220       var nodeArgs = array_slice(arguments, 2);
46221       var deferred = defer();
46222       nodeArgs.push(deferred.makeNodeResolver());
46223       Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
46224       return deferred.promise;
46225   };
46226
46227   Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
46228   Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
46229   Promise.prototype.ninvoke = function (name /*...args*/) {
46230       var nodeArgs = array_slice(arguments, 1);
46231       var deferred = defer();
46232       nodeArgs.push(deferred.makeNodeResolver());
46233       this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
46234       return deferred.promise;
46235   };
46236
46237   /**
46238    * If a function would like to support both Node continuation-passing-style and
46239    * promise-returning-style, it can end its internal promise chain with
46240    * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
46241    * elects to use a nodeback, the result will be sent there.  If they do not
46242    * pass a nodeback, they will receive the result promise.
46243    * @param object a result (or a promise for a result)
46244    * @param {Function} nodeback a Node.js-style callback
46245    * @returns either the promise or nothing
46246    */
46247   Q.nodeify = nodeify;
46248   function nodeify(object, nodeback) {
46249       return Q(object).nodeify(nodeback);
46250   }
46251
46252   Promise.prototype.nodeify = function (nodeback) {
46253       if (nodeback) {
46254           this.then(function (value) {
46255               Q.nextTick(function () {
46256                   nodeback(null, value);
46257               });
46258           }, function (error) {
46259               Q.nextTick(function () {
46260                   nodeback(error);
46261               });
46262           });
46263       } else {
46264           return this;
46265       }
46266   };
46267
46268   Q.noConflict = function() {
46269       throw new Error("Q.noConflict only works when Q is used as a global");
46270   };
46271
46272   // All code before this point will be filtered from stack traces.
46273   var qEndingLine = captureLine();
46274
46275   return Q;
46276
46277   });
46278   });
46279
46280   var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?';
46281   var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/';
46282   var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm';
46283   var pannellumViewerCSS = 'pannellum-streetside/pannellum.css';
46284   var pannellumViewerJS = 'pannellum-streetside/pannellum.js';
46285   var maxResults$2 = 2000;
46286   var tileZoom$2 = 16.5;
46287   var tiler$3 = utilTiler().zoomExtent([tileZoom$2, tileZoom$2]).skipNullIsland(true);
46288   var dispatch$4 = dispatch('loadedBubbles', 'viewerChanged');
46289   var minHfov = 10;         // zoom in degrees:  20, 10, 5
46290   var maxHfov = 90;         // zoom out degrees
46291   var defaultHfov = 45;
46292
46293   var _hires = false;
46294   var _resolution = 512;    // higher numbers are slower - 512, 1024, 2048, 4096
46295   var _currScene = 0;
46296   var _ssCache;
46297   var _pannellumViewer;
46298   var _sceneOptions;
46299   var _dataUrlArray = [];
46300
46301
46302   /**
46303    * abortRequest().
46304    */
46305   function abortRequest$3(i) {
46306       i.abort();
46307   }
46308
46309
46310   /**
46311    * localeTimeStamp().
46312    */
46313   function localeTimestamp(s) {
46314       if (!s) return null;
46315       var detected = utilDetect();
46316       var options = { day: 'numeric', month: 'short', year: 'numeric' };
46317       var d = new Date(s);
46318       if (isNaN(d.getTime())) return null;
46319       return d.toLocaleString(detected.locale, options);
46320   }
46321
46322
46323   /**
46324    * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
46325    */
46326   function loadTiles$2(which, url, projection, margin) {
46327       var tiles = tiler$3.margin(margin).getTiles(projection);
46328
46329       // abort inflight requests that are no longer needed
46330       var cache = _ssCache[which];
46331       forEach(cache.inflight, function(v, k) {
46332           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
46333
46334           if (!wanted) {
46335               abortRequest$3(v);
46336               delete cache.inflight[k];
46337           }
46338       });
46339
46340       tiles.forEach(function (tile) {
46341          loadNextTilePage$2(which, url, tile);
46342       });
46343   }
46344
46345   /**
46346    * loadNextTilePage() load data for the next tile page in line.
46347    */
46348   function loadNextTilePage$2(which, url, tile) {
46349       var cache = _ssCache[which];
46350       var nextPage = cache.nextPage[tile.id] || 0;
46351       var id = tile.id + ',' + String(nextPage);
46352       if (cache.loaded[id] || cache.inflight[id]) return;
46353
46354       cache.inflight[id] = getBubbles(url, tile, function(bubbles) {
46355           cache.loaded[id] = true;
46356           delete cache.inflight[id];
46357           if (!bubbles) return;
46358
46359           // [].shift() removes the first element, some statistics info, not a bubble point
46360           bubbles.shift();
46361
46362           var features = bubbles.map(function(bubble) {
46363               if (cache.points[bubble.id]) return null;  // skip duplicates
46364
46365               var loc = [bubble.lo, bubble.la];
46366               var d = {
46367                   loc: loc,
46368                   key: bubble.id,
46369                   ca: bubble.he,
46370                   captured_at: bubble.cd,
46371                   captured_by: 'microsoft',
46372                   // nbn: bubble.nbn,
46373                   // pbn: bubble.pbn,
46374                   // ad: bubble.ad,
46375                   // rn: bubble.rn,
46376                   pr: bubble.pr,  // previous
46377                   ne: bubble.ne,  // next
46378                   pano: true,
46379                   sequenceKey: null
46380               };
46381
46382               cache.points[bubble.id] = d;
46383
46384               // a sequence starts here
46385               if (bubble.pr === undefined) {
46386                   cache.leaders.push(bubble.id);
46387               }
46388
46389               return {
46390                   minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
46391               };
46392
46393           }).filter(Boolean);
46394
46395           cache.rtree.load(features);
46396
46397           connectSequences();
46398
46399           if (which === 'bubbles') {
46400               dispatch$4.call('loadedBubbles');
46401           }
46402       });
46403   }
46404
46405
46406   // call this sometimes to connect the bubbles into sequences
46407   function connectSequences() {
46408       var cache = _ssCache.bubbles;
46409       var keepLeaders = [];
46410
46411       for (var i = 0; i < cache.leaders.length; i++) {
46412           var bubble = cache.points[cache.leaders[i]];
46413           var seen = {};
46414
46415           // try to make a sequence.. use the key of the leader bubble.
46416           var sequence = { key: bubble.key, bubbles: [] };
46417           var complete = false;
46418
46419           do {
46420               sequence.bubbles.push(bubble);
46421               seen[bubble.key] = true;
46422
46423               if (bubble.ne === undefined) {
46424                   complete = true;
46425               } else {
46426                   bubble = cache.points[bubble.ne];  // advance to next
46427               }
46428           } while (bubble && !seen[bubble.key] && !complete);
46429
46430
46431           if (complete) {
46432               _ssCache.sequences[sequence.key] = sequence;
46433
46434               // assign bubbles to the sequence
46435               for (var j = 0; j < sequence.bubbles.length; j++) {
46436                   sequence.bubbles[j].sequenceKey = sequence.key;
46437               }
46438
46439               // create a GeoJSON LineString
46440               sequence.geojson = {
46441                   type: 'LineString',
46442                   properties: { key: sequence.key },
46443                   coordinates: sequence.bubbles.map(function (d) { return d.loc; })
46444               };
46445
46446           } else {
46447               keepLeaders.push(cache.leaders[i]);
46448           }
46449       }
46450
46451       // couldn't complete these, save for later
46452       cache.leaders = keepLeaders;
46453   }
46454
46455   /**
46456    * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
46457    */
46458   function getBubbles(url, tile, callback) {
46459       var rect = tile.extent.rectangle();
46460       var urlForRequest = url + utilQsString({
46461           n: rect[3],
46462           s: rect[1],
46463           e: rect[2],
46464           w: rect[0],
46465           c: maxResults$2,
46466           appkey: bubbleAppKey,
46467           jsCallback: '{callback}'
46468       });
46469
46470       return jsonpRequest(urlForRequest, function (data) {
46471           if (!data || data.error) {
46472               callback(null);
46473           } else {
46474               callback(data);
46475           }
46476       });
46477   }
46478
46479
46480   // partition viewport into higher zoom tiles
46481   function partitionViewport$2(projection) {
46482       var z = geoScaleToZoom(projection.scale());
46483       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
46484       var tiler = utilTiler().zoomExtent([z2, z2]);
46485
46486       return tiler.getTiles(projection)
46487           .map(function(tile) { return tile.extent; });
46488   }
46489
46490
46491   // no more than `limit` results per partition.
46492   function searchLimited$2(limit, projection, rtree) {
46493       limit = limit || 5;
46494
46495       return partitionViewport$2(projection)
46496           .reduce(function(result, extent) {
46497               var found = rtree.search(extent.bbox())
46498                   .slice(0, limit)
46499                   .map(function(d) { return d.data; });
46500
46501               return (found.length ? result.concat(found) : result);
46502           }, []);
46503   }
46504
46505
46506   /**
46507    * getImage()
46508    */
46509   function getImage(imgInfo) {
46510       var response = q.defer();
46511       var img = new Image();
46512
46513       img.onload = function() {
46514           var canvas = document.getElementById('canvas' + imgInfo.face);
46515           var ctx = canvas.getContext('2d');
46516           ctx.drawImage(img, imgInfo.x, imgInfo.y);
46517           response.resolve({imgInfo:imgInfo, status: 'ok'});
46518       };
46519       img.onerror = function() {
46520           response.resolve({data: imgInfo, status: 'error'});
46521       };
46522       img.setAttribute('crossorigin', '');
46523       img.src = imgInfo.url;
46524
46525       return response.promise;
46526   }
46527
46528
46529   /**
46530    * loadCanvas()
46531    */
46532   function loadCanvas(imgInfoGroup) {
46533       var response = q.defer();
46534       var getImagePromises = imgInfoGroup.map(function(imgInfo) {
46535           return getImage(imgInfo);
46536       });
46537
46538       q.all(getImagePromises).then(function(data) {
46539           var canvas = document.getElementById('canvas' + data[0].imgInfo.face);
46540           switch (data[0].imgInfo.face) {
46541               case '01':
46542                   _dataUrlArray[0] = canvas.toDataURL('image/jpeg', 1.0);
46543                   break;
46544               case '02':
46545                   _dataUrlArray[1] = canvas.toDataURL('image/jpeg', 1.0);
46546                   break;
46547               case '03':
46548                   _dataUrlArray[2] = canvas.toDataURL('image/jpeg', 1.0);
46549                   break;
46550               case '10':
46551                   _dataUrlArray[3] = canvas.toDataURL('image/jpeg', 1.0);
46552                   break;
46553               case '11':
46554                   _dataUrlArray[4] = canvas.toDataURL('image/jpeg', 1.0);
46555                   break;
46556               case '12':
46557                   _dataUrlArray[5] = canvas.toDataURL('image/jpeg', 1.0);
46558                   break;
46559           }
46560           response.resolve({status:'loadCanvas for face ' + data[0].imgInfo.face + 'ok'});
46561       });
46562
46563       return response.promise;
46564   }
46565
46566
46567   function setupCanvas(selection$$1, reset) {
46568       if (reset) {
46569           selection$$1.selectAll('#divForCanvasWork')
46570               .remove();
46571       }
46572
46573       // Add the Streetside working canvases. These are used for 'stitching', or combining,
46574       // multiple images for each of the six faces, before passing to the Pannellum control as DataUrls
46575       selection$$1.selectAll('#divForCanvasWork')
46576           .data([0])
46577           .enter()
46578           .append('div')
46579           .attr('id', 'divForCanvasWork')
46580           .attr('display', 'none')
46581           .selectAll('canvas')
46582           .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12'])
46583           .enter()
46584           .append('canvas')
46585           .attr('id', function(d) { return d; })
46586           .attr('width', _resolution)
46587           .attr('height', _resolution);
46588   }
46589
46590
46591   /**
46592    * processFaces()
46593    */
46594   function processFaces(imgFaceInfoGroups) {
46595       var response = q.defer();
46596       var loadCanvasPromises = imgFaceInfoGroups.map(function(faceImgGroup) {
46597           return loadCanvas(faceImgGroup);
46598       });
46599
46600       q.all(loadCanvasPromises).then(function() {
46601           response.resolve({status: 'processFaces done'});
46602       });
46603
46604       return response.promise;
46605   }
46606
46607
46608
46609   function qkToXY(qk) {
46610       var x = 0;
46611       var y = 0;
46612       var scale = 256;
46613       for (var i = qk.length; i > 0; i--) {
46614           var key = qk[i-1];
46615           x += (+(key === '1' || key === '3')) * scale;
46616           y += (+(key === '2' || key === '3')) * scale;
46617           scale *= 2;
46618       }
46619       return [x, y];
46620   }
46621
46622
46623   function getQuadKeys() {
46624       var dim = _resolution / 256;
46625       var quadKeys;
46626
46627       if (dim === 16) {
46628           quadKeys = [
46629               '0000','0001','0010','0011','0100','0101','0110','0111',  '1000','1001','1010','1011','1100','1101','1110','1111',
46630               '0002','0003','0012','0013','0102','0103','0112','0113',  '1002','1003','1012','1013','1102','1103','1112','1113',
46631               '0020','0021','0030','0031','0120','0121','0130','0131',  '1020','1021','1030','1031','1120','1121','1130','1131',
46632               '0022','0023','0032','0033','0122','0123','0132','0133',  '1022','1023','1032','1033','1122','1123','1132','1133',
46633               '0200','0201','0210','0211','0300','0301','0310','0311',  '1200','1201','1210','1211','1300','1301','1310','1311',
46634               '0202','0203','0212','0213','0302','0303','0312','0313',  '1202','1203','1212','1213','1302','1303','1312','1313',
46635               '0220','0221','0230','0231','0320','0321','0330','0331',  '1220','1221','1230','1231','1320','1321','1330','1331',
46636               '0222','0223','0232','0233','0322','0323','0332','0333',  '1222','1223','1232','1233','1322','1323','1332','1333',
46637
46638               '2000','2001','2010','2011','2100','2101','2110','2111',  '3000','3001','3010','3011','3100','3101','3110','3111',
46639               '2002','2003','2012','2013','2102','2103','2112','2113',  '3002','3003','3012','3013','3102','3103','3112','3113',
46640               '2020','2021','2030','2031','2120','2121','2130','2131',  '3020','3021','3030','3031','3120','3121','3130','3131',
46641               '2022','2023','2032','2033','2122','2123','2132','2133',  '3022','3023','3032','3033','3122','3123','3132','3133',
46642               '2200','2201','2210','2211','2300','2301','2310','2311',  '3200','3201','3210','3211','3300','3301','3310','3311',
46643               '2202','2203','2212','2213','2302','2303','2312','2313',  '3202','3203','3212','3213','3302','3303','3312','3313',
46644               '2220','2221','2230','2231','2320','2321','2330','2331',  '3220','3221','3230','3231','3320','3321','3330','3331',
46645               '2222','2223','2232','2233','2322','2323','2332','2333',  '3222','3223','3232','3233','3322','3323','3332','3333'
46646           ];
46647
46648       } else if (dim === 8) {
46649           quadKeys = [
46650               '000','001','010','011',  '100','101','110','111',
46651               '002','003','012','013',  '102','103','112','113',
46652               '020','021','030','031',  '120','121','130','131',
46653               '022','023','032','033',  '122','123','132','133',
46654
46655               '200','201','210','211',  '300','301','310','311',
46656               '202','203','212','213',  '302','303','312','313',
46657               '220','221','230','231',  '320','321','330','331',
46658               '222','223','232','233',  '322','323','332','333'
46659           ];
46660
46661       } else if (dim === 4) {
46662           quadKeys = [
46663               '00','01',  '10','11',
46664               '02','03',  '12','13',
46665
46666               '20','21',  '30','31',
46667               '22','23',  '32','33'
46668           ];
46669
46670       } else {  // dim === 2
46671           quadKeys = [
46672               '0', '1',
46673               '2', '3'
46674           ];
46675       }
46676
46677       return quadKeys;
46678   }
46679
46680
46681
46682   var serviceStreetside = {
46683       /**
46684        * init() initialize streetside.
46685        */
46686       init: function () {
46687           if (!_ssCache) {
46688               this.reset();
46689           }
46690
46691           this.event = utilRebind(this, dispatch$4, 'on');
46692       },
46693
46694       /**
46695        * reset() reset the cache.
46696        */
46697       reset: function () {
46698           var cache = _ssCache;
46699
46700           if (cache) {
46701               if (cache.bubbles && cache.bubbles.inflight) {
46702                   forEach(cache.bubbles.inflight, abortRequest$3);
46703               }
46704           }
46705
46706           _ssCache = {
46707               bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1(), points: {}, leaders: [] },
46708               sequences: {}
46709           };
46710       },
46711
46712       /**
46713        * bubbles()
46714        */
46715       bubbles: function (projection) {
46716           var limit = 5;
46717           return searchLimited$2(limit, projection, _ssCache.bubbles.rtree);
46718       },
46719
46720
46721       sequences: function(projection) {
46722           var viewport = projection.clipExtent();
46723           var min = [viewport[0][0], viewport[1][1]];
46724           var max = [viewport[1][0], viewport[0][1]];
46725           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
46726           var seen = {};
46727           var results = [];
46728
46729           // all sequences for bubbles in viewport
46730           _ssCache.bubbles.rtree.search(bbox)
46731               .forEach(function(d) {
46732                   var key = d.data.sequenceKey;
46733                   if (key && !seen[key]) {
46734                       seen[key] = true;
46735                       results.push(_ssCache.sequences[key].geojson);
46736                   }
46737               });
46738
46739           return results;
46740       },
46741
46742
46743       /**
46744        * loadBubbles()
46745        */
46746       loadBubbles: function (projection, margin) {
46747           // by default: request 2 nearby tiles so we can connect sequences.
46748           if (margin === undefined) margin = 2;
46749
46750           loadTiles$2('bubbles', bubbleApi, projection, margin);
46751       },
46752
46753
46754       viewer: function() {
46755           return _pannellumViewer;
46756       },
46757
46758
46759       initViewer: function () {
46760           if (!window.pannellum) return;
46761           if (_pannellumViewer) return;
46762
46763           var sceneID = ++_currScene + '';
46764           var options = {
46765               'default': { firstScene: sceneID },
46766               scenes: {}
46767           };
46768           options.scenes[sceneID] = _sceneOptions;
46769
46770           _pannellumViewer = window.pannellum.viewer('viewer-streetside', options);
46771
46772           _pannellumViewer
46773               .on('mousedown', function() {
46774                   select(window).on('mousemove.pannellum', function() {
46775                       dispatch$4.call('viewerChanged');
46776                   });
46777               })
46778               .on('mouseup', function() {
46779                   select(window).on('mousemove.pannellum', null);
46780                   // continue dispatching events for a few seconds, in case viewer has inertia.
46781                   var t$$1 = timer(function(elapsed) {
46782                       dispatch$4.call('viewerChanged');
46783                       if (elapsed > 2000) {
46784                           t$$1.stop();
46785                       }
46786                   });
46787               });
46788       },
46789
46790
46791       /**
46792        * loadViewer() create the streeside viewer.
46793        */
46794       loadViewer: function (context) {
46795           var that = this;
46796
46797           // create ms-wrapper, a photo wrapper class
46798           var wrap = select('#photoviewer').selectAll('.ms-wrapper')
46799               .data([0]);
46800
46801           // inject ms-wrapper into the photoviewer div
46802           // (used by all to house each custom photo viewer)
46803           var wrapEnter = wrap.enter()
46804               .append('div')
46805               .attr('id', 'ms')
46806               .attr('class', 'photo-wrapper ms-wrapper')
46807               .classed('hide', true);
46808
46809           // inject div to support streetside viewer (pannellum) and attribution line
46810           wrapEnter
46811               .append('div')
46812               .attr('id', 'viewer-streetside')
46813               .append('div')
46814               .attr('class', 'photo-attribution fillD');
46815
46816           var controlsEnter = wrapEnter
46817               .append('div')
46818               .attr('class', 'photo-controls-wrap')
46819               .append('div')
46820               .attr('class', 'photo-controls');
46821
46822           controlsEnter
46823               .append('button')
46824               .on('click.back', step(-1))
46825               .text('◄');
46826
46827           controlsEnter
46828               .append('button')
46829               .on('click.forward', step(1))
46830               .text('►');
46831
46832
46833           // create working canvas for stitching together images
46834           wrap = wrap
46835               .merge(wrapEnter)
46836               .call(setupCanvas, true);
46837
46838           // load streetside pannellum viewer css
46839           select('head').selectAll('#streetside-viewercss')
46840               .data([0])
46841               .enter()
46842               .append('link')
46843               .attr('id', 'streetside-viewercss')
46844               .attr('rel', 'stylesheet')
46845               .attr('href', context.asset(pannellumViewerCSS));
46846
46847           // load streetside pannellum viewer js
46848           select('head').selectAll('#streetside-viewerjs')
46849               .data([0])
46850               .enter()
46851               .append('script')
46852               .attr('id', 'streetside-viewerjs')
46853               .attr('src', context.asset(pannellumViewerJS));
46854
46855
46856           // Register viewer resize handler
46857           context.ui().photoviewer.on('resize', function() {
46858               if (_pannellumViewer) {
46859                   _pannellumViewer.resize();
46860               }
46861           });
46862
46863
46864           function step(stepBy) {
46865               return function() {
46866                   var viewer = select('#photoviewer');
46867                   var selected = viewer.empty() ? undefined : viewer.datum();
46868                   if (!selected) return;
46869
46870                   var nextID = (stepBy === 1 ? selected.ne : selected.pr);
46871                   var yaw = _pannellumViewer.getYaw();
46872                   var ca = selected.ca + yaw;
46873                   var origin = selected.loc;
46874
46875                   // construct a search trapezoid pointing out from current bubble
46876                   var meters = 35;
46877                   var p1 = [
46878                       origin[0] + geoMetersToLon(meters / 5, origin[1]),
46879                       origin[1]
46880                   ];
46881                   var p2 = [
46882                       origin[0] + geoMetersToLon(meters / 2, origin[1]),
46883                       origin[1] + geoMetersToLat(meters)
46884                   ];
46885                   var p3 = [
46886                       origin[0] - geoMetersToLon(meters / 2, origin[1]),
46887                       origin[1] + geoMetersToLat(meters)
46888                   ];
46889                   var p4 = [
46890                       origin[0] - geoMetersToLon(meters / 5, origin[1]),
46891                       origin[1]
46892                   ];
46893
46894                   var poly = [p1, p2, p3, p4, p1];
46895
46896                   // rotate it to face forward/backward
46897                   var angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
46898                   poly = geoRotate(poly, -angle, origin);
46899
46900                   var extent = poly.reduce(function(extent, point$$1) {
46901                       return extent.extend(geoExtent$$1(point$$1));
46902                   }, geoExtent$$1());
46903
46904                   // find nearest other bubble in the search polygon
46905                   var minDist = Infinity;
46906                   _ssCache.bubbles.rtree.search(extent.bbox())
46907                       .forEach(function(d) {
46908                           if (d.data.key === selected.key) return;
46909                           if (!geoPointInPolygon(d.data.loc, poly)) return;
46910
46911                           var dist = geoVecLength(d.data.loc, selected.loc);
46912                           var theta = selected.ca - d.data.ca;
46913                           var minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
46914                           if (minTheta > 20) {
46915                               dist += 5;  // penalize distance if camera angles don't match
46916                           }
46917
46918                           if (dist < minDist) {
46919                               nextID = d.data.key;
46920                               minDist = dist;
46921                           }
46922                       });
46923
46924                   var nextBubble = nextID && _ssCache.bubbles.points[nextID];
46925                   if (!nextBubble) return;
46926
46927                   context.map().centerEase(nextBubble.loc);
46928
46929                   that.selectImage(nextBubble)
46930                       .then(function(r) {
46931                           if (r.status === 'ok') {
46932                               _sceneOptions.yaw = yaw;
46933                               that.showViewer();
46934                           }
46935                       });
46936               };
46937           }
46938       },
46939
46940       /**
46941        * showViewer()
46942        */
46943       showViewer: function (yaw) {
46944           if (!_sceneOptions) return;
46945
46946           if (yaw !== undefined) {
46947               _sceneOptions.yaw = yaw;
46948           }
46949
46950           if (!_pannellumViewer) {
46951               this.initViewer();
46952           } else {
46953               // make a new scene
46954               var sceneID = ++_currScene + '';
46955               _pannellumViewer
46956                   .addScene(sceneID, _sceneOptions)
46957                   .loadScene(sceneID);
46958
46959               // remove previous scene
46960               if (_currScene > 2) {
46961                   sceneID = (_currScene - 1) + '';
46962                   _pannellumViewer
46963                       .removeScene(sceneID);
46964               }
46965           }
46966
46967           var wrap = select('#photoviewer')
46968               .classed('hide', false);
46969
46970           var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
46971
46972           if (isHidden) {
46973               wrap
46974                   .selectAll('.photo-wrapper:not(.ms-wrapper)')
46975                   .classed('hide', true);
46976
46977               wrap
46978                   .selectAll('.photo-wrapper.ms-wrapper')
46979                   .classed('hide', false);
46980           }
46981
46982           return this;
46983       },
46984
46985       /**
46986        * hideViewer()
46987        */
46988       hideViewer: function () {
46989           var viewer = select('#photoviewer');
46990           if (!viewer.empty()) viewer.datum(null);
46991
46992           viewer
46993               .classed('hide', true)
46994               .selectAll('.photo-wrapper')
46995               .classed('hide', true);
46996
46997           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
46998               .classed('selected', false);
46999
47000           return this.setStyles(null, true);
47001       },
47002
47003       /**
47004        * selectImage().
47005        */
47006       selectImage: function (d) {
47007           var response = q.defer();
47008           var that = this;
47009
47010           var viewer = select('#photoviewer');
47011           if (!viewer.empty()) viewer.datum(d);
47012
47013           this.setStyles(null, true);
47014
47015           var wrap = select('#photoviewer .ms-wrapper');
47016           var attribution = wrap.selectAll('.photo-attribution').html('');
47017
47018           wrap.selectAll('.pnlm-load-box')   // display "loading.."
47019               .style('display', 'block');
47020
47021           if (!d) {
47022               response.resolve({status: 'ok'});
47023               return response.promise;
47024           }
47025
47026           var line1 = attribution
47027               .append('div')
47028               .attr('class', 'attribution-row');
47029
47030           // Add hires checkbox
47031           var label = line1
47032               .append('label')
47033               .attr('class', 'streetside-hires');
47034
47035           label
47036               .append('input')
47037               .attr('type', 'checkbox')
47038               .attr('id', 'streetside-hires-input')
47039               .property('checked', _hires)
47040               .on('click', function() {
47041                   event.stopPropagation();
47042
47043                   _hires = !_hires;
47044                   _resolution = _hires ? 1024 : 512;
47045                   wrap.call(setupCanvas, true);
47046
47047                   var viewstate = {
47048                       yaw: _pannellumViewer.getYaw(),
47049                       pitch: _pannellumViewer.getPitch(),
47050                       hfov: _pannellumViewer.getHfov()
47051                   };
47052
47053                   that.selectImage(d)
47054                       .then(function(r) {
47055                           if (r.status === 'ok') {
47056                               _sceneOptions = assignIn(_sceneOptions, viewstate);
47057                               that.showViewer();
47058                           }
47059                       });
47060               });
47061
47062           label
47063               .append('span')
47064               .text(t('streetside.hires'));
47065
47066
47067           var captureInfo = line1
47068               .append('div')
47069               .attr('class', 'attribution-capture-info');
47070
47071           // Add capture date
47072           if (d.captured_by) {
47073               var yyyy = (new Date()).getFullYear();
47074
47075               captureInfo
47076                   .append('a')
47077                   .attr('class', 'captured_by')
47078                   .attr('target', '_blank')
47079                   .attr('href', 'https://www.microsoft.com/en-us/maps/streetside')
47080                   .text('©' + yyyy + ' Microsoft');
47081
47082               captureInfo
47083                   .append('span')
47084                   .text('|');
47085           }
47086
47087           if (d.captured_at) {
47088               captureInfo
47089                   .append('span')
47090                   .attr('class', 'captured_at')
47091                   .text(localeTimestamp(d.captured_at));
47092           }
47093
47094           // Add image links
47095           var line2 = attribution
47096               .append('div')
47097               .attr('class', 'attribution-row');
47098
47099           line2
47100               .append('a')
47101               .attr('class', 'image-view-link')
47102               .attr('target', '_blank')
47103               .attr('href', 'https://www.bing.com/maps?cp=' + d.loc[1] + '~' + d.loc[0] +
47104                   '&lvl=17&dir=' + d.ca + '&style=x&v=2&sV=1')
47105               .text(t('streetside.view_on_bing'));
47106
47107           line2
47108               .append('a')
47109               .attr('class', 'image-report-link')
47110               .attr('target', '_blank')
47111               .attr('href', 'https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=' + encodeURIComponent(d.key) +
47112                   '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
47113               .text(t('streetside.report'));
47114
47115
47116           var bubbleIdQuadKey = d.key.toString(4);
47117           var paddingNeeded = 16 - bubbleIdQuadKey.length;
47118           for (var i = 0; i < paddingNeeded; i++) {
47119               bubbleIdQuadKey = '0' + bubbleIdQuadKey;
47120           }
47121           var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
47122           var imgUrlSuffix = '.jpg?g=6338&n=z';
47123
47124           // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12
47125           var faceKeys = ['01','02','03','10','11','12'];
47126
47127           // Map images to cube faces
47128           var quadKeys = getQuadKeys();
47129           var faces = faceKeys.map(function(faceKey) {
47130               return quadKeys.map(function(quadKey) {
47131                   var xy = qkToXY(quadKey);
47132                   return {
47133                       face: faceKey,
47134                       url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
47135                       x: xy[0],
47136                       y: xy[1]
47137                   };
47138               });
47139           });
47140
47141           processFaces(faces).then(function() {
47142               _sceneOptions = {
47143                   showFullscreenCtrl: false,
47144                   autoLoad: true,
47145                   compass: true,
47146                   northOffset: d.ca,
47147                   yaw: 0,
47148                   minHfov: minHfov,
47149                   maxHfov: maxHfov,
47150                   hfov: defaultHfov,
47151                   type: 'cubemap',
47152                   cubeMap: [
47153                       _dataUrlArray[0],
47154                       _dataUrlArray[1],
47155                       _dataUrlArray[2],
47156                       _dataUrlArray[3],
47157                       _dataUrlArray[4],
47158                       _dataUrlArray[5]
47159                   ]
47160               };
47161               response.resolve({status: 'ok'});
47162           });
47163
47164           return response.promise;
47165       },
47166
47167
47168       getSequenceKeyForBubble: function(d) {
47169           return d && d.sequenceKey;
47170       },
47171
47172
47173       /**
47174        * setStyles().
47175        */
47176       setStyles: function (hovered, reset) {
47177           if (reset) {  // reset all layers
47178               d3_selectAll('.viewfield-group')
47179                   .classed('highlighted', false)
47180                   .classed('hovered', false)
47181                   .classed('selected', false);
47182
47183               d3_selectAll('.sequence')
47184                   .classed('highlighted', false)
47185                   .classed('selected', false);
47186           }
47187
47188           var hoveredBubbleKey = hovered && hovered.key;
47189           var hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
47190           var hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
47191           var hoveredBubbleKeys =  (hoveredSequence && hoveredSequence.bubbles.map(function (d) { return d.key; })) || [];
47192
47193           var viewer = select('#photoviewer');
47194           var selected = viewer.empty() ? undefined : viewer.datum();
47195           var selectedBubbleKey = selected && selected.key;
47196           var selectedSequenceKey = this.getSequenceKeyForBubble(selected);
47197           var selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
47198           var selectedBubbleKeys = (selectedSequence && selectedSequence.bubbles.map(function (d) { return d.key; })) || [];
47199
47200           // highlight sibling viewfields on either the selected or the hovered sequences
47201           var highlightedBubbleKeys = union(hoveredBubbleKeys, selectedBubbleKeys);
47202
47203           d3_selectAll('.layer-streetside-images .viewfield-group')
47204               .classed('highlighted', function (d) { return highlightedBubbleKeys.indexOf(d.key) !== -1; })
47205               .classed('hovered', function (d) { return d.key === hoveredBubbleKey; })
47206               .classed('selected', function (d) { return d.key === selectedBubbleKey; });
47207
47208           d3_selectAll('.layer-streetside-images .sequence')
47209               .classed('highlighted', function (d) { return d.properties.key === hoveredSequenceKey; })
47210               .classed('selected', function (d) { return d.properties.key === selectedSequenceKey; });
47211
47212           // update viewfields if needed
47213           d3_selectAll('.viewfield-group .viewfield')
47214               .attr('d', viewfieldPath);
47215
47216           function viewfieldPath() {
47217               var d = this.parentNode.__data__;
47218               if (d.pano && d.key !== selectedBubbleKey) {
47219                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
47220               } else {
47221                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
47222               }
47223           }
47224
47225           return this;
47226       },
47227
47228       /**
47229        * cache().
47230        */
47231       cache: function () {
47232           return _ssCache;
47233       }
47234   };
47235
47236   var apibase$3 = 'https://taginfo.openstreetmap.org/api/4/',
47237       inflight$1 = {},
47238       popularKeys = {},
47239       taginfoCache = {},
47240       tag_sorts = {
47241           point: 'count_nodes',
47242           vertex: 'count_nodes',
47243           area: 'count_ways',
47244           line: 'count_ways'
47245       },
47246       tag_sort_members = {
47247           point: 'count_node_members',
47248           vertex: 'count_node_members',
47249           area: 'count_way_members',
47250           line: 'count_way_members',
47251           relation: 'count_relation_members'
47252       },
47253       tag_filters = {
47254           point: 'nodes',
47255           vertex: 'nodes',
47256           area: 'ways',
47257           line: 'ways'
47258       },
47259       tag_members_fractions = {
47260           point: 'count_node_members_fraction',
47261           vertex: 'count_node_members_fraction',
47262           area: 'count_way_members_fraction',
47263           line: 'count_way_members_fraction',
47264           relation: 'count_relation_members_fraction'
47265       };
47266
47267
47268   function sets(params, n, o) {
47269       if (params.geometry && o[params.geometry]) {
47270           params[n] = o[params.geometry];
47271       }
47272       return params;
47273   }
47274
47275
47276   function setFilter(params) {
47277       return sets(params, 'filter', tag_filters);
47278   }
47279
47280
47281   function setSort(params) {
47282       return sets(params, 'sortname', tag_sorts);
47283   }
47284
47285
47286   function setSortMembers(params) {
47287       return sets(params, 'sortname', tag_sort_members);
47288   }
47289
47290
47291   function clean(params) {
47292       return omit(params, ['geometry', 'debounce']);
47293   }
47294
47295
47296   function filterKeys(type) {
47297       var count_type = type ? 'count_' + type : 'count_all';
47298       return function(d) {
47299           return parseFloat(d[count_type]) > 2500 || d.in_wiki;
47300       };
47301   }
47302
47303
47304   function filterMultikeys(prefix) {
47305       return function(d) {
47306           // d.key begins with prefix, and d.key contains no additional ':'s
47307           var re = new RegExp('^' + prefix + '(.*)$');
47308           var matches = d.key.match(re) || [];
47309           return (matches.length === 2 && matches[1].indexOf(':') === -1);
47310       };
47311   }
47312
47313
47314   function filterValues(allowUpperCase) {
47315       return function(d) {
47316           if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
47317           if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
47318           return parseFloat(d.fraction) > 0.0;
47319       };
47320   }
47321
47322
47323   function filterRoles(geometry) {
47324       return function(d) {
47325           if (d.role === '') return false; // exclude empty role
47326           if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
47327           return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
47328       };
47329   }
47330
47331
47332   function valKey(d) {
47333       return {
47334           value: d.key,
47335           title: d.key
47336       };
47337   }
47338
47339
47340   function valKeyDescription(d) {
47341       return {
47342           value: d.value,
47343           title: d.description || d.value
47344       };
47345   }
47346
47347
47348   function roleKey(d) {
47349       return {
47350           value: d.role,
47351           title: d.role
47352       };
47353   }
47354
47355
47356   // sort keys with ':' lower than keys without ':'
47357   function sortKeys(a, b) {
47358       return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
47359           : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
47360           : 0;
47361   }
47362
47363
47364   var debouncedRequest = debounce(request$1, 500, { leading: false });
47365
47366   function request$1(url, params, exactMatch, callback, loaded) {
47367       if (inflight$1[url]) return;
47368
47369       if (checkCache(url, params, exactMatch, callback)) return;
47370
47371       inflight$1[url] = d3_json(url, function (err, data) {
47372           delete inflight$1[url];
47373           loaded(err, data);
47374       });
47375   }
47376
47377
47378   function checkCache(url, params, exactMatch, callback) {
47379       var rp = params.rp || 25,
47380           testQuery = params.query || '',
47381           testUrl = url;
47382
47383       do {
47384           var hit = taginfoCache[testUrl];
47385
47386           // exact match, or shorter match yielding fewer than max results (rp)
47387           if (hit && (url === testUrl || hit.length < rp)) {
47388               callback(null, hit);
47389               return true;
47390           }
47391
47392           // don't try to shorten the query
47393           if (exactMatch || !testQuery.length) return false;
47394
47395           // do shorten the query to see if we already have a cached result
47396           // that has returned fewer than max results (rp)
47397           testQuery = testQuery.slice(0, -1);
47398           testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
47399       } while (testQuery.length >= 0);
47400
47401       return false;
47402   }
47403
47404
47405   var serviceTaginfo = {
47406
47407       init: function() {
47408           inflight$1 = {};
47409           taginfoCache = {};
47410           popularKeys = {
47411               postal_code: true   // #5377
47412           };
47413
47414           // Fetch popular keys.  We'll exclude these from `values`
47415           // lookups because they stress taginfo, and they aren't likely
47416           // to yield meaningful autocomplete results.. see #3955
47417           var params = { rp: 100, sortname: 'values_all', sortorder: 'desc', page: 1, debounce: false, lang: currentLocale };
47418           this.keys(params, function(err, data) {
47419               if (err) return;
47420               data.forEach(function(d) {
47421                   if (d.value === 'opening_hours') return;  // exception
47422                   popularKeys[d.value] = true;
47423               });
47424           });
47425       },
47426
47427
47428       reset: function() {
47429           forEach(inflight$1, function(req) { req.abort(); });
47430           inflight$1 = {};
47431       },
47432
47433
47434       keys: function(params, callback) {
47435           var doRequest = params.debounce ? debouncedRequest : request$1;
47436           params = clean(setSort(params));
47437           params = assignIn({ rp: 10, sortname: 'count_all', sortorder: 'desc', page: 1, lang: currentLocale }, params);
47438
47439           var url = apibase$3 + 'keys/all?' + utilQsString(params);
47440           doRequest(url, params, false, callback, function(err, d) {
47441               if (err) {
47442                   callback(err);
47443               } else {
47444                   var f = filterKeys(params.filter);
47445                   var result = d.data.filter(f).sort(sortKeys).map(valKey);
47446                   taginfoCache[url] = result;
47447                   callback(null, result);
47448               }
47449           });
47450       },
47451
47452
47453       multikeys: function(params, callback) {
47454           var doRequest = params.debounce ? debouncedRequest : request$1;
47455           params = clean(setSort(params));
47456           params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1, lang: currentLocale }, params);
47457           var prefix = params.query;
47458
47459           var url = apibase$3 + 'keys/all?' + utilQsString(params);
47460           doRequest(url, params, true, callback, function(err, d) {
47461               if (err) {
47462                   callback(err);
47463               } else {
47464                   var f = filterMultikeys(prefix);
47465                   var result = d.data.filter(f).map(valKey);
47466                   taginfoCache[url] = result;
47467                   callback(null, result);
47468               }
47469           });
47470       },
47471
47472
47473       values: function(params, callback) {
47474           // Exclude popular keys from values lookups.. see #3955
47475           var key = params.key;
47476           if (key && popularKeys[key]) {
47477               callback(null, []);
47478               return;
47479           }
47480
47481           var doRequest = params.debounce ? debouncedRequest : request$1;
47482           params = clean(setSort(setFilter(params)));
47483           params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1, lang: currentLocale }, params);
47484
47485           var url = apibase$3 + 'key/values?' + utilQsString(params);
47486           doRequest(url, params, false, callback, function(err, d) {
47487               if (err) {
47488                   callback(err);
47489               } else {
47490                   // In most cases we prefer taginfo value results with lowercase letters.
47491                   // A few OSM keys expect values to contain uppercase values (see #3377).
47492                   // This is not an exhaustive list (e.g. `name` also has uppercase values)
47493                   // but these are the fields where taginfo value lookup is most useful.
47494                   var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times/;
47495                   var allowUpperCase = (params.key.match(re) !== null);
47496                   var f = filterValues(allowUpperCase);
47497
47498                   var result = d.data.filter(f).map(valKeyDescription);
47499                   taginfoCache[url] = result;
47500                   callback(null, result);
47501               }
47502           });
47503       },
47504
47505
47506       roles: function(params, callback) {
47507           var doRequest = params.debounce ? debouncedRequest : request$1;
47508           var geometry = params.geometry;
47509           params = clean(setSortMembers(params));
47510           params = assignIn({ rp: 25, sortname: 'count_all_members', sortorder: 'desc', page: 1, lang: currentLocale }, params);
47511
47512           var url = apibase$3 + 'relation/roles?' + utilQsString(params);
47513           doRequest(url, params, true, callback, function(err, d) {
47514               if (err) {
47515                   callback(err);
47516               } else {
47517                   var f = filterRoles(geometry);
47518                   var result = d.data.filter(f).map(roleKey);
47519                   taginfoCache[url] = result;
47520                   callback(null, result);
47521               }
47522           });
47523       },
47524
47525
47526       docs: function(params, callback) {
47527           var doRequest = params.debounce ? debouncedRequest : request$1;
47528           params = clean(setSort(params));
47529
47530           var path = 'key/wiki_pages?';
47531           if (params.value) path = 'tag/wiki_pages?';
47532           else if (params.rtype) path = 'relation/wiki_pages?';
47533
47534           var url = apibase$3 + path + utilQsString(params);
47535           doRequest(url, params, true, callback, function(err, d) {
47536               if (err) {
47537                   callback(err);
47538               } else {
47539                   taginfoCache[url] = d.data;
47540                   callback(null, d.data);
47541               }
47542           });
47543       },
47544
47545
47546       apibase: function(_) {
47547           if (!arguments.length) return apibase$3;
47548           apibase$3 = _;
47549           return this;
47550       }
47551
47552   };
47553
47554   var helpers = createCommonjsModule(function (module, exports) {
47555   Object.defineProperty(exports, "__esModule", { value: true });
47556   /**
47557    * @module helpers
47558    */
47559   /**
47560    * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
47561    *
47562    * @memberof helpers
47563    * @type {number}
47564    */
47565   exports.earthRadius = 6371008.8;
47566   /**
47567    * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
47568    *
47569    * @memberof helpers
47570    * @type {Object}
47571    */
47572   exports.factors = {
47573       centimeters: exports.earthRadius * 100,
47574       centimetres: exports.earthRadius * 100,
47575       degrees: exports.earthRadius / 111325,
47576       feet: exports.earthRadius * 3.28084,
47577       inches: exports.earthRadius * 39.370,
47578       kilometers: exports.earthRadius / 1000,
47579       kilometres: exports.earthRadius / 1000,
47580       meters: exports.earthRadius,
47581       metres: exports.earthRadius,
47582       miles: exports.earthRadius / 1609.344,
47583       millimeters: exports.earthRadius * 1000,
47584       millimetres: exports.earthRadius * 1000,
47585       nauticalmiles: exports.earthRadius / 1852,
47586       radians: 1,
47587       yards: exports.earthRadius / 1.0936,
47588   };
47589   /**
47590    * Units of measurement factors based on 1 meter.
47591    *
47592    * @memberof helpers
47593    * @type {Object}
47594    */
47595   exports.unitsFactors = {
47596       centimeters: 100,
47597       centimetres: 100,
47598       degrees: 1 / 111325,
47599       feet: 3.28084,
47600       inches: 39.370,
47601       kilometers: 1 / 1000,
47602       kilometres: 1 / 1000,
47603       meters: 1,
47604       metres: 1,
47605       miles: 1 / 1609.344,
47606       millimeters: 1000,
47607       millimetres: 1000,
47608       nauticalmiles: 1 / 1852,
47609       radians: 1 / exports.earthRadius,
47610       yards: 1 / 1.0936,
47611   };
47612   /**
47613    * Area of measurement factors based on 1 square meter.
47614    *
47615    * @memberof helpers
47616    * @type {Object}
47617    */
47618   exports.areaFactors = {
47619       acres: 0.000247105,
47620       centimeters: 10000,
47621       centimetres: 10000,
47622       feet: 10.763910417,
47623       inches: 1550.003100006,
47624       kilometers: 0.000001,
47625       kilometres: 0.000001,
47626       meters: 1,
47627       metres: 1,
47628       miles: 3.86e-7,
47629       millimeters: 1000000,
47630       millimetres: 1000000,
47631       yards: 1.195990046,
47632   };
47633   /**
47634    * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
47635    *
47636    * @name feature
47637    * @param {Geometry} geometry input geometry
47638    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47639    * @param {Object} [options={}] Optional Parameters
47640    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47641    * @param {string|number} [options.id] Identifier associated with the Feature
47642    * @returns {Feature} a GeoJSON Feature
47643    * @example
47644    * var geometry = {
47645    *   "type": "Point",
47646    *   "coordinates": [110, 50]
47647    * };
47648    *
47649    * var feature = turf.feature(geometry);
47650    *
47651    * //=feature
47652    */
47653   function feature(geom, properties, options) {
47654       if (options === void 0) { options = {}; }
47655       var feat = { type: "Feature" };
47656       if (options.id === 0 || options.id) {
47657           feat.id = options.id;
47658       }
47659       if (options.bbox) {
47660           feat.bbox = options.bbox;
47661       }
47662       feat.properties = properties || {};
47663       feat.geometry = geom;
47664       return feat;
47665   }
47666   exports.feature = feature;
47667   /**
47668    * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
47669    * For GeometryCollection type use `helpers.geometryCollection`
47670    *
47671    * @name geometry
47672    * @param {string} type Geometry Type
47673    * @param {Array<any>} coordinates Coordinates
47674    * @param {Object} [options={}] Optional Parameters
47675    * @returns {Geometry} a GeoJSON Geometry
47676    * @example
47677    * var type = "Point";
47678    * var coordinates = [110, 50];
47679    * var geometry = turf.geometry(type, coordinates);
47680    * // => geometry
47681    */
47682   function geometry(type, coordinates, options) {
47683       if (options === void 0) { options = {}; }
47684       switch (type) {
47685           case "Point": return point(coordinates).geometry;
47686           case "LineString": return lineString(coordinates).geometry;
47687           case "Polygon": return polygon(coordinates).geometry;
47688           case "MultiPoint": return multiPoint(coordinates).geometry;
47689           case "MultiLineString": return multiLineString(coordinates).geometry;
47690           case "MultiPolygon": return multiPolygon(coordinates).geometry;
47691           default: throw new Error(type + " is invalid");
47692       }
47693   }
47694   exports.geometry = geometry;
47695   /**
47696    * Creates a {@link Point} {@link Feature} from a Position.
47697    *
47698    * @name point
47699    * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
47700    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47701    * @param {Object} [options={}] Optional Parameters
47702    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47703    * @param {string|number} [options.id] Identifier associated with the Feature
47704    * @returns {Feature<Point>} a Point feature
47705    * @example
47706    * var point = turf.point([-75.343, 39.984]);
47707    *
47708    * //=point
47709    */
47710   function point(coordinates, properties, options) {
47711       if (options === void 0) { options = {}; }
47712       var geom = {
47713           type: "Point",
47714           coordinates: coordinates,
47715       };
47716       return feature(geom, properties, options);
47717   }
47718   exports.point = point;
47719   /**
47720    * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
47721    *
47722    * @name points
47723    * @param {Array<Array<number>>} coordinates an array of Points
47724    * @param {Object} [properties={}] Translate these properties to each Feature
47725    * @param {Object} [options={}] Optional Parameters
47726    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
47727    * associated with the FeatureCollection
47728    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
47729    * @returns {FeatureCollection<Point>} Point Feature
47730    * @example
47731    * var points = turf.points([
47732    *   [-75, 39],
47733    *   [-80, 45],
47734    *   [-78, 50]
47735    * ]);
47736    *
47737    * //=points
47738    */
47739   function points(coordinates, properties, options) {
47740       if (options === void 0) { options = {}; }
47741       return featureCollection(coordinates.map(function (coords) {
47742           return point(coords, properties);
47743       }), options);
47744   }
47745   exports.points = points;
47746   /**
47747    * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
47748    *
47749    * @name polygon
47750    * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
47751    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47752    * @param {Object} [options={}] Optional Parameters
47753    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47754    * @param {string|number} [options.id] Identifier associated with the Feature
47755    * @returns {Feature<Polygon>} Polygon Feature
47756    * @example
47757    * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
47758    *
47759    * //=polygon
47760    */
47761   function polygon(coordinates, properties, options) {
47762       if (options === void 0) { options = {}; }
47763       for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
47764           var ring = coordinates_1[_i];
47765           if (ring.length < 4) {
47766               throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
47767           }
47768           for (var j = 0; j < ring[ring.length - 1].length; j++) {
47769               // Check if first point of Polygon contains two numbers
47770               if (ring[ring.length - 1][j] !== ring[0][j]) {
47771                   throw new Error("First and last Position are not equivalent.");
47772               }
47773           }
47774       }
47775       var geom = {
47776           type: "Polygon",
47777           coordinates: coordinates,
47778       };
47779       return feature(geom, properties, options);
47780   }
47781   exports.polygon = polygon;
47782   /**
47783    * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
47784    *
47785    * @name polygons
47786    * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
47787    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47788    * @param {Object} [options={}] Optional Parameters
47789    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47790    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
47791    * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
47792    * @example
47793    * var polygons = turf.polygons([
47794    *   [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
47795    *   [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
47796    * ]);
47797    *
47798    * //=polygons
47799    */
47800   function polygons(coordinates, properties, options) {
47801       if (options === void 0) { options = {}; }
47802       return featureCollection(coordinates.map(function (coords) {
47803           return polygon(coords, properties);
47804       }), options);
47805   }
47806   exports.polygons = polygons;
47807   /**
47808    * Creates a {@link LineString} {@link Feature} from an Array of Positions.
47809    *
47810    * @name lineString
47811    * @param {Array<Array<number>>} coordinates an array of Positions
47812    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47813    * @param {Object} [options={}] Optional Parameters
47814    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47815    * @param {string|number} [options.id] Identifier associated with the Feature
47816    * @returns {Feature<LineString>} LineString Feature
47817    * @example
47818    * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
47819    * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
47820    *
47821    * //=linestring1
47822    * //=linestring2
47823    */
47824   function lineString(coordinates, properties, options) {
47825       if (options === void 0) { options = {}; }
47826       if (coordinates.length < 2) {
47827           throw new Error("coordinates must be an array of two or more positions");
47828       }
47829       var geom = {
47830           type: "LineString",
47831           coordinates: coordinates,
47832       };
47833       return feature(geom, properties, options);
47834   }
47835   exports.lineString = lineString;
47836   /**
47837    * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
47838    *
47839    * @name lineStrings
47840    * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
47841    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47842    * @param {Object} [options={}] Optional Parameters
47843    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
47844    * associated with the FeatureCollection
47845    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
47846    * @returns {FeatureCollection<LineString>} LineString FeatureCollection
47847    * @example
47848    * var linestrings = turf.lineStrings([
47849    *   [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
47850    *   [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
47851    * ]);
47852    *
47853    * //=linestrings
47854    */
47855   function lineStrings(coordinates, properties, options) {
47856       if (options === void 0) { options = {}; }
47857       return featureCollection(coordinates.map(function (coords) {
47858           return lineString(coords, properties);
47859       }), options);
47860   }
47861   exports.lineStrings = lineStrings;
47862   /**
47863    * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
47864    *
47865    * @name featureCollection
47866    * @param {Feature[]} features input features
47867    * @param {Object} [options={}] Optional Parameters
47868    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47869    * @param {string|number} [options.id] Identifier associated with the Feature
47870    * @returns {FeatureCollection} FeatureCollection of Features
47871    * @example
47872    * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
47873    * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
47874    * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
47875    *
47876    * var collection = turf.featureCollection([
47877    *   locationA,
47878    *   locationB,
47879    *   locationC
47880    * ]);
47881    *
47882    * //=collection
47883    */
47884   function featureCollection(features, options) {
47885       if (options === void 0) { options = {}; }
47886       var fc = { type: "FeatureCollection" };
47887       if (options.id) {
47888           fc.id = options.id;
47889       }
47890       if (options.bbox) {
47891           fc.bbox = options.bbox;
47892       }
47893       fc.features = features;
47894       return fc;
47895   }
47896   exports.featureCollection = featureCollection;
47897   /**
47898    * Creates a {@link Feature<MultiLineString>} based on a
47899    * coordinate array. Properties can be added optionally.
47900    *
47901    * @name multiLineString
47902    * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
47903    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47904    * @param {Object} [options={}] Optional Parameters
47905    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47906    * @param {string|number} [options.id] Identifier associated with the Feature
47907    * @returns {Feature<MultiLineString>} a MultiLineString feature
47908    * @throws {Error} if no coordinates are passed
47909    * @example
47910    * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
47911    *
47912    * //=multiLine
47913    */
47914   function multiLineString(coordinates, properties, options) {
47915       if (options === void 0) { options = {}; }
47916       var geom = {
47917           type: "MultiLineString",
47918           coordinates: coordinates,
47919       };
47920       return feature(geom, properties, options);
47921   }
47922   exports.multiLineString = multiLineString;
47923   /**
47924    * Creates a {@link Feature<MultiPoint>} based on a
47925    * coordinate array. Properties can be added optionally.
47926    *
47927    * @name multiPoint
47928    * @param {Array<Array<number>>} coordinates an array of Positions
47929    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47930    * @param {Object} [options={}] Optional Parameters
47931    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47932    * @param {string|number} [options.id] Identifier associated with the Feature
47933    * @returns {Feature<MultiPoint>} a MultiPoint feature
47934    * @throws {Error} if no coordinates are passed
47935    * @example
47936    * var multiPt = turf.multiPoint([[0,0],[10,10]]);
47937    *
47938    * //=multiPt
47939    */
47940   function multiPoint(coordinates, properties, options) {
47941       if (options === void 0) { options = {}; }
47942       var geom = {
47943           type: "MultiPoint",
47944           coordinates: coordinates,
47945       };
47946       return feature(geom, properties, options);
47947   }
47948   exports.multiPoint = multiPoint;
47949   /**
47950    * Creates a {@link Feature<MultiPolygon>} based on a
47951    * coordinate array. Properties can be added optionally.
47952    *
47953    * @name multiPolygon
47954    * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
47955    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47956    * @param {Object} [options={}] Optional Parameters
47957    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47958    * @param {string|number} [options.id] Identifier associated with the Feature
47959    * @returns {Feature<MultiPolygon>} a multipolygon feature
47960    * @throws {Error} if no coordinates are passed
47961    * @example
47962    * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
47963    *
47964    * //=multiPoly
47965    *
47966    */
47967   function multiPolygon(coordinates, properties, options) {
47968       if (options === void 0) { options = {}; }
47969       var geom = {
47970           type: "MultiPolygon",
47971           coordinates: coordinates,
47972       };
47973       return feature(geom, properties, options);
47974   }
47975   exports.multiPolygon = multiPolygon;
47976   /**
47977    * Creates a {@link Feature<GeometryCollection>} based on a
47978    * coordinate array. Properties can be added optionally.
47979    *
47980    * @name geometryCollection
47981    * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
47982    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47983    * @param {Object} [options={}] Optional Parameters
47984    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47985    * @param {string|number} [options.id] Identifier associated with the Feature
47986    * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
47987    * @example
47988    * var pt = turf.geometry("Point", [100, 0]);
47989    * var line = turf.geometry("LineString", [[101, 0], [102, 1]]);
47990    * var collection = turf.geometryCollection([pt, line]);
47991    *
47992    * // => collection
47993    */
47994   function geometryCollection(geometries, properties, options) {
47995       if (options === void 0) { options = {}; }
47996       var geom = {
47997           type: "GeometryCollection",
47998           geometries: geometries,
47999       };
48000       return feature(geom, properties, options);
48001   }
48002   exports.geometryCollection = geometryCollection;
48003   /**
48004    * Round number to precision
48005    *
48006    * @param {number} num Number
48007    * @param {number} [precision=0] Precision
48008    * @returns {number} rounded number
48009    * @example
48010    * turf.round(120.4321)
48011    * //=120
48012    *
48013    * turf.round(120.4321, 2)
48014    * //=120.43
48015    */
48016   function round(num, precision) {
48017       if (precision === void 0) { precision = 0; }
48018       if (precision && !(precision >= 0)) {
48019           throw new Error("precision must be a positive number");
48020       }
48021       var multiplier = Math.pow(10, precision || 0);
48022       return Math.round(num * multiplier) / multiplier;
48023   }
48024   exports.round = round;
48025   /**
48026    * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
48027    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
48028    *
48029    * @name radiansToLength
48030    * @param {number} radians in radians across the sphere
48031    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
48032    * meters, kilometres, kilometers.
48033    * @returns {number} distance
48034    */
48035   function radiansToLength(radians, units) {
48036       if (units === void 0) { units = "kilometers"; }
48037       var factor = exports.factors[units];
48038       if (!factor) {
48039           throw new Error(units + " units is invalid");
48040       }
48041       return radians * factor;
48042   }
48043   exports.radiansToLength = radiansToLength;
48044   /**
48045    * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
48046    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
48047    *
48048    * @name lengthToRadians
48049    * @param {number} distance in real units
48050    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
48051    * meters, kilometres, kilometers.
48052    * @returns {number} radians
48053    */
48054   function lengthToRadians(distance, units) {
48055       if (units === void 0) { units = "kilometers"; }
48056       var factor = exports.factors[units];
48057       if (!factor) {
48058           throw new Error(units + " units is invalid");
48059       }
48060       return distance / factor;
48061   }
48062   exports.lengthToRadians = lengthToRadians;
48063   /**
48064    * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
48065    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
48066    *
48067    * @name lengthToDegrees
48068    * @param {number} distance in real units
48069    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
48070    * meters, kilometres, kilometers.
48071    * @returns {number} degrees
48072    */
48073   function lengthToDegrees(distance, units) {
48074       return radiansToDegrees(lengthToRadians(distance, units));
48075   }
48076   exports.lengthToDegrees = lengthToDegrees;
48077   /**
48078    * Converts any bearing angle from the north line direction (positive clockwise)
48079    * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
48080    *
48081    * @name bearingToAzimuth
48082    * @param {number} bearing angle, between -180 and +180 degrees
48083    * @returns {number} angle between 0 and 360 degrees
48084    */
48085   function bearingToAzimuth(bearing) {
48086       var angle = bearing % 360;
48087       if (angle < 0) {
48088           angle += 360;
48089       }
48090       return angle;
48091   }
48092   exports.bearingToAzimuth = bearingToAzimuth;
48093   /**
48094    * Converts an angle in radians to degrees
48095    *
48096    * @name radiansToDegrees
48097    * @param {number} radians angle in radians
48098    * @returns {number} degrees between 0 and 360 degrees
48099    */
48100   function radiansToDegrees(radians) {
48101       var degrees = radians % (2 * Math.PI);
48102       return degrees * 180 / Math.PI;
48103   }
48104   exports.radiansToDegrees = radiansToDegrees;
48105   /**
48106    * Converts an angle in degrees to radians
48107    *
48108    * @name degreesToRadians
48109    * @param {number} degrees angle between 0 and 360 degrees
48110    * @returns {number} angle in radians
48111    */
48112   function degreesToRadians(degrees) {
48113       var radians = degrees % 360;
48114       return radians * Math.PI / 180;
48115   }
48116   exports.degreesToRadians = degreesToRadians;
48117   /**
48118    * Converts a length to the requested unit.
48119    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
48120    *
48121    * @param {number} length to be converted
48122    * @param {Units} [originalUnit="kilometers"] of the length
48123    * @param {Units} [finalUnit="kilometers"] returned unit
48124    * @returns {number} the converted length
48125    */
48126   function convertLength(length, originalUnit, finalUnit) {
48127       if (originalUnit === void 0) { originalUnit = "kilometers"; }
48128       if (finalUnit === void 0) { finalUnit = "kilometers"; }
48129       if (!(length >= 0)) {
48130           throw new Error("length must be a positive number");
48131       }
48132       return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);
48133   }
48134   exports.convertLength = convertLength;
48135   /**
48136    * Converts a area to the requested unit.
48137    * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
48138    * @param {number} area to be converted
48139    * @param {Units} [originalUnit="meters"] of the distance
48140    * @param {Units} [finalUnit="kilometers"] returned unit
48141    * @returns {number} the converted distance
48142    */
48143   function convertArea(area, originalUnit, finalUnit) {
48144       if (originalUnit === void 0) { originalUnit = "meters"; }
48145       if (finalUnit === void 0) { finalUnit = "kilometers"; }
48146       if (!(area >= 0)) {
48147           throw new Error("area must be a positive number");
48148       }
48149       var startFactor = exports.areaFactors[originalUnit];
48150       if (!startFactor) {
48151           throw new Error("invalid original units");
48152       }
48153       var finalFactor = exports.areaFactors[finalUnit];
48154       if (!finalFactor) {
48155           throw new Error("invalid final units");
48156       }
48157       return (area / startFactor) * finalFactor;
48158   }
48159   exports.convertArea = convertArea;
48160   /**
48161    * isNumber
48162    *
48163    * @param {*} num Number to validate
48164    * @returns {boolean} true/false
48165    * @example
48166    * turf.isNumber(123)
48167    * //=true
48168    * turf.isNumber('foo')
48169    * //=false
48170    */
48171   function isNumber(num) {
48172       return !isNaN(num) && num !== null && !Array.isArray(num) && !/^\s*$/.test(num);
48173   }
48174   exports.isNumber = isNumber;
48175   /**
48176    * isObject
48177    *
48178    * @param {*} input variable to validate
48179    * @returns {boolean} true/false
48180    * @example
48181    * turf.isObject({elevation: 10})
48182    * //=true
48183    * turf.isObject('foo')
48184    * //=false
48185    */
48186   function isObject(input) {
48187       return (!!input) && (input.constructor === Object);
48188   }
48189   exports.isObject = isObject;
48190   /**
48191    * Validate BBox
48192    *
48193    * @private
48194    * @param {Array<number>} bbox BBox to validate
48195    * @returns {void}
48196    * @throws Error if BBox is not valid
48197    * @example
48198    * validateBBox([-180, -40, 110, 50])
48199    * //=OK
48200    * validateBBox([-180, -40])
48201    * //=Error
48202    * validateBBox('Foo')
48203    * //=Error
48204    * validateBBox(5)
48205    * //=Error
48206    * validateBBox(null)
48207    * //=Error
48208    * validateBBox(undefined)
48209    * //=Error
48210    */
48211   function validateBBox(bbox) {
48212       if (!bbox) {
48213           throw new Error("bbox is required");
48214       }
48215       if (!Array.isArray(bbox)) {
48216           throw new Error("bbox must be an Array");
48217       }
48218       if (bbox.length !== 4 && bbox.length !== 6) {
48219           throw new Error("bbox must be an Array of 4 or 6 numbers");
48220       }
48221       bbox.forEach(function (num) {
48222           if (!isNumber(num)) {
48223               throw new Error("bbox must only contain numbers");
48224           }
48225       });
48226   }
48227   exports.validateBBox = validateBBox;
48228   /**
48229    * Validate Id
48230    *
48231    * @private
48232    * @param {string|number} id Id to validate
48233    * @returns {void}
48234    * @throws Error if Id is not valid
48235    * @example
48236    * validateId([-180, -40, 110, 50])
48237    * //=Error
48238    * validateId([-180, -40])
48239    * //=Error
48240    * validateId('Foo')
48241    * //=OK
48242    * validateId(5)
48243    * //=OK
48244    * validateId(null)
48245    * //=Error
48246    * validateId(undefined)
48247    * //=Error
48248    */
48249   function validateId(id) {
48250       if (!id) {
48251           throw new Error("id is required");
48252       }
48253       if (["string", "number"].indexOf(typeof id) === -1) {
48254           throw new Error("id must be a number or a string");
48255       }
48256   }
48257   exports.validateId = validateId;
48258   // Deprecated methods
48259   function radians2degrees() {
48260       throw new Error("method has been renamed to `radiansToDegrees`");
48261   }
48262   exports.radians2degrees = radians2degrees;
48263   function degrees2radians() {
48264       throw new Error("method has been renamed to `degreesToRadians`");
48265   }
48266   exports.degrees2radians = degrees2radians;
48267   function distanceToDegrees() {
48268       throw new Error("method has been renamed to `lengthToDegrees`");
48269   }
48270   exports.distanceToDegrees = distanceToDegrees;
48271   function distanceToRadians() {
48272       throw new Error("method has been renamed to `lengthToRadians`");
48273   }
48274   exports.distanceToRadians = distanceToRadians;
48275   function radiansToDistance() {
48276       throw new Error("method has been renamed to `radiansToLength`");
48277   }
48278   exports.radiansToDistance = radiansToDistance;
48279   function bearingToAngle() {
48280       throw new Error("method has been renamed to `bearingToAzimuth`");
48281   }
48282   exports.bearingToAngle = bearingToAngle;
48283   function convertDistance() {
48284       throw new Error("method has been renamed to `convertLength`");
48285   }
48286   exports.convertDistance = convertDistance;
48287   });
48288
48289   unwrapExports(helpers);
48290   var helpers_1 = helpers.earthRadius;
48291   var helpers_2 = helpers.factors;
48292   var helpers_3 = helpers.unitsFactors;
48293   var helpers_4 = helpers.areaFactors;
48294   var helpers_5 = helpers.feature;
48295   var helpers_6 = helpers.geometry;
48296   var helpers_7 = helpers.point;
48297   var helpers_8 = helpers.points;
48298   var helpers_9 = helpers.polygon;
48299   var helpers_10 = helpers.polygons;
48300   var helpers_11 = helpers.lineString;
48301   var helpers_12 = helpers.lineStrings;
48302   var helpers_13 = helpers.featureCollection;
48303   var helpers_14 = helpers.multiLineString;
48304   var helpers_15 = helpers.multiPoint;
48305   var helpers_16 = helpers.multiPolygon;
48306   var helpers_17 = helpers.geometryCollection;
48307   var helpers_18 = helpers.round;
48308   var helpers_19 = helpers.radiansToLength;
48309   var helpers_20 = helpers.lengthToRadians;
48310   var helpers_21 = helpers.lengthToDegrees;
48311   var helpers_22 = helpers.bearingToAzimuth;
48312   var helpers_23 = helpers.radiansToDegrees;
48313   var helpers_24 = helpers.degreesToRadians;
48314   var helpers_25 = helpers.convertLength;
48315   var helpers_26 = helpers.convertArea;
48316   var helpers_27 = helpers.isNumber;
48317   var helpers_28 = helpers.isObject;
48318   var helpers_29 = helpers.validateBBox;
48319   var helpers_30 = helpers.validateId;
48320   var helpers_31 = helpers.radians2degrees;
48321   var helpers_32 = helpers.degrees2radians;
48322   var helpers_33 = helpers.distanceToDegrees;
48323   var helpers_34 = helpers.distanceToRadians;
48324   var helpers_35 = helpers.radiansToDistance;
48325   var helpers_36 = helpers.bearingToAngle;
48326   var helpers_37 = helpers.convertDistance;
48327
48328   var invariant = createCommonjsModule(function (module, exports) {
48329   Object.defineProperty(exports, "__esModule", { value: true });
48330
48331   /**
48332    * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.
48333    *
48334    * @name getCoord
48335    * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers
48336    * @returns {Array<number>} coordinates
48337    * @example
48338    * var pt = turf.point([10, 10]);
48339    *
48340    * var coord = turf.getCoord(pt);
48341    * //= [10, 10]
48342    */
48343   function getCoord(coord) {
48344       if (!coord) {
48345           throw new Error("coord is required");
48346       }
48347       if (!Array.isArray(coord)) {
48348           if (coord.type === "Feature" && coord.geometry !== null && coord.geometry.type === "Point") {
48349               return coord.geometry.coordinates;
48350           }
48351           if (coord.type === "Point") {
48352               return coord.coordinates;
48353           }
48354       }
48355       if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) {
48356           return coord;
48357       }
48358       throw new Error("coord must be GeoJSON Point or an Array of numbers");
48359   }
48360   exports.getCoord = getCoord;
48361   /**
48362    * Unwrap coordinates from a Feature, Geometry Object or an Array
48363    *
48364    * @name getCoords
48365    * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array
48366    * @returns {Array<any>} coordinates
48367    * @example
48368    * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);
48369    *
48370    * var coords = turf.getCoords(poly);
48371    * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]
48372    */
48373   function getCoords(coords) {
48374       if (Array.isArray(coords)) {
48375           return coords;
48376       }
48377       // Feature
48378       if (coords.type === "Feature") {
48379           if (coords.geometry !== null) {
48380               return coords.geometry.coordinates;
48381           }
48382       }
48383       else {
48384           // Geometry
48385           if (coords.coordinates) {
48386               return coords.coordinates;
48387           }
48388       }
48389       throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array");
48390   }
48391   exports.getCoords = getCoords;
48392   /**
48393    * Checks if coordinates contains a number
48394    *
48395    * @name containsNumber
48396    * @param {Array<any>} coordinates GeoJSON Coordinates
48397    * @returns {boolean} true if Array contains a number
48398    */
48399   function containsNumber(coordinates) {
48400       if (coordinates.length > 1 && helpers.isNumber(coordinates[0]) && helpers.isNumber(coordinates[1])) {
48401           return true;
48402       }
48403       if (Array.isArray(coordinates[0]) && coordinates[0].length) {
48404           return containsNumber(coordinates[0]);
48405       }
48406       throw new Error("coordinates must only contain numbers");
48407   }
48408   exports.containsNumber = containsNumber;
48409   /**
48410    * Enforce expectations about types of GeoJSON objects for Turf.
48411    *
48412    * @name geojsonType
48413    * @param {GeoJSON} value any GeoJSON object
48414    * @param {string} type expected GeoJSON type
48415    * @param {string} name name of calling function
48416    * @throws {Error} if value is not the expected type.
48417    */
48418   function geojsonType(value, type, name) {
48419       if (!type || !name) {
48420           throw new Error("type and name required");
48421       }
48422       if (!value || value.type !== type) {
48423           throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + value.type);
48424       }
48425   }
48426   exports.geojsonType = geojsonType;
48427   /**
48428    * Enforce expectations about types of {@link Feature} inputs for Turf.
48429    * Internally this uses {@link geojsonType} to judge geometry types.
48430    *
48431    * @name featureOf
48432    * @param {Feature} feature a feature with an expected geometry type
48433    * @param {string} type expected GeoJSON type
48434    * @param {string} name name of calling function
48435    * @throws {Error} error if value is not the expected type.
48436    */
48437   function featureOf(feature, type, name) {
48438       if (!feature) {
48439           throw new Error("No feature passed");
48440       }
48441       if (!name) {
48442           throw new Error(".featureOf() requires a name");
48443       }
48444       if (!feature || feature.type !== "Feature" || !feature.geometry) {
48445           throw new Error("Invalid input to " + name + ", Feature with geometry required");
48446       }
48447       if (!feature.geometry || feature.geometry.type !== type) {
48448           throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
48449       }
48450   }
48451   exports.featureOf = featureOf;
48452   /**
48453    * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.
48454    * Internally this uses {@link geojsonType} to judge geometry types.
48455    *
48456    * @name collectionOf
48457    * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged
48458    * @param {string} type expected GeoJSON type
48459    * @param {string} name name of calling function
48460    * @throws {Error} if value is not the expected type.
48461    */
48462   function collectionOf(featureCollection, type, name) {
48463       if (!featureCollection) {
48464           throw new Error("No featureCollection passed");
48465       }
48466       if (!name) {
48467           throw new Error(".collectionOf() requires a name");
48468       }
48469       if (!featureCollection || featureCollection.type !== "FeatureCollection") {
48470           throw new Error("Invalid input to " + name + ", FeatureCollection required");
48471       }
48472       for (var _i = 0, _a = featureCollection.features; _i < _a.length; _i++) {
48473           var feature = _a[_i];
48474           if (!feature || feature.type !== "Feature" || !feature.geometry) {
48475               throw new Error("Invalid input to " + name + ", Feature with geometry required");
48476           }
48477           if (!feature.geometry || feature.geometry.type !== type) {
48478               throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
48479           }
48480       }
48481   }
48482   exports.collectionOf = collectionOf;
48483   /**
48484    * Get Geometry from Feature or Geometry Object
48485    *
48486    * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object
48487    * @returns {Geometry|null} GeoJSON Geometry Object
48488    * @throws {Error} if geojson is not a Feature or Geometry Object
48489    * @example
48490    * var point = {
48491    *   "type": "Feature",
48492    *   "properties": {},
48493    *   "geometry": {
48494    *     "type": "Point",
48495    *     "coordinates": [110, 40]
48496    *   }
48497    * }
48498    * var geom = turf.getGeom(point)
48499    * //={"type": "Point", "coordinates": [110, 40]}
48500    */
48501   function getGeom(geojson) {
48502       if (geojson.type === "Feature") {
48503           return geojson.geometry;
48504       }
48505       return geojson;
48506   }
48507   exports.getGeom = getGeom;
48508   /**
48509    * Get GeoJSON object's type, Geometry type is prioritize.
48510    *
48511    * @param {GeoJSON} geojson GeoJSON object
48512    * @param {string} [name="geojson"] name of the variable to display in error message
48513    * @returns {string} GeoJSON type
48514    * @example
48515    * var point = {
48516    *   "type": "Feature",
48517    *   "properties": {},
48518    *   "geometry": {
48519    *     "type": "Point",
48520    *     "coordinates": [110, 40]
48521    *   }
48522    * }
48523    * var geom = turf.getType(point)
48524    * //="Point"
48525    */
48526   function getType(geojson, name) {
48527       if (geojson.type === "FeatureCollection") {
48528           return "FeatureCollection";
48529       }
48530       if (geojson.type === "GeometryCollection") {
48531           return "GeometryCollection";
48532       }
48533       if (geojson.type === "Feature" && geojson.geometry !== null) {
48534           return geojson.geometry.type;
48535       }
48536       return geojson.type;
48537   }
48538   exports.getType = getType;
48539   });
48540
48541   unwrapExports(invariant);
48542   var invariant_1 = invariant.getCoord;
48543   var invariant_2 = invariant.getCoords;
48544   var invariant_3 = invariant.containsNumber;
48545   var invariant_4 = invariant.geojsonType;
48546   var invariant_5 = invariant.featureOf;
48547   var invariant_6 = invariant.collectionOf;
48548   var invariant_7 = invariant.getGeom;
48549   var invariant_8 = invariant.getType;
48550
48551   var lineclip_1$1 = lineclip$1;
48552   var default_1$2 = lineclip$1;
48553
48554   lineclip$1.polyline = lineclip$1;
48555   lineclip$1.polygon = polygonclip$1;
48556
48557
48558   // Cohen-Sutherland line clippign algorithm, adapted to efficiently
48559   // handle polylines rather than just segments
48560
48561   function lineclip$1(points, bbox, result) {
48562
48563       var len = points.length,
48564           codeA = bitCode$1(points[0], bbox),
48565           part = [],
48566           i, a, b, codeB, lastCode;
48567
48568       if (!result) result = [];
48569
48570       for (i = 1; i < len; i++) {
48571           a = points[i - 1];
48572           b = points[i];
48573           codeB = lastCode = bitCode$1(b, bbox);
48574
48575           while (true) {
48576
48577               if (!(codeA | codeB)) { // accept
48578                   part.push(a);
48579
48580                   if (codeB !== lastCode) { // segment went outside
48581                       part.push(b);
48582
48583                       if (i < len - 1) { // start a new line
48584                           result.push(part);
48585                           part = [];
48586                       }
48587                   } else if (i === len - 1) {
48588                       part.push(b);
48589                   }
48590                   break;
48591
48592               } else if (codeA & codeB) { // trivial reject
48593                   break;
48594
48595               } else if (codeA) { // a outside, intersect with clip edge
48596                   a = intersect$2(a, b, codeA, bbox);
48597                   codeA = bitCode$1(a, bbox);
48598
48599               } else { // b outside
48600                   b = intersect$2(a, b, codeB, bbox);
48601                   codeB = bitCode$1(b, bbox);
48602               }
48603           }
48604
48605           codeA = lastCode;
48606       }
48607
48608       if (part.length) result.push(part);
48609
48610       return result;
48611   }
48612
48613   // Sutherland-Hodgeman polygon clipping algorithm
48614
48615   function polygonclip$1(points, bbox) {
48616
48617       var result, edge, prev, prevInside, i, p, inside;
48618
48619       // clip against each side of the clip rectangle
48620       for (edge = 1; edge <= 8; edge *= 2) {
48621           result = [];
48622           prev = points[points.length - 1];
48623           prevInside = !(bitCode$1(prev, bbox) & edge);
48624
48625           for (i = 0; i < points.length; i++) {
48626               p = points[i];
48627               inside = !(bitCode$1(p, bbox) & edge);
48628
48629               // if segment goes through the clip window, add an intersection
48630               if (inside !== prevInside) result.push(intersect$2(prev, p, edge, bbox));
48631
48632               if (inside) result.push(p); // add a point if it's inside
48633
48634               prev = p;
48635               prevInside = inside;
48636           }
48637
48638           points = result;
48639
48640           if (!points.length) break;
48641       }
48642
48643       return result;
48644   }
48645
48646   // intersect a segment against one of the 4 lines that make up the bbox
48647
48648   function intersect$2(a, b, edge, bbox) {
48649       return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
48650              edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
48651              edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
48652              edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
48653              null;
48654   }
48655
48656   // bit code reflects the point position relative to the bbox:
48657
48658   //         left  mid  right
48659   //    top  1001  1000  1010
48660   //    mid  0001  0000  0010
48661   // bottom  0101  0100  0110
48662
48663   function bitCode$1(p, bbox) {
48664       var code = 0;
48665
48666       if (p[0] < bbox[0]) code |= 1; // left
48667       else if (p[0] > bbox[2]) code |= 2; // right
48668
48669       if (p[1] < bbox[1]) code |= 4; // bottom
48670       else if (p[1] > bbox[3]) code |= 8; // top
48671
48672       return code;
48673   }
48674   lineclip_1$1.default = default_1$2;
48675
48676   var bboxClip_1 = createCommonjsModule(function (module, exports) {
48677   var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
48678       if (mod && mod.__esModule) return mod;
48679       var result = {};
48680       if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
48681       result["default"] = mod;
48682       return result;
48683   };
48684   Object.defineProperty(exports, "__esModule", { value: true });
48685
48686
48687   var lineclip = __importStar(lineclip_1$1);
48688   /**
48689    * Takes a {@link Feature} and a bbox and clips the feature to the bbox using
48690    * [lineclip](https://github.com/mapbox/lineclip).
48691    * May result in degenerate edges when clipping Polygons.
48692    *
48693    * @name bboxClip
48694    * @param {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature feature to clip to the bbox
48695    * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order
48696    * @returns {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} clipped Feature
48697    * @example
48698    * var bbox = [0, 0, 10, 10];
48699    * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]);
48700    *
48701    * var clipped = turf.bboxClip(poly, bbox);
48702    *
48703    * //addToMap
48704    * var addToMap = [bbox, poly, clipped]
48705    */
48706   function bboxClip(feature, bbox) {
48707       var geom = invariant.getGeom(feature);
48708       var type = geom.type;
48709       var properties = feature.type === "Feature" ? feature.properties : {};
48710       var coords = geom.coordinates;
48711       switch (type) {
48712           case "LineString":
48713           case "MultiLineString":
48714               var lines_1 = [];
48715               if (type === "LineString") {
48716                   coords = [coords];
48717               }
48718               coords.forEach(function (line) {
48719                   lineclip.polyline(line, bbox, lines_1);
48720               });
48721               if (lines_1.length === 1) {
48722                   return helpers.lineString(lines_1[0], properties);
48723               }
48724               return helpers.multiLineString(lines_1, properties);
48725           case "Polygon":
48726               return helpers.polygon(clipPolygon(coords, bbox), properties);
48727           case "MultiPolygon":
48728               return helpers.multiPolygon(coords.map(function (poly) {
48729                   return clipPolygon(poly, bbox);
48730               }), properties);
48731           default:
48732               throw new Error("geometry " + type + " not supported");
48733       }
48734   }
48735   exports.default = bboxClip;
48736   function clipPolygon(rings, bbox) {
48737       var outRings = [];
48738       for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
48739           var ring = rings_1[_i];
48740           var clipped = lineclip.polygon(ring, bbox);
48741           if (clipped.length > 0) {
48742               if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
48743                   clipped.push(clipped[0]);
48744               }
48745               if (clipped.length >= 4) {
48746                   outRings.push(clipped);
48747               }
48748           }
48749       }
48750       return outRings;
48751   }
48752   });
48753
48754   var turf_bboxClip = unwrapExports(bboxClip_1);
48755
48756   var martinez_umd = createCommonjsModule(function (module, exports) {
48757   /**
48758    * martinez v0.5.0
48759    * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
48760    *
48761    * @author Alex Milevski <info@w8r.name>
48762    * @license MIT
48763    * @preserve
48764    */
48765
48766   (function (global, factory) {
48767     factory(exports);
48768   }(commonjsGlobal, (function (exports) {
48769     function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
48770
48771     var SplayTree = function SplayTree(compare, noDuplicates) {
48772       if ( compare === void 0 ) compare = DEFAULT_COMPARE;
48773       if ( noDuplicates === void 0 ) noDuplicates = false;
48774
48775       this._compare = compare;
48776       this._root = null;
48777       this._size = 0;
48778       this._noDuplicates = !!noDuplicates;
48779     };
48780
48781     var prototypeAccessors = { size: { configurable: true } };
48782
48783
48784     SplayTree.prototype.rotateLeft = function rotateLeft (x) {
48785       var y = x.right;
48786       if (y) {
48787         x.right = y.left;
48788         if (y.left) { y.left.parent = x; }
48789         y.parent = x.parent;
48790       }
48791
48792       if (!x.parent)              { this._root = y; }
48793       else if (x === x.parent.left) { x.parent.left = y; }
48794       else                        { x.parent.right = y; }
48795       if (y) { y.left = x; }
48796       x.parent = y;
48797     };
48798
48799
48800     SplayTree.prototype.rotateRight = function rotateRight (x) {
48801       var y = x.left;
48802       if (y) {
48803         x.left = y.right;
48804         if (y.right) { y.right.parent = x; }
48805         y.parent = x.parent;
48806       }
48807
48808       if (!x.parent)             { this._root = y; }
48809       else if(x === x.parent.left) { x.parent.left = y; }
48810       else                       { x.parent.right = y; }
48811       if (y) { y.right = x; }
48812       x.parent = y;
48813     };
48814
48815
48816     SplayTree.prototype._splay = function _splay (x) {
48817         var this$1 = this;
48818
48819       while (x.parent) {
48820         var p = x.parent;
48821         if (!p.parent) {
48822           if (p.left === x) { this$1.rotateRight(p); }
48823           else            { this$1.rotateLeft(p); }
48824         } else if (p.left === x && p.parent.left === p) {
48825           this$1.rotateRight(p.parent);
48826           this$1.rotateRight(p);
48827         } else if (p.right === x && p.parent.right === p) {
48828           this$1.rotateLeft(p.parent);
48829           this$1.rotateLeft(p);
48830         } else if (p.left === x && p.parent.right === p) {
48831           this$1.rotateRight(p);
48832           this$1.rotateLeft(p);
48833         } else {
48834           this$1.rotateLeft(p);
48835           this$1.rotateRight(p);
48836         }
48837       }
48838     };
48839
48840
48841     SplayTree.prototype.splay = function splay (x) {
48842         var this$1 = this;
48843
48844       var p, gp, ggp, l, r;
48845
48846       while (x.parent) {
48847         p = x.parent;
48848         gp = p.parent;
48849
48850         if (gp && gp.parent) {
48851           ggp = gp.parent;
48852           if (ggp.left === gp) { ggp.left= x; }
48853           else               { ggp.right = x; }
48854           x.parent = ggp;
48855         } else {
48856           x.parent = null;
48857           this$1._root = x;
48858         }
48859
48860         l = x.left; r = x.right;
48861
48862         if (x === p.left) { // left
48863           if (gp) {
48864             if (gp.left === p) {
48865               /* zig-zig */
48866               if (p.right) {
48867                 gp.left = p.right;
48868                 gp.left.parent = gp;
48869               } else { gp.left = null; }
48870
48871               p.right = gp;
48872               gp.parent = p;
48873             } else {
48874               /* zig-zag */
48875               if (l) {
48876                 gp.right = l;
48877                 l.parent = gp;
48878               } else { gp.right = null; }
48879
48880               x.left  = gp;
48881               gp.parent = x;
48882             }
48883           }
48884           if (r) {
48885             p.left = r;
48886             r.parent = p;
48887           } else { p.left = null; }
48888
48889           x.right= p;
48890           p.parent = x;
48891         } else { // right
48892           if (gp) {
48893             if (gp.right === p) {
48894               /* zig-zig */
48895               if (p.left) {
48896                 gp.right = p.left;
48897                 gp.right.parent = gp;
48898               } else { gp.right = null; }
48899
48900               p.left = gp;
48901               gp.parent = p;
48902             } else {
48903               /* zig-zag */
48904               if (r) {
48905                 gp.left = r;
48906                 r.parent = gp;
48907               } else { gp.left = null; }
48908
48909               x.right = gp;
48910               gp.parent = x;
48911             }
48912           }
48913           if (l) {
48914             p.right = l;
48915             l.parent = p;
48916           } else { p.right = null; }
48917
48918           x.left = p;
48919           p.parent = x;
48920         }
48921       }
48922     };
48923
48924
48925     SplayTree.prototype.replace = function replace (u, v) {
48926       if (!u.parent) { this._root = v; }
48927       else if (u === u.parent.left) { u.parent.left = v; }
48928       else { u.parent.right = v; }
48929       if (v) { v.parent = u.parent; }
48930     };
48931
48932
48933     SplayTree.prototype.minNode = function minNode (u) {
48934         if ( u === void 0 ) u = this._root;
48935
48936       if (u) { while (u.left) { u = u.left; } }
48937       return u;
48938     };
48939
48940
48941     SplayTree.prototype.maxNode = function maxNode (u) {
48942         if ( u === void 0 ) u = this._root;
48943
48944       if (u) { while (u.right) { u = u.right; } }
48945       return u;
48946     };
48947
48948
48949     SplayTree.prototype.insert = function insert (key, data) {
48950       var z = this._root;
48951       var p = null;
48952       var comp = this._compare;
48953       var cmp;
48954
48955       if (this._noDuplicates) {
48956         while (z) {
48957           p = z;
48958           cmp = comp(z.key, key);
48959           if (cmp === 0) { return; }
48960           else if (comp(z.key, key) < 0) { z = z.right; }
48961           else { z = z.left; }
48962         }
48963       } else {
48964         while (z) {
48965           p = z;
48966           if (comp(z.key, key) < 0) { z = z.right; }
48967           else { z = z.left; }
48968         }
48969       }
48970
48971       z = { key: key, data: data, left: null, right: null, parent: p };
48972
48973       if (!p)                        { this._root = z; }
48974       else if (comp(p.key, z.key) < 0) { p.right = z; }
48975       else                           { p.left= z; }
48976
48977       this.splay(z);
48978       this._size++;
48979       return z;
48980     };
48981
48982
48983     SplayTree.prototype.find = function find (key) {
48984       var z  = this._root;
48985       var comp = this._compare;
48986       while (z) {
48987         var cmp = comp(z.key, key);
48988         if    (cmp < 0) { z = z.right; }
48989         else if (cmp > 0) { z = z.left; }
48990         else            { return z; }
48991       }
48992       return null;
48993     };
48994
48995     /**
48996      * Whether the tree contains a node with the given key
48997      * @param{Key} key
48998      * @return {boolean} true/false
48999      */
49000     SplayTree.prototype.contains = function contains (key) {
49001       var node     = this._root;
49002       var comparator = this._compare;
49003       while (node){
49004         var cmp = comparator(key, node.key);
49005         if    (cmp === 0) { return true; }
49006         else if (cmp < 0) { node = node.left; }
49007         else              { node = node.right; }
49008       }
49009
49010       return false;
49011     };
49012
49013
49014     SplayTree.prototype.remove = function remove (key) {
49015       var z = this.find(key);
49016
49017       if (!z) { return false; }
49018
49019       this.splay(z);
49020
49021       if (!z.left) { this.replace(z, z.right); }
49022       else if (!z.right) { this.replace(z, z.left); }
49023       else {
49024         var y = this.minNode(z.right);
49025         if (y.parent !== z) {
49026           this.replace(y, y.right);
49027           y.right = z.right;
49028           y.right.parent = y;
49029         }
49030         this.replace(z, y);
49031         y.left = z.left;
49032         y.left.parent = y;
49033       }
49034
49035       this._size--;
49036       return true;
49037     };
49038
49039
49040     SplayTree.prototype.removeNode = function removeNode (z) {
49041       if (!z) { return false; }
49042
49043       this.splay(z);
49044
49045       if (!z.left) { this.replace(z, z.right); }
49046       else if (!z.right) { this.replace(z, z.left); }
49047       else {
49048         var y = this.minNode(z.right);
49049         if (y.parent !== z) {
49050           this.replace(y, y.right);
49051           y.right = z.right;
49052           y.right.parent = y;
49053         }
49054         this.replace(z, y);
49055         y.left = z.left;
49056         y.left.parent = y;
49057       }
49058
49059       this._size--;
49060       return true;
49061     };
49062
49063
49064     SplayTree.prototype.erase = function erase (key) {
49065       var z = this.find(key);
49066       if (!z) { return; }
49067
49068       this.splay(z);
49069
49070       var s = z.left;
49071       var t = z.right;
49072
49073       var sMax = null;
49074       if (s) {
49075         s.parent = null;
49076         sMax = this.maxNode(s);
49077         this.splay(sMax);
49078         this._root = sMax;
49079       }
49080       if (t) {
49081         if (s) { sMax.right = t; }
49082         else { this._root = t; }
49083         t.parent = sMax;
49084       }
49085
49086       this._size--;
49087     };
49088
49089     /**
49090      * Removes and returns the node with smallest key
49091      * @return {?Node}
49092      */
49093     SplayTree.prototype.pop = function pop () {
49094       var node = this._root, returnValue = null;
49095       if (node) {
49096         while (node.left) { node = node.left; }
49097         returnValue = { key: node.key, data: node.data };
49098         this.remove(node.key);
49099       }
49100       return returnValue;
49101     };
49102
49103
49104     /* eslint-disable class-methods-use-this */
49105
49106     /**
49107      * Successor node
49108      * @param{Node} node
49109      * @return {?Node}
49110      */
49111     SplayTree.prototype.next = function next (node) {
49112       var successor = node;
49113       if (successor) {
49114         if (successor.right) {
49115           successor = successor.right;
49116           while (successor && successor.left) { successor = successor.left; }
49117         } else {
49118           successor = node.parent;
49119           while (successor && successor.right === node) {
49120             node = successor; successor = successor.parent;
49121           }
49122         }
49123       }
49124       return successor;
49125     };
49126
49127
49128     /**
49129      * Predecessor node
49130      * @param{Node} node
49131      * @return {?Node}
49132      */
49133     SplayTree.prototype.prev = function prev (node) {
49134       var predecessor = node;
49135       if (predecessor) {
49136         if (predecessor.left) {
49137           predecessor = predecessor.left;
49138           while (predecessor && predecessor.right) { predecessor = predecessor.right; }
49139         } else {
49140           predecessor = node.parent;
49141           while (predecessor && predecessor.left === node) {
49142             node = predecessor;
49143             predecessor = predecessor.parent;
49144           }
49145         }
49146       }
49147       return predecessor;
49148     };
49149     /* eslint-enable class-methods-use-this */
49150
49151
49152     /**
49153      * @param{forEachCallback} callback
49154      * @return {SplayTree}
49155      */
49156     SplayTree.prototype.forEach = function forEach (callback) {
49157       var current = this._root;
49158       var s = [], done = false, i = 0;
49159
49160       while (!done) {
49161         // Reach the left most Node of the current Node
49162         if (current) {
49163           // Place pointer to a tree node on the stack
49164           // before traversing the node's left subtree
49165           s.push(current);
49166           current = current.left;
49167         } else {
49168           // BackTrack from the empty subtree and visit the Node
49169           // at the top of the stack; however, if the stack is
49170           // empty you are done
49171           if (s.length > 0) {
49172             current = s.pop();
49173             callback(current, i++);
49174
49175             // We have visited the node and its left
49176             // subtree. Now, it's right subtree's turn
49177             current = current.right;
49178           } else { done = true; }
49179         }
49180       }
49181       return this;
49182     };
49183
49184
49185     /**
49186      * Walk key range from `low` to `high`. Stops if `fn` returns a value.
49187      * @param{Key}    low
49188      * @param{Key}    high
49189      * @param{Function} fn
49190      * @param{*?}     ctx
49191      * @return {SplayTree}
49192      */
49193     SplayTree.prototype.range = function range (low, high, fn, ctx) {
49194         var this$1 = this;
49195
49196       var Q = [];
49197       var compare = this._compare;
49198       var node = this._root, cmp;
49199
49200       while (Q.length !== 0 || node) {
49201         if (node) {
49202           Q.push(node);
49203           node = node.left;
49204         } else {
49205           node = Q.pop();
49206           cmp = compare(node.key, high);
49207           if (cmp > 0) {
49208             break;
49209           } else if (compare(node.key, low) >= 0) {
49210             if (fn.call(ctx, node)) { return this$1; } // stop if smth is returned
49211           }
49212           node = node.right;
49213         }
49214       }
49215       return this;
49216     };
49217
49218     /**
49219      * Returns all keys in order
49220      * @return {Array<Key>}
49221      */
49222     SplayTree.prototype.keys = function keys () {
49223       var current = this._root;
49224       var s = [], r = [], done = false;
49225
49226       while (!done) {
49227         if (current) {
49228           s.push(current);
49229           current = current.left;
49230         } else {
49231           if (s.length > 0) {
49232             current = s.pop();
49233             r.push(current.key);
49234             current = current.right;
49235           } else { done = true; }
49236         }
49237       }
49238       return r;
49239     };
49240
49241
49242     /**
49243      * Returns `data` fields of all nodes in order.
49244      * @return {Array<Value>}
49245      */
49246     SplayTree.prototype.values = function values () {
49247       var current = this._root;
49248       var s = [], r = [], done = false;
49249
49250       while (!done) {
49251         if (current) {
49252           s.push(current);
49253           current = current.left;
49254         } else {
49255           if (s.length > 0) {
49256             current = s.pop();
49257             r.push(current.data);
49258             current = current.right;
49259           } else { done = true; }
49260         }
49261       }
49262       return r;
49263     };
49264
49265
49266     /**
49267      * Returns node at given index
49268      * @param{number} index
49269      * @return {?Node}
49270      */
49271     SplayTree.prototype.at = function at (index) {
49272       // removed after a consideration, more misleading than useful
49273       // index = index % this.size;
49274       // if (index < 0) index = this.size - index;
49275
49276       var current = this._root;
49277       var s = [], done = false, i = 0;
49278
49279       while (!done) {
49280         if (current) {
49281           s.push(current);
49282           current = current.left;
49283         } else {
49284           if (s.length > 0) {
49285             current = s.pop();
49286             if (i === index) { return current; }
49287             i++;
49288             current = current.right;
49289           } else { done = true; }
49290         }
49291       }
49292       return null;
49293     };
49294
49295     /**
49296      * Bulk-load items. Both array have to be same size
49297      * @param{Array<Key>}  keys
49298      * @param{Array<Value>}[values]
49299      * @param{Boolean}     [presort=false] Pre-sort keys and values, using
49300      *                                       tree's comparator. Sorting is done
49301      *                                       in-place
49302      * @return {AVLTree}
49303      */
49304     SplayTree.prototype.load = function load (keys, values, presort) {
49305         if ( keys === void 0 ) keys = [];
49306         if ( values === void 0 ) values = [];
49307         if ( presort === void 0 ) presort = false;
49308
49309       if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
49310       var size = keys.length;
49311       if (presort) { sort(keys, values, 0, size - 1, this._compare); }
49312       this._root = loadRecursive(null, keys, values, 0, size);
49313       this._size = size;
49314       return this;
49315     };
49316
49317
49318     SplayTree.prototype.min = function min () {
49319       var node = this.minNode(this._root);
49320       if (node) { return node.key; }
49321       else    { return null; }
49322     };
49323
49324
49325     SplayTree.prototype.max = function max () {
49326       var node = this.maxNode(this._root);
49327       if (node) { return node.key; }
49328       else    { return null; }
49329     };
49330
49331     SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
49332     prototypeAccessors.size.get = function () { return this._size; };
49333
49334
49335     /**
49336      * Create a tree and load it with items
49337      * @param{Array<Key>}        keys
49338      * @param{Array<Value>?}      [values]
49339
49340      * @param{Function?}          [comparator]
49341      * @param{Boolean?}           [presort=false] Pre-sort keys and values, using
49342      *                                             tree's comparator. Sorting is done
49343      *                                             in-place
49344      * @param{Boolean?}           [noDuplicates=false] Allow duplicates
49345      * @return {SplayTree}
49346      */
49347     SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
49348       return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
49349     };
49350
49351     Object.defineProperties( SplayTree.prototype, prototypeAccessors );
49352
49353
49354     function loadRecursive (parent, keys, values, start, end) {
49355       var size = end - start;
49356       if (size > 0) {
49357         var middle = start + Math.floor(size / 2);
49358         var key    = keys[middle];
49359         var data   = values[middle];
49360         var node   = { key: key, data: data, parent: parent };
49361         node.left    = loadRecursive(node, keys, values, start, middle);
49362         node.right   = loadRecursive(node, keys, values, middle + 1, end);
49363         return node;
49364       }
49365       return null;
49366     }
49367
49368
49369     function sort(keys, values, left, right, compare) {
49370       if (left >= right) { return; }
49371
49372       var pivot = keys[(left + right) >> 1];
49373       var i = left - 1;
49374       var j = right + 1;
49375
49376       while (true) {
49377         do { i++; } while (compare(keys[i], pivot) < 0);
49378         do { j--; } while (compare(keys[j], pivot) > 0);
49379         if (i >= j) { break; }
49380
49381         var tmp = keys[i];
49382         keys[i] = keys[j];
49383         keys[j] = tmp;
49384
49385         tmp = values[i];
49386         values[i] = values[j];
49387         values[j] = tmp;
49388       }
49389
49390       sort(keys, values,  left,     j, compare);
49391       sort(keys, values, j + 1, right, compare);
49392     }
49393
49394     var NORMAL               = 0;
49395     var NON_CONTRIBUTING     = 1;
49396     var SAME_TRANSITION      = 2;
49397     var DIFFERENT_TRANSITION = 3;
49398
49399     var INTERSECTION = 0;
49400     var UNION        = 1;
49401     var DIFFERENCE   = 2;
49402     var XOR          = 3;
49403
49404     /**
49405      * @param  {SweepEvent} event
49406      * @param  {SweepEvent} prev
49407      * @param  {Operation} operation
49408      */
49409     function computeFields (event, prev, operation) {
49410       // compute inOut and otherInOut fields
49411       if (prev === null) {
49412         event.inOut      = false;
49413         event.otherInOut = true;
49414
49415       // previous line segment in sweepline belongs to the same polygon
49416       } else {
49417         if (event.isSubject === prev.isSubject) {
49418           event.inOut      = !prev.inOut;
49419           event.otherInOut = prev.otherInOut;
49420
49421         // previous line segment in sweepline belongs to the clipping polygon
49422         } else {
49423           event.inOut      = !prev.otherInOut;
49424           event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
49425         }
49426
49427         // compute prevInResult field
49428         if (prev) {
49429           event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
49430             ? prev.prevInResult : prev;
49431         }
49432       }
49433
49434       // check if the line segment belongs to the Boolean operation
49435       event.inResult = inResult(event, operation);
49436     }
49437
49438
49439     /* eslint-disable indent */
49440     function inResult(event, operation) {
49441       switch (event.type) {
49442         case NORMAL:
49443           switch (operation) {
49444             case INTERSECTION:
49445               return !event.otherInOut;
49446             case UNION:
49447               return event.otherInOut;
49448             case DIFFERENCE:
49449               // return (event.isSubject && !event.otherInOut) ||
49450               //         (!event.isSubject && event.otherInOut);
49451               return (event.isSubject && event.otherInOut) ||
49452                       (!event.isSubject && !event.otherInOut);
49453             case XOR:
49454               return true;
49455           }
49456           break;
49457         case SAME_TRANSITION:
49458           return operation === INTERSECTION || operation === UNION;
49459         case DIFFERENT_TRANSITION:
49460           return operation === DIFFERENCE;
49461         case NON_CONTRIBUTING:
49462           return false;
49463       }
49464       return false;
49465     }
49466     /* eslint-enable indent */
49467
49468     var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
49469
49470       /**
49471        * Is left endpoint?
49472        * @type {Boolean}
49473        */
49474       this.left = left;
49475
49476       /**
49477        * @type {Array.<Number>}
49478        */
49479       this.point = point;
49480
49481       /**
49482        * Other edge reference
49483        * @type {SweepEvent}
49484        */
49485       this.otherEvent = otherEvent;
49486
49487       /**
49488        * Belongs to source or clipping polygon
49489        * @type {Boolean}
49490        */
49491       this.isSubject = isSubject;
49492
49493       /**
49494        * Edge contribution type
49495        * @type {Number}
49496        */
49497       this.type = edgeType || NORMAL;
49498
49499
49500       /**
49501        * In-out transition for the sweepline crossing polygon
49502        * @type {Boolean}
49503        */
49504       this.inOut = false;
49505
49506
49507       /**
49508        * @type {Boolean}
49509        */
49510       this.otherInOut = false;
49511
49512       /**
49513        * Previous event in result?
49514        * @type {SweepEvent}
49515        */
49516       this.prevInResult = null;
49517
49518       /**
49519        * Does event belong to result?
49520        * @type {Boolean}
49521        */
49522       this.inResult = false;
49523
49524
49525       // connection step
49526
49527       /**
49528        * @type {Boolean}
49529        */
49530       this.resultInOut = false;
49531
49532       this.isExteriorRing = true;
49533     };
49534
49535
49536     /**
49537      * @param{Array.<Number>}p
49538      * @return {Boolean}
49539      */
49540     SweepEvent.prototype.isBelow = function isBelow (p) {
49541       var p0 = this.point, p1 = this.otherEvent.point;
49542       return this.left
49543         ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
49544         // signedArea(this.point, this.otherEvent.point, p) > 0 :
49545         : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
49546         //signedArea(this.otherEvent.point, this.point, p) > 0;
49547     };
49548
49549
49550     /**
49551      * @param{Array.<Number>}p
49552      * @return {Boolean}
49553      */
49554     SweepEvent.prototype.isAbove = function isAbove (p) {
49555       return !this.isBelow(p);
49556     };
49557
49558
49559     /**
49560      * @return {Boolean}
49561      */
49562     SweepEvent.prototype.isVertical = function isVertical () {
49563       return this.point[0] === this.otherEvent.point[0];
49564     };
49565
49566
49567     SweepEvent.prototype.clone = function clone () {
49568       var copy = new SweepEvent(
49569         this.point, this.left, this.otherEvent, this.isSubject, this.type);
49570
49571       copy.inResult     = this.inResult;
49572       copy.prevInResult = this.prevInResult;
49573       copy.isExteriorRing = this.isExteriorRing;
49574       copy.inOut        = this.inOut;
49575       copy.otherInOut   = this.otherInOut;
49576
49577       return copy;
49578     };
49579
49580     function equals(p1, p2) {
49581       if (p1[0] === p2[0]) {
49582         if (p1[1] === p2[1]) {
49583           return true;
49584         } else {
49585           return false;
49586         }
49587       }
49588       return false;
49589     }
49590
49591     // const EPSILON = 1e-9;
49592     // const abs = Math.abs;
49593     // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
49594     // Precision problem.
49595     //
49596     // module.exports = function equals(p1, p2) {
49597     //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
49598     // };
49599
49600     /**
49601      * Signed area of the triangle (p0, p1, p2)
49602      * @param  {Array.<Number>} p0
49603      * @param  {Array.<Number>} p1
49604      * @param  {Array.<Number>} p2
49605      * @return {Number}
49606      */
49607     function signedArea(p0, p1, p2) {
49608       return (p0[0] - p2[0]) * (p1[1] - p2[1]) - (p1[0] - p2[0]) * (p0[1] - p2[1]);
49609     }
49610
49611     /**
49612      * @param  {SweepEvent} e1
49613      * @param  {SweepEvent} e2
49614      * @return {Number}
49615      */
49616     function compareEvents(e1, e2) {
49617       var p1 = e1.point;
49618       var p2 = e2.point;
49619
49620       // Different x-coordinate
49621       if (p1[0] > p2[0]) { return 1; }
49622       if (p1[0] < p2[0]) { return -1; }
49623
49624       // Different points, but same x-coordinate
49625       // Event with lower y-coordinate is processed first
49626       if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
49627
49628       return specialCases(e1, e2, p1, p2);
49629     }
49630
49631
49632     /* eslint-disable no-unused-vars */
49633     function specialCases(e1, e2, p1, p2) {
49634       // Same coordinates, but one is a left endpoint and the other is
49635       // a right endpoint. The right endpoint is processed first
49636       if (e1.left !== e2.left)
49637         { return e1.left ? 1 : -1; }
49638
49639       // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
49640       // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
49641       // Same coordinates, both events
49642       // are left endpoints or right endpoints.
49643       // not collinear
49644       if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
49645         // the event associate to the bottom segment is processed first
49646         return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
49647       }
49648
49649       return (!e1.isSubject && e2.isSubject) ? 1 : -1;
49650     }
49651     /* eslint-enable no-unused-vars */
49652
49653     /**
49654      * @param  {SweepEvent} se
49655      * @param  {Array.<Number>} p
49656      * @param  {Queue} queue
49657      * @return {Queue}
49658      */
49659     function divideSegment(se, p, queue)  {
49660       var r = new SweepEvent(p, false, se,            se.isSubject);
49661       var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
49662
49663       /* eslint-disable no-console */
49664       if (equals(se.point, se.otherEvent.point)) {
49665
49666         console.warn('what is that, a collapsed segment?', se);
49667       }
49668       /* eslint-enable no-console */
49669
49670       r.contourId = l.contourId = se.contourId;
49671
49672       // avoid a rounding error. The left event would be processed after the right event
49673       if (compareEvents(l, se.otherEvent) > 0) {
49674         se.otherEvent.left = true;
49675         l.left = false;
49676       }
49677
49678       // avoid a rounding error. The left event would be processed after the right event
49679       // if (compareEvents(se, r) > 0) {}
49680
49681       se.otherEvent.otherEvent = l;
49682       se.otherEvent = r;
49683
49684       queue.push(l);
49685       queue.push(r);
49686
49687       return queue;
49688     }
49689
49690     //const EPS = 1e-9;
49691
49692     /**
49693      * Finds the magnitude of the cross product of two vectors (if we pretend
49694      * they're in three dimensions)
49695      *
49696      * @param {Object} a First vector
49697      * @param {Object} b Second vector
49698      * @private
49699      * @returns {Number} The magnitude of the cross product
49700      */
49701     function crossProduct(a, b) {
49702       return (a[0] * b[1]) - (a[1] * b[0]);
49703     }
49704
49705     /**
49706      * Finds the dot product of two vectors.
49707      *
49708      * @param {Object} a First vector
49709      * @param {Object} b Second vector
49710      * @private
49711      * @returns {Number} The dot product
49712      */
49713     function dotProduct(a, b) {
49714       return (a[0] * b[0]) + (a[1] * b[1]);
49715     }
49716
49717     /**
49718      * Finds the intersection (if any) between two line segments a and b, given the
49719      * line segments' end points a1, a2 and b1, b2.
49720      *
49721      * This algorithm is based on Schneider and Eberly.
49722      * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
49723      * Page 244.
49724      *
49725      * @param {Array.<Number>} a1 point of first line
49726      * @param {Array.<Number>} a2 point of first line
49727      * @param {Array.<Number>} b1 point of second line
49728      * @param {Array.<Number>} b2 point of second line
49729      * @param {Boolean=}       noEndpointTouch whether to skip single touchpoints
49730      *                                         (meaning connected segments) as
49731      *                                         intersections
49732      * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
49733      * intersection. If they overlap, the two end points of the overlapping segment.
49734      * Otherwise, null.
49735      */
49736     function intersection (a1, a2, b1, b2, noEndpointTouch) {
49737       // The algorithm expects our lines in the form P + sd, where P is a point,
49738       // s is on the interval [0, 1], and d is a vector.
49739       // We are passed two points. P can be the first point of each pair. The
49740       // vector, then, could be thought of as the distance (in x and y components)
49741       // from the first point to the second point.
49742       // So first, let's make our vectors:
49743       var va = [a2[0] - a1[0], a2[1] - a1[1]];
49744       var vb = [b2[0] - b1[0], b2[1] - b1[1]];
49745       // We also define a function to convert back to regular point form:
49746
49747       /* eslint-disable arrow-body-style */
49748
49749       function toPoint(p, s, d) {
49750         return [
49751           p[0] + s * d[0],
49752           p[1] + s * d[1]
49753         ];
49754       }
49755
49756       /* eslint-enable arrow-body-style */
49757
49758       // The rest is pretty much a straight port of the algorithm.
49759       var e = [b1[0] - a1[0], b1[1] - a1[1]];
49760       var kross    = crossProduct(va, vb);
49761       var sqrKross = kross * kross;
49762       var sqrLenA  = dotProduct(va, va);
49763       //const sqrLenB  = dotProduct(vb, vb);
49764
49765       // Check for line intersection. This works because of the properties of the
49766       // cross product -- specifically, two vectors are parallel if and only if the
49767       // cross product is the 0 vector. The full calculation involves relative error
49768       // to account for possible very small line segments. See Schneider & Eberly
49769       // for details.
49770       if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
49771         // If they're not parallel, then (because these are line segments) they
49772         // still might not actually intersect. This code checks that the
49773         // intersection point of the lines is actually on both line segments.
49774         var s = crossProduct(e, vb) / kross;
49775         if (s < 0 || s > 1) {
49776           // not on line segment a
49777           return null;
49778         }
49779         var t = crossProduct(e, va) / kross;
49780         if (t < 0 || t > 1) {
49781           // not on line segment b
49782           return null;
49783         }
49784         if (s === 0 || s === 1) {
49785           // on an endpoint of line segment a
49786           return noEndpointTouch ? null : [toPoint(a1, s, va)];
49787         }
49788         if (t === 0 || t === 1) {
49789           // on an endpoint of line segment b
49790           return noEndpointTouch ? null : [toPoint(b1, t, vb)];
49791         }
49792         return [toPoint(a1, s, va)];
49793       }
49794
49795       // If we've reached this point, then the lines are either parallel or the
49796       // same, but the segments could overlap partially or fully, or not at all.
49797       // So we need to find the overlap, if any. To do that, we can use e, which is
49798       // the (vector) difference between the two initial points. If this is parallel
49799       // with the line itself, then the two lines are the same line, and there will
49800       // be overlap.
49801       //const sqrLenE = dotProduct(e, e);
49802       kross = crossProduct(e, va);
49803       sqrKross = kross * kross;
49804
49805       if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
49806       // Lines are just parallel, not the same. No overlap.
49807         return null;
49808       }
49809
49810       var sa = dotProduct(va, e) / sqrLenA;
49811       var sb = sa + dotProduct(va, vb) / sqrLenA;
49812       var smin = Math.min(sa, sb);
49813       var smax = Math.max(sa, sb);
49814
49815       // this is, essentially, the FindIntersection acting on floats from
49816       // Schneider & Eberly, just inlined into this function.
49817       if (smin <= 1 && smax >= 0) {
49818
49819         // overlap on an end point
49820         if (smin === 1) {
49821           return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
49822         }
49823
49824         if (smax === 0) {
49825           return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
49826         }
49827
49828         if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
49829
49830         // There's overlap on a segment -- two points of intersection. Return both.
49831         return [
49832           toPoint(a1, smin > 0 ? smin : 0, va),
49833           toPoint(a1, smax < 1 ? smax : 1, va)
49834         ];
49835       }
49836
49837       return null;
49838     }
49839
49840     /**
49841      * @param  {SweepEvent} se1
49842      * @param  {SweepEvent} se2
49843      * @param  {Queue}      queue
49844      * @return {Number}
49845      */
49846     function possibleIntersection (se1, se2, queue) {
49847       // that disallows self-intersecting polygons,
49848       // did cost us half a day, so I'll leave it
49849       // out of respect
49850       // if (se1.isSubject === se2.isSubject) return;
49851       var inter = intersection(
49852         se1.point, se1.otherEvent.point,
49853         se2.point, se2.otherEvent.point
49854       );
49855
49856       var nintersections = inter ? inter.length : 0;
49857       if (nintersections === 0) { return 0; } // no intersection
49858
49859       // the line segments intersect at an endpoint of both line segments
49860       if ((nintersections === 1) &&
49861           (equals(se1.point, se2.point) ||
49862            equals(se1.otherEvent.point, se2.otherEvent.point))) {
49863         return 0;
49864       }
49865
49866       if (nintersections === 2 && se1.isSubject === se2.isSubject) {
49867         // if(se1.contourId === se2.contourId){
49868         // console.warn('Edges of the same polygon overlap',
49869         //   se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
49870         // }
49871         //throw new Error('Edges of the same polygon overlap');
49872         return 0;
49873       }
49874
49875       // The line segments associated to se1 and se2 intersect
49876       if (nintersections === 1) {
49877
49878         // if the intersection point is not an endpoint of se1
49879         if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
49880           divideSegment(se1, inter[0], queue);
49881         }
49882
49883         // if the intersection point is not an endpoint of se2
49884         if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
49885           divideSegment(se2, inter[0], queue);
49886         }
49887         return 1;
49888       }
49889
49890       // The line segments associated to se1 and se2 overlap
49891       var events        = [];
49892       var leftCoincide  = false;
49893       var rightCoincide = false;
49894
49895       if (equals(se1.point, se2.point)) {
49896         leftCoincide = true; // linked
49897       } else if (compareEvents(se1, se2) === 1) {
49898         events.push(se2, se1);
49899       } else {
49900         events.push(se1, se2);
49901       }
49902
49903       if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
49904         rightCoincide = true;
49905       } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
49906         events.push(se2.otherEvent, se1.otherEvent);
49907       } else {
49908         events.push(se1.otherEvent, se2.otherEvent);
49909       }
49910
49911       if ((leftCoincide && rightCoincide) || leftCoincide) {
49912         // both line segments are equal or share the left endpoint
49913         se2.type = NON_CONTRIBUTING;
49914         se1.type = (se2.inOut === se1.inOut)
49915           ? SAME_TRANSITION : DIFFERENT_TRANSITION;
49916
49917         if (leftCoincide && !rightCoincide) {
49918           // honestly no idea, but changing events selection from [2, 1]
49919           // to [0, 1] fixes the overlapping self-intersecting polygons issue
49920           divideSegment(events[1].otherEvent, events[0].point, queue);
49921         }
49922         return 2;
49923       }
49924
49925       // the line segments share the right endpoint
49926       if (rightCoincide) {
49927         divideSegment(events[0], events[1].point, queue);
49928         return 3;
49929       }
49930
49931       // no line segment includes totally the other one
49932       if (events[0] !== events[3].otherEvent) {
49933         divideSegment(events[0], events[1].point, queue);
49934         divideSegment(events[1], events[2].point, queue);
49935         return 3;
49936       }
49937
49938       // one line segment includes the other one
49939       divideSegment(events[0], events[1].point, queue);
49940       divideSegment(events[3].otherEvent, events[2].point, queue);
49941
49942       return 3;
49943     }
49944
49945     /**
49946      * @param  {SweepEvent} le1
49947      * @param  {SweepEvent} le2
49948      * @return {Number}
49949      */
49950     function compareSegments(le1, le2) {
49951       if (le1 === le2) { return 0; }
49952
49953       // Segments are not collinear
49954       if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
49955         signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
49956
49957         // If they share their left endpoint use the right endpoint to sort
49958         if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
49959
49960         // Different left endpoint: use the left endpoint to sort
49961         if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
49962
49963         // has the line segment associated to e1 been inserted
49964         // into S after the line segment associated to e2 ?
49965         if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
49966
49967         // The line segment associated to e2 has been inserted
49968         // into S after the line segment associated to e1
49969         return le1.isBelow(le2.point) ? -1 : 1;
49970       }
49971
49972       if (le1.isSubject === le2.isSubject) { // same polygon
49973         var p1 = le1.point, p2 = le2.point;
49974         if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
49975           p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
49976           if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
49977           else { return le1.contourId > le2.contourId ? 1 : -1; }
49978         }
49979       } else { // Segments are collinear, but belong to separate polygons
49980         return le1.isSubject ? -1 : 1;
49981       }
49982
49983       return compareEvents(le1, le2) === 1 ? 1 : -1;
49984     }
49985
49986     function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
49987       var sweepLine = new SplayTree(compareSegments);
49988       var sortedEvents = [];
49989
49990       var rightbound = Math.min(sbbox[2], cbbox[2]);
49991
49992       var prev, next, begin;
49993
49994       while (eventQueue.length !== 0) {
49995         var event = eventQueue.pop();
49996         sortedEvents.push(event);
49997
49998         // optimization by bboxes for intersection and difference goes here
49999         if ((operation === INTERSECTION && event.point[0] > rightbound) ||
50000             (operation === DIFFERENCE   && event.point[0] > sbbox[2])) {
50001           break;
50002         }
50003
50004         if (event.left) {
50005           next  = prev = sweepLine.insert(event);
50006           begin = sweepLine.minNode();
50007
50008           if (prev !== begin) { prev = sweepLine.prev(prev); }
50009           else                { prev = null; }
50010
50011           next = sweepLine.next(next);
50012
50013           var prevEvent = prev ? prev.key : null;
50014           var prevprevEvent = (void 0);
50015           computeFields(event, prevEvent, operation);
50016           if (next) {
50017             if (possibleIntersection(event, next.key, eventQueue) === 2) {
50018               computeFields(event, prevEvent, operation);
50019               computeFields(event, next.key, operation);
50020             }
50021           }
50022
50023           if (prev) {
50024             if (possibleIntersection(prev.key, event, eventQueue) === 2) {
50025               var prevprev = prev;
50026               if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
50027               else                    { prevprev = null; }
50028
50029               prevprevEvent = prevprev ? prevprev.key : null;
50030               computeFields(prevEvent, prevprevEvent, operation);
50031               computeFields(event,     prevEvent,     operation);
50032             }
50033           }
50034         } else {
50035           event = event.otherEvent;
50036           next = prev = sweepLine.find(event);
50037
50038           if (prev && next) {
50039
50040             if (prev !== begin) { prev = sweepLine.prev(prev); }
50041             else                { prev = null; }
50042
50043             next = sweepLine.next(next);
50044             sweepLine.remove(event);
50045
50046             if (next && prev) {
50047               possibleIntersection(prev.key, next.key, eventQueue);
50048             }
50049           }
50050         }
50051       }
50052       return sortedEvents;
50053     }
50054
50055     /**
50056      * @param  {Array.<SweepEvent>} sortedEvents
50057      * @return {Array.<SweepEvent>}
50058      */
50059     function orderEvents(sortedEvents) {
50060       var event, i, len, tmp;
50061       var resultEvents = [];
50062       for (i = 0, len = sortedEvents.length; i < len; i++) {
50063         event = sortedEvents[i];
50064         if ((event.left && event.inResult) ||
50065           (!event.left && event.otherEvent.inResult)) {
50066           resultEvents.push(event);
50067         }
50068       }
50069       // Due to overlapping edges the resultEvents array can be not wholly sorted
50070       var sorted = false;
50071       while (!sorted) {
50072         sorted = true;
50073         for (i = 0, len = resultEvents.length; i < len; i++) {
50074           if ((i + 1) < len &&
50075             compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
50076             tmp = resultEvents[i];
50077             resultEvents[i] = resultEvents[i + 1];
50078             resultEvents[i + 1] = tmp;
50079             sorted = false;
50080           }
50081         }
50082       }
50083
50084
50085       for (i = 0, len = resultEvents.length; i < len; i++) {
50086         event = resultEvents[i];
50087         event.pos = i;
50088       }
50089
50090       // imagine, the right event is found in the beginning of the queue,
50091       // when his left counterpart is not marked yet
50092       for (i = 0, len = resultEvents.length; i < len; i++) {
50093         event = resultEvents[i];
50094         if (!event.left) {
50095           tmp = event.pos;
50096           event.pos = event.otherEvent.pos;
50097           event.otherEvent.pos = tmp;
50098         }
50099       }
50100
50101       return resultEvents;
50102     }
50103
50104
50105     /**
50106      * @param  {Number} pos
50107      * @param  {Array.<SweepEvent>} resultEvents
50108      * @param  {Object>}    processed
50109      * @return {Number}
50110      */
50111     function nextPos(pos, resultEvents, processed, origIndex) {
50112       var p, p1;
50113       var newPos = pos + 1;
50114       var length = resultEvents.length;
50115
50116       p  = resultEvents[pos].point;
50117
50118       if (newPos < length)
50119         { p1 = resultEvents[newPos].point; }
50120
50121
50122       // while in range and not the current one by value
50123       while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
50124         if (!processed[newPos]) {
50125           return newPos;
50126         } else   {
50127           newPos++;
50128         }
50129         p1 = resultEvents[newPos].point;
50130       }
50131
50132       newPos = pos - 1;
50133
50134       while (processed[newPos] && newPos >= origIndex) {
50135         newPos--;
50136       }
50137       return newPos;
50138     }
50139
50140
50141     /**
50142      * @param  {Array.<SweepEvent>} sortedEvents
50143      * @return {Array.<*>} polygons
50144      */
50145     function connectEdges(sortedEvents, operation) {
50146       var i, len;
50147       var resultEvents = orderEvents(sortedEvents);
50148
50149       // "false"-filled array
50150       var processed = {};
50151       var result = [];
50152       var event;
50153
50154       for (i = 0, len = resultEvents.length; i < len; i++) {
50155         if (processed[i]) { continue; }
50156         var contour = [[]];
50157
50158         if (!resultEvents[i].isExteriorRing) {
50159           if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length === 0) {
50160             result.push(contour);
50161           } else if (result.length === 0) {
50162             result.push([[contour]]);
50163           } else {
50164             result[result.length - 1].push(contour[0]);
50165           }
50166         } else if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length > 1) {
50167           result[result.length - 1].push(contour[0]);
50168         } else {
50169           result.push(contour);
50170         }
50171
50172         var ringId = result.length - 1;
50173         var pos = i;
50174
50175         var initial = resultEvents[i].point;
50176         contour[0].push(initial);
50177
50178         while (pos >= i) {
50179           event = resultEvents[pos];
50180           processed[pos] = true;
50181
50182           if (event.left) {
50183             event.resultInOut = false;
50184             event.contourId   = ringId;
50185           } else {
50186             event.otherEvent.resultInOut = true;
50187             event.otherEvent.contourId   = ringId;
50188           }
50189
50190           pos = event.pos;
50191           processed[pos] = true;
50192           contour[0].push(resultEvents[pos].point);
50193           pos = nextPos(pos, resultEvents, processed, i);
50194         }
50195
50196         pos = pos === -1 ? i : pos;
50197
50198         event = resultEvents[pos];
50199         processed[pos] = processed[event.pos] = true;
50200         event.otherEvent.resultInOut = true;
50201         event.otherEvent.contourId   = ringId;
50202       }
50203
50204       // Handle if the result is a polygon (eg not multipoly)
50205       // Commented it again, let's see what do we mean by that
50206       // if (result.length === 1) result = result[0];
50207       return result;
50208     }
50209
50210     var tinyqueue = TinyQueue;
50211     var default_1 = TinyQueue;
50212
50213     function TinyQueue(data, compare) {
50214         var this$1 = this;
50215
50216         if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
50217
50218         this.data = data || [];
50219         this.length = this.data.length;
50220         this.compare = compare || defaultCompare;
50221
50222         if (this.length > 0) {
50223             for (var i = (this.length >> 1) - 1; i >= 0; i--) { this$1._down(i); }
50224         }
50225     }
50226
50227     function defaultCompare(a, b) {
50228         return a < b ? -1 : a > b ? 1 : 0;
50229     }
50230
50231     TinyQueue.prototype = {
50232
50233         push: function (item) {
50234             this.data.push(item);
50235             this.length++;
50236             this._up(this.length - 1);
50237         },
50238
50239         pop: function () {
50240             if (this.length === 0) { return undefined; }
50241
50242             var top = this.data[0];
50243             this.length--;
50244
50245             if (this.length > 0) {
50246                 this.data[0] = this.data[this.length];
50247                 this._down(0);
50248             }
50249             this.data.pop();
50250
50251             return top;
50252         },
50253
50254         peek: function () {
50255             return this.data[0];
50256         },
50257
50258         _up: function (pos) {
50259             var data = this.data;
50260             var compare = this.compare;
50261             var item = data[pos];
50262
50263             while (pos > 0) {
50264                 var parent = (pos - 1) >> 1;
50265                 var current = data[parent];
50266                 if (compare(item, current) >= 0) { break; }
50267                 data[pos] = current;
50268                 pos = parent;
50269             }
50270
50271             data[pos] = item;
50272         },
50273
50274         _down: function (pos) {
50275             var this$1 = this;
50276
50277             var data = this.data;
50278             var compare = this.compare;
50279             var halfLength = this.length >> 1;
50280             var item = data[pos];
50281
50282             while (pos < halfLength) {
50283                 var left = (pos << 1) + 1;
50284                 var right = left + 1;
50285                 var best = data[left];
50286
50287                 if (right < this$1.length && compare(data[right], best) < 0) {
50288                     left = right;
50289                     best = data[right];
50290                 }
50291                 if (compare(best, item) >= 0) { break; }
50292
50293                 data[pos] = best;
50294                 pos = left;
50295             }
50296
50297             data[pos] = item;
50298         }
50299     };
50300     tinyqueue.default = default_1;
50301
50302     var max = Math.max;
50303     var min = Math.min;
50304
50305     var contourId = 0;
50306
50307
50308     function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
50309       var i, len, s1, s2, e1, e2;
50310       for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
50311         s1 = contourOrHole[i];
50312         s2 = contourOrHole[i + 1];
50313         e1 = new SweepEvent(s1, false, undefined, isSubject);
50314         e2 = new SweepEvent(s2, false, e1,        isSubject);
50315         e1.otherEvent = e2;
50316
50317         if (s1[0] === s2[0] && s1[1] === s2[1]) {
50318           continue; // skip collapsed edges, or it breaks
50319         }
50320
50321         e1.contourId = e2.contourId = depth;
50322         if (!isExteriorRing) {
50323           e1.isExteriorRing = false;
50324           e2.isExteriorRing = false;
50325         }
50326         if (compareEvents(e1, e2) > 0) {
50327           e2.left = true;
50328         } else {
50329           e1.left = true;
50330         }
50331
50332         var x = s1[0], y = s1[1];
50333         bbox[0] = min(bbox[0], x);
50334         bbox[1] = min(bbox[1], y);
50335         bbox[2] = max(bbox[2], x);
50336         bbox[3] = max(bbox[3], y);
50337
50338         // Pushing it so the queue is sorted from left to right,
50339         // with object on the left having the highest priority.
50340         Q.push(e1);
50341         Q.push(e2);
50342       }
50343     }
50344
50345
50346     function fillQueue(subject, clipping, sbbox, cbbox, operation) {
50347       var eventQueue = new tinyqueue(null, compareEvents);
50348       var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
50349
50350       for (i = 0, ii = subject.length; i < ii; i++) {
50351         polygonSet = subject[i];
50352         for (j = 0, jj = polygonSet.length; j < jj; j++) {
50353           isExteriorRing = j === 0;
50354           if (isExteriorRing) { contourId++; }
50355           processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
50356         }
50357       }
50358
50359       for (i = 0, ii = clipping.length; i < ii; i++) {
50360         polygonSet = clipping[i];
50361         for (j = 0, jj = polygonSet.length; j < jj; j++) {
50362           isExteriorRing = j === 0;
50363           if (operation === DIFFERENCE) { isExteriorRing = false; }
50364           if (isExteriorRing) { contourId++; }
50365           processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
50366         }
50367       }
50368
50369       return eventQueue;
50370     }
50371
50372     var EMPTY = [];
50373
50374
50375     function trivialOperation(subject, clipping, operation) {
50376       var result = null;
50377       if (subject.length * clipping.length === 0) {
50378         if        (operation === INTERSECTION) {
50379           result = EMPTY;
50380         } else if (operation === DIFFERENCE) {
50381           result = subject;
50382         } else if (operation === UNION ||
50383                    operation === XOR) {
50384           result = (subject.length === 0) ? clipping : subject;
50385         }
50386       }
50387       return result;
50388     }
50389
50390
50391     function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
50392       var result = null;
50393       if (sbbox[0] > cbbox[2] ||
50394           cbbox[0] > sbbox[2] ||
50395           sbbox[1] > cbbox[3] ||
50396           cbbox[1] > sbbox[3]) {
50397         if        (operation === INTERSECTION) {
50398           result = EMPTY;
50399         } else if (operation === DIFFERENCE) {
50400           result = subject;
50401         } else if (operation === UNION ||
50402                    operation === XOR) {
50403           result = subject.concat(clipping);
50404         }
50405       }
50406       return result;
50407     }
50408
50409
50410     function boolean(subject, clipping, operation) {
50411       if (typeof subject[0][0][0] === 'number') {
50412         subject = [subject];
50413       }
50414       if (typeof clipping[0][0][0] === 'number') {
50415         clipping = [clipping];
50416       }
50417       var trivial = trivialOperation(subject, clipping, operation);
50418       if (trivial) {
50419         return trivial === EMPTY ? null : trivial;
50420       }
50421       var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
50422       var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
50423
50424       //console.time('fill queue');
50425       var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
50426       //console.timeEnd('fill queue');
50427
50428       trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
50429       if (trivial) {
50430         return trivial === EMPTY ? null : trivial;
50431       }
50432       //console.time('subdivide edges');
50433       var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
50434       //console.timeEnd('subdivide edges');
50435
50436       //console.time('connect vertices');
50437       var result = connectEdges(sortedEvents, operation);
50438       //console.timeEnd('connect vertices');
50439       return result;
50440     }
50441
50442     function union (subject, clipping) {
50443       return boolean(subject, clipping, UNION);
50444     }
50445
50446     function diff (subject, clipping) {
50447       return boolean(subject, clipping, DIFFERENCE);
50448     }
50449
50450     function xor (subject, clipping){
50451       return boolean(subject, clipping, XOR);
50452     }
50453
50454     function intersection$1 (subject, clipping) {
50455       return boolean(subject, clipping, INTERSECTION);
50456     }
50457
50458     /**
50459      * @enum {Number}
50460      */
50461     var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
50462
50463     exports.union = union;
50464     exports.diff = diff;
50465     exports.xor = xor;
50466     exports.intersection = intersection$1;
50467     exports.operations = operations;
50468
50469     Object.defineProperty(exports, '__esModule', { value: true });
50470
50471   })));
50472
50473   });
50474
50475   var martinez = unwrapExports(martinez_umd);
50476
50477   var read$6 = function (buffer, offset, isLE, mLen, nBytes) {
50478     var e, m;
50479     var eLen = (nBytes * 8) - mLen - 1;
50480     var eMax = (1 << eLen) - 1;
50481     var eBias = eMax >> 1;
50482     var nBits = -7;
50483     var i = isLE ? (nBytes - 1) : 0;
50484     var d = isLE ? -1 : 1;
50485     var s = buffer[offset + i];
50486
50487     i += d;
50488
50489     e = s & ((1 << (-nBits)) - 1);
50490     s >>= (-nBits);
50491     nBits += eLen;
50492     for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
50493
50494     m = e & ((1 << (-nBits)) - 1);
50495     e >>= (-nBits);
50496     nBits += mLen;
50497     for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
50498
50499     if (e === 0) {
50500       e = 1 - eBias;
50501     } else if (e === eMax) {
50502       return m ? NaN : ((s ? -1 : 1) * Infinity)
50503     } else {
50504       m = m + Math.pow(2, mLen);
50505       e = e - eBias;
50506     }
50507     return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
50508   };
50509
50510   var write$6 = function (buffer, value, offset, isLE, mLen, nBytes) {
50511     var e, m, c;
50512     var eLen = (nBytes * 8) - mLen - 1;
50513     var eMax = (1 << eLen) - 1;
50514     var eBias = eMax >> 1;
50515     var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
50516     var i = isLE ? 0 : (nBytes - 1);
50517     var d = isLE ? 1 : -1;
50518     var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
50519
50520     value = Math.abs(value);
50521
50522     if (isNaN(value) || value === Infinity) {
50523       m = isNaN(value) ? 1 : 0;
50524       e = eMax;
50525     } else {
50526       e = Math.floor(Math.log(value) / Math.LN2);
50527       if (value * (c = Math.pow(2, -e)) < 1) {
50528         e--;
50529         c *= 2;
50530       }
50531       if (e + eBias >= 1) {
50532         value += rt / c;
50533       } else {
50534         value += rt * Math.pow(2, 1 - eBias);
50535       }
50536       if (value * c >= 2) {
50537         e++;
50538         c /= 2;
50539       }
50540
50541       if (e + eBias >= eMax) {
50542         m = 0;
50543         e = eMax;
50544       } else if (e + eBias >= 1) {
50545         m = ((value * c) - 1) * Math.pow(2, mLen);
50546         e = e + eBias;
50547       } else {
50548         m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
50549         e = 0;
50550       }
50551     }
50552
50553     for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
50554
50555     e = (e << mLen) | m;
50556     eLen += mLen;
50557     for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
50558
50559     buffer[offset + i - d] |= s * 128;
50560   };
50561
50562   var ieee754 = {
50563         read: read$6,
50564         write: write$6
50565   };
50566
50567   var pbf = Pbf;
50568
50569
50570
50571   function Pbf(buf) {
50572       this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
50573       this.pos = 0;
50574       this.type = 0;
50575       this.length = this.buf.length;
50576   }
50577
50578   Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
50579   Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
50580   Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
50581   Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
50582
50583   var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
50584       SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
50585
50586   Pbf.prototype = {
50587
50588       destroy: function() {
50589           this.buf = null;
50590       },
50591
50592       // === READING =================================================================
50593
50594       readFields: function(readField, result, end) {
50595           end = end || this.length;
50596
50597           while (this.pos < end) {
50598               var val = this.readVarint(),
50599                   tag = val >> 3,
50600                   startPos = this.pos;
50601
50602               this.type = val & 0x7;
50603               readField(tag, result, this);
50604
50605               if (this.pos === startPos) this.skip(val);
50606           }
50607           return result;
50608       },
50609
50610       readMessage: function(readField, result) {
50611           return this.readFields(readField, result, this.readVarint() + this.pos);
50612       },
50613
50614       readFixed32: function() {
50615           var val = readUInt32(this.buf, this.pos);
50616           this.pos += 4;
50617           return val;
50618       },
50619
50620       readSFixed32: function() {
50621           var val = readInt32(this.buf, this.pos);
50622           this.pos += 4;
50623           return val;
50624       },
50625
50626       // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
50627
50628       readFixed64: function() {
50629           var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
50630           this.pos += 8;
50631           return val;
50632       },
50633
50634       readSFixed64: function() {
50635           var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
50636           this.pos += 8;
50637           return val;
50638       },
50639
50640       readFloat: function() {
50641           var val = ieee754.read(this.buf, this.pos, true, 23, 4);
50642           this.pos += 4;
50643           return val;
50644       },
50645
50646       readDouble: function() {
50647           var val = ieee754.read(this.buf, this.pos, true, 52, 8);
50648           this.pos += 8;
50649           return val;
50650       },
50651
50652       readVarint: function(isSigned) {
50653           var buf = this.buf,
50654               val, b;
50655
50656           b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
50657           b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
50658           b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
50659           b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
50660           b = buf[this.pos];   val |= (b & 0x0f) << 28;
50661
50662           return readVarintRemainder(val, isSigned, this);
50663       },
50664
50665       readVarint64: function() { // for compatibility with v2.0.1
50666           return this.readVarint(true);
50667       },
50668
50669       readSVarint: function() {
50670           var num = this.readVarint();
50671           return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
50672       },
50673
50674       readBoolean: function() {
50675           return Boolean(this.readVarint());
50676       },
50677
50678       readString: function() {
50679           var end = this.readVarint() + this.pos,
50680               str = readUtf8(this.buf, this.pos, end);
50681           this.pos = end;
50682           return str;
50683       },
50684
50685       readBytes: function() {
50686           var end = this.readVarint() + this.pos,
50687               buffer = this.buf.subarray(this.pos, end);
50688           this.pos = end;
50689           return buffer;
50690       },
50691
50692       // verbose for performance reasons; doesn't affect gzipped size
50693
50694       readPackedVarint: function(arr, isSigned) {
50695           var end = readPackedEnd(this);
50696           arr = arr || [];
50697           while (this.pos < end) arr.push(this.readVarint(isSigned));
50698           return arr;
50699       },
50700       readPackedSVarint: function(arr) {
50701           var end = readPackedEnd(this);
50702           arr = arr || [];
50703           while (this.pos < end) arr.push(this.readSVarint());
50704           return arr;
50705       },
50706       readPackedBoolean: function(arr) {
50707           var end = readPackedEnd(this);
50708           arr = arr || [];
50709           while (this.pos < end) arr.push(this.readBoolean());
50710           return arr;
50711       },
50712       readPackedFloat: function(arr) {
50713           var end = readPackedEnd(this);
50714           arr = arr || [];
50715           while (this.pos < end) arr.push(this.readFloat());
50716           return arr;
50717       },
50718       readPackedDouble: function(arr) {
50719           var end = readPackedEnd(this);
50720           arr = arr || [];
50721           while (this.pos < end) arr.push(this.readDouble());
50722           return arr;
50723       },
50724       readPackedFixed32: function(arr) {
50725           var end = readPackedEnd(this);
50726           arr = arr || [];
50727           while (this.pos < end) arr.push(this.readFixed32());
50728           return arr;
50729       },
50730       readPackedSFixed32: function(arr) {
50731           var end = readPackedEnd(this);
50732           arr = arr || [];
50733           while (this.pos < end) arr.push(this.readSFixed32());
50734           return arr;
50735       },
50736       readPackedFixed64: function(arr) {
50737           var end = readPackedEnd(this);
50738           arr = arr || [];
50739           while (this.pos < end) arr.push(this.readFixed64());
50740           return arr;
50741       },
50742       readPackedSFixed64: function(arr) {
50743           var end = readPackedEnd(this);
50744           arr = arr || [];
50745           while (this.pos < end) arr.push(this.readSFixed64());
50746           return arr;
50747       },
50748
50749       skip: function(val) {
50750           var type = val & 0x7;
50751           if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
50752           else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
50753           else if (type === Pbf.Fixed32) this.pos += 4;
50754           else if (type === Pbf.Fixed64) this.pos += 8;
50755           else throw new Error('Unimplemented type: ' + type);
50756       },
50757
50758       // === WRITING =================================================================
50759
50760       writeTag: function(tag, type) {
50761           this.writeVarint((tag << 3) | type);
50762       },
50763
50764       realloc: function(min) {
50765           var length = this.length || 16;
50766
50767           while (length < this.pos + min) length *= 2;
50768
50769           if (length !== this.length) {
50770               var buf = new Uint8Array(length);
50771               buf.set(this.buf);
50772               this.buf = buf;
50773               this.length = length;
50774           }
50775       },
50776
50777       finish: function() {
50778           this.length = this.pos;
50779           this.pos = 0;
50780           return this.buf.subarray(0, this.length);
50781       },
50782
50783       writeFixed32: function(val) {
50784           this.realloc(4);
50785           writeInt32(this.buf, val, this.pos);
50786           this.pos += 4;
50787       },
50788
50789       writeSFixed32: function(val) {
50790           this.realloc(4);
50791           writeInt32(this.buf, val, this.pos);
50792           this.pos += 4;
50793       },
50794
50795       writeFixed64: function(val) {
50796           this.realloc(8);
50797           writeInt32(this.buf, val & -1, this.pos);
50798           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
50799           this.pos += 8;
50800       },
50801
50802       writeSFixed64: function(val) {
50803           this.realloc(8);
50804           writeInt32(this.buf, val & -1, this.pos);
50805           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
50806           this.pos += 8;
50807       },
50808
50809       writeVarint: function(val) {
50810           val = +val || 0;
50811
50812           if (val > 0xfffffff || val < 0) {
50813               writeBigVarint(val, this);
50814               return;
50815           }
50816
50817           this.realloc(4);
50818
50819           this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
50820           this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
50821           this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
50822           this.buf[this.pos++] =   (val >>> 7) & 0x7f;
50823       },
50824
50825       writeSVarint: function(val) {
50826           this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
50827       },
50828
50829       writeBoolean: function(val) {
50830           this.writeVarint(Boolean(val));
50831       },
50832
50833       writeString: function(str) {
50834           str = String(str);
50835           this.realloc(str.length * 4);
50836
50837           this.pos++; // reserve 1 byte for short string length
50838
50839           var startPos = this.pos;
50840           // write the string directly to the buffer and see how much was written
50841           this.pos = writeUtf8(this.buf, str, this.pos);
50842           var len = this.pos - startPos;
50843
50844           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
50845
50846           // finally, write the message length in the reserved place and restore the position
50847           this.pos = startPos - 1;
50848           this.writeVarint(len);
50849           this.pos += len;
50850       },
50851
50852       writeFloat: function(val) {
50853           this.realloc(4);
50854           ieee754.write(this.buf, val, this.pos, true, 23, 4);
50855           this.pos += 4;
50856       },
50857
50858       writeDouble: function(val) {
50859           this.realloc(8);
50860           ieee754.write(this.buf, val, this.pos, true, 52, 8);
50861           this.pos += 8;
50862       },
50863
50864       writeBytes: function(buffer) {
50865           var len = buffer.length;
50866           this.writeVarint(len);
50867           this.realloc(len);
50868           for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
50869       },
50870
50871       writeRawMessage: function(fn, obj) {
50872           this.pos++; // reserve 1 byte for short message length
50873
50874           // write the message directly to the buffer and see how much was written
50875           var startPos = this.pos;
50876           fn(obj, this);
50877           var len = this.pos - startPos;
50878
50879           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
50880
50881           // finally, write the message length in the reserved place and restore the position
50882           this.pos = startPos - 1;
50883           this.writeVarint(len);
50884           this.pos += len;
50885       },
50886
50887       writeMessage: function(tag, fn, obj) {
50888           this.writeTag(tag, Pbf.Bytes);
50889           this.writeRawMessage(fn, obj);
50890       },
50891
50892       writePackedVarint:   function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr);   },
50893       writePackedSVarint:  function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr);  },
50894       writePackedBoolean:  function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr);  },
50895       writePackedFloat:    function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr);    },
50896       writePackedDouble:   function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr);   },
50897       writePackedFixed32:  function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr);  },
50898       writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },
50899       writePackedFixed64:  function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr);  },
50900       writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); },
50901
50902       writeBytesField: function(tag, buffer) {
50903           this.writeTag(tag, Pbf.Bytes);
50904           this.writeBytes(buffer);
50905       },
50906       writeFixed32Field: function(tag, val) {
50907           this.writeTag(tag, Pbf.Fixed32);
50908           this.writeFixed32(val);
50909       },
50910       writeSFixed32Field: function(tag, val) {
50911           this.writeTag(tag, Pbf.Fixed32);
50912           this.writeSFixed32(val);
50913       },
50914       writeFixed64Field: function(tag, val) {
50915           this.writeTag(tag, Pbf.Fixed64);
50916           this.writeFixed64(val);
50917       },
50918       writeSFixed64Field: function(tag, val) {
50919           this.writeTag(tag, Pbf.Fixed64);
50920           this.writeSFixed64(val);
50921       },
50922       writeVarintField: function(tag, val) {
50923           this.writeTag(tag, Pbf.Varint);
50924           this.writeVarint(val);
50925       },
50926       writeSVarintField: function(tag, val) {
50927           this.writeTag(tag, Pbf.Varint);
50928           this.writeSVarint(val);
50929       },
50930       writeStringField: function(tag, str) {
50931           this.writeTag(tag, Pbf.Bytes);
50932           this.writeString(str);
50933       },
50934       writeFloatField: function(tag, val) {
50935           this.writeTag(tag, Pbf.Fixed32);
50936           this.writeFloat(val);
50937       },
50938       writeDoubleField: function(tag, val) {
50939           this.writeTag(tag, Pbf.Fixed64);
50940           this.writeDouble(val);
50941       },
50942       writeBooleanField: function(tag, val) {
50943           this.writeVarintField(tag, Boolean(val));
50944       }
50945   };
50946
50947   function readVarintRemainder(l, s, p) {
50948       var buf = p.buf,
50949           h, b;
50950
50951       b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
50952       b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
50953       b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
50954       b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
50955       b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
50956       b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
50957
50958       throw new Error('Expected varint not more than 10 bytes');
50959   }
50960
50961   function readPackedEnd(pbf) {
50962       return pbf.type === Pbf.Bytes ?
50963           pbf.readVarint() + pbf.pos : pbf.pos + 1;
50964   }
50965
50966   function toNum(low, high, isSigned) {
50967       if (isSigned) {
50968           return high * 0x100000000 + (low >>> 0);
50969       }
50970
50971       return ((high >>> 0) * 0x100000000) + (low >>> 0);
50972   }
50973
50974   function writeBigVarint(val, pbf) {
50975       var low, high;
50976
50977       if (val >= 0) {
50978           low  = (val % 0x100000000) | 0;
50979           high = (val / 0x100000000) | 0;
50980       } else {
50981           low  = ~(-val % 0x100000000);
50982           high = ~(-val / 0x100000000);
50983
50984           if (low ^ 0xffffffff) {
50985               low = (low + 1) | 0;
50986           } else {
50987               low = 0;
50988               high = (high + 1) | 0;
50989           }
50990       }
50991
50992       if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
50993           throw new Error('Given varint doesn\'t fit into 10 bytes');
50994       }
50995
50996       pbf.realloc(10);
50997
50998       writeBigVarintLow(low, high, pbf);
50999       writeBigVarintHigh(high, pbf);
51000   }
51001
51002   function writeBigVarintLow(low, high, pbf) {
51003       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
51004       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
51005       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
51006       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
51007       pbf.buf[pbf.pos]   = low & 0x7f;
51008   }
51009
51010   function writeBigVarintHigh(high, pbf) {
51011       var lsb = (high & 0x07) << 4;
51012
51013       pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
51014       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
51015       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
51016       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
51017       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
51018       pbf.buf[pbf.pos++]  = high & 0x7f;
51019   }
51020
51021   function makeRoomForExtraLength(startPos, len, pbf) {
51022       var extraLen =
51023           len <= 0x3fff ? 1 :
51024           len <= 0x1fffff ? 2 :
51025           len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7));
51026
51027       // if 1 byte isn't enough for encoding message length, shift the data to the right
51028       pbf.realloc(extraLen);
51029       for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
51030   }
51031
51032   function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
51033   function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
51034   function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
51035   function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
51036   function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
51037   function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
51038   function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
51039   function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
51040   function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
51041
51042   // Buffer code below from https://github.com/feross/buffer, MIT-licensed
51043
51044   function readUInt32(buf, pos) {
51045       return ((buf[pos]) |
51046           (buf[pos + 1] << 8) |
51047           (buf[pos + 2] << 16)) +
51048           (buf[pos + 3] * 0x1000000);
51049   }
51050
51051   function writeInt32(buf, val, pos) {
51052       buf[pos] = val;
51053       buf[pos + 1] = (val >>> 8);
51054       buf[pos + 2] = (val >>> 16);
51055       buf[pos + 3] = (val >>> 24);
51056   }
51057
51058   function readInt32(buf, pos) {
51059       return ((buf[pos]) |
51060           (buf[pos + 1] << 8) |
51061           (buf[pos + 2] << 16)) +
51062           (buf[pos + 3] << 24);
51063   }
51064
51065   function readUtf8(buf, pos, end) {
51066       var str = '';
51067       var i = pos;
51068
51069       while (i < end) {
51070           var b0 = buf[i];
51071           var c = null; // codepoint
51072           var bytesPerSequence =
51073               b0 > 0xEF ? 4 :
51074               b0 > 0xDF ? 3 :
51075               b0 > 0xBF ? 2 : 1;
51076
51077           if (i + bytesPerSequence > end) break;
51078
51079           var b1, b2, b3;
51080
51081           if (bytesPerSequence === 1) {
51082               if (b0 < 0x80) {
51083                   c = b0;
51084               }
51085           } else if (bytesPerSequence === 2) {
51086               b1 = buf[i + 1];
51087               if ((b1 & 0xC0) === 0x80) {
51088                   c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
51089                   if (c <= 0x7F) {
51090                       c = null;
51091                   }
51092               }
51093           } else if (bytesPerSequence === 3) {
51094               b1 = buf[i + 1];
51095               b2 = buf[i + 2];
51096               if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
51097                   c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
51098                   if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
51099                       c = null;
51100                   }
51101               }
51102           } else if (bytesPerSequence === 4) {
51103               b1 = buf[i + 1];
51104               b2 = buf[i + 2];
51105               b3 = buf[i + 3];
51106               if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
51107                   c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
51108                   if (c <= 0xFFFF || c >= 0x110000) {
51109                       c = null;
51110                   }
51111               }
51112           }
51113
51114           if (c === null) {
51115               c = 0xFFFD;
51116               bytesPerSequence = 1;
51117
51118           } else if (c > 0xFFFF) {
51119               c -= 0x10000;
51120               str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
51121               c = 0xDC00 | c & 0x3FF;
51122           }
51123
51124           str += String.fromCharCode(c);
51125           i += bytesPerSequence;
51126       }
51127
51128       return str;
51129   }
51130
51131   function writeUtf8(buf, str, pos) {
51132       for (var i = 0, c, lead; i < str.length; i++) {
51133           c = str.charCodeAt(i); // code point
51134
51135           if (c > 0xD7FF && c < 0xE000) {
51136               if (lead) {
51137                   if (c < 0xDC00) {
51138                       buf[pos++] = 0xEF;
51139                       buf[pos++] = 0xBF;
51140                       buf[pos++] = 0xBD;
51141                       lead = c;
51142                       continue;
51143                   } else {
51144                       c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
51145                       lead = null;
51146                   }
51147               } else {
51148                   if (c > 0xDBFF || (i + 1 === str.length)) {
51149                       buf[pos++] = 0xEF;
51150                       buf[pos++] = 0xBF;
51151                       buf[pos++] = 0xBD;
51152                   } else {
51153                       lead = c;
51154                   }
51155                   continue;
51156               }
51157           } else if (lead) {
51158               buf[pos++] = 0xEF;
51159               buf[pos++] = 0xBF;
51160               buf[pos++] = 0xBD;
51161               lead = null;
51162           }
51163
51164           if (c < 0x80) {
51165               buf[pos++] = c;
51166           } else {
51167               if (c < 0x800) {
51168                   buf[pos++] = c >> 0x6 | 0xC0;
51169               } else {
51170                   if (c < 0x10000) {
51171                       buf[pos++] = c >> 0xC | 0xE0;
51172                   } else {
51173                       buf[pos++] = c >> 0x12 | 0xF0;
51174                       buf[pos++] = c >> 0xC & 0x3F | 0x80;
51175                   }
51176                   buf[pos++] = c >> 0x6 & 0x3F | 0x80;
51177               }
51178               buf[pos++] = c & 0x3F | 0x80;
51179           }
51180       }
51181       return pos;
51182   }
51183
51184   var pointGeometry = Point;
51185
51186   /**
51187    * A standalone point geometry with useful accessor, comparison, and
51188    * modification methods.
51189    *
51190    * @class Point
51191    * @param {Number} x the x-coordinate. this could be longitude or screen
51192    * pixels, or any other sort of unit.
51193    * @param {Number} y the y-coordinate. this could be latitude or screen
51194    * pixels, or any other sort of unit.
51195    * @example
51196    * var point = new Point(-77, 38);
51197    */
51198   function Point(x, y) {
51199       this.x = x;
51200       this.y = y;
51201   }
51202
51203   Point.prototype = {
51204
51205       /**
51206        * Clone this point, returning a new point that can be modified
51207        * without affecting the old one.
51208        * @return {Point} the clone
51209        */
51210       clone: function() { return new Point(this.x, this.y); },
51211
51212       /**
51213        * Add this point's x & y coordinates to another point,
51214        * yielding a new point.
51215        * @param {Point} p the other point
51216        * @return {Point} output point
51217        */
51218       add:     function(p) { return this.clone()._add(p); },
51219
51220       /**
51221        * Subtract this point's x & y coordinates to from point,
51222        * yielding a new point.
51223        * @param {Point} p the other point
51224        * @return {Point} output point
51225        */
51226       sub:     function(p) { return this.clone()._sub(p); },
51227
51228       /**
51229        * Multiply this point's x & y coordinates by point,
51230        * yielding a new point.
51231        * @param {Point} p the other point
51232        * @return {Point} output point
51233        */
51234       multByPoint:    function(p) { return this.clone()._multByPoint(p); },
51235
51236       /**
51237        * Divide this point's x & y coordinates by point,
51238        * yielding a new point.
51239        * @param {Point} p the other point
51240        * @return {Point} output point
51241        */
51242       divByPoint:     function(p) { return this.clone()._divByPoint(p); },
51243
51244       /**
51245        * Multiply this point's x & y coordinates by a factor,
51246        * yielding a new point.
51247        * @param {Point} k factor
51248        * @return {Point} output point
51249        */
51250       mult:    function(k) { return this.clone()._mult(k); },
51251
51252       /**
51253        * Divide this point's x & y coordinates by a factor,
51254        * yielding a new point.
51255        * @param {Point} k factor
51256        * @return {Point} output point
51257        */
51258       div:     function(k) { return this.clone()._div(k); },
51259
51260       /**
51261        * Rotate this point around the 0, 0 origin by an angle a,
51262        * given in radians
51263        * @param {Number} a angle to rotate around, in radians
51264        * @return {Point} output point
51265        */
51266       rotate:  function(a) { return this.clone()._rotate(a); },
51267
51268       /**
51269        * Rotate this point around p point by an angle a,
51270        * given in radians
51271        * @param {Number} a angle to rotate around, in radians
51272        * @param {Point} p Point to rotate around
51273        * @return {Point} output point
51274        */
51275       rotateAround:  function(a,p) { return this.clone()._rotateAround(a,p); },
51276
51277       /**
51278        * Multiply this point by a 4x1 transformation matrix
51279        * @param {Array<Number>} m transformation matrix
51280        * @return {Point} output point
51281        */
51282       matMult: function(m) { return this.clone()._matMult(m); },
51283
51284       /**
51285        * Calculate this point but as a unit vector from 0, 0, meaning
51286        * that the distance from the resulting point to the 0, 0
51287        * coordinate will be equal to 1 and the angle from the resulting
51288        * point to the 0, 0 coordinate will be the same as before.
51289        * @return {Point} unit vector point
51290        */
51291       unit:    function() { return this.clone()._unit(); },
51292
51293       /**
51294        * Compute a perpendicular point, where the new y coordinate
51295        * is the old x coordinate and the new x coordinate is the old y
51296        * coordinate multiplied by -1
51297        * @return {Point} perpendicular point
51298        */
51299       perp:    function() { return this.clone()._perp(); },
51300
51301       /**
51302        * Return a version of this point with the x & y coordinates
51303        * rounded to integers.
51304        * @return {Point} rounded point
51305        */
51306       round:   function() { return this.clone()._round(); },
51307
51308       /**
51309        * Return the magitude of this point: this is the Euclidean
51310        * distance from the 0, 0 coordinate to this point's x and y
51311        * coordinates.
51312        * @return {Number} magnitude
51313        */
51314       mag: function() {
51315           return Math.sqrt(this.x * this.x + this.y * this.y);
51316       },
51317
51318       /**
51319        * Judge whether this point is equal to another point, returning
51320        * true or false.
51321        * @param {Point} other the other point
51322        * @return {boolean} whether the points are equal
51323        */
51324       equals: function(other) {
51325           return this.x === other.x &&
51326                  this.y === other.y;
51327       },
51328
51329       /**
51330        * Calculate the distance from this point to another point
51331        * @param {Point} p the other point
51332        * @return {Number} distance
51333        */
51334       dist: function(p) {
51335           return Math.sqrt(this.distSqr(p));
51336       },
51337
51338       /**
51339        * Calculate the distance from this point to another point,
51340        * without the square root step. Useful if you're comparing
51341        * relative distances.
51342        * @param {Point} p the other point
51343        * @return {Number} distance
51344        */
51345       distSqr: function(p) {
51346           var dx = p.x - this.x,
51347               dy = p.y - this.y;
51348           return dx * dx + dy * dy;
51349       },
51350
51351       /**
51352        * Get the angle from the 0, 0 coordinate to this point, in radians
51353        * coordinates.
51354        * @return {Number} angle
51355        */
51356       angle: function() {
51357           return Math.atan2(this.y, this.x);
51358       },
51359
51360       /**
51361        * Get the angle from this point to another point, in radians
51362        * @param {Point} b the other point
51363        * @return {Number} angle
51364        */
51365       angleTo: function(b) {
51366           return Math.atan2(this.y - b.y, this.x - b.x);
51367       },
51368
51369       /**
51370        * Get the angle between this point and another point, in radians
51371        * @param {Point} b the other point
51372        * @return {Number} angle
51373        */
51374       angleWith: function(b) {
51375           return this.angleWithSep(b.x, b.y);
51376       },
51377
51378       /*
51379        * Find the angle of the two vectors, solving the formula for
51380        * the cross product a x b = |a||b|sin(θ) for θ.
51381        * @param {Number} x the x-coordinate
51382        * @param {Number} y the y-coordinate
51383        * @return {Number} the angle in radians
51384        */
51385       angleWithSep: function(x, y) {
51386           return Math.atan2(
51387               this.x * y - this.y * x,
51388               this.x * x + this.y * y);
51389       },
51390
51391       _matMult: function(m) {
51392           var x = m[0] * this.x + m[1] * this.y,
51393               y = m[2] * this.x + m[3] * this.y;
51394           this.x = x;
51395           this.y = y;
51396           return this;
51397       },
51398
51399       _add: function(p) {
51400           this.x += p.x;
51401           this.y += p.y;
51402           return this;
51403       },
51404
51405       _sub: function(p) {
51406           this.x -= p.x;
51407           this.y -= p.y;
51408           return this;
51409       },
51410
51411       _mult: function(k) {
51412           this.x *= k;
51413           this.y *= k;
51414           return this;
51415       },
51416
51417       _div: function(k) {
51418           this.x /= k;
51419           this.y /= k;
51420           return this;
51421       },
51422
51423       _multByPoint: function(p) {
51424           this.x *= p.x;
51425           this.y *= p.y;
51426           return this;
51427       },
51428
51429       _divByPoint: function(p) {
51430           this.x /= p.x;
51431           this.y /= p.y;
51432           return this;
51433       },
51434
51435       _unit: function() {
51436           this._div(this.mag());
51437           return this;
51438       },
51439
51440       _perp: function() {
51441           var y = this.y;
51442           this.y = this.x;
51443           this.x = -y;
51444           return this;
51445       },
51446
51447       _rotate: function(angle) {
51448           var cos = Math.cos(angle),
51449               sin = Math.sin(angle),
51450               x = cos * this.x - sin * this.y,
51451               y = sin * this.x + cos * this.y;
51452           this.x = x;
51453           this.y = y;
51454           return this;
51455       },
51456
51457       _rotateAround: function(angle, p) {
51458           var cos = Math.cos(angle),
51459               sin = Math.sin(angle),
51460               x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
51461               y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
51462           this.x = x;
51463           this.y = y;
51464           return this;
51465       },
51466
51467       _round: function() {
51468           this.x = Math.round(this.x);
51469           this.y = Math.round(this.y);
51470           return this;
51471       }
51472   };
51473
51474   /**
51475    * Construct a point from an array if necessary, otherwise if the input
51476    * is already a Point, or an unknown type, return it unchanged
51477    * @param {Array<Number>|Point|*} a any kind of input value
51478    * @return {Point} constructed point, or passed-through value.
51479    * @example
51480    * // this
51481    * var point = Point.convert([0, 1]);
51482    * // is equivalent to
51483    * var point = new Point(0, 1);
51484    */
51485   Point.convert = function (a) {
51486       if (a instanceof Point) {
51487           return a;
51488       }
51489       if (Array.isArray(a)) {
51490           return new Point(a[0], a[1]);
51491       }
51492       return a;
51493   };
51494
51495   var vectortilefeature = VectorTileFeature;
51496
51497   function VectorTileFeature(pbf, end, extent, keys, values) {
51498       // Public
51499       this.properties = {};
51500       this.extent = extent;
51501       this.type = 0;
51502
51503       // Private
51504       this._pbf = pbf;
51505       this._geometry = -1;
51506       this._keys = keys;
51507       this._values = values;
51508
51509       pbf.readFields(readFeature, this, end);
51510   }
51511
51512   function readFeature(tag, feature, pbf) {
51513       if (tag == 1) feature.id = pbf.readVarint();
51514       else if (tag == 2) readTag(pbf, feature);
51515       else if (tag == 3) feature.type = pbf.readVarint();
51516       else if (tag == 4) feature._geometry = pbf.pos;
51517   }
51518
51519   function readTag(pbf, feature) {
51520       var end = pbf.readVarint() + pbf.pos;
51521
51522       while (pbf.pos < end) {
51523           var key = feature._keys[pbf.readVarint()],
51524               value = feature._values[pbf.readVarint()];
51525           feature.properties[key] = value;
51526       }
51527   }
51528
51529   VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
51530
51531   VectorTileFeature.prototype.loadGeometry = function() {
51532       var pbf = this._pbf;
51533       pbf.pos = this._geometry;
51534
51535       var end = pbf.readVarint() + pbf.pos,
51536           cmd = 1,
51537           length = 0,
51538           x = 0,
51539           y = 0,
51540           lines = [],
51541           line;
51542
51543       while (pbf.pos < end) {
51544           if (length <= 0) {
51545               var cmdLen = pbf.readVarint();
51546               cmd = cmdLen & 0x7;
51547               length = cmdLen >> 3;
51548           }
51549
51550           length--;
51551
51552           if (cmd === 1 || cmd === 2) {
51553               x += pbf.readSVarint();
51554               y += pbf.readSVarint();
51555
51556               if (cmd === 1) { // moveTo
51557                   if (line) lines.push(line);
51558                   line = [];
51559               }
51560
51561               line.push(new pointGeometry(x, y));
51562
51563           } else if (cmd === 7) {
51564
51565               // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
51566               if (line) {
51567                   line.push(line[0].clone()); // closePolygon
51568               }
51569
51570           } else {
51571               throw new Error('unknown command ' + cmd);
51572           }
51573       }
51574
51575       if (line) lines.push(line);
51576
51577       return lines;
51578   };
51579
51580   VectorTileFeature.prototype.bbox = function() {
51581       var pbf = this._pbf;
51582       pbf.pos = this._geometry;
51583
51584       var end = pbf.readVarint() + pbf.pos,
51585           cmd = 1,
51586           length = 0,
51587           x = 0,
51588           y = 0,
51589           x1 = Infinity,
51590           x2 = -Infinity,
51591           y1 = Infinity,
51592           y2 = -Infinity;
51593
51594       while (pbf.pos < end) {
51595           if (length <= 0) {
51596               var cmdLen = pbf.readVarint();
51597               cmd = cmdLen & 0x7;
51598               length = cmdLen >> 3;
51599           }
51600
51601           length--;
51602
51603           if (cmd === 1 || cmd === 2) {
51604               x += pbf.readSVarint();
51605               y += pbf.readSVarint();
51606               if (x < x1) x1 = x;
51607               if (x > x2) x2 = x;
51608               if (y < y1) y1 = y;
51609               if (y > y2) y2 = y;
51610
51611           } else if (cmd !== 7) {
51612               throw new Error('unknown command ' + cmd);
51613           }
51614       }
51615
51616       return [x1, y1, x2, y2];
51617   };
51618
51619   VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
51620       var size = this.extent * Math.pow(2, z),
51621           x0 = this.extent * x,
51622           y0 = this.extent * y,
51623           coords = this.loadGeometry(),
51624           type = VectorTileFeature.types[this.type],
51625           i, j;
51626
51627       function project(line) {
51628           for (var j = 0; j < line.length; j++) {
51629               var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
51630               line[j] = [
51631                   (p.x + x0) * 360 / size - 180,
51632                   360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
51633               ];
51634           }
51635       }
51636
51637       switch (this.type) {
51638       case 1:
51639           var points = [];
51640           for (i = 0; i < coords.length; i++) {
51641               points[i] = coords[i][0];
51642           }
51643           coords = points;
51644           project(coords);
51645           break;
51646
51647       case 2:
51648           for (i = 0; i < coords.length; i++) {
51649               project(coords[i]);
51650           }
51651           break;
51652
51653       case 3:
51654           coords = classifyRings(coords);
51655           for (i = 0; i < coords.length; i++) {
51656               for (j = 0; j < coords[i].length; j++) {
51657                   project(coords[i][j]);
51658               }
51659           }
51660           break;
51661       }
51662
51663       if (coords.length === 1) {
51664           coords = coords[0];
51665       } else {
51666           type = 'Multi' + type;
51667       }
51668
51669       var result = {
51670           type: "Feature",
51671           geometry: {
51672               type: type,
51673               coordinates: coords
51674           },
51675           properties: this.properties
51676       };
51677
51678       if ('id' in this) {
51679           result.id = this.id;
51680       }
51681
51682       return result;
51683   };
51684
51685   // classifies an array of rings into polygons with outer rings and holes
51686
51687   function classifyRings(rings) {
51688       var len = rings.length;
51689
51690       if (len <= 1) return [rings];
51691
51692       var polygons = [],
51693           polygon,
51694           ccw;
51695
51696       for (var i = 0; i < len; i++) {
51697           var area = signedArea(rings[i]);
51698           if (area === 0) continue;
51699
51700           if (ccw === undefined) ccw = area < 0;
51701
51702           if (ccw === area < 0) {
51703               if (polygon) polygons.push(polygon);
51704               polygon = [rings[i]];
51705
51706           } else {
51707               polygon.push(rings[i]);
51708           }
51709       }
51710       if (polygon) polygons.push(polygon);
51711
51712       return polygons;
51713   }
51714
51715   function signedArea(ring) {
51716       var sum = 0;
51717       for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
51718           p1 = ring[i];
51719           p2 = ring[j];
51720           sum += (p2.x - p1.x) * (p1.y + p2.y);
51721       }
51722       return sum;
51723   }
51724
51725   var vectortilelayer = VectorTileLayer;
51726
51727   function VectorTileLayer(pbf, end) {
51728       // Public
51729       this.version = 1;
51730       this.name = null;
51731       this.extent = 4096;
51732       this.length = 0;
51733
51734       // Private
51735       this._pbf = pbf;
51736       this._keys = [];
51737       this._values = [];
51738       this._features = [];
51739
51740       pbf.readFields(readLayer, this, end);
51741
51742       this.length = this._features.length;
51743   }
51744
51745   function readLayer(tag, layer, pbf) {
51746       if (tag === 15) layer.version = pbf.readVarint();
51747       else if (tag === 1) layer.name = pbf.readString();
51748       else if (tag === 5) layer.extent = pbf.readVarint();
51749       else if (tag === 2) layer._features.push(pbf.pos);
51750       else if (tag === 3) layer._keys.push(pbf.readString());
51751       else if (tag === 4) layer._values.push(readValueMessage(pbf));
51752   }
51753
51754   function readValueMessage(pbf) {
51755       var value = null,
51756           end = pbf.readVarint() + pbf.pos;
51757
51758       while (pbf.pos < end) {
51759           var tag = pbf.readVarint() >> 3;
51760
51761           value = tag === 1 ? pbf.readString() :
51762               tag === 2 ? pbf.readFloat() :
51763               tag === 3 ? pbf.readDouble() :
51764               tag === 4 ? pbf.readVarint64() :
51765               tag === 5 ? pbf.readVarint() :
51766               tag === 6 ? pbf.readSVarint() :
51767               tag === 7 ? pbf.readBoolean() : null;
51768       }
51769
51770       return value;
51771   }
51772
51773   // return feature `i` from this layer as a `VectorTileFeature`
51774   VectorTileLayer.prototype.feature = function(i) {
51775       if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
51776
51777       this._pbf.pos = this._features[i];
51778
51779       var end = this._pbf.readVarint() + this._pbf.pos;
51780       return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values);
51781   };
51782
51783   var vectortile = VectorTile;
51784
51785   function VectorTile(pbf, end) {
51786       this.layers = pbf.readFields(readTile, {}, end);
51787   }
51788
51789   function readTile(tag, layers, pbf) {
51790       if (tag === 3) {
51791           var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos);
51792           if (layer.length) layers[layer.name] = layer;
51793       }
51794   }
51795
51796   var VectorTile$1 = vectortile;
51797   var VectorTileFeature$1 = vectortilefeature;
51798   var VectorTileLayer$1 = vectortilelayer;
51799
51800   var vectorTile = {
51801         VectorTile: VectorTile$1,
51802         VectorTileFeature: VectorTileFeature$1,
51803         VectorTileLayer: VectorTileLayer$1
51804   };
51805
51806   var tiler$4 = utilTiler().tileSize(512).margin(1);
51807   var dispatch$5 = dispatch('loadedData');
51808   var _vtCache;
51809
51810
51811   function abortRequest$4(i) {
51812       i.abort();
51813   }
51814
51815
51816   function vtToGeoJSON(data, tile, mergeCache) {
51817       var vectorTile$$1 = new vectorTile.VectorTile(new pbf(data.response));
51818       var layers = Object.keys(vectorTile$$1.layers);
51819       if (!Array.isArray(layers)) { layers = [layers]; }
51820
51821       var features = [];
51822       layers.forEach(function(layerID) {
51823           var layer = vectorTile$$1.layers[layerID];
51824           if (layer) {
51825               for (var i = 0; i < layer.length; i++) {
51826                   var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
51827                   var geometry = feature.geometry;
51828
51829                   // Treat all Polygons as MultiPolygons
51830                   if (geometry.type === 'Polygon') {
51831                       geometry.type = 'MultiPolygon';
51832                       geometry.coordinates = [geometry.coordinates];
51833                   }
51834
51835                   // Clip to tile bounds
51836                   if (geometry.type === 'MultiPolygon') {
51837                       var isClipped = false;
51838                       var featureClip = turf_bboxClip(feature, tile.extent.rectangle());
51839                       if (!isEqual(feature.geometry, featureClip.geometry)) {
51840                           // feature = featureClip;
51841                           isClipped = true;
51842                       }
51843                       if (!feature.geometry.coordinates.length) continue;   // not actually on this tile
51844                       if (!feature.geometry.coordinates[0].length) continue;   // not actually on this tile
51845                   }
51846
51847                   // Generate some unique IDs and add some metadata
51848                   var featurehash = utilHashcode(fastJsonStableStringify(feature));
51849                   var propertyhash = utilHashcode(fastJsonStableStringify(feature.properties || {}));
51850                   feature.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, '_');
51851                   feature.__featurehash__ = featurehash;
51852                   feature.__propertyhash__ = propertyhash;
51853                   features.push(feature);
51854
51855                   // Clipped Polygons at same zoom with identical properties can get merged
51856                   if (isClipped && geometry.type === 'MultiPolygon') {
51857                       var merged = mergeCache[propertyhash];
51858                       if (merged && merged.length) {
51859                           var other = merged[0];
51860                           var coords = martinez.union(
51861                               feature.geometry.coordinates, other.geometry.coordinates
51862                           );
51863
51864                           if (!coords || !coords.length) {
51865                               continue;  // something failed in martinez union
51866                           }
51867
51868                           merged.push(feature);
51869                           for (var j = 0; j < merged.length; j++) {      // all these features get...
51870                               merged[j].geometry.coordinates = coords;   // same coords
51871                               merged[j].__featurehash__ = featurehash;   // same hash, so deduplication works
51872                           }
51873                       } else {
51874                           mergeCache[propertyhash] = [feature];
51875                       }
51876                   }
51877               }
51878           }
51879       });
51880
51881       return features;
51882   }
51883
51884
51885   function loadTile(source, tile) {
51886       if (source.loaded[tile.id] || source.inflight[tile.id]) return;
51887
51888       var url = source.template
51889           .replace('{x}', tile.xyz[0])
51890           .replace('{y}', tile.xyz[1])
51891           // TMS-flipped y coordinate
51892           .replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1)
51893           .replace(/\{z(oom)?\}/, tile.xyz[2])
51894           .replace(/\{switch:([^}]+)\}/, function(s, r) {
51895               var subdomains = r.split(',');
51896               return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
51897           });
51898
51899       source.inflight[tile.id] = request(url)
51900           .responseType('arraybuffer')
51901           .get(function(err, data) {
51902               source.loaded[tile.id] = [];
51903               delete source.inflight[tile.id];
51904               if (err || !data) return;
51905
51906               var z = tile.xyz[2];
51907               if (!source.canMerge[z]) {
51908                   source.canMerge[z] = {};  // initialize mergeCache
51909               }
51910
51911               source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
51912               dispatch$5.call('loadedData');
51913           });
51914   }
51915
51916
51917   var serviceVectorTile = {
51918
51919       init: function() {
51920           if (!_vtCache) {
51921               this.reset();
51922           }
51923
51924           this.event = utilRebind(this, dispatch$5, 'on');
51925       },
51926
51927
51928       reset: function() {
51929           for (var sourceID in _vtCache) {
51930               var source = _vtCache[sourceID];
51931               if (source && source.inflight) {
51932                   forEach(source.inflight, abortRequest$4);
51933               }
51934           }
51935
51936           _vtCache = {};
51937       },
51938
51939
51940       addSource: function(sourceID, template) {
51941           _vtCache[sourceID] = { template: template, inflight: {}, loaded: {}, canMerge: {} };
51942           return _vtCache[sourceID];
51943       },
51944
51945
51946       data: function(sourceID, projection) {
51947           var source = _vtCache[sourceID];
51948           if (!source) return [];
51949
51950           var tiles = tiler$4.getTiles(projection);
51951           var seen = {};
51952           var results = [];
51953
51954           for (var i = 0; i < tiles.length; i++) {
51955               var features = source.loaded[tiles[i].id];
51956               if (!features || !features.length) continue;
51957
51958               for (var j = 0; j < features.length; j++) {
51959                   var feature = features[j];
51960                   var hash = feature.__featurehash__;
51961                   if (seen[hash]) continue;
51962                   seen[hash] = true;
51963
51964                   // return a shallow clone, because the hash may change
51965                   // later if this feature gets merged with another
51966                   results.push(clone(feature));
51967               }
51968           }
51969
51970           return results;
51971       },
51972
51973
51974       loadTiles: function(sourceID, template, projection) {
51975           var source = _vtCache[sourceID];
51976           if (!source) {
51977               source = this.addSource(sourceID, template);
51978           }
51979
51980           var tiles = tiler$4.getTiles(projection);
51981
51982           // abort inflight requests that are no longer needed
51983           forEach(source.inflight, function(v, k) {
51984               var wanted = find$1(tiles, function(tile) { return k === tile.id; });
51985
51986               if (!wanted) {
51987                   abortRequest$4(v);
51988                   delete source.inflight[k];
51989               }
51990           });
51991
51992           tiles.forEach(function(tile) {
51993               loadTile(source, tile);
51994           });
51995       },
51996
51997
51998       cache: function() {
51999           return _vtCache;
52000       }
52001
52002   };
52003
52004   var endpoint = 'https://www.wikidata.org/w/api.php?';
52005   var _wikidataCache = {};
52006
52007   var serviceWikidata = {
52008
52009       init: function() {},
52010
52011       reset: function() {
52012           _wikidataCache = {};
52013       },
52014
52015
52016       // Given a Wikipedia language and article title, return an array of
52017       // corresponding Wikidata entities.
52018       itemsByTitle: function(lang, title, callback) {
52019           if (!title) {
52020               callback('', {});
52021               return;
52022           }
52023
52024           lang = lang || 'en';
52025           d3_json(endpoint + utilQsString({
52026               action: 'wbgetentities',
52027               format: 'json',
52028               sites: lang.replace(/-/g, '_') + 'wiki',
52029               titles: title,
52030               languages: 'en', // shrink response by filtering to one language
52031               origin: '*'
52032           }), function(err, data) {
52033               if (err || !data || data.error) {
52034                   callback('', {});
52035               } else {
52036                   callback(title, data.entities || {});
52037               }
52038           });
52039       },
52040
52041       entityByQID: function(qid, callback) {
52042           if (!qid) {
52043               callback('', {});
52044               return;
52045           }
52046           if (_wikidataCache[qid]) {
52047               callback('', _wikidataCache[qid]);
52048               return;
52049           }
52050
52051           var lang = currentLocale.replace(/-/g, '_');
52052
52053           d3_json(endpoint + utilQsString({
52054               action: 'wbgetentities',
52055               format: 'json',
52056               ids: qid,
52057               props: /*sitelinks|*/'labels|descriptions',
52058               //sitefilter: lang + 'wiki',
52059               languages: lang,
52060               languagefallback: 1,
52061               origin: '*'
52062           }), function(err, data) {
52063               if (err || !data || data.error) {
52064                   callback('', {});
52065               } else {
52066                   _wikidataCache[qid] = data.entities[qid];
52067                   callback(qid, data.entities[qid] || {});
52068               }
52069           });
52070       }
52071
52072   };
52073
52074   var endpoint$1 = 'https://en.wikipedia.org/w/api.php?';
52075
52076   var serviceWikipedia = {
52077
52078       init: function() {},
52079       reset: function() {},
52080
52081
52082       search: function(lang, query, callback) {
52083           if (!query) {
52084               callback('', []);
52085               return;
52086           }
52087
52088           lang = lang || 'en';
52089           d3_json(endpoint$1.replace('en', lang) +
52090               utilQsString({
52091                   action: 'query',
52092                   list: 'search',
52093                   srlimit: '10',
52094                   srinfo: 'suggestion',
52095                   format: 'json',
52096                   origin: '*',
52097                   srsearch: query
52098               }), function(err, data) {
52099                   if (err || !data || !data.query || !data.query.search || data.error) {
52100                       callback('', []);
52101                   } else {
52102                       var results = data.query.search.map(function(d) { return d.title; });
52103                       callback(query, results);
52104                   }
52105               }
52106           );
52107       },
52108
52109
52110       suggestions: function(lang, query, callback) {
52111           if (!query) {
52112               callback('', []);
52113               return;
52114           }
52115
52116           lang = lang || 'en';
52117           d3_json(endpoint$1.replace('en', lang) +
52118               utilQsString({
52119                   action: 'opensearch',
52120                   namespace: 0,
52121                   suggest: '',
52122                   format: 'json',
52123                   origin: '*',
52124                   search: query
52125               }), function(err, data) {
52126                   if (err || !data || data.error) {
52127                       callback('', []);
52128                   } else {
52129                       callback(data[0], data[1] || []);
52130                   }
52131               }
52132           );
52133       },
52134
52135
52136       translations: function(lang, title, callback) {
52137           if (!title) {
52138               callback({});
52139               return;
52140           }
52141
52142           d3_json(endpoint$1.replace('en', lang) +
52143               utilQsString({
52144                   action: 'query',
52145                   prop: 'langlinks',
52146                   format: 'json',
52147                   origin: '*',
52148                   lllimit: 500,
52149                   titles: title
52150               }), function(err, data) {
52151                   if (err || !data || !data.query || !data.query.pages || data.error) {
52152                       callback({});
52153                   } else {
52154                       var list = data.query.pages[Object.keys(data.query.pages)[0]],
52155                           translations = {};
52156                       if (list && list.langlinks) {
52157                           list.langlinks.forEach(function(d) {
52158                               translations[d.lang] = d['*'];
52159                           });
52160                       }
52161                       callback(translations);
52162                   }
52163               }
52164           );
52165       }
52166
52167   };
52168
52169   var services = {
52170       geocoder: serviceNominatim,
52171       mapillary: serviceMapillary,
52172       openstreetcam: serviceOpenstreetcam,
52173       osm: serviceOsm,
52174       streetside: serviceStreetside,
52175       taginfo: serviceTaginfo,
52176       vectorTile: serviceVectorTile,
52177       wikidata: serviceWikidata,
52178       wikipedia: serviceWikipedia
52179   };
52180
52181   function modeAddNote$$1(context) {
52182       var mode = {
52183           id: 'add-note',
52184           button: 'note',
52185           title: t('modes.add_note.title'),
52186           description: t('modes.add_note.description'),
52187           key: '4'
52188       };
52189
52190       var behavior = behaviorDraw(context)
52191           .tail(t('modes.add_note.tail'))
52192           .on('click', add)
52193           .on('cancel', cancel)
52194           .on('finish', cancel);
52195
52196
52197       function add(loc) {
52198           var osm = services.osm;
52199           if (!osm) return;
52200
52201           var note = osmNote({ loc: loc, status: 'open', comments: [] });
52202           osm.replaceNote(note);
52203
52204           // force a reraw (there is no history change that would otherwise do this)
52205           context.pan([0,0]);
52206
52207           context
52208               .selectedNoteID(note.id)
52209               .enter(modeSelectNote$$1(context, note.id).newFeature(true));
52210       }
52211
52212
52213       function cancel() {
52214           context.enter(modeBrowse(context));
52215       }
52216
52217
52218       mode.enter = function() {
52219           context.install(behavior);
52220       };
52221
52222
52223       mode.exit = function() {
52224           context.uninstall(behavior);
52225       };
52226
52227
52228       return mode;
52229   }
52230
52231   /* Built-in method references for those with the same name as other `lodash` methods. */
52232   var nativeMin$1 = Math.min;
52233
52234   /**
52235    * The base implementation of methods like `_.intersection`, without support
52236    * for iteratee shorthands, that accepts an array of arrays to inspect.
52237    *
52238    * @private
52239    * @param {Array} arrays The arrays to inspect.
52240    * @param {Function} [iteratee] The iteratee invoked per element.
52241    * @param {Function} [comparator] The comparator invoked per element.
52242    * @returns {Array} Returns the new array of shared values.
52243    */
52244   function baseIntersection(arrays, iteratee, comparator) {
52245     var includes = comparator ? arrayIncludesWith : arrayIncludes,
52246         length = arrays[0].length,
52247         othLength = arrays.length,
52248         othIndex = othLength,
52249         caches = Array(othLength),
52250         maxLength = Infinity,
52251         result = [];
52252
52253     while (othIndex--) {
52254       var array = arrays[othIndex];
52255       if (othIndex && iteratee) {
52256         array = arrayMap(array, baseUnary(iteratee));
52257       }
52258       maxLength = nativeMin$1(array.length, maxLength);
52259       caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
52260         ? new SetCache(othIndex && array)
52261         : undefined;
52262     }
52263     array = arrays[0];
52264
52265     var index = -1,
52266         seen = caches[0];
52267
52268     outer:
52269     while (++index < length && result.length < maxLength) {
52270       var value = array[index],
52271           computed = iteratee ? iteratee(value) : value;
52272
52273       value = (comparator || value !== 0) ? value : 0;
52274       if (!(seen
52275             ? cacheHas(seen, computed)
52276             : includes(result, computed, comparator)
52277           )) {
52278         othIndex = othLength;
52279         while (--othIndex) {
52280           var cache = caches[othIndex];
52281           if (!(cache
52282                 ? cacheHas(cache, computed)
52283                 : includes(arrays[othIndex], computed, comparator))
52284               ) {
52285             continue outer;
52286           }
52287         }
52288         if (seen) {
52289           seen.push(computed);
52290         }
52291         result.push(value);
52292       }
52293     }
52294     return result;
52295   }
52296
52297   /**
52298    * Casts `value` to an empty array if it's not an array like object.
52299    *
52300    * @private
52301    * @param {*} value The value to inspect.
52302    * @returns {Array|Object} Returns the cast array-like object.
52303    */
52304   function castArrayLikeObject(value) {
52305     return isArrayLikeObject(value) ? value : [];
52306   }
52307
52308   /**
52309    * Creates an array of unique values that are included in all given arrays
52310    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
52311    * for equality comparisons. The order and references of result values are
52312    * determined by the first array.
52313    *
52314    * @static
52315    * @memberOf _
52316    * @since 0.1.0
52317    * @category Array
52318    * @param {...Array} [arrays] The arrays to inspect.
52319    * @returns {Array} Returns the new array of intersecting values.
52320    * @example
52321    *
52322    * _.intersection([2, 1], [2, 3]);
52323    * // => [2]
52324    */
52325   var intersection = baseRest(function(arrays) {
52326     var mapped = arrayMap(arrays, castArrayLikeObject);
52327     return (mapped.length && mapped[0] === arrays[0])
52328       ? baseIntersection(mapped)
52329       : [];
52330   });
52331
52332   function modeDragNode$$1(context) {
52333       var mode = {
52334           id: 'drag-node',
52335           button: 'browse'
52336       };
52337       var hover = behaviorHover(context).altDisables(true)
52338           .on('hover', context.ui().sidebar.hover);
52339       var edit = behaviorEdit(context);
52340
52341       var _nudgeInterval;
52342       var _restoreSelectedIDs = [];
52343       var _wasMidpoint = false;
52344       var _isCancelled = false;
52345       var _activeEntity;
52346       var _startLoc;
52347       var _lastLoc;
52348
52349
52350       function startNudge(entity, nudge) {
52351           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
52352           _nudgeInterval = window.setInterval(function() {
52353               context.pan(nudge);
52354               doMove(entity, nudge);
52355           }, 50);
52356       }
52357
52358
52359       function stopNudge() {
52360           if (_nudgeInterval) {
52361               window.clearInterval(_nudgeInterval);
52362               _nudgeInterval = null;
52363           }
52364       }
52365
52366
52367       function moveAnnotation(entity) {
52368           return t('operations.move.annotation.' + entity.geometry(context.graph()));
52369       }
52370
52371
52372       function connectAnnotation(nodeEntity, targetEntity) {
52373           var nodeGeometry = nodeEntity.geometry(context.graph());
52374           var targetGeometry = targetEntity.geometry(context.graph());
52375           if (nodeGeometry === 'vertex' && targetGeometry === 'vertex') {
52376               var nodeParentWayIDs = context.graph().parentWays(nodeEntity);
52377               var targetParentWayIDs = context.graph().parentWays(targetEntity);
52378               var sharedParentWays = intersection(nodeParentWayIDs, targetParentWayIDs);
52379               // if both vertices are part of the same way
52380               if (sharedParentWays.length !== 0) {
52381                   // if the nodes are next to each other, they are merged
52382                   if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) {
52383                       return t('operations.connect.annotation.from_vertex.to_adjacent_vertex');
52384                   }
52385                   return t('operations.connect.annotation.from_vertex.to_sibling_vertex');
52386               }
52387           }
52388           return t('operations.connect.annotation.from_' + nodeGeometry + '.to_' + targetGeometry);
52389       }
52390
52391
52392       function origin(entity) {
52393           return context.projection(entity.loc);
52394       }
52395
52396
52397       function keydown() {
52398           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
52399               if (context.surface().classed('nope')) {
52400                   context.surface()
52401                       .classed('nope-suppressed', true);
52402               }
52403               context.surface()
52404                   .classed('nope', false)
52405                   .classed('nope-disabled', true);
52406           }
52407       }
52408
52409
52410       function keyup() {
52411           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
52412               if (context.surface().classed('nope-suppressed')) {
52413                   context.surface()
52414                       .classed('nope', true);
52415               }
52416               context.surface()
52417                   .classed('nope-suppressed', false)
52418                   .classed('nope-disabled', false);
52419           }
52420       }
52421
52422
52423       function start(entity) {
52424           _wasMidpoint = entity.type === 'midpoint';
52425           var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
52426           _isCancelled = event.sourceEvent.shiftKey || hasHidden;
52427
52428
52429           if (_isCancelled) {
52430               if (hasHidden) {
52431                   uiFlash()
52432                       .duration(4000)
52433                       .text(t('modes.drag_node.connected_to_hidden'))();
52434               }
52435               return drag.cancel();
52436           }
52437
52438           if (_wasMidpoint) {
52439               var midpoint = entity;
52440               entity = osmNode();
52441               context.perform(actionAddMidpoint(midpoint, entity));
52442               entity = context.entity(entity.id);   // get post-action entity
52443
52444               var vertex = context.surface().selectAll('.' + entity.id);
52445               drag.target(vertex.node(), entity);
52446
52447           } else {
52448               context.perform(actionNoop());
52449           }
52450
52451           _activeEntity = entity;
52452           _startLoc = entity.loc;
52453
52454           context.surface().selectAll('.' + _activeEntity.id)
52455               .classed('active', true);
52456
52457           context.enter(mode);
52458       }
52459
52460
52461       // related code
52462       // - `behavior/draw.js` `datum()`
52463       function datum() {
52464           var event$$1 = event && event.sourceEvent;
52465           if (!event$$1 || event$$1.altKey) {
52466               return {};
52467           } else {
52468               // When dragging, snap only to touch targets..
52469               // (this excludes area fills and active drawing elements)
52470               var d = event$$1.target.__data__;
52471               return (d && d.properties && d.properties.target) ? d : {};
52472           }
52473       }
52474
52475
52476       function doMove(entity, nudge) {
52477           nudge = nudge || [0, 0];
52478
52479           var currPoint = (event && event.point) || context.projection(_lastLoc);
52480           var currMouse = geoVecSubtract(currPoint, nudge);
52481           var loc = context.projection.invert(currMouse);
52482
52483           if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
52484               // related code
52485               // - `mode/drag_node.js`     `doMode()`
52486               // - `behavior/draw.js`      `click()`
52487               // - `behavior/draw_way.js`  `move()`
52488               var d = datum();
52489               var target = d && d.properties && d.properties.entity;
52490               var targetLoc = target && target.loc;
52491               var targetNodes = d && d.properties && d.properties.nodes;
52492               var edge;
52493
52494               if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
52495                   loc = targetLoc;
52496
52497               } else if (targetNodes) {   // snap to way - a line target with `.nodes`
52498                   edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
52499                   if (edge) {
52500                       loc = edge.loc;
52501                   }
52502               }
52503           }
52504
52505           context.replace(
52506               actionMoveNode(entity.id, loc),
52507               moveAnnotation(entity)
52508           );
52509
52510           // Below here: validations
52511           var isInvalid = false;
52512
52513           // Check if this connection to `target` could cause relations to break..
52514           if (target) {
52515               isInvalid = hasRelationConflict(entity, target, edge, context.graph());
52516           }
52517
52518           // Check if this drag causes the geometry to break..
52519           if (!isInvalid) {
52520               isInvalid = hasInvalidGeometry(entity, context.graph());
52521           }
52522
52523
52524           var nope = context.surface().classed('nope');
52525           if (isInvalid === 'relation' || isInvalid === 'restriction') {
52526               if (!nope) {   // about to nope - show hint
52527                   uiFlash()
52528                       .duration(4000)
52529                       .text(t('operations.connect.' + isInvalid,
52530                           { relation: context.presets().item('type/restriction').name() }
52531                       ))();
52532               }
52533           } else {
52534               if (nope) {   // about to un-nope, remove hint
52535                   uiFlash()
52536                       .duration(1)
52537                       .text('')();
52538               }
52539           }
52540
52541
52542           var nopeDisabled = context.surface().classed('nope-disabled');
52543           if (nopeDisabled) {
52544               context.surface()
52545                   .classed('nope', false)
52546                   .classed('nope-suppressed', isInvalid);
52547           } else {
52548               context.surface()
52549                   .classed('nope', isInvalid)
52550                   .classed('nope-suppressed', false);
52551           }
52552
52553           _lastLoc = loc;
52554       }
52555
52556
52557       // Uses `actionConnect.disabled()` to know whether this connection is ok..
52558       function hasRelationConflict(entity, target, edge, graph) {
52559           var testGraph = graph.update();  // copy
52560
52561           // if snapping to way - add midpoint there and consider that the target..
52562           if (edge) {
52563               var midpoint = osmNode();
52564               var action = actionAddMidpoint({
52565                   loc: edge.loc,
52566                   edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
52567               }, midpoint);
52568
52569               testGraph = action(testGraph);
52570               target = midpoint;
52571           }
52572
52573           // can we connect to it?
52574           var ids = [entity.id, target.id];
52575           return actionConnect(ids).disabled(testGraph);
52576       }
52577
52578
52579       function hasInvalidGeometry(entity, graph) {
52580           var parents = graph.parentWays(entity);
52581           var i, j, k;
52582
52583           for (i = 0; i < parents.length; i++) {
52584               var parent = parents[i];
52585               var nodes = [];
52586               var activeIndex = null;    // which multipolygon ring contains node being dragged
52587
52588               // test any parent multipolygons for valid geometry
52589               var relations = graph.parentRelations(parent);
52590               for (j = 0; j < relations.length; j++) {
52591                   if (!relations[j].isMultipolygon()) continue;
52592
52593                   var rings = osmJoinWays(relations[j].members, graph);
52594
52595                   // find active ring and test it for self intersections
52596                   for (k = 0; k < rings.length; k++) {
52597                       nodes = rings[k].nodes;
52598                       if (find$1(nodes, function(n) { return n.id === entity.id; })) {
52599                           activeIndex = k;
52600                           if (geoHasSelfIntersections(nodes, entity.id)) {
52601                               return true;
52602                           }
52603                       }
52604                       rings[k].coords = nodes.map(function(n) { return n.loc; });
52605                   }
52606
52607                   // test active ring for intersections with other rings in the multipolygon
52608                   for (k = 0; k < rings.length; k++) {
52609                       if (k === activeIndex) continue;
52610
52611                       // make sure active ring doesnt cross passive rings
52612                       if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
52613                           return true;
52614                       }
52615                   }
52616               }
52617
52618
52619               // If we still haven't tested this node's parent way for self-intersections.
52620               // (because it's not a member of a multipolygon), test it now.
52621               if (activeIndex === null) {
52622                   nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
52623                   if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
52624                       return true;
52625                   }
52626               }
52627
52628           }
52629
52630           return false;
52631       }
52632
52633
52634       function move(entity) {
52635           if (_isCancelled) return;
52636           event.sourceEvent.stopPropagation();
52637
52638           context.surface().classed('nope-disabled', event.sourceEvent.altKey);
52639
52640           _lastLoc = context.projection.invert(event.point);
52641
52642           doMove(entity);
52643           var nudge = geoViewportEdge(event.point, context.map().dimensions());
52644           if (nudge) {
52645               startNudge(entity, nudge);
52646           } else {
52647               stopNudge();
52648           }
52649       }
52650
52651
52652       function end(entity) {
52653           if (_isCancelled) return;
52654
52655           var d = datum();
52656           var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
52657           var target = d && d.properties && d.properties.entity;   // entity to snap to
52658
52659           if (nope) {   // bounce back
52660               context.perform(
52661                   _actionBounceBack(entity.id, _startLoc)
52662               );
52663
52664           } else if (target && target.type === 'way') {
52665               var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
52666               context.replace(
52667                   actionAddMidpoint({
52668                       loc: choice.loc,
52669                       edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
52670                   }, entity),
52671                   connectAnnotation(entity, target)
52672               );
52673
52674           } else if (target && target.type === 'node') {
52675               context.replace(
52676                   actionConnect([target.id, entity.id]),
52677                   connectAnnotation(entity, target)
52678               );
52679
52680           } else if (_wasMidpoint) {
52681               context.replace(
52682                   actionNoop(),
52683                   t('operations.add.annotation.vertex')
52684               );
52685
52686           } else {
52687               context.replace(
52688                   actionNoop(),
52689                   moveAnnotation(entity)
52690               );
52691           }
52692
52693           var reselection = _restoreSelectedIDs.filter(function(id) {
52694               return context.graph().hasEntity(id);
52695           });
52696
52697           if (reselection.length) {
52698               context.enter(modeSelect(context, reselection));
52699           } else {
52700               context.enter(modeBrowse(context));
52701           }
52702       }
52703
52704
52705       function _actionBounceBack(nodeID, toLoc) {
52706           var moveNode = actionMoveNode(nodeID, toLoc);
52707           var action = function(graph, t$$1) {
52708               // last time through, pop off the bounceback perform.
52709               // it will then overwrite the initial perform with a moveNode that does nothing
52710               if (t$$1 === 1) context.pop();
52711               return moveNode(graph, t$$1);
52712           };
52713           action.transitionable = true;
52714           return action;
52715       }
52716
52717
52718       function cancel() {
52719           drag.cancel();
52720           context.enter(modeBrowse(context));
52721       }
52722
52723
52724       var drag = behaviorDrag()
52725           .selector('.layer-touch.points .target')
52726           .surface(select('#map').node())
52727           .origin(origin)
52728           .on('start', start)
52729           .on('move', move)
52730           .on('end', end);
52731
52732
52733       mode.enter = function() {
52734           context.install(hover);
52735           context.install(edit);
52736
52737           select(window)
52738               .on('keydown.drawWay', keydown)
52739               .on('keyup.drawWay', keyup);
52740
52741           context.history()
52742               .on('undone.drag-node', cancel);
52743       };
52744
52745
52746       mode.exit = function() {
52747           context.ui().sidebar.hover.cancel();
52748           context.uninstall(hover);
52749           context.uninstall(edit);
52750
52751           select(window)
52752               .on('keydown.hover', null)
52753               .on('keyup.hover', null);
52754
52755           context.history()
52756               .on('undone.drag-node', null);
52757
52758           _activeEntity = null;
52759
52760           context.surface()
52761               .classed('nope', false)
52762               .classed('nope-suppressed', false)
52763               .classed('nope-disabled', false)
52764               .selectAll('.active')
52765               .classed('active', false);
52766
52767           stopNudge();
52768       };
52769
52770
52771       mode.selectedIDs = function() {
52772           if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
52773           // no assign
52774           return mode;
52775       };
52776
52777
52778       mode.activeID = function() {
52779           if (!arguments.length) return _activeEntity && _activeEntity.id;
52780           // no assign
52781           return mode;
52782       };
52783
52784
52785       mode.restoreSelectedIDs = function(_) {
52786           if (!arguments.length) return _restoreSelectedIDs;
52787           _restoreSelectedIDs = _;
52788           return mode;
52789       };
52790
52791
52792       mode.behavior = drag;
52793
52794
52795       return mode;
52796   }
52797
52798   function modeDragNote$$1(context) {
52799       var mode = {
52800           id: 'drag-note',
52801           button: 'browse'
52802       };
52803
52804       var edit = behaviorEdit(context);
52805
52806       var _nudgeInterval;
52807       var _lastLoc;
52808
52809
52810       function startNudge(note, nudge) {
52811           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
52812           _nudgeInterval = window.setInterval(function() {
52813               context.pan(nudge);
52814               doMove(note, nudge);
52815           }, 50);
52816       }
52817
52818
52819       function stopNudge() {
52820           if (_nudgeInterval) {
52821               window.clearInterval(_nudgeInterval);
52822               _nudgeInterval = null;
52823           }
52824       }
52825
52826
52827       function origin(note) {
52828           return context.projection(note.loc);
52829       }
52830
52831
52832       function start(note) {
52833           context.surface().selectAll('.note-' + note.id)
52834               .classed('active', true);
52835
52836           context.perform(actionNoop());
52837           context.enter(mode);
52838           context.selectedNoteID(note.id);
52839       }
52840
52841
52842       function move(note) {
52843           event.sourceEvent.stopPropagation();
52844           _lastLoc = context.projection.invert(event.point);
52845
52846           doMove(note);
52847           var nudge = geoViewportEdge(event.point, context.map().dimensions());
52848           if (nudge) {
52849               startNudge(note, nudge);
52850           } else {
52851               stopNudge();
52852           }
52853       }
52854
52855
52856       function doMove(note, nudge) {
52857           nudge = nudge || [0, 0];
52858
52859           var currPoint = (event && event.point) || context.projection(_lastLoc);
52860           var currMouse = geoVecSubtract(currPoint, nudge);
52861           var loc = context.projection.invert(currMouse);
52862
52863           note = note.move(loc);
52864
52865           var osm = services.osm;
52866           if (osm) {
52867               osm.replaceNote(note);  // update note cache
52868           }
52869
52870           context.replace(actionNoop());   // trigger redraw
52871       }
52872
52873
52874       function end(note) {
52875           context.replace(actionNoop());   // trigger redraw
52876
52877           context
52878               .selectedNoteID(note.id)
52879               .enter(modeSelectNote$$1(context, note.id));
52880       }
52881
52882
52883       var drag = behaviorDrag()
52884           .selector('.layer-notes .new')
52885           .surface(select('#map').node())
52886           .origin(origin)
52887           .on('start', start)
52888           .on('move', move)
52889           .on('end', end);
52890
52891
52892       mode.enter = function() {
52893           context.install(edit);
52894       };
52895
52896
52897       mode.exit = function() {
52898           context.ui().sidebar.hover.cancel();
52899           context.uninstall(edit);
52900
52901           context.surface()
52902               .selectAll('.active')
52903               .classed('active', false);
52904
52905           stopNudge();
52906       };
52907
52908       mode.behavior = drag;
52909
52910       return mode;
52911   }
52912
52913   function modeBrowse(context) {
52914       var mode = {
52915           button: 'browse',
52916           id: 'browse',
52917           title: t('modes.browse.title'),
52918           description: t('modes.browse.description')
52919       }, sidebar;
52920
52921       var behaviors = [
52922           behaviorPaste(context),
52923           behaviorHover(context).on('hover', context.ui().sidebar.hover),
52924           behaviorSelect(context),
52925           behaviorLasso(context),
52926           modeDragNode$$1(context).behavior,
52927           modeDragNote$$1(context).behavior
52928       ];
52929
52930
52931       mode.enter = function() {
52932           behaviors.forEach(context.install);
52933
52934           // Get focus on the body.
52935           if (document.activeElement && document.activeElement.blur) {
52936               document.activeElement.blur();
52937           }
52938
52939           if (sidebar) {
52940               context.ui().sidebar.show(sidebar);
52941           } else {
52942               context.ui().sidebar.select(null);
52943           }
52944       };
52945
52946
52947       mode.exit = function() {
52948           context.ui().sidebar.hover.cancel();
52949           behaviors.forEach(context.uninstall);
52950
52951           if (sidebar) {
52952               context.ui().sidebar.hide();
52953           }
52954       };
52955
52956
52957       mode.sidebar = function(_) {
52958           if (!arguments.length) return sidebar;
52959           sidebar = _;
52960           return mode;
52961       };
52962
52963
52964       return mode;
52965   }
52966
52967   function modeDrawArea(context, wayId, startGraph) {
52968       var mode = {
52969           button: 'area',
52970           id: 'draw-area'
52971       };
52972
52973       var behavior;
52974
52975
52976       mode.enter = function() {
52977           var way = context.entity(wayId);
52978
52979           behavior = behaviorDrawWay(context, wayId, undefined, mode, startGraph)
52980               .tail(t('modes.draw_area.tail'));
52981
52982           var addNode = behavior.addNode;
52983
52984           behavior.addNode = function(node, d) {
52985               var length = way.nodes.length;
52986               var penultimate = length > 2 ? way.nodes[length - 2] : null;
52987
52988               if (node.id === way.first() || node.id === penultimate) {
52989                   behavior.finish();
52990               } else {
52991                   addNode(node, d);
52992               }
52993           };
52994
52995           context.install(behavior);
52996       };
52997
52998
52999       mode.exit = function() {
53000           context.uninstall(behavior);
53001       };
53002
53003
53004       mode.selectedIDs = function() {
53005           return [wayId];
53006       };
53007
53008
53009       mode.activeID = function() {
53010           return (behavior && behavior.activeID()) || [];
53011       };
53012
53013
53014       return mode;
53015   }
53016
53017   function modeDrawLine(context, wayID, startGraph, affix) {
53018       var mode = {
53019           button: 'line',
53020           id: 'draw-line'
53021       };
53022
53023       var behavior;
53024
53025
53026       mode.enter = function() {
53027           var way = context.entity(wayID);
53028           var index = (affix === 'prefix') ? 0 : undefined;
53029           var headID = (affix === 'prefix') ? way.first() : way.last();
53030
53031           behavior = behaviorDrawWay(context, wayID, index, mode, startGraph)
53032               .tail(t('modes.draw_line.tail'));
53033
53034           var addNode = behavior.addNode;
53035           behavior.addNode = function(node, d) {
53036               if (node.id === headID) {
53037                   behavior.finish();
53038               } else {
53039                   addNode(node, d);
53040               }
53041           };
53042
53043           context.install(behavior);
53044       };
53045
53046
53047       mode.exit = function() {
53048           context.uninstall(behavior);
53049       };
53050
53051
53052       mode.selectedIDs = function() {
53053           return [wayID];
53054       };
53055
53056
53057       mode.activeID = function() {
53058           return (behavior && behavior.activeID()) || [];
53059       };
53060
53061       return mode;
53062   }
53063
53064   function operationCircularize(selectedIDs, context) {
53065       var entityId = selectedIDs[0],
53066           entity = context.entity(entityId),
53067           extent = entity.extent(context.graph()),
53068           geometry = context.geometry(entityId),
53069           action = actionCircularize(entityId, context.projection);
53070
53071
53072       var operation = function() {
53073           context.perform(action, operation.annotation());
53074       };
53075
53076
53077       operation.available = function() {
53078           return selectedIDs.length === 1 &&
53079               entity.type === 'way' &&
53080               uniq(entity.nodes).length > 1;
53081       };
53082
53083
53084       operation.disabled = function() {
53085           var reason;
53086           if (extent.percentContainedIn(context.extent()) < 0.8) {
53087               reason = 'too_large';
53088           } else if (context.hasHiddenConnections(entityId)) {
53089               reason = 'connected_to_hidden';
53090           }
53091           return action.disabled(context.graph()) || reason;
53092       };
53093
53094
53095       operation.tooltip = function() {
53096           var disable = operation.disabled();
53097           return disable ?
53098               t('operations.circularize.' + disable) :
53099               t('operations.circularize.description.' + geometry);
53100       };
53101
53102
53103       operation.annotation = function() {
53104           return t('operations.circularize.annotation.' + geometry);
53105       };
53106
53107
53108       operation.id = 'circularize';
53109       operation.keys = [t('operations.circularize.key')];
53110       operation.title = t('operations.circularize.title');
53111       operation.behavior = behaviorOperation(context).which(operation);
53112
53113       return operation;
53114   }
53115
53116   function operationContinue(selectedIDs, context) {
53117       var graph = context.graph(),
53118           entities = selectedIDs.map(function(id) { return graph.entity(id); }),
53119           geometries = assignIn({ line: [], vertex: [] },
53120               groupBy(entities, function(entity) { return entity.geometry(graph); })),
53121           vertex = geometries.vertex[0];
53122
53123
53124       function candidateWays() {
53125           return graph.parentWays(vertex).filter(function(parent) {
53126               return parent.geometry(graph) === 'line' &&
53127                   !parent.isClosed() &&
53128                   parent.affix(vertex.id) &&
53129                   (geometries.line.length === 0 || geometries.line[0] === parent);
53130           });
53131       }
53132
53133
53134       var operation = function() {
53135           var candidate = candidateWays()[0];
53136           context.enter(
53137               modeDrawLine(context, candidate.id, context.graph(), candidate.affix(vertex.id))
53138           );
53139       };
53140
53141
53142       operation.available = function() {
53143           return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
53144               !context.features().hasHiddenConnections(vertex, context.graph());
53145       };
53146
53147
53148       operation.disabled = function() {
53149           var candidates = candidateWays();
53150           if (candidates.length === 0)
53151               return 'not_eligible';
53152           if (candidates.length > 1)
53153               return 'multiple';
53154       };
53155
53156
53157       operation.tooltip = function() {
53158           var disable = operation.disabled();
53159           return disable ?
53160               t('operations.continue.' + disable) :
53161               t('operations.continue.description');
53162       };
53163
53164
53165       operation.annotation = function() {
53166           return t('operations.continue.annotation.line');
53167       };
53168
53169
53170       operation.id = 'continue';
53171       operation.keys = [t('operations.continue.key')];
53172       operation.title = t('operations.continue.title');
53173       operation.behavior = behaviorOperation(context).which(operation);
53174
53175       return operation;
53176   }
53177
53178   function operationDelete(selectedIDs, context) {
53179       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
53180           action = actionDeleteMultiple(selectedIDs),
53181           extent = selectedIDs.reduce(function(extent, id) {
53182                   return extent.extend(context.entity(id).extent(context.graph()));
53183               }, geoExtent$$1());
53184
53185
53186       var operation = function() {
53187           var nextSelectedID;
53188           var nextSelectedLoc;
53189
53190           if (selectedIDs.length === 1) {
53191               var id = selectedIDs[0],
53192                   entity = context.entity(id),
53193                   geometry = context.geometry(id),
53194                   parents = context.graph().parentWays(entity),
53195                   parent = parents[0];
53196
53197               // Select the next closest node in the way.
53198               if (geometry === 'vertex') {
53199                   var nodes = parent.nodes,
53200                       i = nodes.indexOf(id);
53201
53202                   if (i === 0) {
53203                       i++;
53204                   } else if (i === nodes.length - 1) {
53205                       i--;
53206                   } else {
53207                       var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
53208                           b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
53209                       i = a < b ? i - 1 : i + 1;
53210                   }
53211
53212                   nextSelectedID = nodes[i];
53213                   nextSelectedLoc = context.entity(nextSelectedID).loc;
53214               }
53215           }
53216
53217           context.perform(action, operation.annotation());
53218
53219           if (nextSelectedID && nextSelectedLoc) {
53220               if (context.hasEntity(nextSelectedID)) {
53221                   context.enter(modeSelect(context, [nextSelectedID]).follow(true));
53222               } else {
53223                   context.map().centerEase(nextSelectedLoc);
53224                   context.enter(modeBrowse(context));
53225               }
53226           } else {
53227               context.enter(modeBrowse(context));
53228           }
53229
53230       };
53231
53232
53233       operation.available = function() {
53234           return true;
53235       };
53236
53237
53238       operation.disabled = function() {
53239           var reason;
53240           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
53241               reason = 'too_large';
53242           } else if (some(selectedIDs, context.hasHiddenConnections)) {
53243               reason = 'connected_to_hidden';
53244           } else if (some(selectedIDs, protectedMember)) {
53245               reason = 'part_of_relation';
53246           } else if (some(selectedIDs, incompleteRelation)) {
53247               reason = 'incomplete_relation';
53248           }
53249           return reason;
53250
53251           function incompleteRelation(id) {
53252               var entity = context.entity(id);
53253               return entity.type === 'relation' && !entity.isComplete(context.graph());
53254           }
53255
53256           function protectedMember(id) {
53257               var entity = context.entity(id);
53258               if (entity.type !== 'way') return false;
53259
53260               var parents = context.graph().parentRelations(entity);
53261               for (var i = 0; i < parents.length; i++) {
53262                   var parent = parents[i],
53263                       type = parent.tags.type,
53264                       role = parent.memberById(id).role || 'outer';
53265                   if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
53266                       return true;
53267                   }
53268               }
53269               return false;
53270           }
53271
53272       };
53273
53274
53275       operation.tooltip = function() {
53276           var disable = operation.disabled();
53277           return disable ?
53278               t('operations.delete.' + disable + '.' + multi) :
53279               t('operations.delete.description' + '.' + multi);
53280       };
53281
53282
53283       operation.annotation = function() {
53284           return selectedIDs.length === 1 ?
53285               t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
53286               t('operations.delete.annotation.multiple', { n: selectedIDs.length });
53287       };
53288
53289
53290       operation.id = 'delete';
53291       operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
53292       operation.title = t('operations.delete.title');
53293       operation.behavior = behaviorOperation(context).which(operation);
53294
53295       return operation;
53296   }
53297
53298   function operationDisconnect(selectedIDs, context) {
53299       var vertices = filter(selectedIDs, function(entityId) {
53300           return context.geometry(entityId) === 'vertex';
53301       });
53302
53303       var entityId = vertices[0],
53304           action = actionDisconnect(entityId);
53305
53306       if (selectedIDs.length > 1) {
53307           action.limitWays(without(selectedIDs, entityId));
53308       }
53309
53310
53311       var operation = function() {
53312           context.perform(action, operation.annotation());
53313       };
53314
53315
53316       operation.available = function() {
53317           return vertices.length === 1;
53318       };
53319
53320
53321       operation.disabled = function() {
53322           var reason;
53323           if (some(selectedIDs, context.hasHiddenConnections)) {
53324               reason = 'connected_to_hidden';
53325           }
53326           return action.disabled(context.graph()) || reason;
53327       };
53328
53329
53330       operation.tooltip = function() {
53331           var disable = operation.disabled();
53332           return disable ?
53333               t('operations.disconnect.' + disable) :
53334               t('operations.disconnect.description');
53335       };
53336
53337
53338       operation.annotation = function() {
53339           return t('operations.disconnect.annotation');
53340       };
53341
53342
53343       operation.id = 'disconnect';
53344       operation.keys = [t('operations.disconnect.key')];
53345       operation.title = t('operations.disconnect.title');
53346       operation.behavior = behaviorOperation(context).which(operation);
53347
53348       return operation;
53349   }
53350
53351   function operationMerge(selectedIDs, context) {
53352
53353       function updatePresetTags(newGraph, ids) {
53354           var id = ids[0];
53355           var newEntity = newGraph.hasEntity(id);
53356
53357           if (!newEntity) return;
53358           var newPreset = context.presets().match(newEntity, newGraph);
53359           context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
53360       }
53361
53362
53363       var join = actionJoin(selectedIDs);
53364       var merge = actionMerge(selectedIDs);
53365       var mergePolygon = actionMergePolygon(selectedIDs);
53366       var mergeNodes = actionMergeNodes(selectedIDs);
53367
53368
53369       var operation = function() {
53370           var doUpdateTags;
53371           var action;
53372
53373           if (!join.disabled(context.graph())) {
53374               doUpdateTags = false;
53375               action = join;
53376           } else if (!merge.disabled(context.graph())) {
53377               doUpdateTags = true;
53378               action = merge;
53379           } else if (!mergePolygon.disabled(context.graph())) {
53380               doUpdateTags = false;
53381               action = mergePolygon;
53382           } else {
53383               doUpdateTags = true;
53384               action = mergeNodes;
53385           }
53386
53387           context.perform(action, operation.annotation());
53388
53389           var ids = selectedIDs.filter(function(id) {
53390               var entity = context.hasEntity(id);
53391               return entity && entity.type !== 'node';
53392           });
53393
53394           // if we merged tags, rematch preset to update tags if necessary (#3851)
53395           if (doUpdateTags) {
53396               updatePresetTags(context.graph(), ids);
53397           }
53398
53399           context.enter(modeSelect(context, ids));
53400       };
53401
53402
53403       operation.available = function() {
53404           return selectedIDs.length >= 2;
53405       };
53406
53407
53408       operation.disabled = function() {
53409           return join.disabled(context.graph()) &&
53410               merge.disabled(context.graph()) &&
53411               mergePolygon.disabled(context.graph()) &&
53412               mergeNodes.disabled(context.graph());
53413       };
53414
53415
53416       operation.tooltip = function() {
53417           var j = join.disabled(context.graph());          // 'not_eligible', 'not_adjacent', 'restriction', 'conflicting_tags'
53418           var m = merge.disabled(context.graph());         // 'not_eligible'
53419           var p = mergePolygon.disabled(context.graph());  // 'not_eligible', 'incomplete_relation'
53420           var n = mergeNodes.disabled(context.graph());    // 'not_eligible', 'relation', 'restriction'
53421
53422           // disabled for one of various reasons
53423           if (j && m && p && n) {
53424               if (j === 'restriction' || n === 'restriction') {
53425                   return t('operations.merge.restriction',
53426                       { relation: context.presets().item('type/restriction').name() });
53427
53428               } else if (p === 'incomplete_relation') {
53429                   return t('operations.merge.incomplete_relation');
53430
53431               } else if (n === 'relation') {
53432                   return t('operations.merge.relation');
53433
53434               } else {
53435                   return t('operations.merge.' + j);
53436               }
53437
53438           } else {
53439               return t('operations.merge.description');
53440           }
53441       };
53442
53443
53444       operation.annotation = function() {
53445           return t('operations.merge.annotation', { n: selectedIDs.length });
53446       };
53447
53448
53449       operation.id = 'merge';
53450       operation.keys = [t('operations.merge.key')];
53451       operation.title = t('operations.merge.title');
53452       operation.behavior = behaviorOperation(context).which(operation);
53453
53454       return operation;
53455   }
53456
53457   function operationMove(selectedIDs, context) {
53458       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
53459       var extent = selectedIDs.reduce(function(extent, id) {
53460           return extent.extend(context.entity(id).extent(context.graph()));
53461       }, geoExtent$$1());
53462
53463
53464       var operation = function() {
53465           context.enter(modeMove$$1(context, selectedIDs));
53466       };
53467
53468
53469       operation.available = function() {
53470           return selectedIDs.length > 1 ||
53471               context.entity(selectedIDs[0]).type !== 'node';
53472       };
53473
53474
53475       operation.disabled = function() {
53476           var reason;
53477           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
53478               reason = 'too_large';
53479           } else if (some(selectedIDs, context.hasHiddenConnections)) {
53480               reason = 'connected_to_hidden';
53481           } else if (some(selectedIDs, incompleteRelation)) {
53482               reason = 'incomplete_relation';
53483           }
53484           return reason;
53485
53486           function incompleteRelation(id) {
53487               var entity = context.entity(id);
53488               return entity.type === 'relation' && !entity.isComplete(context.graph());
53489           }
53490       };
53491
53492
53493       operation.tooltip = function() {
53494           var disable = operation.disabled();
53495           return disable ?
53496               t('operations.move.' + disable + '.' + multi) :
53497               t('operations.move.description.' + multi);
53498       };
53499
53500
53501       operation.annotation = function() {
53502           return selectedIDs.length === 1 ?
53503               t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
53504               t('operations.move.annotation.multiple');
53505       };
53506
53507
53508       operation.id = 'move';
53509       operation.keys = [t('operations.move.key')];
53510       operation.title = t('operations.move.title');
53511       operation.behavior = behaviorOperation(context).which(operation);
53512
53513       return operation;
53514   }
53515
53516   function operationOrthogonalize(selectedIDs, context) {
53517       var entityId = selectedIDs[0],
53518           entity = context.entity(entityId),
53519           extent = entity.extent(context.graph()),
53520           geometry = context.geometry(entityId),
53521           action = actionOrthogonalize(entityId, context.projection);
53522
53523
53524       var operation = function() {
53525           context.perform(action, operation.annotation());
53526       };
53527
53528
53529       operation.available = function() {
53530           return selectedIDs.length === 1 &&
53531               entity.type === 'way' &&
53532               entity.isClosed() &&
53533               uniq(entity.nodes).length > 2;
53534       };
53535
53536
53537       operation.disabled = function() {
53538           var reason;
53539           if (extent.percentContainedIn(context.extent()) < 0.8) {
53540               reason = 'too_large';
53541           } else if (context.hasHiddenConnections(entityId)) {
53542               reason = 'connected_to_hidden';
53543           }
53544           return action.disabled(context.graph()) || reason;
53545       };
53546
53547
53548       operation.tooltip = function() {
53549           var disable = operation.disabled();
53550           return disable ?
53551               t('operations.orthogonalize.' + disable) :
53552               t('operations.orthogonalize.description.' + geometry);
53553       };
53554
53555
53556       operation.annotation = function() {
53557           return t('operations.orthogonalize.annotation.' + geometry);
53558       };
53559
53560
53561       operation.id = 'orthogonalize';
53562       operation.keys = [t('operations.orthogonalize.key')];
53563       operation.title = t('operations.orthogonalize.title');
53564       operation.behavior = behaviorOperation(context).which(operation);
53565
53566       return operation;
53567   }
53568
53569   /**
53570    * This method is like `_.uniq` except that it accepts `iteratee` which is
53571    * invoked for each element in `array` to generate the criterion by which
53572    * uniqueness is computed. The order of result values is determined by the
53573    * order they occur in the array. The iteratee is invoked with one argument:
53574    * (value).
53575    *
53576    * @static
53577    * @memberOf _
53578    * @since 4.0.0
53579    * @category Array
53580    * @param {Array} array The array to inspect.
53581    * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
53582    * @returns {Array} Returns the new duplicate free array.
53583    * @example
53584    *
53585    * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
53586    * // => [2.1, 1.2]
53587    *
53588    * // The `_.property` iteratee shorthand.
53589    * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
53590    * // => [{ 'x': 1 }, { 'x': 2 }]
53591    */
53592   function uniqBy(array, iteratee) {
53593     return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
53594   }
53595
53596   function operationReflectShort(selectedIDs, context) {
53597       return operationReflect(selectedIDs, context, 'short');
53598   }
53599
53600
53601   function operationReflectLong(selectedIDs, context) {
53602       return operationReflect(selectedIDs, context, 'long');
53603   }
53604
53605
53606   function operationReflect(selectedIDs, context, axis) {
53607       axis = axis || 'long';
53608       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
53609           extent = selectedIDs.reduce(function(extent, id) {
53610               return extent.extend(context.entity(id).extent(context.graph()));
53611           }, geoExtent$$1());
53612
53613
53614       var operation = function() {
53615           var action = actionReflect(selectedIDs, context.projection)
53616               .useLongAxis(Boolean(axis === 'long'));
53617           context.perform(action, operation.annotation());
53618       };
53619
53620
53621       operation.available = function() {
53622           var nodes = utilGetAllNodes(selectedIDs, context.graph());
53623           return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
53624       };
53625
53626
53627       operation.disabled = function() {
53628           var reason;
53629           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
53630               reason = 'too_large';
53631           } else if (some(selectedIDs, context.hasHiddenConnections)) {
53632               reason = 'connected_to_hidden';
53633           } else if (some(selectedIDs, incompleteRelation)) {
53634               reason = 'incomplete_relation';
53635           }
53636           return reason;
53637
53638           function incompleteRelation(id) {
53639               var entity = context.entity(id);
53640               return entity.type === 'relation' && !entity.isComplete(context.graph());
53641           }
53642       };
53643
53644
53645       operation.tooltip = function() {
53646           var disable = operation.disabled();
53647           return disable ?
53648               t('operations.reflect.' + disable + '.' + multi) :
53649               t('operations.reflect.description.' + axis + '.' + multi);
53650       };
53651
53652
53653       operation.annotation = function() {
53654           return t('operations.reflect.annotation.' + axis + '.' + multi);
53655       };
53656
53657
53658       operation.id = 'reflect-' + axis;
53659       operation.keys = [t('operations.reflect.key.' + axis)];
53660       operation.title = t('operations.reflect.title.' + axis);
53661       operation.behavior = behaviorOperation(context).which(operation);
53662
53663       return operation;
53664   }
53665
53666   function operationReverse(selectedIDs, context) {
53667       var entityId = selectedIDs[0];
53668
53669       var operation = function() {
53670           context.perform(actionReverse(entityId), operation.annotation());
53671       };
53672
53673
53674       operation.available = function() {
53675           return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
53676       };
53677
53678
53679       operation.disabled = function() {
53680           return false;
53681       };
53682
53683
53684       operation.tooltip = function() {
53685           return t('operations.reverse.description');
53686       };
53687
53688
53689       operation.annotation = function() {
53690           return t('operations.reverse.annotation');
53691       };
53692
53693
53694       operation.id = 'reverse';
53695       operation.keys = [t('operations.reverse.key')];
53696       operation.title = t('operations.reverse.title');
53697       operation.behavior = behaviorOperation(context).which(operation);
53698
53699       return operation;
53700   }
53701
53702   function operationRotate(selectedIDs, context) {
53703       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
53704           extent = selectedIDs.reduce(function(extent, id) {
53705               return extent.extend(context.entity(id).extent(context.graph()));
53706           }, geoExtent$$1());
53707
53708
53709       var operation = function() {
53710           context.enter(modeRotate$$1(context, selectedIDs));
53711       };
53712
53713
53714       operation.available = function() {
53715           var nodes = utilGetAllNodes(selectedIDs, context.graph());
53716           return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
53717       };
53718
53719
53720       operation.disabled = function() {
53721           var reason;
53722           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
53723               reason = 'too_large';
53724           } else if (some(selectedIDs, context.hasHiddenConnections)) {
53725               reason = 'connected_to_hidden';
53726           } else if (some(selectedIDs, incompleteRelation)) {
53727               reason = 'incomplete_relation';
53728           }
53729           return reason;
53730
53731           function incompleteRelation(id) {
53732               var entity = context.entity(id);
53733               return entity.type === 'relation' && !entity.isComplete(context.graph());
53734           }
53735       };
53736
53737
53738       operation.tooltip = function() {
53739           var disable = operation.disabled();
53740           return disable ?
53741               t('operations.rotate.' + disable + '.' + multi) :
53742               t('operations.rotate.description.' + multi);
53743       };
53744
53745
53746       operation.annotation = function() {
53747           return selectedIDs.length === 1 ?
53748               t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
53749               t('operations.rotate.annotation.multiple');
53750       };
53751
53752
53753       operation.id = 'rotate';
53754       operation.keys = [t('operations.rotate.key')];
53755       operation.title = t('operations.rotate.title');
53756       operation.behavior = behaviorOperation(context).which(operation);
53757
53758       return operation;
53759   }
53760
53761   function operationSplit(selectedIDs, context) {
53762       var vertices = filter(selectedIDs, function(entityId) {
53763           return context.geometry(entityId) === 'vertex';
53764       });
53765
53766       var entityId = vertices[0],
53767           action = actionSplit(entityId),
53768           ways = [];
53769
53770       if (vertices.length === 1) {
53771           if (selectedIDs.length > 1) {
53772               action.limitWays(without(selectedIDs, entityId));
53773           }
53774           ways = action.ways(context.graph());
53775       }
53776
53777
53778       var operation = function() {
53779           var difference = context.perform(action, operation.annotation());
53780           context.enter(modeSelect(context, difference.extantIDs()));
53781       };
53782
53783
53784       operation.available = function() {
53785           return vertices.length === 1;
53786       };
53787
53788
53789       operation.disabled = function() {
53790           var reason;
53791           if (some(selectedIDs, context.hasHiddenConnections)) {
53792               reason = 'connected_to_hidden';
53793           }
53794           return action.disabled(context.graph()) || reason;
53795       };
53796
53797
53798       operation.tooltip = function() {
53799           var disable = operation.disabled();
53800           if (disable) {
53801               return t('operations.split.' + disable);
53802           }
53803           if (ways.length === 1) {
53804               return t('operations.split.description.' + context.geometry(ways[0].id));
53805           } else {
53806               return t('operations.split.description.multiple');
53807           }
53808       };
53809
53810
53811       operation.annotation = function() {
53812           return ways.length === 1 ?
53813               t('operations.split.annotation.' + context.geometry(ways[0].id)) :
53814               t('operations.split.annotation.multiple', { n: ways.length });
53815       };
53816
53817
53818       operation.id = 'split';
53819       operation.keys = [t('operations.split.key')];
53820       operation.title = t('operations.split.title');
53821       operation.behavior = behaviorOperation(context).which(operation);
53822
53823       return operation;
53824   }
53825
53826   function operationStraighten(selectedIDs, context) {
53827       var entityId = selectedIDs[0],
53828           action = actionStraighten(entityId, context.projection);
53829
53830
53831       function operation() {
53832           context.perform(action, operation.annotation());
53833       }
53834
53835
53836       operation.available = function() {
53837           var entity = context.entity(entityId);
53838           return selectedIDs.length === 1 &&
53839               entity.type === 'way' &&
53840               !entity.isClosed() &&
53841               uniq(entity.nodes).length > 2;
53842       };
53843
53844
53845       operation.disabled = function() {
53846           var reason;
53847           if (context.hasHiddenConnections(entityId)) {
53848               reason = 'connected_to_hidden';
53849           }
53850           return action.disabled(context.graph()) || reason;
53851       };
53852
53853
53854       operation.tooltip = function() {
53855           var disable = operation.disabled();
53856           return disable ?
53857               t('operations.straighten.' + disable) :
53858               t('operations.straighten.description');
53859       };
53860
53861
53862       operation.annotation = function() {
53863           return t('operations.straighten.annotation');
53864       };
53865
53866
53867       operation.id = 'straighten';
53868       operation.keys = [t('operations.straighten.key')];
53869       operation.title = t('operations.straighten.title');
53870       operation.behavior = behaviorOperation(context).which(operation);
53871
53872       return operation;
53873   }
53874
53875   function operationDetachNode(selectedIDs, context) {
53876       var nodeID = selectedIDs.length && selectedIDs[0];
53877       var action = actionDetachNode(nodeID);
53878
53879       var operation = function () {
53880           context.perform(action);  // do the detach
53881
53882           var mouse = context.map().mouseCoordinates();
53883           if (mouse.some(isNaN)) {
53884               enterMoveMode();
53885
53886           } else {
53887               // move detached node to the mouse location (transitioned)
53888               context.perform(actionMoveNode(nodeID, mouse));
53889
53890               // after transition completes, put at final mouse location and enter move mode.
53891               window.setTimeout(function() {
53892                   mouse = context.map().mouseCoordinates();
53893                   context.replace(actionMoveNode(nodeID, mouse));
53894                   enterMoveMode();
53895               }, 150);
53896           }
53897
53898           function enterMoveMode() {
53899               var baseGraph = context.graph();
53900               context.enter(modeMove$$1(context, [nodeID], baseGraph));
53901           }
53902       };
53903
53904
53905       operation.available = function () {
53906           if (selectedIDs.length !== 1) return false;
53907
53908           var graph = context.graph();
53909           var entity = graph.hasEntity(nodeID);
53910           if (!entity) return false;
53911
53912           return entity.type === 'node' &&
53913               entity.hasInterestingTags() &&
53914               graph.parentWays(entity).length > 0;
53915       };
53916
53917
53918       operation.disabled = function () {
53919           var reason;
53920           if (some(selectedIDs, context.hasHiddenConnections)) {
53921               reason = 'connected_to_hidden';
53922           }
53923           return action.disabled(context.graph()) || reason;
53924       };
53925
53926
53927       operation.tooltip = function () {
53928           var disableReason = operation.disabled();
53929           if (disableReason) {
53930               return t('operations.detach_node.' + disableReason,
53931                   { relation: context.presets().item('type/restriction').name() });
53932           } else {
53933               return t('operations.detach_node.description');
53934           }
53935       };
53936
53937
53938       operation.annotation = function () {
53939           return t('operations.detach_node.annotation');
53940       };
53941
53942
53943       operation.id = 'detach-node';
53944       operation.keys = [t('operations.detach_node.key')];
53945       operation.title = t('operations.detach_node.title');
53946       operation.behavior = behaviorOperation(context).which(operation);
53947
53948
53949       return operation;
53950   }
53951
53952
53953
53954   var Operations = /*#__PURE__*/Object.freeze({
53955     operationCircularize: operationCircularize,
53956     operationContinue: operationContinue,
53957     operationDelete: operationDelete,
53958     operationDisconnect: operationDisconnect,
53959     operationMerge: operationMerge,
53960     operationMove: operationMove,
53961     operationOrthogonalize: operationOrthogonalize,
53962     operationReflectShort: operationReflectShort,
53963     operationReflectLong: operationReflectLong,
53964     operationReverse: operationReverse,
53965     operationRotate: operationRotate,
53966     operationSplit: operationSplit,
53967     operationStraighten: operationStraighten,
53968     operationDetachNode: operationDetachNode
53969   });
53970
53971   function modeMove$$1(context, entityIDs, baseGraph) {
53972       var mode = {
53973           id: 'move',
53974           button: 'browse'
53975       };
53976
53977       var keybinding = utilKeybinding('move');
53978       var behaviors = [
53979           behaviorEdit(context),
53980           operationCircularize(entityIDs, context).behavior,
53981           operationDelete(entityIDs, context).behavior,
53982           operationOrthogonalize(entityIDs, context).behavior,
53983           operationReflectLong(entityIDs, context).behavior,
53984           operationReflectShort(entityIDs, context).behavior,
53985           operationRotate(entityIDs, context).behavior
53986       ];
53987       var annotation = entityIDs.length === 1 ?
53988           t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
53989           t('operations.move.annotation.multiple');
53990
53991       var _prevGraph;
53992       var _cache;
53993       var _origin;
53994       var _nudgeInterval;
53995
53996
53997       function doMove(nudge) {
53998           nudge = nudge || [0, 0];
53999
54000           var fn;
54001           if (_prevGraph !== context.graph()) {
54002               _cache = {};
54003               _origin = context.map().mouseCoordinates();
54004               fn = context.perform;
54005           } else {
54006               fn = context.overwrite;
54007           }
54008
54009           var currMouse = context.mouse();
54010           var origMouse = context.projection(_origin);
54011           var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
54012
54013           fn(actionMove(entityIDs, delta, context.projection, _cache), annotation);
54014           _prevGraph = context.graph();
54015       }
54016
54017
54018       function startNudge(nudge) {
54019           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
54020           _nudgeInterval = window.setInterval(function() {
54021               context.pan(nudge);
54022               doMove(nudge);
54023           }, 50);
54024       }
54025
54026
54027       function stopNudge() {
54028           if (_nudgeInterval) {
54029               window.clearInterval(_nudgeInterval);
54030               _nudgeInterval = null;
54031           }
54032       }
54033
54034
54035       function move() {
54036           doMove();
54037           var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
54038           if (nudge) {
54039               startNudge(nudge);
54040           } else {
54041               stopNudge();
54042           }
54043       }
54044
54045
54046       function finish() {
54047           event.stopPropagation();
54048           context.enter(modeSelect(context, entityIDs));
54049           stopNudge();
54050       }
54051
54052
54053       function cancel() {
54054           if (baseGraph) {
54055               while (context.graph() !== baseGraph) context.pop();
54056               context.enter(modeBrowse(context));
54057           } else {
54058               context.pop();
54059               context.enter(modeSelect(context, entityIDs));
54060           }
54061           stopNudge();
54062       }
54063
54064
54065       function undone() {
54066           context.enter(modeBrowse(context));
54067       }
54068
54069
54070       mode.enter = function() {
54071           _origin = context.map().mouseCoordinates();
54072           _prevGraph = null;
54073           _cache = {};
54074
54075           behaviors.forEach(function(behavior) {
54076               context.install(behavior);
54077           });
54078
54079           context.surface()
54080               .on('mousemove.move', move)
54081               .on('click.move', finish);
54082
54083           context.history()
54084               .on('undone.move', undone);
54085
54086           keybinding
54087               .on('⎋', cancel)
54088               .on('↩', finish);
54089
54090           select(document)
54091               .call(keybinding);
54092       };
54093
54094
54095       mode.exit = function() {
54096           stopNudge();
54097
54098           behaviors.forEach(function(behavior) {
54099               context.uninstall(behavior);
54100           });
54101
54102           context.surface()
54103               .on('mousemove.move', null)
54104               .on('click.move', null);
54105
54106           context.history()
54107               .on('undone.move', null);
54108
54109           select(document)
54110               .call(keybinding.unbind);
54111       };
54112
54113
54114       mode.selectedIDs = function() {
54115           if (!arguments.length) return entityIDs;
54116           // no assign
54117           return mode;
54118       };
54119
54120
54121       return mode;
54122   }
54123
54124   function modeRotate$$1(context, entityIDs) {
54125       var mode = {
54126           id: 'rotate',
54127           button: 'browse'
54128       };
54129
54130       var keybinding = utilKeybinding('rotate');
54131       var behaviors = [
54132           behaviorEdit(context),
54133           operationCircularize(entityIDs, context).behavior,
54134           operationDelete(entityIDs, context).behavior,
54135           operationMove(entityIDs, context).behavior,
54136           operationOrthogonalize(entityIDs, context).behavior,
54137           operationReflectLong(entityIDs, context).behavior,
54138           operationReflectShort(entityIDs, context).behavior
54139       ];
54140       var annotation = entityIDs.length === 1 ?
54141           t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
54142           t('operations.rotate.annotation.multiple');
54143
54144       var _prevGraph;
54145       var _prevAngle;
54146       var _prevTransform;
54147       var _pivot;
54148
54149
54150       function doRotate() {
54151           var fn;
54152           if (context.graph() !== _prevGraph) {
54153               fn = context.perform;
54154           } else {
54155               fn = context.replace;
54156           }
54157
54158           // projection changed, recalculate _pivot
54159           var projection = context.projection;
54160           var currTransform = projection.transform();
54161           if (!_prevTransform ||
54162               currTransform.k !== _prevTransform.k ||
54163               currTransform.x !== _prevTransform.x ||
54164               currTransform.y !== _prevTransform.y) {
54165
54166               var nodes = utilGetAllNodes(entityIDs, context.graph());
54167               var points = nodes.map(function(n) { return projection(n.loc); });
54168
54169               if (points.length === 1) {  // degenerate case
54170                   _pivot = points[0];
54171               } else if (points.length === 2) {
54172                   _pivot = geoVecInterp(points[0], points[1], 0.5);
54173               } else {
54174                   _pivot = d3_polygonCentroid(d3_polygonHull(points));
54175               }
54176               _prevAngle = undefined;
54177           }
54178
54179
54180           var currMouse = context.mouse();
54181           var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
54182
54183           if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
54184           var delta = currAngle - _prevAngle;
54185
54186           fn(actionRotate(entityIDs, _pivot, delta, projection), annotation);
54187
54188           _prevTransform = currTransform;
54189           _prevAngle = currAngle;
54190           _prevGraph = context.graph();
54191       }
54192
54193
54194       function finish() {
54195           event.stopPropagation();
54196           context.enter(modeSelect(context, entityIDs));
54197       }
54198
54199
54200       function cancel() {
54201           context.pop();
54202           context.enter(modeSelect(context, entityIDs));
54203       }
54204
54205
54206       function undone() {
54207           context.enter(modeBrowse(context));
54208       }
54209
54210
54211       mode.enter = function() {
54212           behaviors.forEach(context.install);
54213
54214           context.surface()
54215               .on('mousemove.rotate', doRotate)
54216               .on('click.rotate', finish);
54217
54218           context.history()
54219               .on('undone.rotate', undone);
54220
54221           keybinding
54222               .on('⎋', cancel)
54223               .on('↩', finish);
54224
54225           select(document)
54226               .call(keybinding);
54227       };
54228
54229
54230       mode.exit = function() {
54231           behaviors.forEach(context.uninstall);
54232
54233           context.surface()
54234               .on('mousemove.rotate', null)
54235               .on('click.rotate', null);
54236
54237           context.history()
54238               .on('undone.rotate', null);
54239
54240           select(document)
54241               .call(keybinding.unbind);
54242       };
54243
54244
54245       mode.selectedIDs = function() {
54246           if (!arguments.length) return entityIDs;
54247           // no assign
54248           return mode;
54249       };
54250
54251
54252       return mode;
54253   }
54254
54255   var _isSaving = false;
54256
54257
54258   function modeSave$$1(context) {
54259       var mode = { id: 'save' };
54260       var keybinding = utilKeybinding('modeSave');
54261
54262       var loading = uiLoading(context)
54263           .message(t('save.uploading'))
54264           .blocking(true);
54265
54266       var commit = uiCommit(context)
54267           .on('cancel', cancel)
54268           .on('save', save);
54269
54270       var _toCheck = [];
54271       var _toLoad = [];
54272       var _loaded = {};
54273       var _toLoadCount = 0;
54274       var _toLoadTotal = 0;
54275
54276       var _conflicts = [];
54277       var _errors = [];
54278       var _origChanges;
54279       var _location;
54280
54281
54282       function cancel(selectedID) {
54283           if (selectedID) {
54284               context.enter(modeSelect(context, [selectedID]));
54285           } else {
54286               context.enter(modeBrowse(context));
54287           }
54288       }
54289
54290
54291       function save(changeset, tryAgain, checkConflicts) {
54292           // Guard against accidentally entering save code twice - #4641
54293           if (_isSaving && !tryAgain) {
54294               return;
54295           }
54296
54297           var osm = context.connection();
54298           if (!osm) {
54299               cancel();
54300               return;
54301           }
54302
54303           // If user somehow got logged out mid-save, try to reauthenticate..
54304           // This can happen if they were logged in from before, but the tokens are no longer valid.
54305           if (!osm.authenticated()) {
54306               osm.authenticate(function(err) {
54307                   if (err) {
54308                       cancel();   // quit save mode..
54309                   } else {
54310                       save(changeset, tryAgain, checkConflicts);  // continue where we left off..
54311                   }
54312               });
54313               return;
54314           }
54315
54316           if (!_isSaving) {
54317               keybindingOff();
54318               context.container().call(loading);  // block input
54319               _isSaving = true;
54320           }
54321
54322           var history = context.history();
54323           var localGraph = context.graph();
54324           var remoteGraph = coreGraph$$1(history.base(), true);
54325
54326           _conflicts = [];
54327           _errors = [];
54328
54329           // Store original changes, in case user wants to download them as an .osc file
54330           _origChanges = history.changes(actionDiscardTags(history.difference()));
54331
54332           // First time, `history.perform` a no-op action.
54333           // Any conflict resolutions will be done as `history.replace`
54334           if (!tryAgain) {
54335               history.perform(actionNoop());
54336           }
54337
54338           // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
54339           if (!checkConflicts) {
54340               upload(changeset);
54341
54342           // Do the full (slow) conflict check..
54343           } else {
54344               var modified = filter(history.difference().summary(), { changeType: 'modified' });
54345               _toCheck = map$3(map$3(modified, 'entity'), 'id');
54346               _toLoad = withChildNodes(_toCheck, localGraph);
54347               _loaded = {};
54348               _toLoadCount = 0;
54349               _toLoadTotal = _toLoad.length;
54350
54351               if (_toCheck.length) {
54352                   showProgress(_toLoadCount, _toLoadTotal);
54353                   _toLoad.forEach(function(id) { _loaded[id] = false; });
54354                   osm.loadMultiple(_toLoad, loaded);
54355               } else {
54356                   upload(changeset);
54357               }
54358           }
54359
54360           return;
54361
54362
54363           function withChildNodes(ids, graph) {
54364               return uniq(reduce(ids, function(result, id) {
54365                   var entity = graph.entity(id);
54366                   if (entity.type === 'way') {
54367                       try {
54368                           var children = graph.childNodes(entity);
54369                           result.push.apply(result, map$3(filter(children, 'version'), 'id'));
54370                       } catch (err) {
54371                           /* eslint-disable no-console */
54372                           if (typeof console !== 'undefined') console.error(err);
54373                           /* eslint-enable no-console */
54374                       }
54375                   }
54376                   return result;
54377               }, clone(ids)));
54378           }
54379
54380
54381           // Reload modified entities into an alternate graph and check for conflicts..
54382           function loaded(err, result) {
54383               if (_errors.length) return;
54384
54385               if (err) {
54386                   _errors.push({
54387                       msg: err.message || err.responseText,
54388                       details: [ t('save.status_code', { code: err.status }) ]
54389                   });
54390                   showErrors();
54391
54392               } else {
54393                   var loadMore = [];
54394
54395                   result.data.forEach(function(entity) {
54396                       remoteGraph.replace(entity);
54397                       _loaded[entity.id] = true;
54398                       _toLoad = without(_toLoad, entity.id);
54399
54400                       if (!entity.visible) return;
54401
54402                       // Because loadMultiple doesn't download /full like loadEntity,
54403                       // need to also load children that aren't already being checked..
54404                       var i, id;
54405                       if (entity.type === 'way') {
54406                           for (i = 0; i < entity.nodes.length; i++) {
54407                               id = entity.nodes[i];
54408                               if (_loaded[id] === undefined) {
54409                                   _loaded[id] = false;
54410                                   loadMore.push(id);
54411                               }
54412                           }
54413                       } else if (entity.type === 'relation' && entity.isMultipolygon()) {
54414                           for (i = 0; i < entity.members.length; i++) {
54415                               id = entity.members[i].id;
54416                               if (_loaded[id] === undefined) {
54417                                   _loaded[id] = false;
54418                                   loadMore.push(id);
54419                               }
54420                           }
54421                       }
54422                   });
54423
54424                   _toLoadCount += result.data.length;
54425                   _toLoadTotal += loadMore.length;
54426                   showProgress(_toLoadCount, _toLoadTotal);
54427
54428                   if (loadMore.length) {
54429                       _toLoad.push.apply(_toLoad, loadMore);
54430                       osm.loadMultiple(loadMore, loaded);
54431                   }
54432
54433                   if (!_toLoad.length) {
54434                       detectConflicts();
54435                   }
54436               }
54437           }
54438
54439
54440           function detectConflicts() {
54441               function choice(id, text, action) {
54442                   return { id: id, text: text, action: function() { history.replace(action); } };
54443               }
54444               function formatUser(d) {
54445                   return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
54446               }
54447               function entityName(entity) {
54448                   return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
54449               }
54450
54451               function sameVersions(local$$1, remote) {
54452                   if (local$$1.version !== remote.version) return false;
54453
54454                   if (local$$1.type === 'way') {
54455                       var children = union(local$$1.nodes, remote.nodes);
54456                       for (var i = 0; i < children.length; i++) {
54457                           var a = localGraph.hasEntity(children[i]);
54458                           var b = remoteGraph.hasEntity(children[i]);
54459                           if (a && b && a.version !== b.version) return false;
54460                       }
54461                   }
54462
54463                   return true;
54464               }
54465
54466               _toCheck.forEach(function(id) {
54467                   var local$$1 = localGraph.entity(id);
54468                   var remote = remoteGraph.entity(id);
54469
54470                   if (sameVersions(local$$1, remote)) return;
54471
54472                   var action = actionMergeRemoteChanges;
54473                   var merge = action(id, localGraph, remoteGraph, formatUser);
54474
54475                   history.replace(merge);
54476
54477                   var mergeConflicts = merge.conflicts();
54478                   if (!mergeConflicts.length) return;  // merged safely
54479
54480                   var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
54481                   var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
54482                   var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
54483                   var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
54484
54485                   _conflicts.push({
54486                       id: id,
54487                       name: entityName(local$$1),
54488                       details: mergeConflicts,
54489                       chosen: 1,
54490                       choices: [
54491                           choice(id, keepMine, forceLocal),
54492                           choice(id, keepTheirs, forceRemote)
54493                       ]
54494                   });
54495               });
54496
54497               upload(changeset);
54498           }
54499       }
54500
54501
54502       function upload(changeset) {
54503           var osm = context.connection();
54504           if (!osm) {
54505               _errors.push({ msg: 'No OSM Service' });
54506           }
54507
54508           if (_conflicts.length) {
54509               _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
54510               showConflicts(changeset);
54511
54512           } else if (_errors.length) {
54513               showErrors();
54514
54515           } else {
54516               var history = context.history();
54517               var changes = history.changes(actionDiscardTags(history.difference()));
54518               if (changes.modified.length || changes.created.length || changes.deleted.length) {
54519                   loadLocation();  // so it is ready when we display the save screen
54520                   osm.putChangeset(changeset, changes, uploadCallback);
54521               } else {        // changes were insignificant or reverted by user
54522                   select('.inspector-wrap *').remove();
54523                   loading.close();
54524                   _isSaving = false;
54525                   context.flush();
54526                   cancel();
54527               }
54528           }
54529       }
54530
54531
54532       function uploadCallback(err, changeset) {
54533           if (err) {
54534               if (err.status === 409) {          // 409 Conflict
54535                   save(changeset, true, true);   // tryAgain = true, checkConflicts = true
54536               } else {
54537                   _errors.push({
54538                       msg: err.message || err.responseText,
54539                       details: [ t('save.status_code', { code: err.status }) ]
54540                   });
54541                   showErrors();
54542               }
54543
54544           } else {
54545               context.history().clearSaved();
54546               success(changeset);
54547               // Add delay to allow for postgres replication #1646 #2678
54548               window.setTimeout(function() {
54549                   select('.inspector-wrap *').remove();
54550                   loading.close();
54551                   _isSaving = false;
54552                   context.flush();
54553               }, 2500);
54554           }
54555       }
54556
54557
54558       function showProgress(num, total) {
54559           var modal = context.container().select('.loading-modal .modal-section');
54560           var progress = modal.selectAll('.progress')
54561               .data([0]);
54562
54563           // enter/update
54564           progress.enter()
54565               .append('div')
54566               .attr('class', 'progress')
54567               .merge(progress)
54568               .text(t('save.conflict_progress', { num: num, total: total }));
54569       }
54570
54571
54572       function showConflicts(changeset) {
54573           var history = context.history();
54574           var selection$$1 = context.container()
54575               .select('#sidebar')
54576               .append('div')
54577               .attr('class','sidebar-component');
54578
54579           loading.close();
54580           _isSaving = false;
54581
54582           var ui = uiConflicts(context)
54583               .conflictList(_conflicts)
54584               .origChanges(_origChanges)
54585               .on('cancel', function() {
54586                   history.pop();
54587                   selection$$1.remove();
54588                   keybindingOn();
54589               })
54590               .on('save', function() {
54591                   for (var i = 0; i < _conflicts.length; i++) {
54592                       if (_conflicts[i].chosen === 1) {  // user chose "keep theirs"
54593                           var entity = context.hasEntity(_conflicts[i].id);
54594                           if (entity && entity.type === 'way') {
54595                               var children = uniq(entity.nodes);
54596                               for (var j = 0; j < children.length; j++) {
54597                                   history.replace(actionRevert(children[j]));
54598                               }
54599                           }
54600                           history.replace(actionRevert(_conflicts[i].id));
54601                       }
54602                   }
54603
54604                   selection$$1.remove();
54605                   save(changeset, true, false);  // tryAgain = true, checkConflicts = false
54606               });
54607
54608           selection$$1.call(ui);
54609       }
54610
54611
54612       function showErrors() {
54613           keybindingOn();
54614           context.history().pop();
54615           loading.close();
54616           _isSaving = false;
54617
54618           var selection$$1 = uiConfirm(context.container());
54619           selection$$1
54620               .select('.modal-section.header')
54621               .append('h3')
54622               .text(t('save.error'));
54623
54624           addErrors(selection$$1, _errors);
54625           selection$$1.okButton();
54626       }
54627
54628
54629       function addErrors(selection$$1, data) {
54630           var message = selection$$1
54631               .select('.modal-section.message-text');
54632
54633           var items = message
54634               .selectAll('.error-container')
54635               .data(data);
54636
54637           var enter = items.enter()
54638               .append('div')
54639               .attr('class', 'error-container');
54640
54641           enter
54642               .append('a')
54643               .attr('class', 'error-description')
54644               .attr('href', '#')
54645               .classed('hide-toggle', true)
54646               .text(function(d) { return d.msg || t('save.unknown_error_details'); })
54647               .on('click', function() {
54648                   event.preventDefault();
54649
54650                   var error = select(this);
54651                   var detail = select(this.nextElementSibling);
54652                   var exp = error.classed('expanded');
54653
54654                   detail.style('display', exp ? 'none' : 'block');
54655                   error.classed('expanded', !exp);
54656               });
54657
54658           var details = enter
54659               .append('div')
54660               .attr('class', 'error-detail-container')
54661               .style('display', 'none');
54662
54663           details
54664               .append('ul')
54665               .attr('class', 'error-detail-list')
54666               .selectAll('li')
54667               .data(function(d) { return d.details || []; })
54668               .enter()
54669               .append('li')
54670               .attr('class', 'error-detail-item')
54671               .text(function(d) { return d; });
54672
54673           items.exit()
54674               .remove();
54675       }
54676
54677
54678       function success(changeset) {
54679           commit.reset();
54680
54681           var ui = uiSuccess$$1(context)
54682               .changeset(changeset)
54683               .location(_location)
54684               .on('cancel', function() { context.ui().sidebar.hide(); });
54685
54686           context.enter(modeBrowse(context).sidebar(ui));
54687       }
54688
54689
54690       function keybindingOn() {
54691           select(document)
54692               .call(keybinding.on('⎋', cancel, true));
54693       }
54694
54695
54696       function keybindingOff() {
54697           select(document)
54698               .call(keybinding.unbind);
54699       }
54700
54701
54702       // Reverse geocode current map location so we can display a message on
54703       // the success screen like "Thank you for editing around city, state."
54704       function loadLocation() {
54705           _location = null;
54706           if (!services.geocoder) return;
54707
54708           services.geocoder.reverse(context.map().center(), function(err, result) {
54709               if (err || !result || !result.address) return;
54710
54711               var parts = [];
54712               var addr = result.address;
54713               var city = addr && (addr.town || addr.city || addr.county);
54714               if (city) parts.push(city);
54715               var region = addr && (addr.state || addr.country);
54716               if (region) parts.push(region);
54717
54718               _location = parts.join(', ');
54719           });
54720       }
54721
54722
54723       mode.enter = function() {
54724           function done() {
54725               context.ui().sidebar.show(commit);
54726           }
54727
54728           keybindingOn();
54729
54730           context.container().selectAll('#content')
54731               .attr('class', 'inactive');
54732
54733           var osm = context.connection();
54734           if (!osm) {
54735               cancel();
54736               return;
54737           }
54738
54739           if (osm.authenticated()) {
54740               done();
54741           } else {
54742               osm.authenticate(function(err) {
54743                   if (err) {
54744                       cancel();
54745                   } else {
54746                       done();
54747                   }
54748               });
54749           }
54750       };
54751
54752
54753       mode.exit = function() {
54754           _isSaving = false;
54755
54756           keybindingOff();
54757
54758           context.container().selectAll('#content')
54759               .attr('class', 'active');
54760
54761           context.ui().sidebar.hide();
54762       };
54763
54764       return mode;
54765   }
54766
54767   // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
54768   // For example, ⌘Z -> Ctrl+Z
54769   var uiCmd = function (code) {
54770       var detected = utilDetect();
54771
54772       if (detected.os === 'mac') {
54773           return code;
54774       }
54775
54776       if (detected.os === 'win') {
54777           if (code === '⌘⇧Z') return 'Ctrl+Y';
54778       }
54779
54780       var result = '',
54781           replacements = {
54782               '⌘': 'Ctrl',
54783               '⇧': 'Shift',
54784               '⌥': 'Alt',
54785               '⌫': 'Backspace',
54786               '⌦': 'Delete'
54787           };
54788
54789       for (var i = 0; i < code.length; i++) {
54790           if (code[i] in replacements) {
54791               result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
54792           } else {
54793               result += code[i];
54794           }
54795       }
54796
54797       return result;
54798   };
54799
54800
54801   // return a display-focused string for a given keyboard code
54802   uiCmd.display = function(code) {
54803       if (code.length !== 1) return code;
54804
54805       var detected = utilDetect();
54806       var mac = (detected.os === 'mac');
54807       var replacements = {
54808           '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
54809           '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
54810           '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
54811           '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
54812           '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
54813           '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
54814           '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
54815           '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
54816           '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
54817           '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
54818           '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
54819           '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
54820       };
54821
54822       return replacements[code] || code;
54823   };
54824
54825   var _relatedParent;
54826
54827
54828   function modeSelect(context, selectedIDs) {
54829       var mode = {
54830           id: 'select',
54831           button: 'browse'
54832       };
54833
54834       var keybinding = utilKeybinding('select');
54835       var timeout = null;
54836       var behaviors = [
54837           behaviorCopy(context),
54838           behaviorPaste(context),
54839           behaviorBreathe(context),
54840           behaviorHover(context),
54841           behaviorSelect(context),
54842           behaviorLasso(context),
54843           modeDragNode$$1(context).restoreSelectedIDs(selectedIDs).behavior,
54844           modeDragNote$$1(context).behavior
54845       ];
54846       var editMenu;
54847       var newFeature = false;
54848       var suppressMenu = true;
54849       var follow = false;
54850
54851
54852       var wrap = context.container()
54853           .select('.inspector-wrap');
54854
54855
54856       function singular() {
54857           if (selectedIDs.length === 1) {
54858               return context.hasEntity(selectedIDs[0]);
54859           }
54860       }
54861
54862
54863       function checkSelectedIDs() {
54864           var ids = [];
54865           if (Array.isArray(selectedIDs)) {
54866               ids = selectedIDs.filter(function(id) {
54867                   return context.hasEntity(id);
54868               });
54869           }
54870
54871           if (ids.length) {
54872               selectedIDs = ids;
54873           } else {
54874               context.enter(modeBrowse(context));
54875           }
54876           return !!ids.length;
54877       }
54878
54879
54880       // find the common parent ways for nextVertex, previousVertex
54881       function commonParents() {
54882           var graph = context.graph();
54883           var commonParents = [];
54884
54885           for (var i = 0; i < selectedIDs.length; i++) {
54886               var entity = context.hasEntity(selectedIDs[i]);
54887               if (!entity || entity.geometry(graph) !== 'vertex') {
54888                   return [];  // selection includes some not vertexes
54889               }
54890
54891               var currParents = map$3(graph.parentWays(entity), 'id');
54892               if (!commonParents.length) {
54893                   commonParents = currParents;
54894                   continue;
54895               }
54896
54897               commonParents = intersection(commonParents, currParents);
54898               if (!commonParents.length) {
54899                   return [];
54900               }
54901           }
54902
54903           return commonParents;
54904       }
54905
54906
54907       function singularParent() {
54908           var parents = commonParents();
54909           if (!parents || parents.length === 0) {
54910               _relatedParent = null;
54911               return null;
54912           }
54913
54914           // relatedParent is used when we visit a vertex with multiple
54915           // parents, and we want to remember which parent line we started on.
54916
54917           if (parents.length === 1) {
54918               _relatedParent = parents[0];  // remember this parent for later
54919               return _relatedParent;
54920           }
54921
54922           if (parents.indexOf(_relatedParent) !== -1) {
54923               return _relatedParent;   // prefer the previously seen parent
54924           }
54925
54926           return parents[0];
54927       }
54928
54929
54930       function closeMenu() {
54931           if (editMenu) {
54932               context.surface().call(editMenu.close);
54933           }
54934       }
54935
54936
54937       function positionMenu() {
54938           if (!editMenu) { return; }
54939
54940           var entity = singular();
54941           if (entity && context.geometry(entity.id) === 'relation') {
54942               suppressMenu = true;
54943           } else {
54944               var point$$1 = context.mouse();
54945               var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
54946
54947               if (point$$1 && geoPointInPolygon(point$$1, viewport)) {
54948                   editMenu.center(point$$1);
54949               } else {
54950                   suppressMenu = true;
54951               }
54952           }
54953       }
54954
54955
54956       function showMenu() {
54957           closeMenu();
54958           if (editMenu) {
54959               context.surface().call(editMenu);
54960           }
54961       }
54962
54963
54964       function toggleMenu() {
54965           // deprecation warning - Radial Menu to be removed in iD v3
54966           if (select('.edit-menu, .radial-menu').empty()) {
54967               positionMenu();
54968               showMenu();
54969           } else {
54970               closeMenu();
54971           }
54972       }
54973
54974
54975       mode.selectedIDs = function() {
54976           return selectedIDs;
54977       };
54978
54979
54980       mode.reselect = function() {
54981           if (!checkSelectedIDs()) return;
54982
54983           var surfaceNode = context.surface().node();
54984           if (surfaceNode.focus) {   // FF doesn't support it
54985               surfaceNode.focus();
54986           }
54987
54988           positionMenu();
54989           if (!suppressMenu) {
54990               showMenu();
54991           }
54992       };
54993
54994
54995       mode.newFeature = function(_) {
54996           if (!arguments.length) return newFeature;
54997           newFeature = _;
54998           return mode;
54999       };
55000
55001
55002       mode.suppressMenu = function(_) {
55003           if (!arguments.length) return suppressMenu;
55004           suppressMenu = _;
55005           return mode;
55006       };
55007
55008
55009       mode.follow = function(_) {
55010           if (!arguments.length) return follow;
55011           follow = _;
55012           return mode;
55013       };
55014
55015
55016       mode.enter = function() {
55017
55018           function update() {
55019               closeMenu();
55020               checkSelectedIDs();
55021           }
55022
55023
55024           function dblclick() {
55025               var target = select(event.target);
55026
55027               var datum = target.datum();
55028               var entity = datum && datum.properties && datum.properties.entity;
55029               if (!entity) return;
55030
55031               if (entity instanceof osmWay && target.classed('target')) {
55032                   var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
55033                   var prev = entity.nodes[choice.index - 1];
55034                   var next = entity.nodes[choice.index];
55035
55036                   context.perform(
55037                       actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
55038                       t('operations.add.annotation.vertex')
55039                   );
55040
55041                   event.preventDefault();
55042                   event.stopPropagation();
55043
55044               } else if (entity.type === 'midpoint') {
55045                   context.perform(
55046                       actionAddMidpoint({loc: entity.loc, edge: entity.edge}, osmNode()),
55047                       t('operations.add.annotation.vertex'));
55048
55049                   event.preventDefault();
55050                   event.stopPropagation();
55051               }
55052           }
55053
55054
55055           function selectElements(drawn) {
55056               if (!checkSelectedIDs()) return;
55057
55058               var surface = context.surface();
55059               var entity = singular();
55060
55061               if (entity && context.geometry(entity.id) === 'relation') {
55062                   suppressMenu = true;
55063                   return;
55064               }
55065
55066               surface.selectAll('.related')
55067                   .classed('related', false);
55068
55069               singularParent();
55070               if (_relatedParent) {
55071                   surface.selectAll(utilEntitySelector([_relatedParent]))
55072                       .classed('related', true);
55073               }
55074
55075               var selection$$1 = context.surface()
55076                   .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
55077
55078               if (selection$$1.empty()) {
55079                   // Return to browse mode if selected DOM elements have
55080                   // disappeared because the user moved them out of view..
55081                   var source = event && event.type === 'zoom' && event.sourceEvent;
55082                   if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
55083                       context.enter(modeBrowse(context));
55084                   }
55085               } else {
55086                   selection$$1
55087                       .classed('selected', true);
55088               }
55089           }
55090
55091
55092           function esc() {
55093               context.enter(modeBrowse(context));
55094           }
55095
55096
55097           function firstVertex() {
55098               event.preventDefault();
55099               var entity = singular();
55100               var parent = singularParent();
55101               var way;
55102
55103               if (entity && entity.type === 'way') {
55104                   way = entity;
55105               } else if (parent) {
55106                   way = context.entity(parent);
55107               }
55108
55109               if (way) {
55110                   context.enter(
55111                       modeSelect(context, [way.first()]).follow(true)
55112                   );
55113               }
55114           }
55115
55116
55117           function lastVertex() {
55118               event.preventDefault();
55119               var entity = singular();
55120               var parent = singularParent();
55121               var way;
55122
55123               if (entity && entity.type === 'way') {
55124                   way = entity;
55125               } else if (parent) {
55126                   way = context.entity(parent);
55127               }
55128
55129               if (way) {
55130                   context.enter(
55131                       modeSelect(context, [way.last()]).follow(true)
55132                   );
55133               }
55134           }
55135
55136
55137           function previousVertex() {
55138               event.preventDefault();
55139               var parent = singularParent();
55140               if (!parent) return;
55141
55142               var way = context.entity(parent);
55143               var length = way.nodes.length;
55144               var curr = way.nodes.indexOf(selectedIDs[0]);
55145               var index = -1;
55146
55147               if (curr > 0) {
55148                   index = curr - 1;
55149               } else if (way.isClosed()) {
55150                   index = length - 2;
55151               }
55152
55153               if (index !== -1) {
55154                   context.enter(
55155                       modeSelect(context, [way.nodes[index]]).follow(true)
55156                   );
55157               }
55158           }
55159
55160
55161           function nextVertex() {
55162               event.preventDefault();
55163               var parent = singularParent();
55164               if (!parent) return;
55165
55166               var way = context.entity(parent);
55167               var length = way.nodes.length;
55168               var curr = way.nodes.indexOf(selectedIDs[0]);
55169               var index = -1;
55170
55171               if (curr < length - 1) {
55172                   index = curr + 1;
55173               } else if (way.isClosed()) {
55174                   index = 0;
55175               }
55176
55177               if (index !== -1) {
55178                   context.enter(
55179                       modeSelect(context, [way.nodes[index]]).follow(true)
55180                   );
55181               }
55182           }
55183
55184
55185           function nextParent() {
55186               event.preventDefault();
55187               var parents = uniq(commonParents());
55188               if (!parents || parents.length < 2) return;
55189
55190               var index = parents.indexOf(_relatedParent);
55191               if (index < 0 || index > parents.length - 2) {
55192                   _relatedParent = parents[0];
55193               } else {
55194                   _relatedParent = parents[index + 1];
55195               }
55196
55197               var surface = context.surface();
55198               surface.selectAll('.related')
55199                   .classed('related', false);
55200
55201               if (_relatedParent) {
55202                   surface.selectAll(utilEntitySelector([_relatedParent]))
55203                       .classed('related', true);
55204               }
55205           }
55206
55207
55208           if (!checkSelectedIDs()) return;
55209
55210           var operations = without(values$1(Operations), operationDelete)
55211               .map(function(o) { return o(selectedIDs, context); })
55212               .filter(function(o) { return o.available(); });
55213
55214           // deprecation warning - Radial Menu to be removed in iD v3
55215           var isRadialMenu = context.storage('edit-menu-style') === 'radial';
55216           if (isRadialMenu) {
55217               operations = operations.slice(0,7);
55218               operations.unshift(operationDelete(selectedIDs, context));
55219           } else {
55220               operations.push(operationDelete(selectedIDs, context));
55221           }
55222
55223           operations.forEach(function(operation) {
55224               if (operation.behavior) {
55225                   behaviors.push(operation.behavior);
55226               }
55227           });
55228
55229           behaviors.forEach(context.install);
55230
55231           keybinding
55232               .on(['[', 'pgup'], previousVertex)
55233               .on([']', 'pgdown'], nextVertex)
55234               .on(['{', uiCmd('⌘['), 'home'], firstVertex)
55235               .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
55236               .on(['\\', 'pause'], nextParent)
55237               .on('⎋', esc, true)
55238               .on('space', toggleMenu);
55239
55240           select(document)
55241               .call(keybinding);
55242
55243
55244           // deprecation warning - Radial Menu to be removed in iD v3
55245           editMenu = isRadialMenu
55246               ? uiRadialMenu(context, operations)
55247               : uiEditMenu(context, operations);
55248
55249           context.ui().sidebar
55250               .select(singular() ? singular().id : null, newFeature);
55251
55252           context.history()
55253               .on('undone.select', update)
55254               .on('redone.select', update);
55255
55256           context.map()
55257               .on('move.select', closeMenu)
55258               .on('drawn.select', selectElements);
55259
55260           context.surface()
55261               .on('dblclick.select', dblclick);
55262
55263
55264           selectElements();
55265
55266           if (selectedIDs.length > 1) {
55267               var entities = uiSelectionList(context, selectedIDs);
55268               context.ui().sidebar.show(entities);
55269           }
55270
55271           if (follow) {
55272               var extent = geoExtent$$1();
55273               var graph = context.graph();
55274               selectedIDs.forEach(function(id) {
55275                   var entity = context.entity(id);
55276                   extent._extend(entity.extent(graph));
55277               });
55278
55279               var loc = extent.center();
55280               context.map().centerEase(loc);
55281           } else if (singular() && singular().type === 'way') {
55282               context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
55283           }
55284
55285           timeout = window.setTimeout(function() {
55286               positionMenu();
55287               if (!suppressMenu) {
55288                   showMenu();
55289               }
55290           }, 270);  /* after any centerEase completes */
55291       };
55292
55293
55294       mode.exit = function() {
55295           if (timeout) window.clearTimeout(timeout);
55296
55297           behaviors.forEach(context.uninstall);
55298
55299           select(document)
55300               .call(keybinding.unbind);
55301
55302           closeMenu();
55303           editMenu = undefined;
55304
55305           context.history()
55306               .on('undone.select', null)
55307               .on('redone.select', null);
55308
55309           var surface = context.surface();
55310
55311           surface
55312               .on('dblclick.select', null);
55313
55314           surface
55315               .selectAll('.selected')
55316               .classed('selected', false);
55317
55318           surface
55319               .selectAll('.related')
55320               .classed('related', false);
55321
55322           context.map().on('drawn.select', null);
55323           context.ui().sidebar.hide();
55324       };
55325
55326
55327       return mode;
55328   }
55329
55330   function modeSelectData$$1(context, selectedDatum) {
55331       var mode = {
55332           id: 'select-data',
55333           button: 'browse'
55334       };
55335
55336       var keybinding = utilKeybinding('select-data');
55337       var dataEditor = uiDataEditor$$1(context);
55338
55339       var behaviors = [
55340           behaviorBreathe(context),
55341           behaviorHover(context),
55342           behaviorSelect(context),
55343           behaviorLasso(context),
55344           modeDragNode$$1(context).behavior,
55345           modeDragNote$$1(context).behavior
55346       ];
55347
55348
55349       // class the data as selected, or return to browse mode if the data is gone
55350       function selectData(drawn) {
55351           var selection$$1 = context.surface().selectAll('.layer-mapdata .data' + selectedDatum.__featurehash__);
55352
55353           if (selection$$1.empty()) {
55354               // Return to browse mode if selected DOM elements have
55355               // disappeared because the user moved them out of view..
55356               var source = event && event.type === 'zoom' && event.sourceEvent;
55357               if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
55358                   context.enter(modeBrowse(context));
55359               }
55360           } else {
55361               selection$$1.classed('selected', true);
55362           }
55363       }
55364
55365
55366       function esc() {
55367           context.enter(modeBrowse(context));
55368       }
55369
55370
55371       mode.enter = function() {
55372           behaviors.forEach(context.install);
55373           keybinding.on('⎋', esc, true);
55374
55375           select(document)
55376               .call(keybinding);
55377
55378           selectData();
55379
55380           var sidebar = context.ui().sidebar;
55381           sidebar.show(dataEditor.datum(selectedDatum));
55382
55383           // expand the sidebar, avoid obscuring the data if needed
55384           var extent = geoExtent$$1(d3_geoBounds(selectedDatum));
55385           sidebar.expand(sidebar.intersects(extent));
55386
55387           context.map()
55388               .on('drawn.select-data', selectData);
55389       };
55390
55391
55392       mode.exit = function() {
55393           behaviors.forEach(context.uninstall);
55394
55395           select(document)
55396               .call(keybinding.unbind);
55397
55398           context.surface()
55399               .selectAll('.layer-mapdata .selected')
55400               .classed('selected hover', false);
55401
55402           context.map()
55403               .on('drawn.select-data', null);
55404
55405           context.ui().sidebar
55406               .hide();
55407       };
55408
55409
55410       return mode;
55411   }
55412
55413   function modeSelectNote$$1(context, selectedNoteID) {
55414       var mode = {
55415           id: 'select-note',
55416           button: 'browse'
55417       };
55418
55419       var osm = services.osm;
55420       var keybinding = utilKeybinding('select-note');
55421       var noteEditor = uiNoteEditor$$1(context)
55422           .on('change', function() {
55423               context.map().pan([0,0]);  // trigger a redraw
55424               var note = checkSelectedID();
55425               if (!note) return;
55426               context.ui().sidebar
55427                   .show(noteEditor.note(note));
55428           });
55429
55430       var behaviors = [
55431           behaviorBreathe(context),
55432           behaviorHover(context),
55433           behaviorSelect(context),
55434           behaviorLasso(context),
55435           modeDragNode$$1(context).behavior,
55436           modeDragNote$$1(context).behavior
55437       ];
55438
55439       var newFeature = false;
55440
55441
55442       function checkSelectedID() {
55443           if (!osm) return;
55444           var note = osm.getNote(selectedNoteID);
55445           if (!note) {
55446               context.enter(modeBrowse(context));
55447           }
55448           return note;
55449       }
55450
55451
55452       // class the note as selected, or return to browse mode if the note is gone
55453       function selectNote(drawn) {
55454           if (!checkSelectedID()) return;
55455
55456           var selection$$1 = context.surface().selectAll('.layer-notes .note-' + selectedNoteID);
55457
55458           if (selection$$1.empty()) {
55459               // Return to browse mode if selected DOM elements have
55460               // disappeared because the user moved them out of view..
55461               var source = event && event.type === 'zoom' && event.sourceEvent;
55462               if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
55463                   context.enter(modeBrowse(context));
55464               }
55465
55466           } else {
55467               selection$$1
55468                   .classed('selected', true);
55469               context.selectedNoteID(selectedNoteID);
55470           }
55471       }
55472
55473
55474       function esc() {
55475           context.enter(modeBrowse(context));
55476       }
55477
55478
55479       mode.newFeature = function(_) {
55480           if (!arguments.length) return newFeature;
55481           newFeature = _;
55482           return mode;
55483       };
55484
55485
55486       mode.enter = function() {
55487           var note = checkSelectedID();
55488           if (!note) return;
55489
55490           behaviors.forEach(context.install);
55491           keybinding.on('⎋', esc, true);
55492
55493           select(document)
55494               .call(keybinding);
55495
55496           selectNote();
55497
55498           var sidebar = context.ui().sidebar;
55499           sidebar.show(noteEditor.note(note));
55500
55501           // expand the sidebar, avoid obscuring the note if needed
55502           sidebar.expand(sidebar.intersects(note.extent()));
55503
55504           context.map()
55505               .on('drawn.select', selectNote);
55506       };
55507
55508
55509       mode.exit = function() {
55510           behaviors.forEach(context.uninstall);
55511
55512           select(document)
55513               .call(keybinding.unbind);
55514
55515           context.surface()
55516               .selectAll('.layer-notes .selected')
55517               .classed('selected hover', false);
55518
55519           context.map()
55520               .on('drawn.select', null);
55521
55522           context.ui().sidebar
55523               .hide();
55524
55525           context.selectedNoteID(null);
55526       };
55527
55528
55529       return mode;
55530   }
55531
55532   function behaviorAddWay(context) {
55533       var dispatch$$1 = dispatch('start', 'startFromWay', 'startFromNode');
55534       var draw = behaviorDraw(context);
55535
55536       function behavior(surface) {
55537           draw.on('click', function() { dispatch$$1.apply('start', this, arguments); })
55538               .on('clickWay', function() { dispatch$$1.apply('startFromWay', this, arguments); })
55539               .on('clickNode', function() { dispatch$$1.apply('startFromNode', this, arguments); })
55540               .on('cancel', behavior.cancel)
55541               .on('finish', behavior.cancel);
55542
55543           context.map()
55544               .dblclickEnable(false);
55545
55546           surface.call(draw);
55547       }
55548
55549
55550       behavior.off = function(surface) {
55551           surface.call(draw.off);
55552       };
55553
55554
55555       behavior.cancel = function() {
55556           window.setTimeout(function() {
55557               context.map().dblclickEnable(true);
55558           }, 1000);
55559
55560           context.enter(modeBrowse(context));
55561       };
55562
55563
55564       behavior.tail = function(text) {
55565           draw.tail(text);
55566           return behavior;
55567       };
55568
55569
55570       return utilRebind(behavior, dispatch$$1, 'on');
55571   }
55572
55573   function behaviorBreathe() {
55574       var duration = 800;
55575       var steps = 4;
55576       var selector$$1 = '.selected.shadow, .selected .shadow';
55577       var _selected = select(null);
55578       var _classed = '';
55579       var _params = {};
55580       var _done = false;
55581       var _timer;
55582
55583
55584       function ratchetyInterpolator(a, b, steps, units) {
55585           a = parseFloat(a);
55586           b = parseFloat(b);
55587           var sample = quantize()
55588               .domain([0, 1])
55589               .range(d3_quantize(interpolateNumber(a, b), steps));
55590
55591           return function(t) {
55592               return String(sample(t)) + (units || '');
55593           };
55594       }
55595
55596
55597       function reset(selection$$1) {
55598           selection$$1
55599               .style('stroke-opacity', null)
55600               .style('stroke-width', null)
55601               .style('fill-opacity', null)
55602               .style('r', null);
55603       }
55604
55605
55606       function setAnimationParams(transition, fromTo) {
55607           var toFrom = (fromTo === 'from' ? 'to' : 'from');
55608
55609           transition
55610               .styleTween('stroke-opacity', function(d) {
55611                   return ratchetyInterpolator(
55612                       _params[d.id][toFrom].opacity,
55613                       _params[d.id][fromTo].opacity,
55614                       steps
55615                   );
55616               })
55617               .styleTween('stroke-width', function(d) {
55618                   return ratchetyInterpolator(
55619                       _params[d.id][toFrom].width,
55620                       _params[d.id][fromTo].width,
55621                       steps,
55622                       'px'
55623                   );
55624               })
55625               .styleTween('fill-opacity', function(d) {
55626                   return ratchetyInterpolator(
55627                       _params[d.id][toFrom].opacity,
55628                       _params[d.id][fromTo].opacity,
55629                       steps
55630                   );
55631               })
55632               .styleTween('r', function(d) {
55633                   return ratchetyInterpolator(
55634                       _params[d.id][toFrom].width,
55635                       _params[d.id][fromTo].width,
55636                       steps,
55637                       'px'
55638                   );
55639               });
55640       }
55641
55642
55643       function calcAnimationParams(selection$$1) {
55644           selection$$1
55645               .call(reset)
55646               .each(function(d) {
55647                   var s = select(this);
55648                   var tag = s.node().tagName;
55649                   var p = {'from': {}, 'to': {}};
55650                   var opacity;
55651                   var width;
55652
55653                   // determine base opacity and width
55654                   if (tag === 'circle') {
55655                       opacity = parseFloat(s.style('fill-opacity') || 0.5);
55656                       width = parseFloat(s.style('r') || 15.5);
55657                   } else {
55658                       opacity = parseFloat(s.style('stroke-opacity') || 0.7);
55659                       width = parseFloat(s.style('stroke-width') || 10);
55660                   }
55661
55662                   // calculate from/to interpolation params..
55663                   p.tag = tag;
55664                   p.from.opacity = opacity * 0.6;
55665                   p.to.opacity = opacity * 1.25;
55666                   p.from.width = width * 0.7;
55667                   p.to.width = width * (tag === 'circle' ? 1.5 : 1);
55668                   _params[d.id] = p;
55669               });
55670       }
55671
55672
55673       function run(surface, fromTo) {
55674           var toFrom = (fromTo === 'from' ? 'to' : 'from');
55675           var currSelected = surface.selectAll(selector$$1);
55676           var currClassed = surface.attr('class');
55677
55678           if (_done || currSelected.empty()) {
55679               _selected.call(reset);
55680               return;
55681           }
55682
55683           if (!isEqual(currSelected.data(), _selected.data()) || currClassed !== _classed) {
55684               _selected.call(reset);
55685               _classed = currClassed;
55686               _selected = currSelected.call(calcAnimationParams);
55687           }
55688
55689           _selected
55690               .transition()
55691               .duration(duration)
55692               .call(setAnimationParams, fromTo)
55693               .on('end', function() {
55694                   surface.call(run, toFrom);
55695               });
55696       }
55697
55698
55699       function behavior(surface) {
55700           _done = false;
55701           _timer = timer(function() {
55702               // wait for elements to actually become selected
55703               if (surface.selectAll(selector$$1).empty()) {
55704                   return false;
55705               }
55706
55707               surface.call(run, 'from');
55708               _timer.stop();
55709               return true;
55710           }, 20);
55711       }
55712
55713
55714       behavior.off = function() {
55715           _done = true;
55716           if (_timer) {
55717               _timer.stop();
55718           }
55719           _selected
55720               .interrupt()
55721               .call(reset);
55722       };
55723
55724
55725       return behavior;
55726   }
55727
55728   function behaviorCopy(context) {
55729
55730       function groupEntities(ids, graph) {
55731           var entities = ids.map(function (id) { return graph.entity(id); });
55732           return assignIn({relation: [], way: [], node: []},
55733               groupBy(entities, function(entity) { return entity.type; }));
55734       }
55735
55736
55737       function getDescendants(id, graph, descendants) {
55738           var entity = graph.entity(id);
55739           var children;
55740
55741           descendants = descendants || {};
55742
55743           if (entity.type === 'relation') {
55744               children = map$3(entity.members, 'id');
55745           } else if (entity.type === 'way') {
55746               children = entity.nodes;
55747           } else {
55748               children = [];
55749           }
55750
55751           for (var i = 0; i < children.length; i++) {
55752               if (!descendants[children[i]]) {
55753                   descendants[children[i]] = true;
55754                   descendants = getDescendants(children[i], graph, descendants);
55755               }
55756           }
55757
55758           return descendants;
55759       }
55760
55761
55762       function getSelectionText() {
55763           return window.getSelection().toString();
55764       }
55765
55766
55767       function doCopy() {
55768           if (!getSelectionText()) {
55769               event.preventDefault();
55770           }
55771
55772           var graph = context.graph();
55773           var selected = groupEntities(context.selectedIDs(), graph);
55774           var canCopy = [];
55775           var skip = {};
55776           var entity;
55777           var i;
55778
55779           for (i = 0; i < selected.relation.length; i++) {
55780               entity = selected.relation[i];
55781               if (!skip[entity.id] && entity.isComplete(graph)) {
55782                   canCopy.push(entity.id);
55783                   skip = getDescendants(entity.id, graph, skip);
55784               }
55785           }
55786           for (i = 0; i < selected.way.length; i++) {
55787               entity = selected.way[i];
55788               if (!skip[entity.id]) {
55789                   canCopy.push(entity.id);
55790                   skip = getDescendants(entity.id, graph, skip);
55791               }
55792           }
55793           for (i = 0; i < selected.node.length; i++) {
55794               entity = selected.node[i];
55795               if (!skip[entity.id]) {
55796                   canCopy.push(entity.id);
55797               }
55798           }
55799
55800           context.copyIDs(canCopy);
55801       }
55802
55803
55804       function behavior() {
55805           context.keybinding().on(uiCmd('⌘C'), doCopy);
55806           return behavior;
55807       }
55808
55809       behavior.off = function() {
55810           context.keybinding().off(uiCmd('⌘C'));
55811       };
55812
55813
55814       return behavior;
55815   }
55816
55817   /*
55818       `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
55819
55820       * The `origin` function is expected to return an [x, y] tuple rather than an
55821         {x, y} object.
55822       * The events are `start`, `move`, and `end`.
55823         (https://github.com/mbostock/d3/issues/563)
55824       * The `start` event is not dispatched until the first cursor movement occurs.
55825         (https://github.com/mbostock/d3/pull/368)
55826       * The `move` event has a `point` and `delta` [x, y] tuple properties rather
55827         than `x`, `y`, `dx`, and `dy` properties.
55828       * The `end` event is not dispatched if no movement occurs.
55829       * An `off` function is available that unbinds the drag's internal event handlers.
55830    */
55831
55832   function behaviorDrag() {
55833       var dispatch$$1 = dispatch('start', 'move', 'end');
55834       var _origin = null;
55835       var _selector = '';
55836       var _event;
55837       var _target;
55838       var _surface;
55839
55840
55841       var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
55842       var d3_event_userSelectSuppress = function() {
55843               var selection$$1 = selection();
55844               var select$$1 = selection$$1.style(d3_event_userSelectProperty);
55845               selection$$1.style(d3_event_userSelectProperty, 'none');
55846               return function() {
55847                   selection$$1.style(d3_event_userSelectProperty, select$$1);
55848               };
55849           };
55850
55851
55852       function d3_eventCancel() {
55853           event.stopPropagation();
55854           event.preventDefault();
55855       }
55856
55857
55858       function eventOf(thiz, argumentz) {
55859           return function(e1) {
55860               e1.target = behavior;
55861               customEvent(e1, dispatch$$1.apply, dispatch$$1, [e1.type, thiz, argumentz]);
55862           };
55863       }
55864
55865
55866       function dragstart() {
55867           _target = this;
55868           _event = eventOf(_target, arguments);
55869
55870           var eventTarget = event.target;
55871           var touchId = event.touches ? event.changedTouches[0].identifier : null;
55872           var offset;
55873           var startOrigin = point$$1();
55874           var started = false;
55875           var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
55876
55877           select(window)
55878               .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
55879               .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
55880
55881           if (_origin) {
55882               offset = _origin.apply(_target, arguments);
55883               offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
55884           } else {
55885               offset = [0, 0];
55886           }
55887
55888           if (touchId === null) {
55889               event.stopPropagation();
55890           }
55891
55892
55893           function point$$1() {
55894               var p = _surface || _target.parentNode;
55895               return touchId !== null ? d3_touches(p).filter(function(p) {
55896                   return p.identifier === touchId;
55897               })[0] : mouse(p);
55898           }
55899
55900
55901           function dragmove() {
55902               var p = point$$1();
55903               var dx = p[0] - startOrigin[0];
55904               var dy = p[1] - startOrigin[1];
55905
55906               if (dx === 0 && dy === 0)
55907                   return;
55908
55909               startOrigin = p;
55910               d3_eventCancel();
55911
55912               if (!started) {
55913                   started = true;
55914                   _event({ type: 'start' });
55915               } else {
55916                   _event({
55917                       type: 'move',
55918                       point: [p[0] + offset[0],  p[1] + offset[1]],
55919                       delta: [dx, dy]
55920                   });
55921               }
55922           }
55923
55924
55925           function dragend() {
55926               if (started) {
55927                   _event({ type: 'end' });
55928
55929                   d3_eventCancel();
55930                   if (event.target === eventTarget) {
55931                       select(window)
55932                           .on('click.drag', click, true);
55933                   }
55934               }
55935
55936               select(window)
55937                   .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
55938                   .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
55939
55940               selectEnable();
55941           }
55942
55943
55944           function click() {
55945               d3_eventCancel();
55946               select(window)
55947                   .on('click.drag', null);
55948           }
55949       }
55950
55951
55952       function behavior(selection$$1) {
55953           var matchesSelector = utilPrefixDOMProperty('matchesSelector');
55954           var delegate = dragstart;
55955
55956           if (_selector) {
55957               delegate = function() {
55958                   var root = this;
55959                   var target = event.target;
55960                   for (; target && target !== root; target = target.parentNode) {
55961                       var datum = target.__data__;
55962
55963                       var entity = datum instanceof osmNote ?
55964                           datum : datum && datum.properties && datum.properties.entity;
55965
55966                       if (entity && target[matchesSelector](_selector)) {
55967                           return dragstart.call(target, entity);
55968                       }
55969                   }
55970               };
55971           }
55972
55973           selection$$1
55974               .on('mousedown.drag' + _selector, delegate)
55975               .on('touchstart.drag' + _selector, delegate);
55976       }
55977
55978
55979       behavior.off = function(selection$$1) {
55980           selection$$1
55981               .on('mousedown.drag' + _selector, null)
55982               .on('touchstart.drag' + _selector, null);
55983       };
55984
55985
55986       behavior.selector = function(_) {
55987           if (!arguments.length) return _selector;
55988           _selector = _;
55989           return behavior;
55990       };
55991
55992
55993       behavior.origin = function(_) {
55994           if (!arguments.length) return _origin;
55995           _origin = _;
55996           return behavior;
55997       };
55998
55999
56000       behavior.cancel = function() {
56001           select(window)
56002               .on('mousemove.drag', null)
56003               .on('mouseup.drag', null);
56004           return behavior;
56005       };
56006
56007
56008       behavior.target = function() {
56009           if (!arguments.length) return _target;
56010           _target = arguments[0];
56011           _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
56012           return behavior;
56013       };
56014
56015
56016       behavior.surface = function() {
56017           if (!arguments.length) return _surface;
56018           _surface = arguments[0];
56019           return behavior;
56020       };
56021
56022
56023       return utilRebind(behavior, dispatch$$1, 'on');
56024   }
56025
56026   function behaviorDrawWay(context, wayId, index, mode, startGraph) {
56027       var origWay = context.entity(wayId);
56028       var annotation = t((origWay.isDegenerate() ?
56029           'operations.start.annotation.' :
56030           'operations.continue.annotation.') + context.geometry(wayId)
56031       );
56032       var behavior = behaviorDraw(context);
56033       var _tempEdits = 0;
56034
56035       var end = osmNode({ loc: context.map().mouseCoordinates() });
56036
56037       // Push an annotated state for undo to return back to.
56038       // We must make sure to remove this edit later.
56039       context.perform(actionNoop(), annotation);
56040       _tempEdits++;
56041
56042       // Add the drawing node to the graph.
56043       // We must make sure to remove this edit later.
56044       context.perform(_actionAddDrawNode());
56045       _tempEdits++;
56046
56047
56048       function keydown() {
56049           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
56050               if (context.surface().classed('nope')) {
56051                   context.surface()
56052                       .classed('nope-suppressed', true);
56053               }
56054               context.surface()
56055                   .classed('nope', false)
56056                   .classed('nope-disabled', true);
56057           }
56058       }
56059
56060
56061       function keyup() {
56062           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
56063               if (context.surface().classed('nope-suppressed')) {
56064                   context.surface()
56065                       .classed('nope', true);
56066               }
56067               context.surface()
56068                   .classed('nope-suppressed', false)
56069                   .classed('nope-disabled', false);
56070           }
56071       }
56072
56073
56074       // related code
56075       // - `mode/drag_node.js`     `doMode()`
56076       // - `behavior/draw.js`      `click()`
56077       // - `behavior/draw_way.js`  `move()`
56078       function move(datum) {
56079           context.surface().classed('nope-disabled', event.altKey);
56080
56081           var targetLoc = datum && datum.properties && datum.properties.entity && datum.properties.entity.loc;
56082           var targetNodes = datum && datum.properties && datum.properties.nodes;
56083           var loc = context.map().mouseCoordinates();
56084
56085           if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
56086               loc = targetLoc;
56087
56088           } else if (targetNodes) {   // snap to way - a line target with `.nodes`
56089               var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
56090               if (choice) {
56091                   loc = choice.loc;
56092               }
56093           }
56094
56095           context.replace(actionMoveNode(end.id, loc));
56096           end = context.entity(end.id);
56097           checkGeometry(false);
56098       }
56099
56100
56101       // Check whether this edit causes the geometry to break.
56102       // If so, class the surface with a nope cursor.
56103       // `finishDraw` - Only checks the relevant line segments if finishing drawing
56104       function checkGeometry(finishDraw) {
56105           var nopeDisabled = context.surface().classed('nope-disabled');
56106           var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
56107
56108           if (nopeDisabled) {
56109               context.surface()
56110                   .classed('nope', false)
56111                   .classed('nope-suppressed', isInvalid);
56112           } else {
56113               context.surface()
56114                   .classed('nope', isInvalid)
56115                   .classed('nope-suppressed', false);
56116           }
56117       }
56118
56119
56120       function isInvalidGeometry(entity, graph, finishDraw) {
56121           var parents = graph.parentWays(entity);
56122
56123           for (var i = 0; i < parents.length; i++) {
56124               var parent = parents[i];
56125               var nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
56126
56127               if (origWay.isClosed()) { // Check if Area
56128                   if (finishDraw) {
56129                       nodes.splice(-2, 1);
56130                       entity = nodes[nodes.length-2];
56131                   } else {
56132                       nodes.pop();
56133                   }
56134               } else { // Line
56135                   if (finishDraw) {
56136                       nodes.pop();
56137                   }
56138               }
56139
56140               if (geoHasSelfIntersections(nodes, entity.id)) {
56141                   return true;
56142               }
56143           }
56144
56145           return false;
56146       }
56147
56148
56149       function undone() {
56150           // Undo popped the history back to the initial annotated no-op edit.
56151           // Remove initial no-op edit and whatever edit happened immediately before it.
56152           context.pop(2);
56153           _tempEdits = 0;
56154
56155           if (context.hasEntity(wayId)) {
56156               context.enter(mode);
56157           } else {
56158               context.enter(modeBrowse(context));
56159           }
56160       }
56161
56162
56163       function setActiveElements() {
56164           context.surface().selectAll('.' + end.id)
56165               .classed('active', true);
56166       }
56167
56168
56169       var drawWay = function(surface) {
56170           behavior
56171               .on('move', move)
56172               .on('click', drawWay.add)
56173               .on('clickWay', drawWay.addWay)
56174               .on('clickNode', drawWay.addNode)
56175               .on('undo', context.undo)
56176               .on('cancel', drawWay.cancel)
56177               .on('finish', drawWay.finish);
56178
56179           select(window)
56180               .on('keydown.drawWay', keydown)
56181               .on('keyup.drawWay', keyup);
56182
56183           context.map()
56184               .dblclickEnable(false)
56185               .on('drawn.draw', setActiveElements);
56186
56187           setActiveElements();
56188
56189           surface.call(behavior);
56190
56191           context.history()
56192               .on('undone.draw', undone);
56193       };
56194
56195
56196       drawWay.off = function(surface) {
56197           // Drawing was interrupted unexpectedly.
56198           // This can happen if the user changes modes,
56199           // clicks geolocate button, a hashchange event occurs, etc.
56200           if (_tempEdits) {
56201               context.pop(_tempEdits);
56202               while (context.graph() !== startGraph) {
56203                   context.pop();
56204               }
56205           }
56206
56207           context.map()
56208               .on('drawn.draw', null);
56209
56210           surface.call(behavior.off)
56211               .selectAll('.active')
56212               .classed('active', false);
56213
56214           surface
56215               .classed('nope', false)
56216               .classed('nope-suppressed', false)
56217               .classed('nope-disabled', false);
56218
56219           select(window)
56220               .on('keydown.hover', null)
56221               .on('keyup.hover', null);
56222
56223           context.history()
56224               .on('undone.draw', null);
56225       };
56226
56227
56228       function _actionAddDrawNode() {
56229           return function(graph) {
56230               return graph
56231                   .replace(end)
56232                   .replace(origWay.addNode(end.id, index));
56233           };
56234       }
56235
56236
56237       function _actionReplaceDrawNode(newNode) {
56238           return function(graph) {
56239               return graph
56240                   .replace(origWay.addNode(newNode.id, index))
56241                   .remove(end);
56242           };
56243       }
56244
56245
56246       // Accept the current position of the drawing node and continue drawing.
56247       drawWay.add = function(loc, d) {
56248           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
56249               return;   // can't click here
56250           }
56251
56252           context.pop(_tempEdits);
56253           _tempEdits = 0;
56254
56255           context.perform(
56256               _actionAddDrawNode(),
56257               annotation
56258           );
56259
56260           checkGeometry(false);   // finishDraw = false
56261           context.enter(mode);
56262       };
56263
56264
56265       // Connect the way to an existing way.
56266       drawWay.addWay = function(loc, edge, d) {
56267           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
56268               return;   // can't click here
56269           }
56270
56271           context.pop(_tempEdits);
56272           _tempEdits = 0;
56273
56274           context.perform(
56275               _actionAddDrawNode(),
56276               actionAddMidpoint({ loc: loc, edge: edge }, end),
56277               annotation
56278           );
56279
56280           checkGeometry(false);   // finishDraw = false
56281           context.enter(mode);
56282       };
56283
56284
56285       // Connect the way to an existing node and continue drawing.
56286       drawWay.addNode = function(node, d) {
56287           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
56288               return;   // can't click here
56289           }
56290
56291           context.pop(_tempEdits);
56292           _tempEdits = 0;
56293
56294           context.perform(
56295               _actionReplaceDrawNode(node),
56296               annotation
56297           );
56298
56299           checkGeometry(false);   // finishDraw = false
56300           context.enter(mode);
56301       };
56302
56303
56304       // Finish the draw operation, removing the temporary edits.
56305       // If the way has enough nodes to be valid, it's selected.
56306       // Otherwise, delete everything and return to browse mode.
56307       drawWay.finish = function() {
56308           checkGeometry(true);   // finishDraw = true
56309           if (context.surface().classed('nope')) {
56310               return;   // can't click here
56311           }
56312
56313           context.pop(_tempEdits);
56314           _tempEdits = 0;
56315
56316           var way = context.hasEntity(wayId);
56317           if (!way || way.isDegenerate()) {
56318               drawWay.cancel();
56319               return;
56320           }
56321
56322           window.setTimeout(function() {
56323               context.map().dblclickEnable(true);
56324           }, 1000);
56325
56326           context.enter(modeSelect(context, [wayId]).newFeature(true));
56327       };
56328
56329
56330       // Cancel the draw operation, delete everything, and return to browse mode.
56331       drawWay.cancel = function() {
56332           context.pop(_tempEdits);
56333           _tempEdits = 0;
56334
56335           while (context.graph() !== startGraph) {
56336               context.pop();
56337           }
56338
56339           window.setTimeout(function() {
56340               context.map().dblclickEnable(true);
56341           }, 1000);
56342
56343           context.surface()
56344               .classed('nope', false)
56345               .classed('nope-disabled', false)
56346               .classed('nope-suppressed', false);
56347
56348           context.enter(modeBrowse(context));
56349       };
56350
56351
56352       drawWay.activeID = function() {
56353           if (!arguments.length) return end.id;
56354           // no assign
56355           return drawWay;
56356       };
56357
56358
56359       drawWay.tail = function(text) {
56360           behavior.tail(text);
56361           return drawWay;
56362       };
56363
56364
56365       return drawWay;
56366   }
56367
56368   function behaviorHash(context) {
56369       var s0 = null; // cached window.location.hash
56370       var lat = 90 - 1e-8; // allowable latitude range
56371
56372
56373       var parser = function(map, s) {
56374           var q = utilStringQs(s);
56375           var args = (q.map || '').split('/').map(Number);
56376
56377           if (args.length < 3 || args.some(isNaN)) {
56378               return true; // replace bogus hash
56379
56380           } else if (s !== formatter(map).slice(1)) {   // hash has changed
56381               var mode = context.mode(),
56382                   dist = geoSphericalDistance(map.center(), [args[2], args[1]]),
56383                   maxdist = 500;
56384
56385               // Don't allow the hash location to change too much while drawing
56386               // This can happen if the user accidently hit the back button.  #3996
56387               if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
56388                   context.enter(modeBrowse(context));
56389               }
56390
56391               map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
56392           }
56393       };
56394
56395
56396       var formatter = function(map) {
56397           var center = map.center();
56398           var zoom = map.zoom();
56399           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
56400           var q = omit(utilStringQs(window.location.hash.substring(1)),
56401               ['comment', 'source', 'hashtags', 'walkthrough']
56402           );
56403           var newParams = {};
56404
56405           delete q.id;
56406           var selected = context.selectedIDs().filter(function(id) {
56407               return !context.entity(id).isNew();
56408           });
56409           if (selected.length) {
56410               newParams.id = selected.join(',');
56411           }
56412
56413           newParams.map = zoom.toFixed(2) +
56414               '/' + center[1].toFixed(precision) +
56415               '/' + center[0].toFixed(precision);
56416
56417           return '#' + utilQsString(assign(q, newParams), true);
56418       };
56419
56420
56421       function update() {
56422           if (context.inIntro()) return;
56423           var s1 = formatter(context.map());
56424           if (s0 !== s1) {
56425               window.location.replace(s0 = s1);  // don't recenter the map!
56426           }
56427       }
56428
56429
56430       var throttledUpdate = throttle(update, 500);
56431
56432
56433       function hashchange() {
56434           if (window.location.hash === s0) return;  // ignore spurious hashchange events
56435           if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
56436               update(); // replace bogus hash
56437           }
56438       }
56439
56440
56441       function behavior() {
56442           context.map()
56443               .on('move.hash', throttledUpdate);
56444
56445           context
56446               .on('enter.hash', throttledUpdate);
56447
56448           select(window)
56449               .on('hashchange.hash', hashchange);
56450
56451           if (window.location.hash) {
56452               var q = utilStringQs(window.location.hash.substring(1));
56453
56454               if (q.id) {
56455                   context.zoomToEntity(q.id.split(',')[0], !q.map);
56456               }
56457
56458               if (q.comment) {
56459                   context.storage('comment', q.comment);
56460                   context.storage('commentDate', Date.now());
56461               }
56462
56463               if (q.source) {
56464                   context.storage('source', q.source);
56465                   context.storage('commentDate', Date.now());
56466               }
56467
56468               if (q.hashtags) {
56469                   context.storage('hashtags', q.hashtags);
56470               }
56471
56472               if (q.walkthrough === 'true') {
56473                   behavior.startWalkthrough = true;
56474               }
56475
56476               hashchange();
56477
56478               if (q.map) {
56479                   behavior.hadHash = true;
56480               }
56481           }
56482       }
56483
56484
56485       behavior.off = function() {
56486           throttledUpdate.cancel();
56487
56488           context.map()
56489               .on('move.hash', null);
56490
56491           context
56492               .on('enter.hash', null);
56493
56494           select(window)
56495               .on('hashchange.hash', null);
56496
56497           window.location.hash = '';
56498       };
56499
56500
56501       return behavior;
56502   }
56503
56504   function behaviorLasso(context) {
56505
56506       var behavior = function(selection$$1) {
56507           var lasso;
56508
56509
56510           function mousedown() {
56511               var button = 0;  // left
56512               if (event.button === button && event.shiftKey === true) {
56513                   lasso = null;
56514
56515                   select(window)
56516                       .on('mousemove.lasso', mousemove)
56517                       .on('mouseup.lasso', mouseup);
56518
56519                   event.stopPropagation();
56520               }
56521           }
56522
56523
56524           function mousemove() {
56525               if (!lasso) {
56526                   lasso = uiLasso(context);
56527                   context.surface().call(lasso);
56528               }
56529
56530               lasso.p(context.mouse());
56531           }
56532
56533
56534           function normalize(a, b) {
56535               return [
56536                   [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
56537                   [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
56538           }
56539
56540
56541           function lassoed() {
56542               if (!lasso) return [];
56543
56544               var graph = context.graph();
56545               var bounds = lasso.extent().map(context.projection.invert);
56546               var extent = geoExtent$$1(normalize(bounds[0], bounds[1]));
56547
56548               return map$3(context.intersects(extent).filter(function(entity) {
56549                   return entity.type === 'node' &&
56550                       geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
56551                       !context.features().isHidden(entity, graph, entity.geometry(graph));
56552               }), 'id');
56553           }
56554
56555
56556           function mouseup() {
56557               select(window)
56558                   .on('mousemove.lasso', null)
56559                   .on('mouseup.lasso', null);
56560
56561               if (!lasso) return;
56562
56563               var ids = lassoed();
56564               lasso.close();
56565
56566               if (ids.length) {
56567                   context.enter(modeSelect(context, ids));
56568               }
56569           }
56570
56571           selection$$1
56572               .on('mousedown.lasso', mousedown);
56573       };
56574
56575
56576       behavior.off = function(selection$$1) {
56577           selection$$1.on('mousedown.lasso', null);
56578       };
56579
56580
56581       return behavior;
56582   }
56583
56584   /* Creates a keybinding behavior for an operation */
56585   function behaviorOperation(context) {
56586       var _operation;
56587
56588       function keypress() {
56589           event.preventDefault();
56590           var disabled = _operation.disabled();
56591           var flash;
56592
56593           if (disabled) {
56594               flash = uiFlash()
56595                   .duration(4000)
56596                   .iconName('#iD-operation-' + _operation.id)
56597                   .iconClass('operation disabled')
56598                   .text(_operation.tooltip);
56599
56600               flash();
56601
56602           } else {
56603               flash = uiFlash()
56604                   .duration(2000)
56605                   .iconName('#iD-operation-' + _operation.id)
56606                   .iconClass('operation')
56607                   .text(_operation.annotation() || _operation.title);
56608
56609               flash();
56610               _operation();
56611           }
56612       }
56613
56614
56615       function behavior() {
56616           if (_operation && _operation.available()) {
56617               context.keybinding()
56618                   .on(_operation.keys, keypress);
56619           }
56620
56621           return behavior;
56622       }
56623
56624
56625       behavior.off = function() {
56626           context.keybinding()
56627               .off(_operation.keys);
56628       };
56629
56630
56631       behavior.which = function (_) {
56632           if (!arguments.length) return _operation;
56633           _operation = _;
56634           return behavior;
56635       };
56636
56637
56638       return behavior;
56639   }
56640
56641   /**
56642    * The base implementation of `_.invert` and `_.invertBy` which inverts
56643    * `object` with values transformed by `iteratee` and set by `setter`.
56644    *
56645    * @private
56646    * @param {Object} object The object to iterate over.
56647    * @param {Function} setter The function to set `accumulator` values.
56648    * @param {Function} iteratee The iteratee to transform values.
56649    * @param {Object} accumulator The initial inverted object.
56650    * @returns {Function} Returns `accumulator`.
56651    */
56652   function baseInverter(object, setter, iteratee, accumulator) {
56653     baseForOwn(object, function(value, key, object) {
56654       setter(accumulator, iteratee(value), key, object);
56655     });
56656     return accumulator;
56657   }
56658
56659   /**
56660    * Creates a function like `_.invertBy`.
56661    *
56662    * @private
56663    * @param {Function} setter The function to set accumulator values.
56664    * @param {Function} toIteratee The function to resolve iteratees.
56665    * @returns {Function} Returns the new inverter function.
56666    */
56667   function createInverter(setter, toIteratee) {
56668     return function(object, iteratee) {
56669       return baseInverter(object, setter, toIteratee(iteratee), {});
56670     };
56671   }
56672
56673   /** Used for built-in method references. */
56674   var objectProto$j = Object.prototype;
56675
56676   /**
56677    * Used to resolve the
56678    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
56679    * of values.
56680    */
56681   var nativeObjectToString$2 = objectProto$j.toString;
56682
56683   /**
56684    * Creates an object composed of the inverted keys and values of `object`.
56685    * If `object` contains duplicate values, subsequent values overwrite
56686    * property assignments of previous values.
56687    *
56688    * @static
56689    * @memberOf _
56690    * @since 0.7.0
56691    * @category Object
56692    * @param {Object} object The object to invert.
56693    * @returns {Object} Returns the new inverted object.
56694    * @example
56695    *
56696    * var object = { 'a': 1, 'b': 2, 'c': 1 };
56697    *
56698    * _.invert(object);
56699    * // => { '1': 'c', '2': 'b' }
56700    */
56701   var invert = createInverter(function(result, value, key) {
56702     if (value != null &&
56703         typeof value.toString != 'function') {
56704       value = nativeObjectToString$2.call(value);
56705     }
56706
56707     result[value] = key;
56708   }, constant$d(identity$8));
56709
56710   /**
56711    * Creates an object with the same keys as `object` and values generated
56712    * by running each own enumerable string keyed property of `object` thru
56713    * `iteratee`. The iteratee is invoked with three arguments:
56714    * (value, key, object).
56715    *
56716    * @static
56717    * @memberOf _
56718    * @since 2.4.0
56719    * @category Object
56720    * @param {Object} object The object to iterate over.
56721    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
56722    * @returns {Object} Returns the new mapped object.
56723    * @see _.mapKeys
56724    * @example
56725    *
56726    * var users = {
56727    *   'fred':    { 'user': 'fred',    'age': 40 },
56728    *   'pebbles': { 'user': 'pebbles', 'age': 1 }
56729    * };
56730    *
56731    * _.mapValues(users, function(o) { return o.age; });
56732    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
56733    *
56734    * // The `_.property` iteratee shorthand.
56735    * _.mapValues(users, 'age');
56736    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
56737    */
56738   function mapValues(object, iteratee) {
56739     var result = {};
56740     iteratee = baseIteratee(iteratee, 3);
56741
56742     baseForOwn(object, function(value, key, object) {
56743       baseAssignValue(result, key, iteratee(value, key, object));
56744     });
56745     return result;
56746   }
56747
56748   function behaviorPaste(context) {
56749
56750       function doPaste() {
56751           event.preventDefault();
56752
56753           var baseGraph = context.graph();
56754           var mouse$$1 = context.mouse();
56755           var projection = context.projection;
56756           var viewport = geoExtent$$1(projection.clipExtent()).polygon();
56757
56758           if (!geoPointInPolygon(mouse$$1, viewport)) return;
56759
56760           var extent = geoExtent$$1();
56761           var oldIDs = context.copyIDs();
56762           var oldGraph = context.copyGraph();
56763           var newIDs = [];
56764
56765           if (!oldIDs.length) return;
56766
56767           var action = actionCopyEntities(oldIDs, oldGraph);
56768           context.perform(action);
56769
56770           var copies = action.copies();
56771           var originals = invert(mapValues(copies, 'id'));
56772           for (var id in copies) {
56773               var oldEntity = oldGraph.entity(id);
56774               var newEntity = copies[id];
56775
56776               extent._extend(oldEntity.extent(oldGraph));
56777
56778               // Exclude child nodes from newIDs if their parent way was also copied.
56779               var parents = context.graph().parentWays(newEntity);
56780               var parentCopied = false;
56781               for (var i = 0; i < parents.length; i++) {
56782                   if (originals[parents[i].id]) {
56783                       parentCopied = true;
56784                       break;
56785                   }
56786               }
56787
56788               if (!parentCopied) {
56789                   newIDs.push(newEntity.id);
56790               }
56791           }
56792
56793           // Put pasted objects where mouse pointer is..
56794           var center = projection(extent.center());
56795           var delta = geoVecSubtract(mouse$$1, center);
56796
56797           context.perform(actionMove(newIDs, delta, projection));
56798           context.enter(modeMove$$1(context, newIDs, baseGraph));
56799       }
56800
56801
56802       function behavior() {
56803           context.keybinding().on(uiCmd('⌘V'), doPaste);
56804           return behavior;
56805       }
56806
56807
56808       behavior.off = function() {
56809           context.keybinding().off(uiCmd('⌘V'));
56810       };
56811
56812
56813       return behavior;
56814   }
56815
56816   function behaviorSelect(context) {
56817       var lastMouse = null;
56818       var suppressMenu = true;
56819       var tolerance = 4;
56820       var p1 = null;
56821
56822
56823       function point$$1() {
56824           return mouse(context.container().node());
56825       }
56826
56827
56828       function keydown() {
56829           var e = event;
56830           if (e && e.shiftKey) {
56831               context.surface()
56832                   .classed('behavior-multiselect', true);
56833           }
56834
56835           if (e && e.keyCode === 93) {  // context menu
56836               e.preventDefault();
56837               e.stopPropagation();
56838           }
56839       }
56840
56841
56842       function keyup() {
56843           var e = event;
56844           if (!e || !e.shiftKey) {
56845               context.surface()
56846                   .classed('behavior-multiselect', false);
56847           }
56848
56849
56850           if (e && e.keyCode === 93) {  // context menu
56851               e.preventDefault();
56852               e.stopPropagation();
56853               contextmenu();
56854           }
56855       }
56856
56857
56858       function mousedown() {
56859           if (!p1) p1 = point$$1();
56860           select(window)
56861               .on('mouseup.select', mouseup, true);
56862
56863           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
56864           suppressMenu = !isShowAlways;
56865       }
56866
56867
56868       function mousemove() {
56869           if (event) lastMouse = event;
56870       }
56871
56872
56873       function mouseup() {
56874           click();
56875       }
56876
56877
56878       function contextmenu() {
56879           var e = event;
56880           e.preventDefault();
56881           e.stopPropagation();
56882
56883           if (!+e.clientX && !+e.clientY) {
56884               if (lastMouse) {
56885                   e.sourceEvent = lastMouse;
56886               } else {
56887                   return;
56888               }
56889           }
56890
56891           if (!p1) p1 = point$$1();
56892           suppressMenu = false;
56893           click();
56894       }
56895
56896
56897       function click() {
56898           select(window)
56899               .on('mouseup.select', null, true);
56900
56901           if (!p1) return;
56902           var p2 = point$$1();
56903           var dist = geoVecLength(p1, p2);
56904
56905           p1 = null;
56906           if (dist > tolerance) {
56907               return;
56908           }
56909
56910           var isMultiselect = event.shiftKey || select('#surface .lasso').node();
56911           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
56912           var datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__);
56913           var mode = context.mode();
56914
56915           var entity = datum && datum.properties && datum.properties.entity;
56916           if (entity) datum = entity;
56917
56918           if (datum && datum.type === 'midpoint') {
56919               datum = datum.parents[0];
56920           }
56921
56922           if (datum instanceof osmEntity$$1) {    // clicked an entity..
56923               var selectedIDs = context.selectedIDs();
56924               context.selectedNoteID(null);
56925
56926               if (!isMultiselect) {
56927                   if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
56928                       // multiple things already selected, just show the menu...
56929                       mode.suppressMenu(false).reselect();
56930                   } else {
56931                       // select a single thing..
56932                       context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
56933                   }
56934
56935               } else {
56936                   if (selectedIDs.indexOf(datum.id) !== -1) {
56937                       // clicked entity is already in the selectedIDs list..
56938                       if (!suppressMenu && !isShowAlways) {
56939                           // don't deselect clicked entity, just show the menu.
56940                           mode.suppressMenu(false).reselect();
56941                       } else {
56942                           // deselect clicked entity, then reenter select mode or return to browse mode..
56943                           selectedIDs = without(selectedIDs, datum.id);
56944                           context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
56945                       }
56946                   } else {
56947                       // clicked entity is not in the selected list, add it..
56948                       selectedIDs = selectedIDs.concat([datum.id]);
56949                       context.enter(modeSelect(context, selectedIDs).suppressMenu(suppressMenu));
56950                   }
56951               }
56952
56953           } else if (datum && datum.__featurehash__ && !isMultiselect) {    // clicked Data..
56954               context
56955                   .selectedNoteID(null)
56956                   .enter(modeSelectData$$1(context, datum));
56957
56958           } else if (datum instanceof osmNote && !isMultiselect) {    // clicked a Note..
56959               context
56960                   .selectedNoteID(datum.id)
56961                   .enter(modeSelectNote$$1(context, datum.id));
56962
56963           } else {    // clicked nothing..
56964               context.selectedNoteID(null);
56965               if (!isMultiselect && mode.id !== 'browse') {
56966                   context.enter(modeBrowse(context));
56967               }
56968           }
56969
56970           // reset for next time..
56971           suppressMenu = true;
56972       }
56973
56974
56975       function behavior(selection$$1) {
56976           lastMouse = null;
56977           suppressMenu = true;
56978           p1 = null;
56979
56980           select(window)
56981               .on('keydown.select', keydown)
56982               .on('keyup.select', keyup)
56983               .on('contextmenu.select-window', function() {
56984                   // Edge and IE really like to show the contextmenu on the
56985                   // menubar when user presses a keyboard menu button
56986                   // even after we've already preventdefaulted the key event.
56987                   var e = event;
56988                   if (+e.clientX === 0 && +e.clientY === 0) {
56989                       event.preventDefault();
56990                       event.stopPropagation();
56991                   }
56992               });
56993
56994           selection$$1
56995               .on('mousedown.select', mousedown)
56996               .on('mousemove.select', mousemove)
56997               .on('contextmenu.select', contextmenu);
56998
56999           if (event && event.shiftKey) {
57000               context.surface()
57001                   .classed('behavior-multiselect', true);
57002           }
57003       }
57004
57005
57006       behavior.off = function(selection$$1) {
57007           select(window)
57008               .on('keydown.select', null)
57009               .on('keyup.select', null)
57010               .on('contextmenu.select-window', null)
57011               .on('mouseup.select', null, true);
57012
57013           selection$$1
57014               .on('mousedown.select', null)
57015               .on('mousemove.select', null)
57016               .on('contextmenu.select', null);
57017
57018           context.surface()
57019               .classed('behavior-multiselect', false);
57020       };
57021
57022
57023       return behavior;
57024   }
57025
57026   function uiAccount(context) {
57027       var osm = context.connection();
57028
57029
57030       function update(selection$$1) {
57031           if (!osm) return;
57032
57033           if (!osm.authenticated()) {
57034               selection$$1.selectAll('#userLink, #logoutLink')
57035                   .classed('hide', true);
57036               return;
57037           }
57038
57039           osm.userDetails(function(err, details) {
57040               var userLink = selection$$1.select('#userLink'),
57041                   logoutLink = selection$$1.select('#logoutLink');
57042
57043               userLink.html('');
57044               logoutLink.html('');
57045
57046               if (err) return;
57047
57048               selection$$1.selectAll('#userLink, #logoutLink')
57049                   .classed('hide', false);
57050
57051               // Link
57052               userLink.append('a')
57053                   .attr('href', osm.userURL(details.display_name))
57054                   .attr('target', '_blank');
57055
57056               // Add thumbnail or dont
57057               if (details.image_url) {
57058                   userLink.append('img')
57059                       .attr('class', 'icon pre-text user-icon')
57060                       .attr('src', details.image_url);
57061               } else {
57062                   userLink
57063                       .call(svgIcon('#iD-icon-avatar', 'pre-text light'));
57064               }
57065
57066               // Add user name
57067               userLink.append('span')
57068                   .attr('class', 'label')
57069                   .text(details.display_name);
57070
57071               logoutLink.append('a')
57072                   .attr('class', 'logout')
57073                   .attr('href', '#')
57074                   .text(t('logout'))
57075                   .on('click.logout', function() {
57076                       event.preventDefault();
57077                       osm.logout();
57078                   });
57079           });
57080       }
57081
57082
57083       return function(selection$$1) {
57084           selection$$1.append('li')
57085               .attr('id', 'logoutLink')
57086               .classed('hide', true);
57087
57088           selection$$1.append('li')
57089               .attr('id', 'userLink')
57090               .classed('hide', true);
57091
57092           if (osm) {
57093               osm.on('change.account', function() { update(selection$$1); });
57094               update(selection$$1);
57095           }
57096       };
57097   }
57098
57099   function uiAttribution(context) {
57100       var selection$$1;
57101
57102
57103       function attribution(data, klass) {
57104           var div = selection$$1.selectAll('.' + klass)
57105               .data([0]);
57106
57107           div = div.enter()
57108               .append('div')
57109               .attr('class', klass)
57110               .merge(div);
57111
57112
57113           var background = div.selectAll('.attribution')
57114               .data(data, function(d) { return d.name(); });
57115
57116           background.exit()
57117               .remove();
57118
57119           background = background.enter()
57120               .append('span')
57121               .attr('class', 'attribution')
57122               .each(function(d) {
57123                   if (d.terms_html) {
57124                       select(this)
57125                           .html(d.terms_html);
57126                       return;
57127                   }
57128
57129                   var selection$$1;
57130                   if (d.terms_url) {
57131                       selection$$1 = select(this)
57132                           .append('a')
57133                           .attr('href', d.terms_url)
57134                           .attr('target', '_blank');
57135                   } else {
57136                       selection$$1 = select(this);
57137                   }
57138
57139
57140                   var id_safe = d.id.replace('.', '<TX_DOT>');
57141                   var terms_text = t('imagery.' + id_safe + '.attribution.text',
57142                       { default: d.terms_text || d.id || d.name() }
57143                   );
57144
57145                   if (d.icon && !d.overlay) {
57146                       selection$$1
57147                           .append('img')
57148                           .attr('class', 'source-image')
57149                           .attr('src', d.icon);
57150                   }
57151
57152                   selection$$1
57153                       .append('span')
57154                       .attr('class', 'attribution-text')
57155                       .text(terms_text);
57156               })
57157               .merge(background);
57158
57159
57160           var copyright = background.selectAll('.copyright-notice')
57161               .data(function(d) {
57162                   var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
57163                   return notice ? [notice] : [];
57164               });
57165
57166           copyright.exit()
57167               .remove();
57168
57169           copyright = copyright.enter()
57170               .append('span')
57171               .attr('class', 'copyright-notice')
57172               .merge(copyright);
57173
57174           copyright
57175               .text(String);
57176       }
57177
57178
57179       function update() {
57180           attribution([context.background().baseLayerSource()], 'base-layer-attribution');
57181           attribution(context.background().overlayLayerSources().filter(function (s) {
57182               return s.validZoom(context.map().zoom());
57183           }), 'overlay-layer-attribution');
57184       }
57185
57186
57187       return function(select$$1) {
57188           selection$$1 = select$$1;
57189
57190           context.background()
57191               .on('change.attribution', update);
57192
57193           context.map()
57194               .on('move.attribution', throttle(update, 400, {leading: false}));
57195
57196           update();
57197       };
57198   }
57199
57200   // toggles the visibility of ui elements, using a combination of the
57201   // hide class, which sets display=none, and a d3 transition for opacity.
57202   // this will cause blinking when called repeatedly, so check that the
57203   // value actually changes between calls.
57204   function uiToggle(show, callback) {
57205       return function(selection$$1) {
57206           selection$$1
57207               .style('opacity', show ? 0 : 1)
57208               .classed('hide', false)
57209               .transition()
57210               .style('opacity', show ? 1 : 0)
57211               .on('end', function() {
57212                   select(this)
57213                       .classed('hide', !show)
57214                       .style('opacity', null);
57215                   if (callback) callback.apply(this);
57216               });
57217       };
57218   }
57219
57220   function uiDisclosure(context, key, expandedDefault) {
57221       var dispatch$$1 = dispatch('toggled');
57222       var _preference = (context.storage('disclosure.' + key + '.expanded'));
57223       var _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true'));
57224       var _title;
57225       var _updatePreference = true;
57226       var _content = function () {};
57227
57228
57229       var disclosure = function(selection$$1) {
57230           var hideToggle = selection$$1.selectAll('.hide-toggle-' + key)
57231               .data([0]);
57232
57233           // enter
57234           var hideToggleEnter = hideToggle.enter()
57235               .append('a')
57236               .attr('href', '#')
57237               .attr('class', 'hide-toggle hide-toggle-' + key)
57238               .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
57239
57240           hideToggleEnter
57241               .append('span')
57242               .attr('class', 'hide-toggle-text');
57243
57244           // update
57245           hideToggle = hideToggleEnter
57246               .merge(hideToggle);
57247
57248           hideToggle
57249               .on('click', toggle)
57250               .classed('expanded', _expanded);
57251
57252           hideToggle.selectAll('.hide-toggle-text')
57253               .text(_title);
57254
57255           hideToggle.selectAll('.hide-toggle-icon')
57256               .attr('xlink:href', _expanded ? '#iD-icon-down'
57257                   : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57258               );
57259
57260
57261           var wrap = selection$$1.selectAll('.disclosure-wrap')
57262               .data([0]);
57263
57264           wrap = wrap.enter()
57265               .append('div')
57266               .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
57267               .merge(wrap);
57268
57269           wrap
57270               .classed('hide', !_expanded)
57271               .call(_content);
57272
57273
57274           function toggle() {
57275               event.preventDefault();
57276
57277               _expanded = !_expanded;
57278
57279               if (_updatePreference) {
57280                   context.storage('disclosure.' + key + '.expanded', _expanded);
57281               }
57282
57283               hideToggle
57284                   .classed('expanded', _expanded);
57285
57286               hideToggle.selectAll('.hide-toggle-icon')
57287                   .attr('xlink:href', _expanded ? '#iD-icon-down'
57288                       : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57289                   );
57290
57291               wrap
57292                   .call(uiToggle(_expanded));
57293
57294               dispatch$$1.call('toggled', this, _expanded);
57295           }
57296       };
57297
57298
57299       disclosure.title = function(_) {
57300           if (!arguments.length) return _title;
57301           _title = _;
57302           return disclosure;
57303       };
57304
57305
57306       disclosure.expanded = function(_) {
57307           if (!arguments.length) return _expanded;
57308           _expanded = _;
57309           return disclosure;
57310       };
57311
57312
57313       disclosure.updatePreference = function(_) {
57314           if (!arguments.length) return _updatePreference;
57315           _updatePreference = _;
57316           return disclosure;
57317       };
57318
57319
57320       disclosure.content = function(_) {
57321           if (!arguments.length) return _content;
57322           _content = _;
57323           return disclosure;
57324       };
57325
57326
57327       return utilRebind(disclosure, dispatch$$1, 'on');
57328   }
57329
57330   function uiBackgroundDisplayOptions(context) {
57331       var detected = utilDetect();
57332       var storedOpacity = context.storage('background-opacity');
57333       var minVal = 0.25;
57334       var maxVal = detected.cssfilters ? 2 : 1;
57335
57336       var sliders = detected.cssfilters
57337           ? ['brightness', 'contrast', 'saturation', 'sharpness']
57338           : ['brightness'];
57339
57340       var _options = {
57341           brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
57342           contrast: 1,
57343           saturation: 1,
57344           sharpness: 1
57345       };
57346
57347       var _selection = select(null);
57348
57349
57350       function clamp(x, min, max) {
57351           return Math.max(min, Math.min(x, max));
57352       }
57353
57354
57355       function updateValue(d, val) {
57356           if (!val && event && event.target) {
57357               val = event.target.value;
57358           }
57359
57360           val = clamp(val, minVal, maxVal);
57361
57362           _options[d] = val;
57363           context.background()[d](val);
57364
57365           if (d === 'brightness') {
57366               context.storage('background-opacity', val);
57367           }
57368
57369           _selection
57370               .call(render);
57371       }
57372
57373
57374       function render(selection$$1) {
57375           var container = selection$$1.selectAll('.display-options-container')
57376               .data([0]);
57377
57378           var containerEnter = container.enter()
57379               .append('div')
57380               .attr('class', 'display-options-container controls-list');
57381
57382           // add slider controls
57383           var slidersEnter = containerEnter.selectAll('.display-control')
57384               .data(sliders)
57385               .enter()
57386               .append('div')
57387               .attr('class', function(d) { return 'display-control display-control-' + d; });
57388
57389           slidersEnter
57390               .append('h5')
57391               .text(function(d) { return t('background.' + d); })
57392               .append('span')
57393               .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
57394
57395           slidersEnter
57396               .append('input')
57397               .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
57398               .attr('type', 'range')
57399               .attr('min', minVal)
57400               .attr('max', maxVal)
57401               .attr('step', '0.05')
57402               .on('input', function(d) {
57403                   var val = select(this).property('value');
57404                   updateValue(d, val);
57405               });
57406
57407           slidersEnter
57408               .append('button')
57409               .attr('title', t('background.reset'))
57410               .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
57411               .on('click', function(d) {
57412                   if (event.button !== 0) return;
57413                   updateValue(d, 1);
57414               })
57415               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
57416
57417
57418           // update
57419           container = containerEnter
57420               .merge(container);
57421
57422           container.selectAll('.display-option-input')
57423               .property('value', function(d) { return _options[d]; });
57424
57425           container.selectAll('.display-option-value')
57426               .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
57427
57428           container.selectAll('.display-option-reset')
57429               .classed('disabled', function(d) { return _options[d] === 1; });
57430
57431           // first time only, set brightness if needed
57432           if (containerEnter.size() && _options.brightness !== 1) {
57433               context.background().brightness(_options.brightness);
57434           }
57435       }
57436
57437
57438       function backgroundDisplayOptions(selection$$1) {
57439           _selection = selection$$1;
57440
57441           selection$$1
57442               .call(uiDisclosure(context, 'background_display_options', true)
57443                   .title(t('background.display_options'))
57444                   .content(render)
57445               );
57446       }
57447
57448
57449       return backgroundDisplayOptions;
57450   }
57451
57452   function uiBackgroundOffset(context) {
57453       var directions = [
57454           ['right', [0.5, 0]],
57455           ['top', [0, -0.5]],
57456           ['left', [-0.5, 0]],
57457           ['bottom', [0, 0.5]]
57458       ];
57459
57460
57461       function d3_eventCancel() {
57462           event.stopPropagation();
57463           event.preventDefault();
57464       }
57465
57466
57467       function updateValue() {
57468           var meters = geoOffsetToMeters(context.background().offset());
57469           var x = +meters[0].toFixed(2);
57470           var y = +meters[1].toFixed(2);
57471
57472           d3_selectAll('.nudge-inner-rect')
57473               .select('input')
57474               .classed('error', false)
57475               .property('value', x + ', ' + y);
57476
57477           d3_selectAll('.nudge-reset')
57478               .classed('disabled', function() {
57479                   return (x === 0 && y === 0);
57480               });
57481       }
57482
57483
57484       function resetOffset() {
57485           context.background().offset([0, 0]);
57486           updateValue();
57487       }
57488
57489
57490       function nudge(d) {
57491           context.background().nudge(d, context.map().zoom());
57492           updateValue();
57493       }
57494
57495
57496       function clickNudgeButton(d) {
57497           var interval;
57498           var timeout = window.setTimeout(function() {
57499                   interval = window.setInterval(nudge.bind(null, d), 100);
57500               }, 500);
57501
57502           function doneNudge() {
57503               window.clearTimeout(timeout);
57504               window.clearInterval(interval);
57505               select(window)
57506                   .on('mouseup.buttonoffset', null, true)
57507                   .on('mousedown.buttonoffset', null, true);
57508           }
57509
57510           select(window)
57511               .on('mouseup.buttonoffset', doneNudge, true)
57512               .on('mousedown.buttonoffset', doneNudge, true);
57513
57514           nudge(d);
57515       }
57516
57517
57518       function inputOffset() {
57519           var input = select(this);
57520           var d = input.node().value;
57521
57522           if (d === '') return resetOffset();
57523
57524           d = d.replace(/;/g, ',').split(',').map(function(n) {
57525               // if n is NaN, it will always get mapped to false.
57526               return !isNaN(n) && n;
57527           });
57528
57529           if (d.length !== 2 || !d[0] || !d[1]) {
57530               input.classed('error', true);
57531               return;
57532           }
57533
57534           context.background().offset(geoMetersToOffset(d));
57535           updateValue();
57536       }
57537
57538
57539       function dragOffset() {
57540           event.preventDefault();
57541           if (event.button !== 0) return;
57542
57543           var origin = [event.clientX, event.clientY];
57544
57545           context.container()
57546               .append('div')
57547               .attr('class', 'nudge-surface');
57548
57549           select(window)
57550               .on('mousemove.offset', function() {
57551                   var latest = [event.clientX, event.clientY];
57552                   var d = [
57553                       -(origin[0] - latest[0]) / 4,
57554                       -(origin[1] - latest[1]) / 4
57555                   ];
57556
57557                   origin = latest;
57558                   nudge(d);
57559               })
57560               .on('mouseup.offset', function() {
57561                   if (event.button !== 0) return;
57562                   d3_selectAll('.nudge-surface')
57563                       .remove();
57564
57565                   select(window)
57566                       .on('mousemove.offset', null)
57567                       .on('mouseup.offset', null);
57568               });
57569       }
57570
57571
57572       function render(selection$$1) {
57573           var container = selection$$1.selectAll('.nudge-container')
57574               .data([0]);
57575
57576           var containerEnter = container.enter()
57577               .append('div')
57578               .attr('class', 'nudge-container cf');
57579
57580           containerEnter
57581               .append('div')
57582               .attr('class', 'nudge-instructions')
57583               .text(t('background.offset'));
57584
57585           var nudgeEnter = containerEnter
57586               .append('div')
57587               .attr('class', 'nudge-outer-rect')
57588               .on('mousedown', dragOffset);
57589
57590           nudgeEnter
57591               .append('div')
57592               .attr('class', 'nudge-inner-rect')
57593               .append('input')
57594               .on('change', inputOffset);
57595
57596           containerEnter
57597               .append('div')
57598               .selectAll('button')
57599               .data(directions).enter()
57600               .append('button')
57601               .attr('class', function(d) { return d[0] + ' nudge'; })
57602               .on('contextmenu', d3_eventCancel)
57603               .on('mousedown', function(d) {
57604                   if (event.button !== 0) return;
57605                   clickNudgeButton(d[1]);
57606               });
57607
57608           containerEnter
57609               .append('button')
57610               .attr('title', t('background.reset'))
57611               .attr('class', 'nudge-reset disabled')
57612               .on('contextmenu', d3_eventCancel)
57613               .on('click', function() {
57614                   if (event.button !== 0) return;
57615                   resetOffset();
57616               })
57617               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
57618
57619           updateValue();
57620       }
57621
57622
57623       function backgroundOffset(selection$$1) {
57624           selection$$1
57625               .call(uiDisclosure(context, 'background_offset', false)
57626                   .title(t('background.fix_misalignment'))
57627                   .content(render)
57628               );
57629       }
57630
57631
57632       context.background()
57633           .on('change.backgroundOffset-update', updateValue);
57634
57635       return backgroundOffset;
57636   }
57637
57638   var marked = createCommonjsModule(function (module, exports) {
57639   (function(root) {
57640
57641   /**
57642    * Block-Level Grammar
57643    */
57644
57645   var block = {
57646     newline: /^\n+/,
57647     code: /^( {4}[^\n]+\n*)+/,
57648     fences: noop,
57649     hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
57650     heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
57651     nptable: noop,
57652     blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
57653     list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
57654     html: '^ {0,3}(?:' // optional indentation
57655       + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
57656       + '|comment[^\\n]*(\\n+|$)' // (2)
57657       + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
57658       + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
57659       + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
57660       + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
57661       + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
57662       + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
57663       + ')',
57664     def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
57665     table: noop,
57666     lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
57667     paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
57668     text: /^[^\n]+/
57669   };
57670
57671   block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
57672   block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
57673   block.def = edit(block.def)
57674     .replace('label', block._label)
57675     .replace('title', block._title)
57676     .getRegex();
57677
57678   block.bullet = /(?:[*+-]|\d+\.)/;
57679   block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
57680   block.item = edit(block.item, 'gm')
57681     .replace(/bull/g, block.bullet)
57682     .getRegex();
57683
57684   block.list = edit(block.list)
57685     .replace(/bull/g, block.bullet)
57686     .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
57687     .replace('def', '\\n+(?=' + block.def.source + ')')
57688     .getRegex();
57689
57690   block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
57691     + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
57692     + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
57693     + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
57694     + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
57695     + '|track|ul';
57696   block._comment = /<!--(?!-?>)[\s\S]*?-->/;
57697   block.html = edit(block.html, 'i')
57698     .replace('comment', block._comment)
57699     .replace('tag', block._tag)
57700     .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
57701     .getRegex();
57702
57703   block.paragraph = edit(block.paragraph)
57704     .replace('hr', block.hr)
57705     .replace('heading', block.heading)
57706     .replace('lheading', block.lheading)
57707     .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
57708     .getRegex();
57709
57710   block.blockquote = edit(block.blockquote)
57711     .replace('paragraph', block.paragraph)
57712     .getRegex();
57713
57714   /**
57715    * Normal Block Grammar
57716    */
57717
57718   block.normal = merge({}, block);
57719
57720   /**
57721    * GFM Block Grammar
57722    */
57723
57724   block.gfm = merge({}, block.normal, {
57725     fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,
57726     paragraph: /^/,
57727     heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
57728   });
57729
57730   block.gfm.paragraph = edit(block.paragraph)
57731     .replace('(?!', '(?!'
57732       + block.gfm.fences.source.replace('\\1', '\\2') + '|'
57733       + block.list.source.replace('\\1', '\\3') + '|')
57734     .getRegex();
57735
57736   /**
57737    * GFM + Tables Block Grammar
57738    */
57739
57740   block.tables = merge({}, block.gfm, {
57741     nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
57742     table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
57743   });
57744
57745   /**
57746    * Pedantic grammar
57747    */
57748
57749   block.pedantic = merge({}, block.normal, {
57750     html: edit(
57751       '^ *(?:comment *(?:\\n|\\s*$)'
57752       + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
57753       + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
57754       .replace('comment', block._comment)
57755       .replace(/tag/g, '(?!(?:'
57756         + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
57757         + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
57758         + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
57759       .getRegex(),
57760     def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
57761   });
57762
57763   /**
57764    * Block Lexer
57765    */
57766
57767   function Lexer(options) {
57768     this.tokens = [];
57769     this.tokens.links = Object.create(null);
57770     this.options = options || marked.defaults;
57771     this.rules = block.normal;
57772
57773     if (this.options.pedantic) {
57774       this.rules = block.pedantic;
57775     } else if (this.options.gfm) {
57776       if (this.options.tables) {
57777         this.rules = block.tables;
57778       } else {
57779         this.rules = block.gfm;
57780       }
57781     }
57782   }
57783
57784   /**
57785    * Expose Block Rules
57786    */
57787
57788   Lexer.rules = block;
57789
57790   /**
57791    * Static Lex Method
57792    */
57793
57794   Lexer.lex = function(src, options) {
57795     var lexer = new Lexer(options);
57796     return lexer.lex(src);
57797   };
57798
57799   /**
57800    * Preprocessing
57801    */
57802
57803   Lexer.prototype.lex = function(src) {
57804     src = src
57805       .replace(/\r\n|\r/g, '\n')
57806       .replace(/\t/g, '    ')
57807       .replace(/\u00a0/g, ' ')
57808       .replace(/\u2424/g, '\n');
57809
57810     return this.token(src, true);
57811   };
57812
57813   /**
57814    * Lexing
57815    */
57816
57817   Lexer.prototype.token = function(src, top) {
57818     src = src.replace(/^ +$/gm, '');
57819     var next,
57820         loose,
57821         cap,
57822         bull,
57823         b,
57824         item,
57825         listStart,
57826         listItems,
57827         t,
57828         space,
57829         i,
57830         tag,
57831         l,
57832         isordered,
57833         istask,
57834         ischecked;
57835
57836     while (src) {
57837       // newline
57838       if (cap = this.rules.newline.exec(src)) {
57839         src = src.substring(cap[0].length);
57840         if (cap[0].length > 1) {
57841           this.tokens.push({
57842             type: 'space'
57843           });
57844         }
57845       }
57846
57847       // code
57848       if (cap = this.rules.code.exec(src)) {
57849         src = src.substring(cap[0].length);
57850         cap = cap[0].replace(/^ {4}/gm, '');
57851         this.tokens.push({
57852           type: 'code',
57853           text: !this.options.pedantic
57854             ? rtrim(cap, '\n')
57855             : cap
57856         });
57857         continue;
57858       }
57859
57860       // fences (gfm)
57861       if (cap = this.rules.fences.exec(src)) {
57862         src = src.substring(cap[0].length);
57863         this.tokens.push({
57864           type: 'code',
57865           lang: cap[2],
57866           text: cap[3] || ''
57867         });
57868         continue;
57869       }
57870
57871       // heading
57872       if (cap = this.rules.heading.exec(src)) {
57873         src = src.substring(cap[0].length);
57874         this.tokens.push({
57875           type: 'heading',
57876           depth: cap[1].length,
57877           text: cap[2]
57878         });
57879         continue;
57880       }
57881
57882       // table no leading pipe (gfm)
57883       if (top && (cap = this.rules.nptable.exec(src))) {
57884         item = {
57885           type: 'table',
57886           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
57887           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
57888           cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
57889         };
57890
57891         if (item.header.length === item.align.length) {
57892           src = src.substring(cap[0].length);
57893
57894           for (i = 0; i < item.align.length; i++) {
57895             if (/^ *-+: *$/.test(item.align[i])) {
57896               item.align[i] = 'right';
57897             } else if (/^ *:-+: *$/.test(item.align[i])) {
57898               item.align[i] = 'center';
57899             } else if (/^ *:-+ *$/.test(item.align[i])) {
57900               item.align[i] = 'left';
57901             } else {
57902               item.align[i] = null;
57903             }
57904           }
57905
57906           for (i = 0; i < item.cells.length; i++) {
57907             item.cells[i] = splitCells(item.cells[i], item.header.length);
57908           }
57909
57910           this.tokens.push(item);
57911
57912           continue;
57913         }
57914       }
57915
57916       // hr
57917       if (cap = this.rules.hr.exec(src)) {
57918         src = src.substring(cap[0].length);
57919         this.tokens.push({
57920           type: 'hr'
57921         });
57922         continue;
57923       }
57924
57925       // blockquote
57926       if (cap = this.rules.blockquote.exec(src)) {
57927         src = src.substring(cap[0].length);
57928
57929         this.tokens.push({
57930           type: 'blockquote_start'
57931         });
57932
57933         cap = cap[0].replace(/^ *> ?/gm, '');
57934
57935         // Pass `top` to keep the current
57936         // "toplevel" state. This is exactly
57937         // how markdown.pl works.
57938         this.token(cap, top);
57939
57940         this.tokens.push({
57941           type: 'blockquote_end'
57942         });
57943
57944         continue;
57945       }
57946
57947       // list
57948       if (cap = this.rules.list.exec(src)) {
57949         src = src.substring(cap[0].length);
57950         bull = cap[2];
57951         isordered = bull.length > 1;
57952
57953         listStart = {
57954           type: 'list_start',
57955           ordered: isordered,
57956           start: isordered ? +bull : '',
57957           loose: false
57958         };
57959
57960         this.tokens.push(listStart);
57961
57962         // Get each top-level item.
57963         cap = cap[0].match(this.rules.item);
57964
57965         listItems = [];
57966         next = false;
57967         l = cap.length;
57968         i = 0;
57969
57970         for (; i < l; i++) {
57971           item = cap[i];
57972
57973           // Remove the list item's bullet
57974           // so it is seen as the next token.
57975           space = item.length;
57976           item = item.replace(/^ *([*+-]|\d+\.) +/, '');
57977
57978           // Outdent whatever the
57979           // list item contains. Hacky.
57980           if (~item.indexOf('\n ')) {
57981             space -= item.length;
57982             item = !this.options.pedantic
57983               ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
57984               : item.replace(/^ {1,4}/gm, '');
57985           }
57986
57987           // Determine whether the next list item belongs here.
57988           // Backpedal if it does not belong in this list.
57989           if (this.options.smartLists && i !== l - 1) {
57990             b = block.bullet.exec(cap[i + 1])[0];
57991             if (bull !== b && !(bull.length > 1 && b.length > 1)) {
57992               src = cap.slice(i + 1).join('\n') + src;
57993               i = l - 1;
57994             }
57995           }
57996
57997           // Determine whether item is loose or not.
57998           // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
57999           // for discount behavior.
58000           loose = next || /\n\n(?!\s*$)/.test(item);
58001           if (i !== l - 1) {
58002             next = item.charAt(item.length - 1) === '\n';
58003             if (!loose) loose = next;
58004           }
58005
58006           if (loose) {
58007             listStart.loose = true;
58008           }
58009
58010           // Check for task list items
58011           istask = /^\[[ xX]\] /.test(item);
58012           ischecked = undefined;
58013           if (istask) {
58014             ischecked = item[1] !== ' ';
58015             item = item.replace(/^\[[ xX]\] +/, '');
58016           }
58017
58018           t = {
58019             type: 'list_item_start',
58020             task: istask,
58021             checked: ischecked,
58022             loose: loose
58023           };
58024
58025           listItems.push(t);
58026           this.tokens.push(t);
58027
58028           // Recurse.
58029           this.token(item, false);
58030
58031           this.tokens.push({
58032             type: 'list_item_end'
58033           });
58034         }
58035
58036         if (listStart.loose) {
58037           l = listItems.length;
58038           i = 0;
58039           for (; i < l; i++) {
58040             listItems[i].loose = true;
58041           }
58042         }
58043
58044         this.tokens.push({
58045           type: 'list_end'
58046         });
58047
58048         continue;
58049       }
58050
58051       // html
58052       if (cap = this.rules.html.exec(src)) {
58053         src = src.substring(cap[0].length);
58054         this.tokens.push({
58055           type: this.options.sanitize
58056             ? 'paragraph'
58057             : 'html',
58058           pre: !this.options.sanitizer
58059             && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
58060           text: cap[0]
58061         });
58062         continue;
58063       }
58064
58065       // def
58066       if (top && (cap = this.rules.def.exec(src))) {
58067         src = src.substring(cap[0].length);
58068         if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
58069         tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
58070         if (!this.tokens.links[tag]) {
58071           this.tokens.links[tag] = {
58072             href: cap[2],
58073             title: cap[3]
58074           };
58075         }
58076         continue;
58077       }
58078
58079       // table (gfm)
58080       if (top && (cap = this.rules.table.exec(src))) {
58081         item = {
58082           type: 'table',
58083           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
58084           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
58085           cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : []
58086         };
58087
58088         if (item.header.length === item.align.length) {
58089           src = src.substring(cap[0].length);
58090
58091           for (i = 0; i < item.align.length; i++) {
58092             if (/^ *-+: *$/.test(item.align[i])) {
58093               item.align[i] = 'right';
58094             } else if (/^ *:-+: *$/.test(item.align[i])) {
58095               item.align[i] = 'center';
58096             } else if (/^ *:-+ *$/.test(item.align[i])) {
58097               item.align[i] = 'left';
58098             } else {
58099               item.align[i] = null;
58100             }
58101           }
58102
58103           for (i = 0; i < item.cells.length; i++) {
58104             item.cells[i] = splitCells(
58105               item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
58106               item.header.length);
58107           }
58108
58109           this.tokens.push(item);
58110
58111           continue;
58112         }
58113       }
58114
58115       // lheading
58116       if (cap = this.rules.lheading.exec(src)) {
58117         src = src.substring(cap[0].length);
58118         this.tokens.push({
58119           type: 'heading',
58120           depth: cap[2] === '=' ? 1 : 2,
58121           text: cap[1]
58122         });
58123         continue;
58124       }
58125
58126       // top-level paragraph
58127       if (top && (cap = this.rules.paragraph.exec(src))) {
58128         src = src.substring(cap[0].length);
58129         this.tokens.push({
58130           type: 'paragraph',
58131           text: cap[1].charAt(cap[1].length - 1) === '\n'
58132             ? cap[1].slice(0, -1)
58133             : cap[1]
58134         });
58135         continue;
58136       }
58137
58138       // text
58139       if (cap = this.rules.text.exec(src)) {
58140         // Top-level should never reach here.
58141         src = src.substring(cap[0].length);
58142         this.tokens.push({
58143           type: 'text',
58144           text: cap[0]
58145         });
58146         continue;
58147       }
58148
58149       if (src) {
58150         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
58151       }
58152     }
58153
58154     return this.tokens;
58155   };
58156
58157   /**
58158    * Inline-Level Grammar
58159    */
58160
58161   var inline = {
58162     escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
58163     autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
58164     url: noop,
58165     tag: '^comment'
58166       + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
58167       + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
58168       + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
58169       + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
58170       + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
58171     link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
58172     reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
58173     nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
58174     strong: /^__([^\s])__(?!_)|^\*\*([^\s])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
58175     em: /^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_|[^\s.])|^_([^\s_][\s\S]*?[^\s])_(?!_|[^\s.])|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
58176     code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
58177     br: /^( {2,}|\\)\n(?!\s*$)/,
58178     del: noop,
58179     text: /^(`+|[^`])[\s\S]*?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
58180   };
58181
58182   inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
58183
58184   inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
58185   inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
58186   inline.autolink = edit(inline.autolink)
58187     .replace('scheme', inline._scheme)
58188     .replace('email', inline._email)
58189     .getRegex();
58190
58191   inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
58192
58193   inline.tag = edit(inline.tag)
58194     .replace('comment', block._comment)
58195     .replace('attribute', inline._attribute)
58196     .getRegex();
58197
58198   inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/;
58199   inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f\\]*\)|[^\s\x00-\x1f()\\])*?)/;
58200   inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
58201
58202   inline.link = edit(inline.link)
58203     .replace('label', inline._label)
58204     .replace('href', inline._href)
58205     .replace('title', inline._title)
58206     .getRegex();
58207
58208   inline.reflink = edit(inline.reflink)
58209     .replace('label', inline._label)
58210     .getRegex();
58211
58212   /**
58213    * Normal Inline Grammar
58214    */
58215
58216   inline.normal = merge({}, inline);
58217
58218   /**
58219    * Pedantic Inline Grammar
58220    */
58221
58222   inline.pedantic = merge({}, inline.normal, {
58223     strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
58224     em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
58225     link: edit(/^!?\[(label)\]\((.*?)\)/)
58226       .replace('label', inline._label)
58227       .getRegex(),
58228     reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
58229       .replace('label', inline._label)
58230       .getRegex()
58231   });
58232
58233   /**
58234    * GFM Inline Grammar
58235    */
58236
58237   inline.gfm = merge({}, inline.normal, {
58238     escape: edit(inline.escape).replace('])', '~|])').getRegex(),
58239     _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
58240     url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
58241     _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
58242     del: /^~+(?=\S)([\s\S]*?\S)~+/,
58243     text: edit(inline.text)
58244       .replace(']|', '~]|')
58245       .replace('|$', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|$')
58246       .getRegex()
58247   });
58248
58249   inline.gfm.url = edit(inline.gfm.url)
58250     .replace('email', inline.gfm._extended_email)
58251     .getRegex();
58252   /**
58253    * GFM + Line Breaks Inline Grammar
58254    */
58255
58256   inline.breaks = merge({}, inline.gfm, {
58257     br: edit(inline.br).replace('{2,}', '*').getRegex(),
58258     text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
58259   });
58260
58261   /**
58262    * Inline Lexer & Compiler
58263    */
58264
58265   function InlineLexer(links, options) {
58266     this.options = options || marked.defaults;
58267     this.links = links;
58268     this.rules = inline.normal;
58269     this.renderer = this.options.renderer || new Renderer();
58270     this.renderer.options = this.options;
58271
58272     if (!this.links) {
58273       throw new Error('Tokens array requires a `links` property.');
58274     }
58275
58276     if (this.options.pedantic) {
58277       this.rules = inline.pedantic;
58278     } else if (this.options.gfm) {
58279       if (this.options.breaks) {
58280         this.rules = inline.breaks;
58281       } else {
58282         this.rules = inline.gfm;
58283       }
58284     }
58285   }
58286
58287   /**
58288    * Expose Inline Rules
58289    */
58290
58291   InlineLexer.rules = inline;
58292
58293   /**
58294    * Static Lexing/Compiling Method
58295    */
58296
58297   InlineLexer.output = function(src, links, options) {
58298     var inline = new InlineLexer(links, options);
58299     return inline.output(src);
58300   };
58301
58302   /**
58303    * Lexing/Compiling
58304    */
58305
58306   InlineLexer.prototype.output = function(src) {
58307     var out = '',
58308         link,
58309         text,
58310         href,
58311         title,
58312         cap,
58313         prevCapZero;
58314
58315     while (src) {
58316       // escape
58317       if (cap = this.rules.escape.exec(src)) {
58318         src = src.substring(cap[0].length);
58319         out += cap[1];
58320         continue;
58321       }
58322
58323       // autolink
58324       if (cap = this.rules.autolink.exec(src)) {
58325         src = src.substring(cap[0].length);
58326         if (cap[2] === '@') {
58327           text = escape(this.mangle(cap[1]));
58328           href = 'mailto:' + text;
58329         } else {
58330           text = escape(cap[1]);
58331           href = text;
58332         }
58333         out += this.renderer.link(href, null, text);
58334         continue;
58335       }
58336
58337       // url (gfm)
58338       if (!this.inLink && (cap = this.rules.url.exec(src))) {
58339         if (cap[2] === '@') {
58340           text = escape(cap[0]);
58341           href = 'mailto:' + text;
58342         } else {
58343           // do extended autolink path validation
58344           do {
58345             prevCapZero = cap[0];
58346             cap[0] = this.rules._backpedal.exec(cap[0])[0];
58347           } while (prevCapZero !== cap[0]);
58348           text = escape(cap[0]);
58349           if (cap[1] === 'www.') {
58350             href = 'http://' + text;
58351           } else {
58352             href = text;
58353           }
58354         }
58355         src = src.substring(cap[0].length);
58356         out += this.renderer.link(href, null, text);
58357         continue;
58358       }
58359
58360       // tag
58361       if (cap = this.rules.tag.exec(src)) {
58362         if (!this.inLink && /^<a /i.test(cap[0])) {
58363           this.inLink = true;
58364         } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
58365           this.inLink = false;
58366         }
58367         if (!this.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
58368           this.inRawBlock = true;
58369         } else if (this.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
58370           this.inRawBlock = false;
58371         }
58372
58373         src = src.substring(cap[0].length);
58374         out += this.options.sanitize
58375           ? this.options.sanitizer
58376             ? this.options.sanitizer(cap[0])
58377             : escape(cap[0])
58378           : cap[0];
58379         continue;
58380       }
58381
58382       // link
58383       if (cap = this.rules.link.exec(src)) {
58384         src = src.substring(cap[0].length);
58385         this.inLink = true;
58386         href = cap[2];
58387         if (this.options.pedantic) {
58388           link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
58389
58390           if (link) {
58391             href = link[1];
58392             title = link[3];
58393           } else {
58394             title = '';
58395           }
58396         } else {
58397           title = cap[3] ? cap[3].slice(1, -1) : '';
58398         }
58399         href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
58400         out += this.outputLink(cap, {
58401           href: InlineLexer.escapes(href),
58402           title: InlineLexer.escapes(title)
58403         });
58404         this.inLink = false;
58405         continue;
58406       }
58407
58408       // reflink, nolink
58409       if ((cap = this.rules.reflink.exec(src))
58410           || (cap = this.rules.nolink.exec(src))) {
58411         src = src.substring(cap[0].length);
58412         link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
58413         link = this.links[link.toLowerCase()];
58414         if (!link || !link.href) {
58415           out += cap[0].charAt(0);
58416           src = cap[0].substring(1) + src;
58417           continue;
58418         }
58419         this.inLink = true;
58420         out += this.outputLink(cap, link);
58421         this.inLink = false;
58422         continue;
58423       }
58424
58425       // strong
58426       if (cap = this.rules.strong.exec(src)) {
58427         src = src.substring(cap[0].length);
58428         out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
58429         continue;
58430       }
58431
58432       // em
58433       if (cap = this.rules.em.exec(src)) {
58434         src = src.substring(cap[0].length);
58435         out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
58436         continue;
58437       }
58438
58439       // code
58440       if (cap = this.rules.code.exec(src)) {
58441         src = src.substring(cap[0].length);
58442         out += this.renderer.codespan(escape(cap[2].trim(), true));
58443         continue;
58444       }
58445
58446       // br
58447       if (cap = this.rules.br.exec(src)) {
58448         src = src.substring(cap[0].length);
58449         out += this.renderer.br();
58450         continue;
58451       }
58452
58453       // del (gfm)
58454       if (cap = this.rules.del.exec(src)) {
58455         src = src.substring(cap[0].length);
58456         out += this.renderer.del(this.output(cap[1]));
58457         continue;
58458       }
58459
58460       // text
58461       if (cap = this.rules.text.exec(src)) {
58462         src = src.substring(cap[0].length);
58463         if (this.inRawBlock) {
58464           out += this.renderer.text(cap[0]);
58465         } else {
58466           out += this.renderer.text(escape(this.smartypants(cap[0])));
58467         }
58468         continue;
58469       }
58470
58471       if (src) {
58472         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
58473       }
58474     }
58475
58476     return out;
58477   };
58478
58479   InlineLexer.escapes = function(text) {
58480     return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
58481   };
58482
58483   /**
58484    * Compile Link
58485    */
58486
58487   InlineLexer.prototype.outputLink = function(cap, link) {
58488     var href = link.href,
58489         title = link.title ? escape(link.title) : null;
58490
58491     return cap[0].charAt(0) !== '!'
58492       ? this.renderer.link(href, title, this.output(cap[1]))
58493       : this.renderer.image(href, title, escape(cap[1]));
58494   };
58495
58496   /**
58497    * Smartypants Transformations
58498    */
58499
58500   InlineLexer.prototype.smartypants = function(text) {
58501     if (!this.options.smartypants) return text;
58502     return text
58503       // em-dashes
58504       .replace(/---/g, '\u2014')
58505       // en-dashes
58506       .replace(/--/g, '\u2013')
58507       // opening singles
58508       .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
58509       // closing singles & apostrophes
58510       .replace(/'/g, '\u2019')
58511       // opening doubles
58512       .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
58513       // closing doubles
58514       .replace(/"/g, '\u201d')
58515       // ellipses
58516       .replace(/\.{3}/g, '\u2026');
58517   };
58518
58519   /**
58520    * Mangle Links
58521    */
58522
58523   InlineLexer.prototype.mangle = function(text) {
58524     if (!this.options.mangle) return text;
58525     var out = '',
58526         l = text.length,
58527         i = 0,
58528         ch;
58529
58530     for (; i < l; i++) {
58531       ch = text.charCodeAt(i);
58532       if (Math.random() > 0.5) {
58533         ch = 'x' + ch.toString(16);
58534       }
58535       out += '&#' + ch + ';';
58536     }
58537
58538     return out;
58539   };
58540
58541   /**
58542    * Renderer
58543    */
58544
58545   function Renderer(options) {
58546     this.options = options || marked.defaults;
58547   }
58548
58549   Renderer.prototype.code = function(code, lang, escaped) {
58550     if (this.options.highlight) {
58551       var out = this.options.highlight(code, lang);
58552       if (out != null && out !== code) {
58553         escaped = true;
58554         code = out;
58555       }
58556     }
58557
58558     if (!lang) {
58559       return '<pre><code>'
58560         + (escaped ? code : escape(code, true))
58561         + '</code></pre>';
58562     }
58563
58564     return '<pre><code class="'
58565       + this.options.langPrefix
58566       + escape(lang, true)
58567       + '">'
58568       + (escaped ? code : escape(code, true))
58569       + '</code></pre>\n';
58570   };
58571
58572   Renderer.prototype.blockquote = function(quote) {
58573     return '<blockquote>\n' + quote + '</blockquote>\n';
58574   };
58575
58576   Renderer.prototype.html = function(html) {
58577     return html;
58578   };
58579
58580   Renderer.prototype.heading = function(text, level, raw) {
58581     if (this.options.headerIds) {
58582       return '<h'
58583         + level
58584         + ' id="'
58585         + this.options.headerPrefix
58586         + raw.toLowerCase().replace(/[^\w]+/g, '-')
58587         + '">'
58588         + text
58589         + '</h'
58590         + level
58591         + '>\n';
58592     }
58593     // ignore IDs
58594     return '<h' + level + '>' + text + '</h' + level + '>\n';
58595   };
58596
58597   Renderer.prototype.hr = function() {
58598     return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
58599   };
58600
58601   Renderer.prototype.list = function(body, ordered, start) {
58602     var type = ordered ? 'ol' : 'ul',
58603         startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
58604     return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
58605   };
58606
58607   Renderer.prototype.listitem = function(text) {
58608     return '<li>' + text + '</li>\n';
58609   };
58610
58611   Renderer.prototype.checkbox = function(checked) {
58612     return '<input '
58613       + (checked ? 'checked="" ' : '')
58614       + 'disabled="" type="checkbox"'
58615       + (this.options.xhtml ? ' /' : '')
58616       + '> ';
58617   };
58618
58619   Renderer.prototype.paragraph = function(text) {
58620     return '<p>' + text + '</p>\n';
58621   };
58622
58623   Renderer.prototype.table = function(header, body) {
58624     if (body) body = '<tbody>' + body + '</tbody>';
58625
58626     return '<table>\n'
58627       + '<thead>\n'
58628       + header
58629       + '</thead>\n'
58630       + body
58631       + '</table>\n';
58632   };
58633
58634   Renderer.prototype.tablerow = function(content) {
58635     return '<tr>\n' + content + '</tr>\n';
58636   };
58637
58638   Renderer.prototype.tablecell = function(content, flags) {
58639     var type = flags.header ? 'th' : 'td';
58640     var tag = flags.align
58641       ? '<' + type + ' align="' + flags.align + '">'
58642       : '<' + type + '>';
58643     return tag + content + '</' + type + '>\n';
58644   };
58645
58646   // span level renderer
58647   Renderer.prototype.strong = function(text) {
58648     return '<strong>' + text + '</strong>';
58649   };
58650
58651   Renderer.prototype.em = function(text) {
58652     return '<em>' + text + '</em>';
58653   };
58654
58655   Renderer.prototype.codespan = function(text) {
58656     return '<code>' + text + '</code>';
58657   };
58658
58659   Renderer.prototype.br = function() {
58660     return this.options.xhtml ? '<br/>' : '<br>';
58661   };
58662
58663   Renderer.prototype.del = function(text) {
58664     return '<del>' + text + '</del>';
58665   };
58666
58667   Renderer.prototype.link = function(href, title, text) {
58668     href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
58669     if (href === null) {
58670       return text;
58671     }
58672     var out = '<a href="' + escape(href) + '"';
58673     if (title) {
58674       out += ' title="' + title + '"';
58675     }
58676     out += '>' + text + '</a>';
58677     return out;
58678   };
58679
58680   Renderer.prototype.image = function(href, title, text) {
58681     href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
58682     if (href === null) {
58683       return text;
58684     }
58685
58686     var out = '<img src="' + href + '" alt="' + text + '"';
58687     if (title) {
58688       out += ' title="' + title + '"';
58689     }
58690     out += this.options.xhtml ? '/>' : '>';
58691     return out;
58692   };
58693
58694   Renderer.prototype.text = function(text) {
58695     return text;
58696   };
58697
58698   /**
58699    * TextRenderer
58700    * returns only the textual part of the token
58701    */
58702
58703   function TextRenderer() {}
58704
58705   // no need for block level renderers
58706
58707   TextRenderer.prototype.strong =
58708   TextRenderer.prototype.em =
58709   TextRenderer.prototype.codespan =
58710   TextRenderer.prototype.del =
58711   TextRenderer.prototype.text = function (text) {
58712     return text;
58713   };
58714
58715   TextRenderer.prototype.link =
58716   TextRenderer.prototype.image = function(href, title, text) {
58717     return '' + text;
58718   };
58719
58720   TextRenderer.prototype.br = function() {
58721     return '';
58722   };
58723
58724   /**
58725    * Parsing & Compiling
58726    */
58727
58728   function Parser(options) {
58729     this.tokens = [];
58730     this.token = null;
58731     this.options = options || marked.defaults;
58732     this.options.renderer = this.options.renderer || new Renderer();
58733     this.renderer = this.options.renderer;
58734     this.renderer.options = this.options;
58735   }
58736
58737   /**
58738    * Static Parse Method
58739    */
58740
58741   Parser.parse = function(src, options) {
58742     var parser = new Parser(options);
58743     return parser.parse(src);
58744   };
58745
58746   /**
58747    * Parse Loop
58748    */
58749
58750   Parser.prototype.parse = function(src) {
58751     this.inline = new InlineLexer(src.links, this.options);
58752     // use an InlineLexer with a TextRenderer to extract pure text
58753     this.inlineText = new InlineLexer(
58754       src.links,
58755       merge({}, this.options, {renderer: new TextRenderer()})
58756     );
58757     this.tokens = src.reverse();
58758
58759     var out = '';
58760     while (this.next()) {
58761       out += this.tok();
58762     }
58763
58764     return out;
58765   };
58766
58767   /**
58768    * Next Token
58769    */
58770
58771   Parser.prototype.next = function() {
58772     return this.token = this.tokens.pop();
58773   };
58774
58775   /**
58776    * Preview Next Token
58777    */
58778
58779   Parser.prototype.peek = function() {
58780     return this.tokens[this.tokens.length - 1] || 0;
58781   };
58782
58783   /**
58784    * Parse Text Tokens
58785    */
58786
58787   Parser.prototype.parseText = function() {
58788     var body = this.token.text;
58789
58790     while (this.peek().type === 'text') {
58791       body += '\n' + this.next().text;
58792     }
58793
58794     return this.inline.output(body);
58795   };
58796
58797   /**
58798    * Parse Current Token
58799    */
58800
58801   Parser.prototype.tok = function() {
58802     switch (this.token.type) {
58803       case 'space': {
58804         return '';
58805       }
58806       case 'hr': {
58807         return this.renderer.hr();
58808       }
58809       case 'heading': {
58810         return this.renderer.heading(
58811           this.inline.output(this.token.text),
58812           this.token.depth,
58813           unescape(this.inlineText.output(this.token.text)));
58814       }
58815       case 'code': {
58816         return this.renderer.code(this.token.text,
58817           this.token.lang,
58818           this.token.escaped);
58819       }
58820       case 'table': {
58821         var header = '',
58822             body = '',
58823             i,
58824             row,
58825             cell,
58826             j;
58827
58828         // header
58829         cell = '';
58830         for (i = 0; i < this.token.header.length; i++) {
58831           cell += this.renderer.tablecell(
58832             this.inline.output(this.token.header[i]),
58833             { header: true, align: this.token.align[i] }
58834           );
58835         }
58836         header += this.renderer.tablerow(cell);
58837
58838         for (i = 0; i < this.token.cells.length; i++) {
58839           row = this.token.cells[i];
58840
58841           cell = '';
58842           for (j = 0; j < row.length; j++) {
58843             cell += this.renderer.tablecell(
58844               this.inline.output(row[j]),
58845               { header: false, align: this.token.align[j] }
58846             );
58847           }
58848
58849           body += this.renderer.tablerow(cell);
58850         }
58851         return this.renderer.table(header, body);
58852       }
58853       case 'blockquote_start': {
58854         body = '';
58855
58856         while (this.next().type !== 'blockquote_end') {
58857           body += this.tok();
58858         }
58859
58860         return this.renderer.blockquote(body);
58861       }
58862       case 'list_start': {
58863         body = '';
58864         var ordered = this.token.ordered,
58865             start = this.token.start;
58866
58867         while (this.next().type !== 'list_end') {
58868           body += this.tok();
58869         }
58870
58871         return this.renderer.list(body, ordered, start);
58872       }
58873       case 'list_item_start': {
58874         body = '';
58875         var loose = this.token.loose;
58876
58877         if (this.token.task) {
58878           body += this.renderer.checkbox(this.token.checked);
58879         }
58880
58881         while (this.next().type !== 'list_item_end') {
58882           body += !loose && this.token.type === 'text'
58883             ? this.parseText()
58884             : this.tok();
58885         }
58886
58887         return this.renderer.listitem(body);
58888       }
58889       case 'html': {
58890         // TODO parse inline content if parameter markdown=1
58891         return this.renderer.html(this.token.text);
58892       }
58893       case 'paragraph': {
58894         return this.renderer.paragraph(this.inline.output(this.token.text));
58895       }
58896       case 'text': {
58897         return this.renderer.paragraph(this.parseText());
58898       }
58899     }
58900   };
58901
58902   /**
58903    * Helpers
58904    */
58905
58906   function escape(html, encode) {
58907     if (encode) {
58908       if (escape.escapeTest.test(html)) {
58909         return html.replace(escape.escapeReplace, function (ch) { return escape.replacements[ch]; });
58910       }
58911     } else {
58912       if (escape.escapeTestNoEncode.test(html)) {
58913         return html.replace(escape.escapeReplaceNoEncode, function (ch) { return escape.replacements[ch]; });
58914       }
58915     }
58916
58917     return html;
58918   }
58919
58920   escape.escapeTest = /[&<>"']/;
58921   escape.escapeReplace = /[&<>"']/g;
58922   escape.replacements = {
58923     '&': '&amp;',
58924     '<': '&lt;',
58925     '>': '&gt;',
58926     '"': '&quot;',
58927     "'": '&#39;'
58928   };
58929
58930   escape.escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
58931   escape.escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
58932
58933   function unescape(html) {
58934     // explicitly match decimal, hex, and named HTML entities
58935     return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
58936       n = n.toLowerCase();
58937       if (n === 'colon') return ':';
58938       if (n.charAt(0) === '#') {
58939         return n.charAt(1) === 'x'
58940           ? String.fromCharCode(parseInt(n.substring(2), 16))
58941           : String.fromCharCode(+n.substring(1));
58942       }
58943       return '';
58944     });
58945   }
58946
58947   function edit(regex, opt) {
58948     regex = regex.source || regex;
58949     opt = opt || '';
58950     return {
58951       replace: function(name, val) {
58952         val = val.source || val;
58953         val = val.replace(/(^|[^\[])\^/g, '$1');
58954         regex = regex.replace(name, val);
58955         return this;
58956       },
58957       getRegex: function() {
58958         return new RegExp(regex, opt);
58959       }
58960     };
58961   }
58962
58963   function cleanUrl(sanitize, base, href) {
58964     if (sanitize) {
58965       try {
58966         var prot = decodeURIComponent(unescape(href))
58967           .replace(/[^\w:]/g, '')
58968           .toLowerCase();
58969       } catch (e) {
58970         return null;
58971       }
58972       if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
58973         return null;
58974       }
58975     }
58976     if (base && !originIndependentUrl.test(href)) {
58977       href = resolveUrl(base, href);
58978     }
58979     try {
58980       href = encodeURI(href).replace(/%25/g, '%');
58981     } catch (e) {
58982       return null;
58983     }
58984     return href;
58985   }
58986
58987   function resolveUrl(base, href) {
58988     if (!baseUrls[' ' + base]) {
58989       // we can ignore everything in base after the last slash of its path component,
58990       // but we might need to add _that_
58991       // https://tools.ietf.org/html/rfc3986#section-3
58992       if (/^[^:]+:\/*[^/]*$/.test(base)) {
58993         baseUrls[' ' + base] = base + '/';
58994       } else {
58995         baseUrls[' ' + base] = rtrim(base, '/', true);
58996       }
58997     }
58998     base = baseUrls[' ' + base];
58999
59000     if (href.slice(0, 2) === '//') {
59001       return base.replace(/:[\s\S]*/, ':') + href;
59002     } else if (href.charAt(0) === '/') {
59003       return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
59004     } else {
59005       return base + href;
59006     }
59007   }
59008   var baseUrls = {};
59009   var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
59010
59011   function noop() {}
59012   noop.exec = noop;
59013
59014   function merge(obj) {
59015     var i = 1,
59016         target,
59017         key;
59018
59019     for (; i < arguments.length; i++) {
59020       target = arguments[i];
59021       for (key in target) {
59022         if (Object.prototype.hasOwnProperty.call(target, key)) {
59023           obj[key] = target[key];
59024         }
59025       }
59026     }
59027
59028     return obj;
59029   }
59030
59031   function splitCells(tableRow, count) {
59032     // ensure that every cell-delimiting pipe has a space
59033     // before it to distinguish it from an escaped pipe
59034     var row = tableRow.replace(/\|/g, function (match, offset, str) {
59035           var escaped = false,
59036               curr = offset;
59037           while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
59038           if (escaped) {
59039             // odd number of slashes means | is escaped
59040             // so we leave it alone
59041             return '|';
59042           } else {
59043             // add space before unescaped |
59044             return ' |';
59045           }
59046         }),
59047         cells = row.split(/ \|/),
59048         i = 0;
59049
59050     if (cells.length > count) {
59051       cells.splice(count);
59052     } else {
59053       while (cells.length < count) cells.push('');
59054     }
59055
59056     for (; i < cells.length; i++) {
59057       // leading or trailing whitespace is ignored per the gfm spec
59058       cells[i] = cells[i].trim().replace(/\\\|/g, '|');
59059     }
59060     return cells;
59061   }
59062
59063   // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
59064   // /c*$/ is vulnerable to REDOS.
59065   // invert: Remove suffix of non-c chars instead. Default falsey.
59066   function rtrim(str, c, invert) {
59067     if (str.length === 0) {
59068       return '';
59069     }
59070
59071     // Length of suffix matching the invert condition.
59072     var suffLen = 0;
59073
59074     // Step left until we fail to match the invert condition.
59075     while (suffLen < str.length) {
59076       var currChar = str.charAt(str.length - suffLen - 1);
59077       if (currChar === c && !invert) {
59078         suffLen++;
59079       } else if (currChar !== c && invert) {
59080         suffLen++;
59081       } else {
59082         break;
59083       }
59084     }
59085
59086     return str.substr(0, str.length - suffLen);
59087   }
59088
59089   /**
59090    * Marked
59091    */
59092
59093   function marked(src, opt, callback) {
59094     // throw error in case of non string input
59095     if (typeof src === 'undefined' || src === null) {
59096       throw new Error('marked(): input parameter is undefined or null');
59097     }
59098     if (typeof src !== 'string') {
59099       throw new Error('marked(): input parameter is of type '
59100         + Object.prototype.toString.call(src) + ', string expected');
59101     }
59102
59103     if (callback || typeof opt === 'function') {
59104       if (!callback) {
59105         callback = opt;
59106         opt = null;
59107       }
59108
59109       opt = merge({}, marked.defaults, opt || {});
59110
59111       var highlight = opt.highlight,
59112           tokens,
59113           pending,
59114           i = 0;
59115
59116       try {
59117         tokens = Lexer.lex(src, opt);
59118       } catch (e) {
59119         return callback(e);
59120       }
59121
59122       pending = tokens.length;
59123
59124       var done = function(err) {
59125         if (err) {
59126           opt.highlight = highlight;
59127           return callback(err);
59128         }
59129
59130         var out;
59131
59132         try {
59133           out = Parser.parse(tokens, opt);
59134         } catch (e) {
59135           err = e;
59136         }
59137
59138         opt.highlight = highlight;
59139
59140         return err
59141           ? callback(err)
59142           : callback(null, out);
59143       };
59144
59145       if (!highlight || highlight.length < 3) {
59146         return done();
59147       }
59148
59149       delete opt.highlight;
59150
59151       if (!pending) return done();
59152
59153       for (; i < tokens.length; i++) {
59154         (function(token) {
59155           if (token.type !== 'code') {
59156             return --pending || done();
59157           }
59158           return highlight(token.text, token.lang, function(err, code) {
59159             if (err) return done(err);
59160             if (code == null || code === token.text) {
59161               return --pending || done();
59162             }
59163             token.text = code;
59164             token.escaped = true;
59165             --pending || done();
59166           });
59167         })(tokens[i]);
59168       }
59169
59170       return;
59171     }
59172     try {
59173       if (opt) opt = merge({}, marked.defaults, opt);
59174       return Parser.parse(Lexer.lex(src, opt), opt);
59175     } catch (e) {
59176       e.message += '\nPlease report this to https://github.com/markedjs/marked.';
59177       if ((opt || marked.defaults).silent) {
59178         return '<p>An error occurred:</p><pre>'
59179           + escape(e.message + '', true)
59180           + '</pre>';
59181       }
59182       throw e;
59183     }
59184   }
59185
59186   /**
59187    * Options
59188    */
59189
59190   marked.options =
59191   marked.setOptions = function(opt) {
59192     merge(marked.defaults, opt);
59193     return marked;
59194   };
59195
59196   marked.getDefaults = function () {
59197     return {
59198       baseUrl: null,
59199       breaks: false,
59200       gfm: true,
59201       headerIds: true,
59202       headerPrefix: '',
59203       highlight: null,
59204       langPrefix: 'language-',
59205       mangle: true,
59206       pedantic: false,
59207       renderer: new Renderer(),
59208       sanitize: false,
59209       sanitizer: null,
59210       silent: false,
59211       smartLists: false,
59212       smartypants: false,
59213       tables: true,
59214       xhtml: false
59215     };
59216   };
59217
59218   marked.defaults = marked.getDefaults();
59219
59220   /**
59221    * Expose
59222    */
59223
59224   marked.Parser = Parser;
59225   marked.parser = Parser.parse;
59226
59227   marked.Renderer = Renderer;
59228   marked.TextRenderer = TextRenderer;
59229
59230   marked.Lexer = Lexer;
59231   marked.lexer = Lexer.lex;
59232
59233   marked.InlineLexer = InlineLexer;
59234   marked.inlineLexer = InlineLexer.output;
59235
59236   marked.parse = marked;
59237
59238   {
59239     module.exports = marked;
59240   }
59241   })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
59242   });
59243
59244   function pointBox(loc, context) {
59245       var rect = context.surfaceRect();
59246       var point$$1 = context.curtainProjection(loc);
59247       return {
59248           left: point$$1[0] + rect.left - 40,
59249           top: point$$1[1] + rect.top - 60,
59250           width: 80,
59251           height: 90
59252       };
59253   }
59254
59255
59256   function pad$1(locOrBox, padding, context) {
59257       var box;
59258       if (locOrBox instanceof Array) {
59259           var rect = context.surfaceRect();
59260           var point$$1 = context.curtainProjection(locOrBox);
59261           box = {
59262               left: point$$1[0] + rect.left,
59263               top: point$$1[1] + rect.top
59264           };
59265       } else {
59266           box = locOrBox;
59267       }
59268
59269       return {
59270           left: box.left - padding,
59271           top: box.top - padding,
59272           width: (box.width || 0) + 2 * padding,
59273           height: (box.width || 0) + 2 * padding
59274       };
59275   }
59276
59277
59278   function icon(name, svgklass, useklass) {
59279       return '<svg class="icon ' + (svgklass || '') + '">' +
59280            '<use xlink:href="' + name + '"' +
59281            (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
59282   }
59283
59284
59285   function slugify(text) {
59286       return text.toString().toLowerCase()
59287           .replace(/\s+/g, '-')           // Replace spaces with -
59288           .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
59289           .replace(/\-\-+/g, '-')         // Replace multiple - with single -
59290           .replace(/^-+/, '')             // Trim - from start of text
59291           .replace(/-+$/, '');            // Trim - from end of text
59292   }
59293
59294
59295   // console warning for missing walkthrough names
59296   var missingStrings = {};
59297   function checkKey(key, text) {
59298       if (t(key, { default: undefined}) === undefined) {
59299           if (missingStrings.hasOwnProperty(key)) return;  // warn once
59300           missingStrings[key] = text;
59301           var missing = key + ': ' + text;
59302           if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
59303       }
59304   }
59305
59306
59307   function localize(obj) {
59308       var key;
59309
59310       // Assign name if entity has one..
59311       var name = obj.tags && obj.tags.name;
59312       if (name) {
59313           key = 'intro.graph.name.' + slugify(name);
59314           obj.tags.name = t(key, { default: name });
59315           checkKey(key, name);
59316       }
59317
59318       // Assign street name if entity has one..
59319       var street = obj.tags && obj.tags['addr:street'];
59320       if (street) {
59321           key = 'intro.graph.name.' + slugify(street);
59322           obj.tags['addr:street'] = t(key, { default: street });
59323           checkKey(key, street);
59324
59325           // Add address details common across walkthrough..
59326           var addrTags = [
59327               'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
59328               'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
59329           ];
59330           addrTags.forEach(function(k) {
59331               var key = 'intro.graph.' + k;
59332               var tag = 'addr:' + k;
59333               var val = obj.tags && obj.tags[tag];
59334               var str = t(key, { default: val });
59335
59336               if (str) {
59337                   if (str.match(/^<.*>$/) !== null) {
59338                       delete obj.tags[tag];
59339                   } else {
59340                       obj.tags[tag] = str;
59341                   }
59342               }
59343           });
59344       }
59345
59346       return obj;
59347   }
59348
59349
59350   // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
59351   function isMostlySquare(points) {
59352       // note: uses 15 here instead of the 12 from actionOrthogonalize because
59353       // actionOrthogonalize can actually straighten some larger angles as it iterates
59354       var threshold = 15; // degrees within right or straight
59355       var lowerBound = Math.cos((90 - threshold) * Math.PI / 180);  // near right
59356       var upperBound = Math.cos(threshold * Math.PI / 180);         // near straight
59357       var mag;
59358
59359       for (var i = 0; i < points.length; i++) {
59360           mag = Math.abs(normalizedDotProduct(i, points));
59361           if (mag > lowerBound && mag < upperBound) {
59362               return false;
59363           }
59364       }
59365
59366       return true;
59367
59368
59369       function normalizedDotProduct(i, points) {
59370           var a = points[(i - 1 + points.length) % points.length];
59371           var b = points[i];
59372           var c = points[(i + 1) % points.length];
59373           var p = subtractPoints(a, b);
59374           var q = subtractPoints(c, b);
59375
59376           p = normalizePoint(p);
59377           q = normalizePoint(q);
59378
59379           return p[0] * q[0] + p[1] * q[1];
59380
59381
59382           function subtractPoints(a, b) {
59383               return [a[0] - b[0], a[1] - b[1]];
59384           }
59385
59386           function normalizePoint(point$$1) {
59387               var vector = [0, 0];
59388               var length = Math.sqrt(point$$1[0] * point$$1[0] + point$$1[1] * point$$1[1]);
59389               if (length !== 0) {
59390                   vector[0] = point$$1[0] / length;
59391                   vector[1] = point$$1[1] / length;
59392               }
59393               return vector;
59394           }
59395       }
59396   }
59397
59398
59399   function selectMenuItem(operation) {
59400       var selector$$1 = '.edit-menu .edit-menu-item-' + operation +
59401           ', .radial-menu .radial-menu-item-' + operation;
59402       return select(selector$$1);
59403   }
59404
59405
59406   function transitionTime(point1, point2) {
59407       var distance = geoSphericalDistance(point1, point2);
59408       if (distance === 0)
59409           return 0;
59410       else if (distance < 80)
59411           return 500;
59412       else
59413           return 1000;
59414   }
59415
59416   var dataIntroGraph = {n1:{id:"n1",loc:[-85.631039,41.948829]},n10:{id:"n10",loc:[-85.634733,41.941588]},n100:{id:"n100",loc:[-85.637395,41.942252]},n1000:{id:"n1000",loc:[-85.632699,41.944763]},n1001:{id:"n1001",loc:[-85.632685,41.944763]},n1002:{id:"n1002",loc:[-85.632673,41.944755]},n1003:{id:"n1003",loc:[-85.632595,41.944682]},n1004:{id:"n1004",loc:[-85.632576,41.944673]},n1005:{id:"n1005",loc:[-85.632551,41.944667]},n1006:{id:"n1006",loc:[-85.63253,41.944667]},n1007:{id:"n1007",loc:[-85.632502,41.944669]},n1008:{id:"n1008",loc:[-85.632483,41.944677]},n1009:{id:"n1009",loc:[-85.632383,41.944731]},n101:{id:"n101",loc:[-85.637357,41.942252]},n1010:{id:"n1010",loc:[-85.63349,41.944976],tags:{"addr:city":"Three Rivers","addr:housenumber":"31","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Sherwin-Williams",shop:"paint"}},n1011:{id:"n1011",loc:[-85.633548,41.945034],tags:{"addr:city":"Three Rivers","addr:housenumber":"33","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Unique Jewelry",shop:"jewelry"}},n1012:{id:"n1012",loc:[-85.633683,41.945129],tags:{"addr:city":"Three Rivers","addr:housenumber":"37","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"World Fare",shop:"gift"}},n1013:{id:"n1013",loc:[-85.634563,41.945469],tags:{"addr:city":"Three Rivers","addr:housenumber":"62","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Golden Finch Framing",shop:"frame"}},n1014:{id:"n1014",loc:[-85.634469,41.945379],tags:{"addr:city":"Three Rivers","addr:housenumber":"58","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Dollar Tree",shop:"second_hand"}},n1015:{id:"n1015",loc:[-85.634227,41.945159],tags:{"addr:city":"Three Rivers","addr:housenumber":"48","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",amenity:"theatre",name:"Riviera Theatre"}},n1016:{id:"n1016",loc:[-85.634057,41.945012],tags:{"addr:city":"Three Rivers","addr:housenumber":"42","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"River City Appliance",shop:"appliance"}},n1017:{id:"n1017",loc:[-85.633879,41.945325],tags:{"addr:city":"Three Rivers","addr:housenumber":"45","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Paparazzi Tattoo",shop:"tattoo"}},n1018:{id:"n1018",loc:[-85.634914,41.945839],tags:{"addr:city":"Three Rivers","addr:housenumber":"88","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",amenity:"bank",name:"Southern Michigan Bank"}},n1019:{id:"n1019",loc:[-85.634514,41.946176]},n102:{id:"n102",loc:[-85.637357,41.942216]},n1020:{id:"n1020",loc:[-85.634087,41.946178]},n1021:{id:"n1021",loc:[-85.634357,41.945805]},n1022:{id:"n1022",loc:[-85.634389,41.945788]},n1023:{id:"n1023",loc:[-85.634491,41.94581]},n1024:{id:"n1024",loc:[-85.634513,41.945853]},n1025:{id:"n1025",loc:[-85.634506,41.94583]},n1026:{id:"n1026",loc:[-85.634762,41.946056],tags:{crossing:"marked",highway:"crossing"}},n1027:{id:"n1027",loc:[-85.634767,41.946172]},n1028:{id:"n1028",loc:[-85.634622,41.946175],tags:{crossing:"marked",highway:"crossing"}},n1029:{id:"n1029",loc:[-85.640655,41.942057]},n103:{id:"n103",loc:[-85.637386,41.942054]},n1030:{id:"n1030",loc:[-85.640947,41.942057]},n1031:{id:"n1031",loc:[-85.640957,41.942593]},n1032:{id:"n1032",loc:[-85.630953,41.960873]},n1033:{id:"n1033",loc:[-85.632174,41.960679]},n1034:{id:"n1034",loc:[-85.638785,41.943066]},n1035:{id:"n1035",loc:[-85.638853,41.943065]},n1036:{id:"n1036",loc:[-85.638855,41.943183]},n1037:{id:"n1037",loc:[-85.638552,41.943189]},n1038:{id:"n1038",loc:[-85.63855,41.943149]},n1039:{id:"n1039",loc:[-85.638638,41.943068]},n104:{id:"n104",loc:[-85.637387,41.942125]},n1040:{id:"n1040",loc:[-85.638638,41.943078]},n1041:{id:"n1041",loc:[-85.638813,41.943163]},n1042:{id:"n1042",loc:[-85.638684,41.943165]},n1043:{id:"n1043",loc:[-85.638682,41.943105]},n1044:{id:"n1044",loc:[-85.638706,41.943105]},n1045:{id:"n1045",loc:[-85.638707,41.943117]},n1046:{id:"n1046",loc:[-85.638812,41.943115]},n1047:{id:"n1047",loc:[-85.638769,41.943407]},n1048:{id:"n1048",loc:[-85.638549,41.943407]},n1049:{id:"n1049",loc:[-85.638567,41.943555]},n105:{id:"n105",loc:[-85.637319,41.942125]},n1050:{id:"n1050",loc:[-85.638426,41.943554]},n1051:{id:"n1051",loc:[-85.638427,41.94346]},n1052:{id:"n1052",loc:[-85.638568,41.943461]},n1053:{id:"n1053",loc:[-85.639264,41.943415]},n1054:{id:"n1054",loc:[-85.639082,41.943417]},n1055:{id:"n1055",loc:[-85.63908,41.943331]},n1056:{id:"n1056",loc:[-85.639136,41.94333]},n1057:{id:"n1057",loc:[-85.639158,41.943312]},n1058:{id:"n1058",loc:[-85.639188,41.943313]},n1059:{id:"n1059",loc:[-85.639211,41.943331]},n106:{id:"n106",loc:[-85.637319,41.942137]},n1060:{id:"n1060",loc:[-85.639262,41.943331]},n1061:{id:"n1061",loc:[-85.638986,41.943515]},n1062:{id:"n1062",loc:[-85.63888,41.943521]},n1063:{id:"n1063",loc:[-85.638871,41.943436]},n1064:{id:"n1064",loc:[-85.638958,41.943431]},n1065:{id:"n1065",loc:[-85.638979,41.943443]},n1066:{id:"n1066",loc:[-85.63926,41.943703]},n1067:{id:"n1067",loc:[-85.639152,41.943704]},n1068:{id:"n1068",loc:[-85.639152,41.943691]},n1069:{id:"n1069",loc:[-85.639063,41.943691]},n107:{id:"n107",loc:[-85.637259,41.942137]},n1070:{id:"n1070",loc:[-85.639062,41.943613]},n1071:{id:"n1071",loc:[-85.639259,41.943611]},n1072:{id:"n1072",loc:[-85.639117,41.943726]},n1073:{id:"n1073",loc:[-85.639118,41.943767]},n1074:{id:"n1074",loc:[-85.639051,41.943768]},n1075:{id:"n1075",loc:[-85.63905,41.943727]},n1076:{id:"n1076",loc:[-85.638627,41.943716]},n1077:{id:"n1077",loc:[-85.63863,41.943634]},n1078:{id:"n1078",loc:[-85.63844,41.943631]},n1079:{id:"n1079",loc:[-85.638437,41.943729]},n108:{id:"n108",loc:[-85.637259,41.942126]},n1080:{id:"n1080",loc:[-85.638533,41.94373]},n1081:{id:"n1081",loc:[-85.638534,41.943715]},n1082:{id:"n1082",loc:[-85.638678,41.943941]},n1083:{id:"n1083",loc:[-85.638522,41.943944]},n1084:{id:"n1084",loc:[-85.63852,41.943864]},n1085:{id:"n1085",loc:[-85.638676,41.943861]},n1086:{id:"n1086",loc:[-85.638663,41.944059]},n1087:{id:"n1087",loc:[-85.638513,41.944061]},n1088:{id:"n1088",loc:[-85.638511,41.943991]},n1089:{id:"n1089",loc:[-85.638661,41.943989]},n109:{id:"n109",loc:[-85.637193,41.942126]},n1090:{id:"n1090",loc:[-85.63865,41.944134]},n1091:{id:"n1091",loc:[-85.638429,41.944144]},n1092:{id:"n1092",loc:[-85.638426,41.944106]},n1093:{id:"n1093",loc:[-85.638476,41.944104]},n1094:{id:"n1094",loc:[-85.638475,41.94409]},n1095:{id:"n1095",loc:[-85.638594,41.944084]},n1096:{id:"n1096",loc:[-85.638595,41.944101]},n1097:{id:"n1097",loc:[-85.638647,41.944099]},n1098:{id:"n1098",loc:[-85.63829,41.944154]},n1099:{id:"n1099",loc:[-85.638558,41.944155]},n11:{id:"n11",loc:[-85.634602,41.941523]},n110:{id:"n110",loc:[-85.637192,41.942053]},n1100:{id:"n1100",loc:[-85.638558,41.944338]},n1101:{id:"n1101",loc:[-85.638851,41.944408]},n1102:{id:"n1102",loc:[-85.637771,41.943989]},n1103:{id:"n1103",loc:[-85.639345,41.943964]},n1104:{id:"n1104",loc:[-85.638515,41.94397]},n1105:{id:"n1105",loc:[-85.639256,41.943928]},n1106:{id:"n1106",loc:[-85.639157,41.943929]},n1107:{id:"n1107",loc:[-85.639156,41.9439]},n1108:{id:"n1108",loc:[-85.639118,41.9439]},n1109:{id:"n1109",loc:[-85.639116,41.94382]},n111:{id:"n111",loc:[-85.637248,41.942053]},n1110:{id:"n1110",loc:[-85.639202,41.943819]},n1111:{id:"n1111",loc:[-85.639202,41.943837]},n1112:{id:"n1112",loc:[-85.639293,41.943836]},n1113:{id:"n1113",loc:[-85.639295,41.943898]},n1114:{id:"n1114",loc:[-85.639255,41.943898]},n1115:{id:"n1115",loc:[-85.639296,41.944083]},n1116:{id:"n1116",loc:[-85.639144,41.944084]},n1117:{id:"n1117",loc:[-85.639143,41.944026]},n1118:{id:"n1118",loc:[-85.639162,41.944026]},n1119:{id:"n1119",loc:[-85.639162,41.944]},n112:{id:"n112",loc:[-85.637248,41.942042]},n1120:{id:"n1120",loc:[-85.639295,41.943999]},n1121:{id:"n1121",loc:[-85.639131,41.944139]},n1122:{id:"n1122",loc:[-85.63901,41.94414]},n1123:{id:"n1123",loc:[-85.63901,41.944076]},n1124:{id:"n1124",loc:[-85.63913,41.944075]},n1125:{id:"n1125",loc:[-85.639092,41.944155]},n1126:{id:"n1126",loc:[-85.639093,41.944308]},n1127:{id:"n1127",loc:[-85.639225,41.944308]},n1128:{id:"n1128",loc:[-85.639225,41.94429]},n1129:{id:"n1129",loc:[-85.639253,41.944289]},n113:{id:"n113",loc:[-85.637338,41.942041]},n1130:{id:"n1130",loc:[-85.639253,41.944269]},n1131:{id:"n1131",loc:[-85.639243,41.944269]},n1132:{id:"n1132",loc:[-85.639243,41.944229]},n1133:{id:"n1133",loc:[-85.639224,41.944229]},n1134:{id:"n1134",loc:[-85.639224,41.944196]},n1135:{id:"n1135",loc:[-85.639195,41.944196]},n1136:{id:"n1136",loc:[-85.639195,41.944155]},n1137:{id:"n1137",loc:[-85.639072,41.944154]},n1138:{id:"n1138",loc:[-85.638865,41.944154]},n1139:{id:"n1139",loc:[-85.638863,41.943967]},n114:{id:"n114",loc:[-85.637338,41.942055]},n1140:{id:"n1140",loc:[-85.6386,41.942698]},n1141:{id:"n1141",loc:[-85.639348,41.942698]},n1142:{id:"n1142",loc:[-85.639377,41.944984]},n1143:{id:"n1143",loc:[-85.63937,41.945013]},n1144:{id:"n1144",loc:[-85.639357,41.945033]},n1145:{id:"n1145",loc:[-85.639353,41.945053]},n1146:{id:"n1146",loc:[-85.639352,41.945084]},n1147:{id:"n1147",loc:[-85.638278,41.945516]},n1148:{id:"n1148",loc:[-85.637505,41.945801]},n1149:{id:"n1149",loc:[-85.637327,41.945857]},n115:{id:"n115",loc:[-85.637583,41.941943]},n1150:{id:"n1150",loc:[-85.637168,41.945899]},n1151:{id:"n1151",loc:[-85.637017,41.94593]},n1152:{id:"n1152",loc:[-85.637185,41.945938]},n1153:{id:"n1153",loc:[-85.63682,41.945963]},n1154:{id:"n1154",loc:[-85.636639,41.945984]},n1155:{id:"n1155",loc:[-85.636439,41.945999]},n1156:{id:"n1156",loc:[-85.635801,41.945999]},n1157:{id:"n1157",loc:[-85.635769,41.945908]},n1158:{id:"n1158",loc:[-85.635953,41.946154]},n1159:{id:"n1159",loc:[-85.635472,41.94598]},n116:{id:"n116",loc:[-85.637584,41.941983]},n1160:{id:"n1160",loc:[-85.635409,41.945981]},n1161:{id:"n1161",loc:[-85.635583,41.945987]},n1162:{id:"n1162",loc:[-85.636452,41.945805]},n1163:{id:"n1163",loc:[-85.636425,41.94582]},n1164:{id:"n1164",loc:[-85.636396,41.945817]},n1165:{id:"n1165",loc:[-85.636368,41.945797]},n1166:{id:"n1166",loc:[-85.636346,41.945767]},n1167:{id:"n1167",loc:[-85.636307,41.945745]},n1168:{id:"n1168",loc:[-85.636194,41.94565]},n1169:{id:"n1169",loc:[-85.636121,41.945579]},n117:{id:"n117",loc:[-85.63751,41.941983]},n1170:{id:"n1170",loc:[-85.635995,41.945432]},n1171:{id:"n1171",loc:[-85.637564,41.943538]},n1172:{id:"n1172",loc:[-85.63756,41.943505]},n1173:{id:"n1173",loc:[-85.637435,41.943489]},n1174:{id:"n1174",loc:[-85.637093,41.943556]},n1175:{id:"n1175",loc:[-85.634836,41.941574]},n1176:{id:"n1176",loc:[-85.634692,41.9415]},n1177:{id:"n1177",loc:[-85.634261,41.941337]},n1178:{id:"n1178",loc:[-85.634208,41.940962]},n1179:{id:"n1179",loc:[-85.635247,41.940968]},n118:{id:"n118",loc:[-85.637509,41.941944]},n1180:{id:"n1180",loc:[-85.63514,41.941205]},n1181:{id:"n1181",loc:[-85.634858,41.941511]},n1182:{id:"n1182",loc:[-85.630725,41.943465]},n1183:{id:"n1183",loc:[-85.632591,41.942826]},n1184:{id:"n1184",loc:[-85.634487,41.941928]},n1185:{id:"n1185",loc:[-85.634499,41.942056]},n1186:{id:"n1186",loc:[-85.63433,41.943102]},n1187:{id:"n1187",loc:[-85.634158,41.943151]},n1188:{id:"n1188",loc:[-85.634107,41.94305]},n1189:{id:"n1189",loc:[-85.634279,41.943002]},n119:{id:"n119",loc:[-85.637724,41.941973]},n1190:{id:"n1190",loc:[-85.634362,41.943762]},n1191:{id:"n1191",loc:[-85.634331,41.943731]},n1192:{id:"n1192",loc:[-85.634396,41.943695]},n1193:{id:"n1193",loc:[-85.634426,41.943726]},n1194:{id:"n1194",loc:[-85.621569,41.956021]},n1195:{id:"n1195",loc:[-85.621574,41.956164]},n1196:{id:"n1196",loc:[-85.621489,41.956165]},n1197:{id:"n1197",loc:[-85.621488,41.956136]},n1198:{id:"n1198",loc:[-85.621372,41.956139]},n1199:{id:"n1199",loc:[-85.621369,41.956049]},n12:{id:"n12",loc:[-85.63359,41.941093]},n120:{id:"n120",loc:[-85.637633,41.941973]},n1200:{id:"n1200",loc:[-85.621493,41.956047]},n1201:{id:"n1201",loc:[-85.621492,41.956022]},n1202:{id:"n1202",loc:[-85.619744,41.953192]},n1203:{id:"n1203",loc:[-85.619059,41.953902]},n1204:{id:"n1204",loc:[-85.623984,41.95469]},n1205:{id:"n1205",loc:[-85.630159,41.958208]},n1206:{id:"n1206",loc:[-85.63002,41.958208]},n1207:{id:"n1207",loc:[-85.630021,41.95814]},n1208:{id:"n1208",loc:[-85.63,41.95814]},n1209:{id:"n1209",loc:[-85.63,41.958043]},n121:{id:"n121",loc:[-85.637633,41.941853]},n1210:{id:"n1210",loc:[-85.630159,41.958043]},n1211:{id:"n1211",loc:[-85.630304,41.957566]},n1212:{id:"n1212",loc:[-85.630303,41.957684]},n1213:{id:"n1213",loc:[-85.630073,41.957683]},n1214:{id:"n1214",loc:[-85.630072,41.957721]},n1215:{id:"n1215",loc:[-85.629993,41.95772]},n1216:{id:"n1216",loc:[-85.629993,41.95768]},n1217:{id:"n1217",loc:[-85.629968,41.95768]},n1218:{id:"n1218",loc:[-85.629969,41.957588]},n1219:{id:"n1219",loc:[-85.630219,41.95759]},n122:{id:"n122",loc:[-85.637724,41.941853]},n1220:{id:"n1220",loc:[-85.630219,41.957566]},n1221:{id:"n1221",loc:[-85.630717,41.957744]},n1222:{id:"n1222",loc:[-85.630596,41.957745]},n1223:{id:"n1223",loc:[-85.630598,41.957553]},n1224:{id:"n1224",loc:[-85.630717,41.957555]},n1225:{id:"n1225",loc:[-85.630609,41.957745]},n1226:{id:"n1226",loc:[-85.63061,41.957789]},n1227:{id:"n1227",loc:[-85.630327,41.957791]},n1228:{id:"n1228",loc:[-85.630324,41.95752]},n1229:{id:"n1229",loc:[-85.630325,41.95756]},n123:{id:"n123",loc:[-85.637773,41.941988]},n1230:{id:"n1230",loc:[-85.63057,41.95756]},n1231:{id:"n1231",loc:[-85.63069,41.958016]},n1232:{id:"n1232",loc:[-85.630586,41.958017]},n1233:{id:"n1233",loc:[-85.630584,41.957956]},n1234:{id:"n1234",loc:[-85.630614,41.957956]},n1235:{id:"n1235",loc:[-85.630611,41.957835]},n1236:{id:"n1236",loc:[-85.630737,41.957833]},n1237:{id:"n1237",loc:[-85.630739,41.957921]},n1238:{id:"n1238",loc:[-85.630688,41.957922]},n1239:{id:"n1239",loc:[-85.630719,41.958291]},n124:{id:"n124",loc:[-85.637773,41.942046]},n1240:{id:"n1240",loc:[-85.630592,41.958291]},n1241:{id:"n1241",loc:[-85.630593,41.958108]},n1242:{id:"n1242",loc:[-85.630701,41.958109]},n1243:{id:"n1243",loc:[-85.6307,41.958173]},n1244:{id:"n1244",loc:[-85.630711,41.958173]},n1245:{id:"n1245",loc:[-85.630711,41.958233]},n1246:{id:"n1246",loc:[-85.630719,41.958233]},n1247:{id:"n1247",loc:[-85.630523,41.958329]},n1248:{id:"n1248",loc:[-85.630388,41.958329]},n1249:{id:"n1249",loc:[-85.630387,41.958262]},n125:{id:"n125",loc:[-85.637693,41.942047]},n1250:{id:"n1250",loc:[-85.630523,41.958261]},n1251:{id:"n1251",loc:[-85.63072,41.958636]},n1252:{id:"n1252",loc:[-85.630721,41.958709]},n1253:{id:"n1253",loc:[-85.630503,41.958712]},n1254:{id:"n1254",loc:[-85.630498,41.958511]},n1255:{id:"n1255",loc:[-85.630635,41.95851]},n1256:{id:"n1256",loc:[-85.630638,41.958636]},n1257:{id:"n1257",loc:[-85.630437,41.958822]},n1258:{id:"n1258",loc:[-85.630437,41.958849]},n1259:{id:"n1259",loc:[-85.630393,41.958849]},n126:{id:"n126",loc:[-85.637692,41.941988]},n1260:{id:"n1260",loc:[-85.630393,41.958822]},n1261:{id:"n1261",loc:[-85.630605,41.959102]},n1262:{id:"n1262",loc:[-85.63049,41.959104]},n1263:{id:"n1263",loc:[-85.630487,41.958996]},n1264:{id:"n1264",loc:[-85.630462,41.958996]},n1265:{id:"n1265",loc:[-85.63046,41.958922]},n1266:{id:"n1266",loc:[-85.630562,41.958921]},n1267:{id:"n1267",loc:[-85.630564,41.958992]},n1268:{id:"n1268",loc:[-85.630602,41.958992]},n1269:{id:"n1269",loc:[-85.630126,41.957096]},n127:{id:"n127",loc:[-85.637604,41.941994]},n1270:{id:"n1270",loc:[-85.630129,41.957283]},n1271:{id:"n1271",loc:[-85.629993,41.957284]},n1272:{id:"n1272",loc:[-85.629992,41.957216]},n1273:{id:"n1273",loc:[-85.630015,41.957215]},n1274:{id:"n1274",loc:[-85.630013,41.957097]},n1275:{id:"n1275",loc:[-85.630211,41.956592]},n1276:{id:"n1276",loc:[-85.630211,41.956676]},n1277:{id:"n1277",loc:[-85.630162,41.956676]},n1278:{id:"n1278",loc:[-85.630162,41.95676]},n1279:{id:"n1279",loc:[-85.630037,41.956761]},n128:{id:"n128",loc:[-85.637604,41.942057]},n1280:{id:"n1280",loc:[-85.630037,41.956592]},n1281:{id:"n1281",loc:[-85.630309,41.95653]},n1282:{id:"n1282",loc:[-85.630326,41.957065]},n1283:{id:"n1283",loc:[-85.630118,41.957065]},n1284:{id:"n1284",loc:[-85.630119,41.957096]},n1285:{id:"n1285",loc:[-85.63067,41.957307]},n1286:{id:"n1286",loc:[-85.630536,41.957308]},n1287:{id:"n1287",loc:[-85.630533,41.957111]},n1288:{id:"n1288",loc:[-85.630667,41.95711]},n1289:{id:"n1289",loc:[-85.630676,41.956808]},n129:{id:"n129",loc:[-85.63748,41.942057]},n1290:{id:"n1290",loc:[-85.630551,41.956808]},n1291:{id:"n1291",loc:[-85.630552,41.956982]},n1292:{id:"n1292",loc:[-85.63059,41.956982]},n1293:{id:"n1293",loc:[-85.63059,41.957001]},n1294:{id:"n1294",loc:[-85.630692,41.957001]},n1295:{id:"n1295",loc:[-85.630692,41.956936]},n1296:{id:"n1296",loc:[-85.630676,41.956936]},n1297:{id:"n1297",loc:[-85.630496,41.956889]},n1298:{id:"n1298",loc:[-85.630501,41.956947]},n1299:{id:"n1299",loc:[-85.630377,41.956953]},n13:{id:"n13",loc:[-85.633643,41.941143]},n130:{id:"n130",loc:[-85.63748,41.941994]},n1300:{id:"n1300",loc:[-85.630359,41.956938]},n1301:{id:"n1301",loc:[-85.630359,41.956912]},n1302:{id:"n1302",loc:[-85.63038,41.956894]},n1303:{id:"n1303",loc:[-85.630679,41.956747]},n1304:{id:"n1304",loc:[-85.630572,41.956748]},n1305:{id:"n1305",loc:[-85.63057,41.956668]},n1306:{id:"n1306",loc:[-85.630501,41.956669]},n1307:{id:"n1307",loc:[-85.630499,41.95659]},n1308:{id:"n1308",loc:[-85.630565,41.956589]},n1309:{id:"n1309",loc:[-85.630564,41.956541]},n131:{id:"n131",loc:[-85.637431,41.941832]},n1310:{id:"n1310",loc:[-85.630686,41.956539]},n1311:{id:"n1311",loc:[-85.630688,41.956631]},n1312:{id:"n1312",loc:[-85.630676,41.956631]},n1313:{id:"n1313",loc:[-85.630686,41.956487]},n1314:{id:"n1314",loc:[-85.63059,41.956487]},n1315:{id:"n1315",loc:[-85.63059,41.956396]},n1316:{id:"n1316",loc:[-85.630686,41.956396]},n1317:{id:"n1317",loc:[-85.630643,41.9563]},n1318:{id:"n1318",loc:[-85.630548,41.956301]},n1319:{id:"n1319",loc:[-85.630545,41.956217]},n132:{id:"n132",loc:[-85.637432,41.94189]},n1320:{id:"n1320",loc:[-85.630529,41.956214]},n1321:{id:"n1321",loc:[-85.630521,41.956202]},n1322:{id:"n1322",loc:[-85.63052,41.95618]},n1323:{id:"n1323",loc:[-85.630527,41.956169]},n1324:{id:"n1324",loc:[-85.630544,41.956163]},n1325:{id:"n1325",loc:[-85.630543,41.956094]},n1326:{id:"n1326",loc:[-85.630641,41.956093]},n1327:{id:"n1327",loc:[-85.630642,41.956134]},n1328:{id:"n1328",loc:[-85.630656,41.956134]},n1329:{id:"n1329",loc:[-85.630657,41.956252]},n133:{id:"n133",loc:[-85.637412,41.94189]},n1330:{id:"n1330",loc:[-85.630643,41.956252]},n1331:{id:"n1331",loc:[-85.630409,41.956044]},n1332:{id:"n1332",loc:[-85.630409,41.956075]},n1333:{id:"n1333",loc:[-85.630195,41.956078]},n1334:{id:"n1334",loc:[-85.630195,41.9561]},n1335:{id:"n1335",loc:[-85.630088,41.956101]},n1336:{id:"n1336",loc:[-85.630087,41.956048]},n1337:{id:"n1337",loc:[-85.630345,41.956114]},n1338:{id:"n1338",loc:[-85.630328,41.956113]},n1339:{id:"n1339",loc:[-85.63034,41.956189]},n134:{id:"n134",loc:[-85.637413,41.941938]},n1340:{id:"n1340",loc:[-85.630355,41.956185]},n1341:{id:"n1341",loc:[-85.630311,41.956117]},n1342:{id:"n1342",loc:[-85.630297,41.956125]},n1343:{id:"n1343",loc:[-85.630287,41.956136]},n1344:{id:"n1344",loc:[-85.630283,41.956149]},n1345:{id:"n1345",loc:[-85.630285,41.956162]},n1346:{id:"n1346",loc:[-85.630293,41.956174]},n1347:{id:"n1347",loc:[-85.630306,41.956183]},n1348:{id:"n1348",loc:[-85.630322,41.956188]},n1349:{id:"n1349",loc:[-85.630368,41.956179]},n135:{id:"n135",loc:[-85.637342,41.941939]},n1350:{id:"n1350",loc:[-85.630378,41.95617]},n1351:{id:"n1351",loc:[-85.630384,41.956159]},n1352:{id:"n1352",loc:[-85.630385,41.956147]},n1353:{id:"n1353",loc:[-85.630381,41.956136]},n1354:{id:"n1354",loc:[-85.630372,41.956126]},n1355:{id:"n1355",loc:[-85.63036,41.956118]},n1356:{id:"n1356",loc:[-85.630776,41.956041]},n1357:{id:"n1357",loc:[-85.630195,41.956036]},n1358:{id:"n1358",loc:[-85.630137,41.956037]},n1359:{id:"n1359",loc:[-85.630136,41.956006]},n136:{id:"n136",loc:[-85.637342,41.941914]},n1360:{id:"n1360",loc:[-85.630194,41.956005]},n1361:{id:"n1361",loc:[-85.629864,41.956039]},n1362:{id:"n1362",loc:[-85.629864,41.955862]},n1363:{id:"n1363",loc:[-85.629541,41.958291]},n1364:{id:"n1364",loc:[-85.629419,41.958292]},n1365:{id:"n1365",loc:[-85.629417,41.958168]},n1366:{id:"n1366",loc:[-85.629445,41.958168]},n1367:{id:"n1367",loc:[-85.629444,41.958109]},n1368:{id:"n1368",loc:[-85.629537,41.958108]},n1369:{id:"n1369",loc:[-85.629351,41.958136]},n137:{id:"n137",loc:[-85.637212,41.941916]},n1370:{id:"n1370",loc:[-85.629352,41.958202]},n1371:{id:"n1371",loc:[-85.629365,41.958202]},n1372:{id:"n1372",loc:[-85.629365,41.958223]},n1373:{id:"n1373",loc:[-85.629291,41.958224]},n1374:{id:"n1374",loc:[-85.62929,41.958137]},n1375:{id:"n1375",loc:[-85.629443,41.958073]},n1376:{id:"n1376",loc:[-85.629252,41.958075]},n1377:{id:"n1377",loc:[-85.629253,41.95827]},n1378:{id:"n1378",loc:[-85.629566,41.957585]},n1379:{id:"n1379",loc:[-85.629566,41.957692]},n138:{id:"n138",loc:[-85.637211,41.941835]},n1380:{id:"n1380",loc:[-85.629281,41.957693]},n1381:{id:"n1381",loc:[-85.62928,41.957585]},n1382:{id:"n1382",loc:[-85.629004,41.957599]},n1383:{id:"n1383",loc:[-85.629004,41.957682]},n1384:{id:"n1384",loc:[-85.628902,41.957682]},n1385:{id:"n1385",loc:[-85.628902,41.957723]},n1386:{id:"n1386",loc:[-85.628731,41.957724]},n1387:{id:"n1387",loc:[-85.628731,41.9576]},n1388:{id:"n1388",loc:[-85.62836,41.957679]},n1389:{id:"n1389",loc:[-85.628359,41.957759]},n139:{id:"n139",loc:[-85.637293,41.941834]},n1390:{id:"n1390",loc:[-85.628062,41.957757]},n1391:{id:"n1391",loc:[-85.628063,41.957657]},n1392:{id:"n1392",loc:[-85.628198,41.957657]},n1393:{id:"n1393",loc:[-85.628198,41.957678]},n1394:{id:"n1394",loc:[-85.627775,41.958095]},n1395:{id:"n1395",loc:[-85.627608,41.958095]},n1396:{id:"n1396",loc:[-85.627606,41.957829]},n1397:{id:"n1397",loc:[-85.627774,41.957829]},n1398:{id:"n1398",loc:[-85.626816,41.957636]},n1399:{id:"n1399",loc:[-85.626787,41.957681]},n14:{id:"n14",loc:[-85.633643,41.940122]},n140:{id:"n140",loc:[-85.637293,41.941823]},n1400:{id:"n1400",loc:[-85.626673,41.95764]},n1401:{id:"n1401",loc:[-85.626703,41.957594]},n1402:{id:"n1402",loc:[-85.62694,41.95752]},n1403:{id:"n1403",loc:[-85.62688,41.957611]},n1404:{id:"n1404",loc:[-85.626798,41.957582]},n1405:{id:"n1405",loc:[-85.626793,41.95759]},n1406:{id:"n1406",loc:[-85.626657,41.95754]},n1407:{id:"n1407",loc:[-85.626666,41.957526]},n1408:{id:"n1408",loc:[-85.626584,41.957497]},n1409:{id:"n1409",loc:[-85.626638,41.957415]},n141:{id:"n141",loc:[-85.637363,41.941822]},n1410:{id:"n1410",loc:[-85.626731,41.957449]},n1411:{id:"n1411",loc:[-85.626725,41.957457]},n1412:{id:"n1412",loc:[-85.626843,41.9575]},n1413:{id:"n1413",loc:[-85.626851,41.957487]},n1414:{id:"n1414",loc:[-85.626579,41.957521]},n1415:{id:"n1415",loc:[-85.626537,41.957587]},n1416:{id:"n1416",loc:[-85.626427,41.957551]},n1417:{id:"n1417",loc:[-85.626468,41.957483]},n1418:{id:"n1418",loc:[-85.626592,41.957639]},n1419:{id:"n1419",loc:[-85.626807,41.957713]},n142:{id:"n142",loc:[-85.637364,41.941833]},n1420:{id:"n1420",loc:[-85.627129,41.957401]},n1421:{id:"n1421",loc:[-85.627209,41.95742]},n1422:{id:"n1422",loc:[-85.627302,41.957435]},n1423:{id:"n1423",loc:[-85.629566,41.957048]},n1424:{id:"n1424",loc:[-85.629568,41.957215]},n1425:{id:"n1425",loc:[-85.629383,41.957216]},n1426:{id:"n1426",loc:[-85.629384,41.95727]},n1427:{id:"n1427",loc:[-85.629231,41.957271]},n1428:{id:"n1428",loc:[-85.62923,41.957198]},n1429:{id:"n1429",loc:[-85.629322,41.957198]},n143:{id:"n143",loc:[-85.637559,41.942448]},n1430:{id:"n1430",loc:[-85.629321,41.957108]},n1431:{id:"n1431",loc:[-85.629441,41.957108]},n1432:{id:"n1432",loc:[-85.62944,41.957049]},n1433:{id:"n1433",loc:[-85.629337,41.957018]},n1434:{id:"n1434",loc:[-85.629366,41.957028]},n1435:{id:"n1435",loc:[-85.629375,41.957044]},n1436:{id:"n1436",loc:[-85.629354,41.957071]},n1437:{id:"n1437",loc:[-85.629317,41.957071]},n1438:{id:"n1438",loc:[-85.62929,41.957074]},n1439:{id:"n1439",loc:[-85.62927,41.957084]},n144:{id:"n144",loc:[-85.637036,41.942454]},n1440:{id:"n1440",loc:[-85.629232,41.957081]},n1441:{id:"n1441",loc:[-85.629222,41.957057]},n1442:{id:"n1442",loc:[-85.629259,41.957025]},n1443:{id:"n1443",loc:[-85.629293,41.957017]},n1444:{id:"n1444",loc:[-85.629251,41.957085]},n1445:{id:"n1445",loc:[-85.629235,41.957041]},n1446:{id:"n1446",loc:[-85.62937,41.95706]},n1447:{id:"n1447",loc:[-85.629531,41.956909]},n1448:{id:"n1448",loc:[-85.629408,41.956909]},n1449:{id:"n1449",loc:[-85.629402,41.956681]},n145:{id:"n145",loc:[-85.636692,41.942828]},n1450:{id:"n1450",loc:[-85.62953,41.956681]},n1451:{id:"n1451",loc:[-85.629402,41.956728]},n1452:{id:"n1452",loc:[-85.629408,41.956845]},n1453:{id:"n1453",loc:[-85.629385,41.956845]},n1454:{id:"n1454",loc:[-85.629384,41.956728]},n1455:{id:"n1455",loc:[-85.629063,41.956973]},n1456:{id:"n1456",loc:[-85.629064,41.957009]},n1457:{id:"n1457",loc:[-85.62902,41.957009]},n1458:{id:"n1458",loc:[-85.629019,41.956973]},n1459:{id:"n1459",loc:[-85.629136,41.956633]},n146:{id:"n146",loc:[-85.635929,41.942826]},n1460:{id:"n1460",loc:[-85.629084,41.956632]},n1461:{id:"n1461",loc:[-85.629084,41.956605]},n1462:{id:"n1462",loc:[-85.629136,41.956605]},n1463:{id:"n1463",loc:[-85.629153,41.956657]},n1464:{id:"n1464",loc:[-85.627914,41.956661]},n1465:{id:"n1465",loc:[-85.630096,41.956101]},n1466:{id:"n1466",loc:[-85.630097,41.95612]},n1467:{id:"n1467",loc:[-85.630011,41.956121]},n1468:{id:"n1468",loc:[-85.630015,41.956374]},n1469:{id:"n1469",loc:[-85.629148,41.95626]},n147:{id:"n147",loc:[-85.636433,41.942828]},n1470:{id:"n1470",loc:[-85.629527,41.956591]},n1471:{id:"n1471",loc:[-85.629405,41.956591]},n1472:{id:"n1472",loc:[-85.629405,41.956459]},n1473:{id:"n1473",loc:[-85.629369,41.956459]},n1474:{id:"n1474",loc:[-85.629369,41.956424]},n1475:{id:"n1475",loc:[-85.629413,41.956424]},n1476:{id:"n1476",loc:[-85.629414,41.956326]},n1477:{id:"n1477",loc:[-85.629522,41.956326]},n1478:{id:"n1478",loc:[-85.629522,41.956487]},n1479:{id:"n1479",loc:[-85.629527,41.956487]},n148:{id:"n148",loc:[-85.636435,41.942864],tags:{entrance:"yes"}},n1480:{id:"n1480",loc:[-85.629414,41.95634]},n1481:{id:"n1481",loc:[-85.629149,41.956338]},n1482:{id:"n1482",loc:[-85.62931,41.956531]},n1483:{id:"n1483",loc:[-85.629291,41.95655]},n1484:{id:"n1484",loc:[-85.629255,41.95655]},n1485:{id:"n1485",loc:[-85.629236,41.956533]},n1486:{id:"n1486",loc:[-85.629237,41.956461]},n1487:{id:"n1487",loc:[-85.629257,41.956445]},n1488:{id:"n1488",loc:[-85.629257,41.956428]},n1489:{id:"n1489",loc:[-85.629287,41.956428]},n149:{id:"n149",loc:[-85.637235,41.942622]},n1490:{id:"n1490",loc:[-85.629287,41.956445]},n1491:{id:"n1491",loc:[-85.62931,41.95646]},n1492:{id:"n1492",loc:[-85.629049,41.956425]},n1493:{id:"n1493",loc:[-85.628907,41.956427]},n1494:{id:"n1494",loc:[-85.628907,41.956455]},n1495:{id:"n1495",loc:[-85.628841,41.956455]},n1496:{id:"n1496",loc:[-85.62884,41.956424]},n1497:{id:"n1497",loc:[-85.628764,41.956425]},n1498:{id:"n1498",loc:[-85.628762,41.956323]},n1499:{id:"n1499",loc:[-85.628808,41.956323]},n15:{id:"n15",loc:[-85.633477,41.940187]},n150:{id:"n150",loc:[-85.637247,41.943116]},n1500:{id:"n1500",loc:[-85.628808,41.956314]},n1501:{id:"n1501",loc:[-85.628911,41.956313]},n1502:{id:"n1502",loc:[-85.628911,41.956322]},n1503:{id:"n1503",loc:[-85.62896,41.956322]},n1504:{id:"n1504",loc:[-85.62896,41.956348]},n1505:{id:"n1505",loc:[-85.629047,41.956347]},n1506:{id:"n1506",loc:[-85.628893,41.957263]},n1507:{id:"n1507",loc:[-85.628788,41.957264]},n1508:{id:"n1508",loc:[-85.628786,41.95711]},n1509:{id:"n1509",loc:[-85.628894,41.957109]},n151:{id:"n151",loc:[-85.637564,41.943116]},n1510:{id:"n1510",loc:[-85.628893,41.957075]},n1511:{id:"n1511",loc:[-85.628965,41.957075]},n1512:{id:"n1512",loc:[-85.628965,41.957111]},n1513:{id:"n1513",loc:[-85.629035,41.95711]},n1514:{id:"n1514",loc:[-85.629036,41.957209]},n1515:{id:"n1515",loc:[-85.628893,41.95721]},n1516:{id:"n1516",loc:[-85.631348,41.95773]},n1517:{id:"n1517",loc:[-85.631101,41.957732]},n1518:{id:"n1518",loc:[-85.631099,41.957558]},n1519:{id:"n1519",loc:[-85.63123,41.957557]},n152:{id:"n152",loc:[-85.637552,41.942619]},n1520:{id:"n1520",loc:[-85.631231,41.957618]},n1521:{id:"n1521",loc:[-85.63129,41.957618]},n1522:{id:"n1522",loc:[-85.63129,41.957651]},n1523:{id:"n1523",loc:[-85.631346,41.957651]},n1524:{id:"n1524",loc:[-85.631366,41.95802]},n1525:{id:"n1525",loc:[-85.631141,41.958021]},n1526:{id:"n1526",loc:[-85.63114,41.957943]},n1527:{id:"n1527",loc:[-85.631167,41.957943]},n1528:{id:"n1528",loc:[-85.631166,41.957808]},n1529:{id:"n1529",loc:[-85.631301,41.957807]},n153:{id:"n153",loc:[-85.63763,41.942528]},n1530:{id:"n1530",loc:[-85.631302,41.95789]},n1531:{id:"n1531",loc:[-85.631364,41.95789]},n1532:{id:"n1532",loc:[-85.631539,41.957754]},n1533:{id:"n1533",loc:[-85.631069,41.957756]},n1534:{id:"n1534",loc:[-85.631536,41.957518]},n1535:{id:"n1535",loc:[-85.631543,41.957995]},n1536:{id:"n1536",loc:[-85.631531,41.957748]},n1537:{id:"n1537",loc:[-85.631485,41.957748]},n1538:{id:"n1538",loc:[-85.631484,41.957698]},n1539:{id:"n1539",loc:[-85.631531,41.957698]},n154:{id:"n154",loc:[-85.637151,41.94253]},n1540:{id:"n1540",loc:[-85.631586,41.957742]},n1541:{id:"n1541",loc:[-85.63155,41.957742]},n1542:{id:"n1542",loc:[-85.631551,41.957702]},n1543:{id:"n1543",loc:[-85.631587,41.957702]},n1544:{id:"n1544",loc:[-85.631534,41.95807]},n1545:{id:"n1545",loc:[-85.631534,41.958097]},n1546:{id:"n1546",loc:[-85.631491,41.958097]},n1547:{id:"n1547",loc:[-85.631491,41.95807]},n1548:{id:"n1548",loc:[-85.631304,41.958861]},n1549:{id:"n1549",loc:[-85.631186,41.958862]},n155:{id:"n155",loc:[-85.63715,41.942424]},n1550:{id:"n1550",loc:[-85.631182,41.958653]},n1551:{id:"n1551",loc:[-85.6313,41.958651]},n1552:{id:"n1552",loc:[-85.631293,41.95854]},n1553:{id:"n1553",loc:[-85.631176,41.958539]},n1554:{id:"n1554",loc:[-85.631176,41.958377]},n1555:{id:"n1555",loc:[-85.631297,41.958377]},n1556:{id:"n1556",loc:[-85.631297,41.958422]},n1557:{id:"n1557",loc:[-85.631333,41.958422]},n1558:{id:"n1558",loc:[-85.631333,41.958479]},n1559:{id:"n1559",loc:[-85.631293,41.958479]},n156:{id:"n156",loc:[-85.637629,41.942422]},n1560:{id:"n1560",loc:[-85.631951,41.958908]},n1561:{id:"n1561",loc:[-85.631838,41.958909]},n1562:{id:"n1562",loc:[-85.631837,41.958847]},n1563:{id:"n1563",loc:[-85.631859,41.958847]},n1564:{id:"n1564",loc:[-85.631858,41.958746]},n1565:{id:"n1565",loc:[-85.631961,41.958745]},n1566:{id:"n1566",loc:[-85.631962,41.958812]},n1567:{id:"n1567",loc:[-85.631949,41.958813]},n1568:{id:"n1568",loc:[-85.631579,41.958913]},n1569:{id:"n1569",loc:[-85.631567,41.95864]},n157:{id:"n157",loc:[-85.638232,41.942477]},n1570:{id:"n1570",loc:[-85.631942,41.958639]},n1571:{id:"n1571",loc:[-85.631543,41.958594]},n1572:{id:"n1572",loc:[-85.631543,41.958065]},n1573:{id:"n1573",loc:[-85.631888,41.958546]},n1574:{id:"n1574",loc:[-85.631804,41.958546]},n1575:{id:"n1575",loc:[-85.631803,41.95841]},n1576:{id:"n1576",loc:[-85.631886,41.958409]},n1577:{id:"n1577",loc:[-85.631897,41.958125]},n1578:{id:"n1578",loc:[-85.631755,41.958126]},n1579:{id:"n1579",loc:[-85.631756,41.958174]},n158:{id:"n158",loc:[-85.637775,41.942483]},n1580:{id:"n1580",loc:[-85.63178,41.958174]},n1581:{id:"n1581",loc:[-85.631782,41.958272]},n1582:{id:"n1582",loc:[-85.631922,41.958271]},n1583:{id:"n1583",loc:[-85.631922,41.958244]},n1584:{id:"n1584",loc:[-85.631883,41.958245]},n1585:{id:"n1585",loc:[-85.631882,41.958175]},n1586:{id:"n1586",loc:[-85.631898,41.958175]},n1587:{id:"n1587",loc:[-85.631924,41.958032]},n1588:{id:"n1588",loc:[-85.631762,41.958032]},n1589:{id:"n1589",loc:[-85.63176,41.957827]},n159:{id:"n159",loc:[-85.638107,41.942512]},n1590:{id:"n1590",loc:[-85.631888,41.957826]},n1591:{id:"n1591",loc:[-85.631888,41.957892]},n1592:{id:"n1592",loc:[-85.631871,41.957892]},n1593:{id:"n1593",loc:[-85.631872,41.957949]},n1594:{id:"n1594",loc:[-85.631923,41.957949]},n1595:{id:"n1595",loc:[-85.631695,41.95795]},n1596:{id:"n1596",loc:[-85.631666,41.957975]},n1597:{id:"n1597",loc:[-85.63163,41.957975]},n1598:{id:"n1598",loc:[-85.6316,41.957951]},n1599:{id:"n1599",loc:[-85.6316,41.95785]},n16:{id:"n16",loc:[-85.63341,41.94032]},n160:{id:"n160",loc:[-85.637763,41.942514]},n1600:{id:"n1600",loc:[-85.63166,41.95785]},n1601:{id:"n1601",loc:[-85.631696,41.957873]},n1602:{id:"n1602",loc:[-85.631924,41.957762]},n1603:{id:"n1603",loc:[-85.631762,41.957762]},n1604:{id:"n1604",loc:[-85.631762,41.957708]},n1605:{id:"n1605",loc:[-85.631785,41.957708]},n1606:{id:"n1606",loc:[-85.631785,41.957606]},n1607:{id:"n1607",loc:[-85.631734,41.957606]},n1608:{id:"n1608",loc:[-85.631734,41.957538]},n1609:{id:"n1609",loc:[-85.631821,41.957538]},n161:{id:"n161",loc:[-85.637763,41.942445]},n1610:{id:"n1610",loc:[-85.631935,41.957545]},n1611:{id:"n1611",loc:[-85.631821,41.957544]},n1612:{id:"n1612",loc:[-85.631935,41.957645]},n1613:{id:"n1613",loc:[-85.631924,41.957645]},n1614:{id:"n1614",loc:[-85.627135,41.953828]},n1615:{id:"n1615",loc:[-85.633517,41.941353],tags:{man_made:"lighthouse"}},n1616:{id:"n1616",loc:[-85.633659,41.942041],tags:{amenity:"bbq"}},n1617:{id:"n1617",loc:[-85.63662,41.942911],tags:{amenity:"toilets"}},n1618:{id:"n1618",loc:[-85.637487,41.943876],tags:{amenity:"toilets"}},n1619:{id:"n1619",loc:[-85.634938,41.941917],tags:{amenity:"toilets"}},n162:{id:"n162",loc:[-85.638107,41.942443]},n1620:{id:"n1620",loc:[-85.632427,41.941678],tags:{amenity:"bbq"}},n1621:{id:"n1621",loc:[-85.638033,41.944568],tags:{amenity:"bbq"}},n1622:{id:"n1622",loc:[-85.638052,41.944522],tags:{amenity:"bbq"}},n1623:{id:"n1623",loc:[-85.635001,41.941965]},n1624:{id:"n1624",loc:[-85.634635,41.941884]},n1625:{id:"n1625",loc:[-85.634667,41.941894]},n1626:{id:"n1626",loc:[-85.634791,41.942011]},n1627:{id:"n1627",loc:[-85.634749,41.941938]},n1628:{id:"n1628",loc:[-85.627295,41.953946],tags:{barrier:"gate"}},n1629:{id:"n1629",loc:[-85.629076,41.954689]},n163:{id:"n163",loc:[-85.638813,41.942475]},n1630:{id:"n1630",loc:[-85.640667,41.942595]},n1631:{id:"n1631",loc:[-85.639455,41.94261]},n1632:{id:"n1632",loc:[-85.643407,41.942336]},n1633:{id:"n1633",loc:[-85.641845,41.941316]},n1634:{id:"n1634",loc:[-85.643322,41.942224]},n1635:{id:"n1635",loc:[-85.643301,41.942124]},n1636:{id:"n1636",loc:[-85.640639,41.941326]},n1637:{id:"n1637",loc:[-85.640614,41.940058]},n1638:{id:"n1638",loc:[-85.639428,41.941335]},n1639:{id:"n1639",loc:[-85.643078,41.941293]},n164:{id:"n164",loc:[-85.63883,41.942422]},n1640:{id:"n1640",loc:[-85.64371,41.942302]},n1641:{id:"n1641",loc:[-85.643056,41.94001]},n1642:{id:"n1642",loc:[-85.643097,41.942575],tags:{highway:"traffic_signals",traffic_signals:"signal","traffic_signals:direction":"both"}},n1643:{id:"n1643",loc:[-85.641855,41.942586]},n1644:{id:"n1644",loc:[-85.643549,41.942209]},n1645:{id:"n1645",loc:[-85.639359,41.94007]},n1646:{id:"n1646",loc:[-85.642797,41.940522]},n1647:{id:"n1647",loc:[-85.642589,41.940523]},n1648:{id:"n1648",loc:[-85.642587,41.940287]},n1649:{id:"n1649",loc:[-85.642797,41.940286]},n165:{id:"n165",loc:[-85.63883,41.942508]},n1650:{id:"n1650",loc:[-85.642571,41.940523]},n1651:{id:"n1651",loc:[-85.642568,41.940286]},n1652:{id:"n1652",loc:[-85.642316,41.940289]},n1653:{id:"n1653",loc:[-85.642321,41.940436]},n1654:{id:"n1654",loc:[-85.642292,41.940458]},n1655:{id:"n1655",loc:[-85.642287,41.940483]},n1656:{id:"n1656",loc:[-85.642323,41.940509]},n1657:{id:"n1657",loc:[-85.642385,41.940511]},n1658:{id:"n1658",loc:[-85.642408,41.940526]},n1659:{id:"n1659",loc:[-85.641962,41.94109]},n166:{id:"n166",loc:[-85.638364,41.942508]},n1660:{id:"n1660",loc:[-85.642753,41.941084]},n1661:{id:"n1661",loc:[-85.642752,41.941004]},n1662:{id:"n1662",loc:[-85.642806,41.941003]},n1663:{id:"n1663",loc:[-85.642803,41.940731]},n1664:{id:"n1664",loc:[-85.642741,41.940732]},n1665:{id:"n1665",loc:[-85.64274,41.940645]},n1666:{id:"n1666",loc:[-85.641957,41.940651]},n1667:{id:"n1667",loc:[-85.642937,41.941241]},n1668:{id:"n1668",loc:[-85.641776,41.941253]},n1669:{id:"n1669",loc:[-85.641766,41.940598]},n167:{id:"n167",loc:[-85.638836,41.942167]},n1670:{id:"n1670",loc:[-85.64198,41.940598]},n1671:{id:"n1671",loc:[-85.641961,41.940137]},n1672:{id:"n1672",loc:[-85.642934,41.94012]},n1673:{id:"n1673",loc:[-85.643074,41.941173]},n1674:{id:"n1674",loc:[-85.642841,41.940997]},n1675:{id:"n1675",loc:[-85.642839,41.940721]},n1676:{id:"n1676",loc:[-85.643065,41.940552]},n1677:{id:"n1677",loc:[-85.642732,41.94124]},n1678:{id:"n1678",loc:[-85.641815,41.941246]},n1679:{id:"n1679",loc:[-85.641813,41.941132]},n168:{id:"n168",loc:[-85.638836,41.94229]},n1680:{id:"n1680",loc:[-85.641839,41.941111]},n1681:{id:"n1681",loc:[-85.641884,41.941098]},n1682:{id:"n1682",loc:[-85.642732,41.941092]},n1683:{id:"n1683",loc:[-85.642776,41.941302]},n1684:{id:"n1684",loc:[-85.632788,41.946236]},n1685:{id:"n1685",loc:[-85.622342,41.953127]},n1686:{id:"n1686",loc:[-85.641848,41.941167]},n1687:{id:"n1687",loc:[-85.643753,41.941503]},n1688:{id:"n1688",loc:[-85.643762,41.942119]},n1689:{id:"n1689",loc:[-85.64238,41.942262]},n169:{id:"n169",loc:[-85.638594,41.94229]},n1690:{id:"n1690",loc:[-85.642374,41.941944]},n1691:{id:"n1691",loc:[-85.642518,41.941943]},n1692:{id:"n1692",loc:[-85.642519,41.94198]},n1693:{id:"n1693",loc:[-85.642831,41.941977]},n1694:{id:"n1694",loc:[-85.642837,41.942312]},n1695:{id:"n1695",loc:[-85.642495,41.942315]},n1696:{id:"n1696",loc:[-85.642494,41.942261]},n1697:{id:"n1697",loc:[-85.641087,41.942433]},n1698:{id:"n1698",loc:[-85.641081,41.942006]},n1699:{id:"n1699",loc:[-85.641244,41.942005]},n17:{id:"n17",loc:[-85.633478,41.94081]},n170:{id:"n170",loc:[-85.638594,41.942422]},n1700:{id:"n1700",loc:[-85.64125,41.942431]},n1701:{id:"n1701",loc:[-85.641331,41.942968]},n1702:{id:"n1702",loc:[-85.641328,41.942713]},n1703:{id:"n1703",loc:[-85.641521,41.942712]},n1704:{id:"n1704",loc:[-85.641523,41.942924]},n1705:{id:"n1705",loc:[-85.641504,41.942924]},n1706:{id:"n1706",loc:[-85.641505,41.942967]},n1707:{id:"n1707",loc:[-85.638612,41.942408]},n1708:{id:"n1708",loc:[-85.638612,41.942327]},n1709:{id:"n1709",loc:[-85.638775,41.942327]},n171:{id:"n171",loc:[-85.638364,41.942356]},n1710:{id:"n1710",loc:[-85.638775,41.942299]},n1711:{id:"n1711",loc:[-85.638835,41.942298]},n1712:{id:"n1712",loc:[-85.638835,41.942407]},n1713:{id:"n1713",loc:[-85.639116,41.942444]},n1714:{id:"n1714",loc:[-85.639114,41.942362]},n1715:{id:"n1715",loc:[-85.639294,41.94236]},n1716:{id:"n1716",loc:[-85.639296,41.942442]},n1717:{id:"n1717",loc:[-85.639808,41.942385]},n1718:{id:"n1718",loc:[-85.639805,41.942285]},n1719:{id:"n1719",loc:[-85.639988,41.942283]},n172:{id:"n172",loc:[-85.638364,41.942167]},n1720:{id:"n1720",loc:[-85.63999,41.942383]},n1721:{id:"n1721",loc:[-85.639633,41.943023]},n1722:{id:"n1722",loc:[-85.639867,41.943019]},n1723:{id:"n1723",loc:[-85.639866,41.942964]},n1724:{id:"n1724",loc:[-85.639888,41.942963]},n1725:{id:"n1725",loc:[-85.639883,41.942779]},n1726:{id:"n1726",loc:[-85.639851,41.94278]},n1727:{id:"n1727",loc:[-85.63985,41.94274]},n1728:{id:"n1728",loc:[-85.639789,41.942741]},n1729:{id:"n1729",loc:[-85.639789,41.942753]},n173:{id:"n173",loc:[-85.639038,41.942463]},n1730:{id:"n1730",loc:[-85.639698,41.942754]},n1731:{id:"n1731",loc:[-85.639699,41.942788]},n1732:{id:"n1732",loc:[-85.639675,41.942789]},n1733:{id:"n1733",loc:[-85.639676,41.94283]},n1734:{id:"n1734",loc:[-85.639701,41.942829]},n1735:{id:"n1735",loc:[-85.639702,41.942869]},n1736:{id:"n1736",loc:[-85.639629,41.94287]},n1737:{id:"n1737",loc:[-85.643568,41.942946]},n1738:{id:"n1738",loc:[-85.643568,41.942777]},n1739:{id:"n1739",loc:[-85.643401,41.942777]},n174:{id:"n174",loc:[-85.638897,41.942464]},n1740:{id:"n1740",loc:[-85.643401,41.942863]},n1741:{id:"n1741",loc:[-85.643448,41.942863]},n1742:{id:"n1742",loc:[-85.643448,41.942946]},n1743:{id:"n1743",loc:[-85.642836,41.942981]},n1744:{id:"n1744",loc:[-85.642917,41.942979]},n1745:{id:"n1745",loc:[-85.642914,41.942904]},n1746:{id:"n1746",loc:[-85.642938,41.942903]},n1747:{id:"n1747",loc:[-85.642935,41.942813]},n1748:{id:"n1748",loc:[-85.642775,41.942816]},n1749:{id:"n1749",loc:[-85.642778,41.942906]},n175:{id:"n175",loc:[-85.638897,41.942423]},n1750:{id:"n1750",loc:[-85.642833,41.942905]},n1751:{id:"n1751",loc:[-85.642302,41.942886]},n1752:{id:"n1752",loc:[-85.642299,41.942721]},n1753:{id:"n1753",loc:[-85.642422,41.94272]},n1754:{id:"n1754",loc:[-85.642425,41.942868]},n1755:{id:"n1755",loc:[-85.642385,41.942869]},n1756:{id:"n1756",loc:[-85.642385,41.942885]},n1757:{id:"n1757",loc:[-85.641533,41.942939]},n1758:{id:"n1758",loc:[-85.64161,41.942877]},n1759:{id:"n1759",loc:[-85.641676,41.942922]},n176:{id:"n176",loc:[-85.638853,41.942423]},n1760:{id:"n1760",loc:[-85.6416,41.942985]},n1761:{id:"n1761",loc:[-85.64206,41.942802]},n1762:{id:"n1762",loc:[-85.642059,41.942741]},n1763:{id:"n1763",loc:[-85.642196,41.942741]},n1764:{id:"n1764",loc:[-85.642196,41.942818]},n1765:{id:"n1765",loc:[-85.642128,41.942819]},n1766:{id:"n1766",loc:[-85.642128,41.942801]},n1767:{id:"n1767",loc:[-85.640943,41.942934]},n1768:{id:"n1768",loc:[-85.641035,41.942933]},n1769:{id:"n1769",loc:[-85.641032,41.942797]},n177:{id:"n177",loc:[-85.638852,41.94237]},n1770:{id:"n1770",loc:[-85.640997,41.942798]},n1771:{id:"n1771",loc:[-85.640996,41.942764]},n1772:{id:"n1772",loc:[-85.640861,41.942766]},n1773:{id:"n1773",loc:[-85.640862,41.942848]},n1774:{id:"n1774",loc:[-85.640941,41.942847]},n1775:{id:"n1775",loc:[-85.643766,41.942226]},n1776:{id:"n1776",loc:[-85.643768,41.942407]},n1777:{id:"n1777",loc:[-85.643218,41.94177]},n1778:{id:"n1778",loc:[-85.64321,41.941327]},n1779:{id:"n1779",loc:[-85.643649,41.941323]},n178:{id:"n178",loc:[-85.638892,41.94237]},n1780:{id:"n1780",loc:[-85.643656,41.941716]},n1781:{id:"n1781",loc:[-85.64358,41.941717]},n1782:{id:"n1782",loc:[-85.64358,41.941767]},n1783:{id:"n1783",loc:[-85.64382,41.941495]},n1784:{id:"n1784",loc:[-85.643817,41.941317]},n1785:{id:"n1785",loc:[-85.643235,41.941833]},n1786:{id:"n1786",loc:[-85.64335,41.941842]},n1787:{id:"n1787",loc:[-85.643504,41.941903]},n1788:{id:"n1788",loc:[-85.643554,41.941946]},n1789:{id:"n1789",loc:[-85.643618,41.942015]},n179:{id:"n179",loc:[-85.638891,41.942334]},n1790:{id:"n1790",loc:[-85.64346,41.941971]},n1791:{id:"n1791",loc:[-85.643528,41.942468]},n1792:{id:"n1792",loc:[-85.643621,41.942363]},n1793:{id:"n1793",loc:[-85.643496,41.942297]},n1794:{id:"n1794",loc:[-85.643446,41.942246]},n1795:{id:"n1795",loc:[-85.643398,41.942177]},n1796:{id:"n1796",loc:[-85.643398,41.942031]},n1797:{id:"n1797",loc:[-85.621531,41.952693]},n1798:{id:"n1798",loc:[-85.643221,41.942028]},n1799:{id:"n1799",loc:[-85.643225,41.942276]},n18:{id:"n18",loc:[-85.63345,41.94071]},n180:{id:"n180",loc:[-85.639037,41.942334]},n1800:{id:"n1800",loc:[-85.643265,41.942347]},n1801:{id:"n1801",loc:[-85.643323,41.942413]},n1802:{id:"n1802",loc:[-85.643411,41.94247]},n1803:{id:"n1803",loc:[-85.643459,41.942435]},n1804:{id:"n1804",loc:[-85.643767,41.942307]},n1805:{id:"n1805",loc:[-85.643661,41.942293]},n1806:{id:"n1806",loc:[-85.643578,41.942247]},n1807:{id:"n1807",loc:[-85.643522,41.942125]},n1808:{id:"n1808",loc:[-85.643515,41.942061]},n1809:{id:"n1809",loc:[-85.643346,41.941924]},n181:{id:"n181",loc:[-85.638074,41.941839]},n1810:{id:"n1810",loc:[-85.643086,41.94192]},n1811:{id:"n1811",loc:[-85.643529,41.94217]},n1812:{id:"n1812",loc:[-85.643489,41.942003]},n1813:{id:"n1813",loc:[-85.643295,41.941919]},n1814:{id:"n1814",loc:[-85.643305,41.942163]},n1815:{id:"n1815",loc:[-85.643354,41.942285]},n1816:{id:"n1816",loc:[-85.643472,41.942389]},n1817:{id:"n1817",loc:[-85.643608,41.942271]},n1818:{id:"n1818",loc:[-85.643876,41.941402]},n1819:{id:"n1819",loc:[-85.643818,41.941369]},n182:{id:"n182",loc:[-85.638076,41.941942]},n1820:{id:"n1820",loc:[-85.643682,41.941304]},n1821:{id:"n1821",loc:[-85.64359,41.941286]},n1822:{id:"n1822",loc:[-85.643317,41.941727]},n1823:{id:"n1823",loc:[-85.643301,41.941286]},n1824:{id:"n1824",loc:[-85.643553,41.941698]},n1825:{id:"n1825",loc:[-85.643543,41.941286]},n1826:{id:"n1826",loc:[-85.636967,41.940118]},n1827:{id:"n1827",loc:[-85.63378,41.940114]},n1828:{id:"n1828",loc:[-85.637254,41.940075]},n1829:{id:"n1829",loc:[-85.637002,41.941355]},n183:{id:"n183",loc:[-85.637955,41.941944]},n1830:{id:"n1830",loc:[-85.643532,41.94204]},n1831:{id:"n1831",loc:[-85.638235,41.942615]},n1832:{id:"n1832",loc:[-85.637039,41.942624]},n1833:{id:"n1833",loc:[-85.636369,41.94266]},n1834:{id:"n1834",loc:[-85.63582,41.942771],tags:{highway:"traffic_signals",traffic_signals:"emergency","traffic_signals:direction":"both"}},n1835:{id:"n1835",loc:[-85.634873,41.943044]},n1836:{id:"n1836",loc:[-85.643482,41.941976]},n1837:{id:"n1837",loc:[-85.64345,41.941945]},n1838:{id:"n1838",loc:[-85.641885,41.943851]},n1839:{id:"n1839",loc:[-85.641915,41.945121]},n184:{id:"n184",loc:[-85.637953,41.94184]},n1840:{id:"n1840",loc:[-85.639454,41.943871]},n1841:{id:"n1841",loc:[-85.639491,41.945191]},n1842:{id:"n1842",loc:[-85.635768,41.940113]},n1843:{id:"n1843",loc:[-85.638206,41.941345]},n1844:{id:"n1844",loc:[-85.640721,41.94513]},n1845:{id:"n1845",loc:[-85.643137,41.945103]},n1846:{id:"n1846",loc:[-85.638199,41.940079]},n1847:{id:"n1847",loc:[-85.640688,41.943861]},n1848:{id:"n1848",loc:[-85.643397,41.941924]},n1849:{id:"n1849",loc:[-85.643117,41.943841]},n185:{id:"n185",loc:[-85.637953,41.941866]},n1850:{id:"n1850",loc:[-85.636731,41.94263]},n1851:{id:"n1851",loc:[-85.63518,41.942955],tags:{highway:"crossing"}},n1852:{id:"n1852",loc:[-85.636152,41.942695]},n1853:{id:"n1853",loc:[-85.644202,41.941499]},n1854:{id:"n1854",loc:[-85.644211,41.942116]},n1855:{id:"n1855",loc:[-85.644233,41.942404]},n1856:{id:"n1856",loc:[-85.644231,41.942223]},n1857:{id:"n1857",loc:[-85.644133,41.941315]},n1858:{id:"n1858",loc:[-85.644136,41.941493]},n1859:{id:"n1859",loc:[-85.644345,41.942307]},n186:{id:"n186",loc:[-85.637873,41.941867]},n1860:{id:"n1860",loc:[-85.644232,41.942304]},n1861:{id:"n1861",loc:[-85.644134,41.941403]},n1862:{id:"n1862",loc:[-85.63607,41.943005],tags:{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",amenity:"fire_station",name:"Three Rivers Fire Department"}},n1863:{id:"n1863",loc:[-85.637,41.941236]},n1864:{id:"n1864",loc:[-85.634476,41.941475]},n1865:{id:"n1865",loc:[-85.635036,41.941858]},n1866:{id:"n1866",loc:[-85.635362,41.941962]},n1867:{id:"n1867",loc:[-85.635796,41.941962]},n1868:{id:"n1868",loc:[-85.63295,41.943006]},n1869:{id:"n1869",loc:[-85.634692,41.943098]},n187:{id:"n187",loc:[-85.637877,41.941975]},n1870:{id:"n1870",loc:[-85.633128,41.940484]},n1871:{id:"n1871",loc:[-85.633117,41.942798]},n1872:{id:"n1872",loc:[-85.633303,41.942412]},n1873:{id:"n1873",loc:[-85.633482,41.941912]},n1874:{id:"n1874",loc:[-85.633455,41.941359]},n1875:{id:"n1875",loc:[-85.633162,41.942679]},n1876:{id:"n1876",loc:[-85.634274,41.943479]},n1877:{id:"n1877",loc:[-85.634678,41.942909]},n1878:{id:"n1878",loc:[-85.6339,41.941453]},n1879:{id:"n1879",loc:[-85.634571,41.942774]},n188:{id:"n188",loc:[-85.636855,41.942488]},n1880:{id:"n1880",loc:[-85.63419,41.941732]},n1881:{id:"n1881",loc:[-85.634067,41.941565]},n1882:{id:"n1882",loc:[-85.63436,41.942358]},n1883:{id:"n1883",loc:[-85.634327,41.942247]},n1884:{id:"n1884",loc:[-85.633391,41.941231]},n1885:{id:"n1885",loc:[-85.634303,41.941972]},n1886:{id:"n1886",loc:[-85.633541,41.940147]},n1887:{id:"n1887",loc:[-85.633433,41.940252]},n1888:{id:"n1888",loc:[-85.633402,41.940411]},n1889:{id:"n1889",loc:[-85.633551,41.941023]},n189:{id:"n189",loc:[-85.636702,41.942488]},n1890:{id:"n1890",loc:[-85.633719,41.941186]},n1891:{id:"n1891",loc:[-85.633067,41.941845]},n1892:{id:"n1892",loc:[-85.634902,41.942766]},n1893:{id:"n1893",loc:[-85.634603,41.942202]},n1894:{id:"n1894",loc:[-85.634858,41.942152]},n1895:{id:"n1895",loc:[-85.634842,41.942269]},n1896:{id:"n1896",loc:[-85.634907,41.942313]},n1897:{id:"n1897",loc:[-85.635049,41.942331]},n1898:{id:"n1898",loc:[-85.635101,41.942281]},n1899:{id:"n1899",loc:[-85.635129,41.942144]},n19:{id:"n19",loc:[-85.633009,41.942229]},n190:{id:"n190",loc:[-85.636702,41.942434]},n1900:{id:"n1900",loc:[-85.635531,41.942143]},n1901:{id:"n1901",loc:[-85.635534,41.942577]},n1902:{id:"n1902",loc:[-85.635158,41.942656]},n1903:{id:"n1903",loc:[-85.635121,41.942703]},n1904:{id:"n1904",loc:[-85.635087,41.941508]},n1905:{id:"n1905",loc:[-85.63536,41.941106]},n1906:{id:"n1906",loc:[-85.635442,41.941094]},n1907:{id:"n1907",loc:[-85.635508,41.941104]},n1908:{id:"n1908",loc:[-85.635569,41.941125]},n1909:{id:"n1909",loc:[-85.635583,41.941106]},n191:{id:"n191",loc:[-85.636761,41.942434]},n1910:{id:"n1910",loc:[-85.635555,41.940976]},n1911:{id:"n1911",loc:[-85.635501,41.940915]},n1912:{id:"n1912",loc:[-85.635392,41.940922]},n1913:{id:"n1913",loc:[-85.635276,41.940974]},n1914:{id:"n1914",loc:[-85.63517,41.941204]},n1915:{id:"n1915",loc:[-85.634888,41.941517]},n1916:{id:"n1916",loc:[-85.634897,41.941576]},n1917:{id:"n1917",loc:[-85.634961,41.94164]},n1918:{id:"n1918",loc:[-85.635028,41.941659]},n1919:{id:"n1919",loc:[-85.635118,41.941621]},n192:{id:"n192",loc:[-85.636761,41.942369]},n1920:{id:"n1920",loc:[-85.635085,41.941558]},n1921:{id:"n1921",loc:[-85.63504,41.94136]},n1922:{id:"n1922",loc:[-85.635221,41.941077]},n1923:{id:"n1923",loc:[-85.634387,41.941559]},n1924:{id:"n1924",loc:[-85.634351,41.941587]},n1925:{id:"n1925",loc:[-85.634416,41.941756]},n1926:{id:"n1926",loc:[-85.634461,41.941797]},n1927:{id:"n1927",loc:[-85.634501,41.941819]},n1928:{id:"n1928",loc:[-85.634597,41.941816]},n1929:{id:"n1929",loc:[-85.634732,41.941724]},n193:{id:"n193",loc:[-85.636855,41.942369]},n1930:{id:"n1930",loc:[-85.634672,41.941775]},n1931:{id:"n1931",loc:[-85.633403,41.939101]},n1932:{id:"n1932",loc:[-85.633297,41.939397]},n1933:{id:"n1933",loc:[-85.633205,41.939674]},n1934:{id:"n1934",loc:[-85.63322,41.939777]},n1935:{id:"n1935",loc:[-85.633345,41.939936]},n1936:{id:"n1936",loc:[-85.633376,41.940002]},n1937:{id:"n1937",loc:[-85.633266,41.940228]},n1938:{id:"n1938",loc:[-85.633236,41.940352]},n1939:{id:"n1939",loc:[-85.633282,41.94063]},n194:{id:"n194",loc:[-85.636645,41.94249]},n1940:{id:"n1940",loc:[-85.633364,41.940874]},n1941:{id:"n1941",loc:[-85.633439,41.941052]},n1942:{id:"n1942",loc:[-85.633582,41.941172]},n1943:{id:"n1943",loc:[-85.633748,41.941273]},n1944:{id:"n1944",loc:[-85.634317,41.941527]},n1945:{id:"n1945",loc:[-85.634389,41.94174]},n1946:{id:"n1946",loc:[-85.634441,41.941801]},n1947:{id:"n1947",loc:[-85.634514,41.941837]},n1948:{id:"n1948",loc:[-85.634485,41.942005]},n1949:{id:"n1949",loc:[-85.63457,41.942202]},n195:{id:"n195",loc:[-85.636565,41.94249]},n1950:{id:"n1950",loc:[-85.634869,41.942769]},n1951:{id:"n1951",loc:[-85.634943,41.942792]},n1952:{id:"n1952",loc:[-85.635139,41.942882]},n1953:{id:"n1953",loc:[-85.634962,41.943161]},n1954:{id:"n1954",loc:[-85.635002,41.943131]},n1955:{id:"n1955",loc:[-85.635005,41.943091]},n1956:{id:"n1956",loc:[-85.635216,41.943033]},n1957:{id:"n1957",loc:[-85.634817,41.94267]},n1958:{id:"n1958",loc:[-85.634614,41.942599]},n1959:{id:"n1959",loc:[-85.634494,41.942381]},n196:{id:"n196",loc:[-85.636565,41.942474]},n1960:{id:"n1960",loc:[-85.634486,41.9423]},n1961:{id:"n1961",loc:[-85.634671,41.941795]},n1962:{id:"n1962",loc:[-85.634595,41.941831]},n1963:{id:"n1963",loc:[-85.634332,41.941866]},n1964:{id:"n1964",loc:[-85.634207,41.941885]},n1965:{id:"n1965",loc:[-85.634133,41.941892]},n1966:{id:"n1966",loc:[-85.634131,41.942203]},n1967:{id:"n1967",loc:[-85.634047,41.942327]},n1968:{id:"n1968",loc:[-85.634219,41.942793]},n1969:{id:"n1969",loc:[-85.634061,41.942392]},n197:{id:"n197",loc:[-85.636514,41.942474]},n1970:{id:"n1970",loc:[-85.633989,41.942407]},n1971:{id:"n1971",loc:[-85.633971,41.942356]},n1972:{id:"n1972",loc:[-85.63361,41.942423]},n1973:{id:"n1973",loc:[-85.633714,41.942682]},n1974:{id:"n1974",loc:[-85.633698,41.942863]},n1975:{id:"n1975",loc:[-85.633882,41.942865]},n1976:{id:"n1976",loc:[-85.633941,41.943007]},n1977:{id:"n1977",loc:[-85.633887,41.943035]},n1978:{id:"n1978",loc:[-85.633768,41.942815]},n1979:{id:"n1979",loc:[-85.633682,41.942351]},n198:{id:"n198",loc:[-85.636514,41.942326]},n1980:{id:"n1980",loc:[-85.634037,41.942273]},n1981:{id:"n1981",loc:[-85.634029,41.942252]},n1982:{id:"n1982",loc:[-85.633673,41.942331]},n1983:{id:"n1983",loc:[-85.634219,41.942571]},n1984:{id:"n1984",loc:[-85.634252,41.942565]},n1985:{id:"n1985",loc:[-85.634144,41.942299]},n1986:{id:"n1986",loc:[-85.634115,41.942306]},n1987:{id:"n1987",loc:[-85.634059,41.943094]},n1988:{id:"n1988",loc:[-85.633944,41.942903]},n1989:{id:"n1989",loc:[-85.634311,41.942821]},n199:{id:"n199",loc:[-85.636561,41.942326]},n1990:{id:"n1990",loc:[-85.634351,41.94277]},n1991:{id:"n1991",loc:[-85.634153,41.942254]},n1992:{id:"n1992",loc:[-85.634092,41.94222]},n1993:{id:"n1993",loc:[-85.633571,41.942336]},n1994:{id:"n1994",loc:[-85.633513,41.942387]},n1995:{id:"n1995",loc:[-85.633509,41.942455]},n1996:{id:"n1996",loc:[-85.63363,41.942665]},n1997:{id:"n1997",loc:[-85.63414,41.94286]},n1998:{id:"n1998",loc:[-85.63397,41.942449]},n1999:{id:"n1999",loc:[-85.633551,41.942529]},n2:{id:"n2",loc:[-85.627421,41.953877]},n20:{id:"n20",loc:[-85.633013,41.941438]},n200:{id:"n200",loc:[-85.636561,41.942311]},n2000:{id:"n2000",loc:[-85.633741,41.942493]},n2001:{id:"n2001",loc:[-85.633894,41.942869]},n2002:{id:"n2002",loc:[-85.634132,41.941954]},n2003:{id:"n2003",loc:[-85.634032,41.942038]},n2004:{id:"n2004",loc:[-85.633765,41.942238]},n2005:{id:"n2005",loc:[-85.63376,41.942268]},n2006:{id:"n2006",loc:[-85.633768,41.942293]},n2007:{id:"n2007",loc:[-85.633808,41.942386]},n2008:{id:"n2008",loc:[-85.634946,41.941663]},n2009:{id:"n2009",loc:[-85.63511,41.941697]},n201:{id:"n201",loc:[-85.636621,41.942311]},n2010:{id:"n2010",loc:[-85.635337,41.94168]},n2011:{id:"n2011",loc:[-85.634997,41.942251]},n2012:{id:"n2012",loc:[-85.635013,41.942173]},n2013:{id:"n2013",loc:[-85.634876,41.942157]},n2014:{id:"n2014",loc:[-85.634859,41.942235]},n2015:{id:"n2015",loc:[-85.634992,41.941951]},n2016:{id:"n2016",loc:[-85.634952,41.941877]},n2017:{id:"n2017",loc:[-85.634844,41.94191]},n2018:{id:"n2018",loc:[-85.634884,41.941983]},n2019:{id:"n2019",loc:[-85.635189,41.941691]},n202:{id:"n202",loc:[-85.636621,41.942351]},n2020:{id:"n2020",loc:[-85.635089,41.941896]},n2021:{id:"n2021",loc:[-85.635077,41.941964]},n2022:{id:"n2022",loc:[-85.635058,41.942147]},n2023:{id:"n2023",loc:[-85.635099,41.942161]},n2024:{id:"n2024",loc:[-85.635099,41.942213]},n2025:{id:"n2025",loc:[-85.635079,41.942285]},n2026:{id:"n2026",loc:[-85.635047,41.942316]},n2027:{id:"n2027",loc:[-85.634925,41.9423]},n2028:{id:"n2028",loc:[-85.634911,41.942276]},n2029:{id:"n2029",loc:[-85.634917,41.942242]},n203:{id:"n203",loc:[-85.63666,41.942351]},n2030:{id:"n2030",loc:[-85.634698,41.941898]},n2031:{id:"n2031",loc:[-85.634964,41.941878]},n2032:{id:"n2032",loc:[-85.635025,41.941929]},n2033:{id:"n2033",loc:[-85.634862,41.941887]},n2034:{id:"n2034",loc:[-85.634811,41.94181]},n2035:{id:"n2035",loc:[-85.634731,41.941745]},n2036:{id:"n2036",loc:[-85.634933,41.94176]},n2037:{id:"n2037",loc:[-85.634942,41.942145]},n2038:{id:"n2038",loc:[-85.634944,41.942065]},n2039:{id:"n2039",loc:[-85.634914,41.941996]},n204:{id:"n204",loc:[-85.63666,41.942453]},n2040:{id:"n2040",loc:[-85.634981,41.941979]},n2041:{id:"n2041",loc:[-85.633419,41.942172]},n2042:{id:"n2042",loc:[-85.633509,41.941631]},n2043:{id:"n2043",loc:[-85.633686,41.942937]},n2044:{id:"n2044",loc:[-85.633371,41.942722]},n2045:{id:"n2045",loc:[-85.633291,41.942538]},n2046:{id:"n2046",loc:[-85.633902,41.940941]},n2047:{id:"n2047",loc:[-85.635254,41.940939]},n2048:{id:"n2048",loc:[-85.635686,41.940829]},n2049:{id:"n2049",loc:[-85.635712,41.942681]},n205:{id:"n205",loc:[-85.636645,41.942453]},n2050:{id:"n2050",loc:[-85.633721,41.942118]},n2051:{id:"n2051",loc:[-85.633698,41.942057]},n2052:{id:"n2052",loc:[-85.633591,41.942079]},n2053:{id:"n2053",loc:[-85.633614,41.94214]},n2054:{id:"n2054",loc:[-85.633968,41.941099]},n2055:{id:"n2055",loc:[-85.633907,41.941138]},n2056:{id:"n2056",loc:[-85.633968,41.941197]},n2057:{id:"n2057",loc:[-85.63404,41.941162]},n2058:{id:"n2058",loc:[-85.634839,41.941665]},n2059:{id:"n2059",loc:[-85.635314,41.943035]},n206:{id:"n206",loc:[-85.636394,41.942471]},n2060:{id:"n2060",loc:[-85.634919,41.943142]},n2061:{id:"n2061",loc:[-85.636433,41.942959],tags:{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",amenity:"townhall",name:"Three Rivers City Hall"}},n2062:{id:"n2062",loc:[-85.637039,41.942789]},n2063:{id:"n2063",loc:[-85.636333,41.94279]},n2064:{id:"n2064",loc:[-85.634484,41.940726]},n2065:{id:"n2065",loc:[-85.634483,41.940603]},n2066:{id:"n2066",loc:[-85.634908,41.940601]},n2067:{id:"n2067",loc:[-85.634908,41.94053]},n2068:{id:"n2068",loc:[-85.634934,41.94053]},n2069:{id:"n2069",loc:[-85.634934,41.940496]},n207:{id:"n207",loc:[-85.636262,41.942472]},n2070:{id:"n2070",loc:[-85.63504,41.940495]},n2071:{id:"n2071",loc:[-85.63504,41.940531]},n2072:{id:"n2072",loc:[-85.635068,41.940531]},n2073:{id:"n2073",loc:[-85.635071,41.940794]},n2074:{id:"n2074",loc:[-85.635183,41.940793]},n2075:{id:"n2075",loc:[-85.635185,41.940916]},n2076:{id:"n2076",loc:[-85.634799,41.940919]},n2077:{id:"n2077",loc:[-85.634798,41.940798]},n2078:{id:"n2078",loc:[-85.634925,41.940797]},n2079:{id:"n2079",loc:[-85.634924,41.940724]},n208:{id:"n208",loc:[-85.636261,41.94233]},n2080:{id:"n2080",loc:[-85.637448,41.938233]},n2081:{id:"n2081",loc:[-85.634168,41.943279]},n2082:{id:"n2082",loc:[-85.635744,41.938248]},n2083:{id:"n2083",loc:[-85.638744,41.951211]},n2084:{id:"n2084",loc:[-85.636421,41.946392]},n2085:{id:"n2085",loc:[-85.635965,41.945809]},n2086:{id:"n2086",loc:[-85.635683,41.945449]},n2087:{id:"n2087",loc:[-85.635281,41.945025]},n2088:{id:"n2088",loc:[-85.632443,41.942574]},n2089:{id:"n2089",loc:[-85.638243,41.943674]},n209:{id:"n209",loc:[-85.636353,41.942329]},n2090:{id:"n2090",loc:[-85.638228,41.943747]},n2091:{id:"n2091",loc:[-85.638163,41.943797]},n2092:{id:"n2092",loc:[-85.638089,41.943832]},n2093:{id:"n2093",loc:[-85.637969,41.943841]},n2094:{id:"n2094",loc:[-85.637841,41.943833]},n2095:{id:"n2095",loc:[-85.637342,41.943734]},n2096:{id:"n2096",loc:[-85.637232,41.943707]},n2097:{id:"n2097",loc:[-85.637163,41.943668]},n2098:{id:"n2098",loc:[-85.637118,41.943615]},n2099:{id:"n2099",loc:[-85.637078,41.943494]},n21:{id:"n21",loc:[-85.634126,41.942228]},n210:{id:"n210",loc:[-85.636354,41.94239]},n2100:{id:"n2100",loc:[-85.632903,41.998429],tags:{railway:"level_crossing"}},n2101:{id:"n2101",loc:[-85.633616,41.943581],tags:{railway:"level_crossing"}},n2102:{id:"n2102",loc:[-85.636943,41.947311]},n2103:{id:"n2103",loc:[-85.6376,41.94854]},n2104:{id:"n2104",loc:[-85.634565,41.93631]},n2105:{id:"n2105",loc:[-85.629597,41.942562]},n2106:{id:"n2106",loc:[-85.630821,41.943077]},n2107:{id:"n2107",loc:[-85.627473,41.940659]},n2108:{id:"n2108",loc:[-85.629708,41.942872]},n2109:{id:"n2109",loc:[-85.634093,41.935448]},n211:{id:"n211",loc:[-85.636393,41.94239]},n2110:{id:"n2110",loc:[-85.630413,41.94366]},n2111:{id:"n2111",loc:[-85.630488,41.942662]},n2112:{id:"n2112",loc:[-85.63361,41.936749]},n2113:{id:"n2113",loc:[-85.630038,41.941808]},n2114:{id:"n2114",loc:[-85.632016,41.942922]},n2115:{id:"n2115",loc:[-85.631525,41.944303]},n2116:{id:"n2116",loc:[-85.626862,41.94022]},n2117:{id:"n2117",loc:[-85.629673,41.94121]},n2118:{id:"n2118",loc:[-85.632752,41.943101]},n2119:{id:"n2119",loc:[-85.631147,41.943201]},n212:{id:"n212",loc:[-85.63444,41.943176]},n2120:{id:"n2120",loc:[-85.624974,41.940579]},n2121:{id:"n2121",loc:[-85.629518,41.941783]},n2122:{id:"n2122",loc:[-85.632349,41.942699]},n2123:{id:"n2123",loc:[-85.628418,41.940356]},n2124:{id:"n2124",loc:[-85.629147,41.94129]},n2125:{id:"n2125",loc:[-85.631111,41.943979]},n2126:{id:"n2126",loc:[-85.632087,41.940013]},n2127:{id:"n2127",loc:[-85.634469,41.935057]},n2128:{id:"n2128",loc:[-85.630097,41.943449]},n2129:{id:"n2129",loc:[-85.6331,41.937878]},n213:{id:"n213",loc:[-85.63375,41.942814]},n2130:{id:"n2130",loc:[-85.625274,41.941114]},n2131:{id:"n2131",loc:[-85.632632,41.941217]},n2132:{id:"n2132",loc:[-85.632739,41.941926]},n2133:{id:"n2133",loc:[-85.631647,41.94366]},n2134:{id:"n2134",loc:[-85.635059,41.935456]},n2135:{id:"n2135",loc:[-85.631259,41.944349]},n2136:{id:"n2136",loc:[-85.626336,41.940811]},n2137:{id:"n2137",loc:[-85.631507,41.943875]},n2138:{id:"n2138",loc:[-85.625081,41.940859]},n2139:{id:"n2139",loc:[-85.625778,41.940093]},n214:{id:"n214",loc:[-85.633674,41.942869]},n2140:{id:"n2140",loc:[-85.632641,41.942436]},n2141:{id:"n2141",loc:[-85.628825,41.941034]},n2142:{id:"n2142",loc:[-85.627913,41.940292]},n2143:{id:"n2143",loc:[-85.628943,41.940516]},n2144:{id:"n2144",loc:[-85.63139,41.943941]},n2145:{id:"n2145",loc:[-85.630081,41.94204]},n2146:{id:"n2146",loc:[-85.632194,41.93963]},n2147:{id:"n2147",loc:[-85.632913,41.93939]},n2148:{id:"n2148",loc:[-85.632001,41.943492]},n2149:{id:"n2149",loc:[-85.63149,41.943154]},n215:{id:"n215",loc:[-85.633542,41.942768]},n2150:{id:"n2150",loc:[-85.625167,41.940117]},n2151:{id:"n2151",loc:[-85.63287,41.939941]},n2152:{id:"n2152",loc:[-85.630789,41.943732]},n2153:{id:"n2153",loc:[-85.632173,41.940348]},n2154:{id:"n2154",loc:[-85.626587,41.940113]},n2155:{id:"n2155",loc:[-85.62684,41.940667]},n2156:{id:"n2156",loc:[-85.632527,41.938904]},n2157:{id:"n2157",loc:[-85.624866,41.94018]},n2158:{id:"n2158",loc:[-85.633267,41.93872]},n2159:{id:"n2159",loc:[-85.62934,41.940843]},n216:{id:"n216",loc:[-85.633618,41.942714]},n2160:{id:"n2160",loc:[-85.62272,41.953817]},n2161:{id:"n2161",loc:[-85.622555,41.954453]},n2162:{id:"n2162",loc:[-85.637225,41.944128]},n2163:{id:"n2163",loc:[-85.622628,41.953683]},n2164:{id:"n2164",loc:[-85.635441,41.943989]},n2165:{id:"n2165",loc:[-85.622629,41.953807]},n2166:{id:"n2166",loc:[-85.62262,41.953807]},n2167:{id:"n2167",loc:[-85.62262,41.953837]},n2168:{id:"n2168",loc:[-85.622532,41.953838]},n2169:{id:"n2169",loc:[-85.637469,41.944579]},n217:{id:"n217",loc:[-85.634001,41.942336]},n2170:{id:"n2170",loc:[-85.63688,41.943935]},n2171:{id:"n2171",loc:[-85.638263,41.946367]},n2172:{id:"n2172",loc:[-85.622532,41.953807]},n2173:{id:"n2173",loc:[-85.622353,41.953808]},n2174:{id:"n2174",loc:[-85.622352,41.953685]},n2175:{id:"n2175",loc:[-85.622464,41.953684]},n2176:{id:"n2176",loc:[-85.622464,41.953648]},n2177:{id:"n2177",loc:[-85.637136,41.94576]},n2178:{id:"n2178",loc:[-85.622521,41.953648]},n2179:{id:"n2179",loc:[-85.637129,41.945415]},n218:{id:"n218",loc:[-85.633825,41.942376]},n2180:{id:"n2180",loc:[-85.637473,41.94607]},n2181:{id:"n2181",loc:[-85.622521,41.953683]},n2182:{id:"n2182",loc:[-85.622717,41.954104]},n2183:{id:"n2183",loc:[-85.637769,41.946095]},n2184:{id:"n2184",loc:[-85.623872,41.953515]},n2185:{id:"n2185",loc:[-85.623851,41.953588]},n2186:{id:"n2186",loc:[-85.631385,41.94433]},n2187:{id:"n2187",loc:[-85.623608,41.953543]},n2188:{id:"n2188",loc:[-85.637308,41.944882]},n2189:{id:"n2189",loc:[-85.634898,41.944041]},n219:{id:"n219",loc:[-85.633807,41.942334]},n2190:{id:"n2190",loc:[-85.623604,41.953442]},n2191:{id:"n2191",loc:[-85.623705,41.953442]},n2192:{id:"n2192",loc:[-85.623708,41.953493]},n2193:{id:"n2193",loc:[-85.624064,41.952655]},n2194:{id:"n2194",loc:[-85.62395,41.952654]},n2195:{id:"n2195",loc:[-85.623951,41.952579]},n2196:{id:"n2196",loc:[-85.637435,41.944342]},n2197:{id:"n2197",loc:[-85.624064,41.952579]},n2198:{id:"n2198",loc:[-85.623812,41.952648]},n2199:{id:"n2199",loc:[-85.623813,41.952705]},n22:{id:"n22",loc:[-85.633531,41.942357]},n220:{id:"n220",loc:[-85.633983,41.942294]},n2200:{id:"n2200",loc:[-85.637169,41.945098]},n2201:{id:"n2201",loc:[-85.623552,41.952707]},n2202:{id:"n2202",loc:[-85.623551,41.95263]},n2203:{id:"n2203",loc:[-85.623701,41.952629]},n2204:{id:"n2204",loc:[-85.635894,41.943719]},n2205:{id:"n2205",loc:[-85.637297,41.945992]},n2206:{id:"n2206",loc:[-85.623724,41.952648]},n2207:{id:"n2207",loc:[-85.623812,41.952438]},n2208:{id:"n2208",loc:[-85.625239,41.952197]},n2209:{id:"n2209",loc:[-85.625232,41.952257]},n221:{id:"n221",loc:[-85.634182,41.942495]},n2210:{id:"n2210",loc:[-85.635175,41.94408]},n2211:{id:"n2211",loc:[-85.636381,41.943761]},n2212:{id:"n2212",loc:[-85.625115,41.952249]},n2213:{id:"n2213",loc:[-85.638578,41.946644]},n2214:{id:"n2214",loc:[-85.625122,41.952189]},n2215:{id:"n2215",loc:[-85.625085,41.952031]},n2216:{id:"n2216",loc:[-85.636126,41.943713]},n2217:{id:"n2217",loc:[-85.635005,41.944041]},n2218:{id:"n2218",loc:[-85.63714,41.945328]},n2219:{id:"n2219",loc:[-85.634871,41.943292]},n222:{id:"n222",loc:[-85.634149,41.942503]},n2220:{id:"n2220",loc:[-85.635705,41.943799]},n2221:{id:"n2221",loc:[-85.634995,41.943576]},n2222:{id:"n2222",loc:[-85.635026,41.943829]},n2223:{id:"n2223",loc:[-85.632874,41.941031]},n2224:{id:"n2224",loc:[-85.632531,41.940233]},n2225:{id:"n2225",loc:[-85.634247,41.936003]},n2226:{id:"n2226",loc:[-85.62929,41.941127]},n2227:{id:"n2227",loc:[-85.630428,41.943266]},n2228:{id:"n2228",loc:[-85.631608,41.943425]},n2229:{id:"n2229",loc:[-85.632316,41.943042]},n223:{id:"n223",loc:[-85.634098,41.942373]},n2230:{id:"n2230",loc:[-85.628711,41.940744]},n2231:{id:"n2231",loc:[-85.627831,41.940536]},n2232:{id:"n2232",loc:[-85.625514,41.94052]},n2233:{id:"n2233",loc:[-85.631127,41.943545]},n2234:{id:"n2234",loc:[-85.632909,41.942531]},n2235:{id:"n2235",loc:[-85.632917,41.938796]},n2236:{id:"n2236",loc:[-85.626716,41.94044]},n2237:{id:"n2237",loc:[-85.630122,41.942852]},n2238:{id:"n2238",loc:[-85.632509,41.939674]},n2239:{id:"n2239",loc:[-85.634762,41.935237]},n224:{id:"n224",loc:[-85.634131,41.942366]},n2240:{id:"n2240",loc:[-85.63384,41.937025]},n2241:{id:"n2241",loc:[-85.629741,41.941909]},n2242:{id:"n2242",loc:[-85.635254,41.945001],tags:{railway:"level_crossing"}},n2243:{id:"n2243",loc:[-85.634005,41.938168]},n2244:{id:"n2244",loc:[-85.63393,41.938335]},n2245:{id:"n2245",loc:[-85.633859,41.93846]},n2246:{id:"n2246",loc:[-85.633663,41.938776]},n2247:{id:"n2247",loc:[-85.633513,41.938936]},n2248:{id:"n2248",loc:[-85.635295,41.943225]},n2249:{id:"n2249",loc:[-85.635393,41.943293]},n225:{id:"n225",loc:[-85.635986,41.94177]},n2250:{id:"n2250",loc:[-85.635645,41.94332]},n2251:{id:"n2251",loc:[-85.63629,41.943328]},n2252:{id:"n2252",loc:[-85.636554,41.943372]},n2253:{id:"n2253",loc:[-85.636869,41.943526]},n2254:{id:"n2254",loc:[-85.637099,41.943704]},n2255:{id:"n2255",loc:[-85.637268,41.943773]},n2256:{id:"n2256",loc:[-85.637483,41.943821]},n2257:{id:"n2257",loc:[-85.637616,41.943929]},n2258:{id:"n2258",loc:[-85.637752,41.944114]},n2259:{id:"n2259",loc:[-85.638399,41.944308]},n226:{id:"n226",loc:[-85.635982,41.941523]},n2260:{id:"n2260",loc:[-85.638573,41.944451]},n2261:{id:"n2261",loc:[-85.638702,41.944574]},n2262:{id:"n2262",loc:[-85.638718,41.944652]},n2263:{id:"n2263",loc:[-85.638715,41.944809]},n2264:{id:"n2264",loc:[-85.638766,41.944988]},n2265:{id:"n2265",loc:[-85.638773,41.945136]},n2266:{id:"n2266",loc:[-85.638705,41.945251]},n2267:{id:"n2267",loc:[-85.638335,41.944291]},n2268:{id:"n2268",loc:[-85.638474,41.944352]},n2269:{id:"n2269",loc:[-85.635408,41.943429]},n227:{id:"n227",loc:[-85.636108,41.941521]},n2270:{id:"n2270",loc:[-85.635271,41.943654]},n2271:{id:"n2271",loc:[-85.635266,41.943744]},n2272:{id:"n2272",loc:[-85.635271,41.943819]},n2273:{id:"n2273",loc:[-85.635192,41.943876]},n2274:{id:"n2274",loc:[-85.635129,41.943857]},n2275:{id:"n2275",loc:[-85.635122,41.943764]},n2276:{id:"n2276",loc:[-85.635124,41.943664]},n2277:{id:"n2277",loc:[-85.63515,41.943611]},n2278:{id:"n2278",loc:[-85.635106,41.943534]},n2279:{id:"n2279",loc:[-85.634972,41.943197]},n228:{id:"n228",loc:[-85.636109,41.941559]},n2280:{id:"n2280",loc:[-85.633978,41.938227]},n2281:{id:"n2281",loc:[-85.634216,41.943255]},n2282:{id:"n2282",loc:[-85.634434,41.943622]},n2283:{id:"n2283",loc:[-85.632406,41.940854]},n2284:{id:"n2284",loc:[-85.632488,41.941063],tags:{leisure:"slipway"}},n2285:{id:"n2285",loc:[-85.632726,41.941537]},n2286:{id:"n2286",loc:[-85.632639,41.94136]},n2287:{id:"n2287",loc:[-85.632704,41.941439]},n2288:{id:"n2288",loc:[-85.632289,41.940601]},n2289:{id:"n2289",loc:[-85.632541,41.942526]},n229:{id:"n229",loc:[-85.636145,41.941559]},n2290:{id:"n2290",loc:[-85.634058,41.943173]},n2291:{id:"n2291",loc:[-85.636175,41.945974]},n2292:{id:"n2292",loc:[-85.636528,41.945975]},n2293:{id:"n2293",loc:[-85.637092,41.945893]},n2294:{id:"n2294",loc:[-85.637881,41.945647]},n2295:{id:"n2295",loc:[-85.639329,41.945162]},n2296:{id:"n2296",loc:[-85.639323,41.945026]},n2297:{id:"n2297",loc:[-85.638826,41.945032]},n2298:{id:"n2298",loc:[-85.638817,41.944174]},n2299:{id:"n2299",loc:[-85.638291,41.94418]},n23:{id:"n23",loc:[-85.633504,41.942418]},n230:{id:"n230",loc:[-85.636145,41.941551]},n2300:{id:"n2300",loc:[-85.63828,41.943811]},n2301:{id:"n2301",loc:[-85.638195,41.943601]},n2302:{id:"n2302",loc:[-85.63719,41.943592]},n2303:{id:"n2303",loc:[-85.636697,41.943273]},n2304:{id:"n2304",loc:[-85.635375,41.943274]},n2305:{id:"n2305",loc:[-85.635091,41.943547]},n2306:{id:"n2306",loc:[-85.63442,41.944117]},n2307:{id:"n2307",loc:[-85.635117,41.943717]},n2308:{id:"n2308",loc:[-85.635601,41.945177]},n2309:{id:"n2309",loc:[-85.635819,41.945494]},n231:{id:"n231",loc:[-85.636312,41.941549]},n2310:{id:"n2310",loc:[-85.635303,41.944891]},n2311:{id:"n2311",loc:[-85.637674,41.943802]},n2312:{id:"n2312",loc:[-85.638263,41.944272]},n2313:{id:"n2313",loc:[-85.634267,41.935266]},n2314:{id:"n2314",loc:[-85.639788,41.945152]},n2315:{id:"n2315",loc:[-85.639645,41.945167]},n2316:{id:"n2316",loc:[-85.639362,41.945233]},n2317:{id:"n2317",loc:[-85.638616,41.945163]},n2318:{id:"n2318",loc:[-85.638514,41.944936]},n2319:{id:"n2319",loc:[-85.638578,41.94503]},n232:{id:"n232",loc:[-85.636314,41.941649]},n2320:{id:"n2320",loc:[-85.638578,41.945215]},n2321:{id:"n2321",loc:[-85.640495,41.947015]},n2322:{id:"n2322",loc:[-85.639577,41.946495]},n2323:{id:"n2323",loc:[-85.638935,41.946087]},n2324:{id:"n2324",loc:[-85.637535,41.94584]},n2325:{id:"n2325",loc:[-85.638357,41.945404]},n2326:{id:"n2326",loc:[-85.638051,41.94553]},n2327:{id:"n2327",loc:[-85.637732,41.945555]},n2328:{id:"n2328",loc:[-85.637657,41.945524]},n2329:{id:"n2329",loc:[-85.637598,41.945467]},n233:{id:"n233",loc:[-85.636152,41.94165]},n2330:{id:"n2330",loc:[-85.637669,41.945318]},n2331:{id:"n2331",loc:[-85.637894,41.945171]},n2332:{id:"n2332",loc:[-85.637923,41.945082]},n2333:{id:"n2333",loc:[-85.63793,41.944756]},n2334:{id:"n2334",loc:[-85.637976,41.944696]},n2335:{id:"n2335",loc:[-85.638044,41.944671]},n2336:{id:"n2336",loc:[-85.638129,41.944597]},n2337:{id:"n2337",loc:[-85.638252,41.944413]},n2338:{id:"n2338",loc:[-85.638092,41.945442]},n2339:{id:"n2339",loc:[-85.638409,41.945315]},n234:{id:"n234",loc:[-85.636152,41.941628]},n2340:{id:"n2340",loc:[-85.638325,41.944771]},n2341:{id:"n2341",loc:[-85.638103,41.944744]},n2342:{id:"n2342",loc:[-85.637976,41.944781]},n2343:{id:"n2343",loc:[-85.637983,41.944865]},n2344:{id:"n2344",loc:[-85.638063,41.945074]},n2345:{id:"n2345",loc:[-85.638041,41.945206]},n2346:{id:"n2346",loc:[-85.637907,41.945309]},n2347:{id:"n2347",loc:[-85.637925,41.94539]},n2348:{id:"n2348",loc:[-85.637998,41.94545]},n2349:{id:"n2349",loc:[-85.637135,41.946254]},n235:{id:"n235",loc:[-85.63611,41.941628]},n2350:{id:"n2350",loc:[-85.636837,41.946615]},n2351:{id:"n2351",loc:[-85.637954,41.948909]},n2352:{id:"n2352",loc:[-85.638382,41.949786]},n2353:{id:"n2353",loc:[-85.639367,41.951242]},n2354:{id:"n2354",loc:[-85.640554,41.951777]},n2355:{id:"n2355",loc:[-85.6411,41.952234]},n2356:{id:"n2356",loc:[-85.641742,41.952657]},n2357:{id:"n2357",loc:[-85.642321,41.952941]},n2358:{id:"n2358",loc:[-85.64277,41.953228]},n2359:{id:"n2359",loc:[-85.643333,41.953825]},n236:{id:"n236",loc:[-85.636113,41.941768]},n2360:{id:"n2360",loc:[-85.643579,41.954365]},n2361:{id:"n2361",loc:[-85.644439,41.954105]},n2362:{id:"n2362",loc:[-85.64506,41.954]},n2363:{id:"n2363",loc:[-85.645483,41.953911]},n2364:{id:"n2364",loc:[-85.646046,41.953853]},n2365:{id:"n2365",loc:[-85.646318,41.953717]},n2366:{id:"n2366",loc:[-85.646276,41.953414]},n2367:{id:"n2367",loc:[-85.631063,41.957478],tags:{emergency:"fire_hydrant"}},n2368:{id:"n2368",loc:[-85.630996,41.955857],tags:{emergency:"fire_hydrant"}},n2369:{id:"n2369",loc:[-85.630976,41.954608],tags:{emergency:"fire_hydrant"}},n237:{id:"n237",loc:[-85.635983,41.941589],tags:{entrance:"yes"}},n2370:{id:"n2370",loc:[-85.646,41.953154]},n2371:{id:"n2371",loc:[-85.645222,41.953193]},n2372:{id:"n2372",loc:[-85.644732,41.953181]},n2373:{id:"n2373",loc:[-85.644064,41.953298]},n2374:{id:"n2374",loc:[-85.643818,41.953177]},n2375:{id:"n2375",loc:[-85.644001,41.95284]},n2376:{id:"n2376",loc:[-85.628174,41.95456],tags:{emergency:"fire_hydrant"}},n2377:{id:"n2377",loc:[-85.644267,41.952591]},n2378:{id:"n2378",loc:[-85.644288,41.952328]},n2379:{id:"n2379",loc:[-85.627276,41.953987],tags:{emergency:"fire_hydrant"}},n238:{id:"n238",loc:[-85.635906,41.94159]},n2380:{id:"n2380",loc:[-85.644262,41.952153]},n2381:{id:"n2381",loc:[-85.644168,41.95204]},n2382:{id:"n2382",loc:[-85.64421,41.951749]},n2383:{id:"n2383",loc:[-85.64385,41.951586]},n2384:{id:"n2384",loc:[-85.62736,41.955964],tags:{emergency:"fire_hydrant"}},n2385:{id:"n2385",loc:[-85.626307,41.957198],tags:{emergency:"fire_hydrant"}},n2386:{id:"n2386",loc:[-85.643589,41.951323]},n2387:{id:"n2387",loc:[-85.62747,41.957509],tags:{emergency:"fire_hydrant"}},n2388:{id:"n2388",loc:[-85.628665,41.957492],tags:{emergency:"fire_hydrant"}},n2389:{id:"n2389",loc:[-85.642535,41.951031]},n239:{id:"n239",loc:[-85.635883,41.940182]},n2390:{id:"n2390",loc:[-85.642269,41.95088]},n2391:{id:"n2391",loc:[-85.641878,41.950814]},n2392:{id:"n2392",loc:[-85.641549,41.950806]},n2393:{id:"n2393",loc:[-85.641103,41.950549]},n2394:{id:"n2394",loc:[-85.630864,41.959046],tags:{emergency:"fire_hydrant"}},n2395:{id:"n2395",loc:[-85.632249,41.958969],tags:{emergency:"fire_hydrant"}},n2396:{id:"n2396",loc:[-85.641037,41.949821]},n2397:{id:"n2397",loc:[-85.641006,41.949433]},n2398:{id:"n2398",loc:[-85.632232,41.95859],tags:{emergency:"fire_hydrant"}},n2399:{id:"n2399",loc:[-85.632071,41.958345],tags:{emergency:"fire_hydrant"}},n24:{id:"n24",loc:[-85.634346,41.942792]},n240:{id:"n240",loc:[-85.635916,41.94264]},n2400:{id:"n2400",loc:[-85.632228,41.9573],tags:{emergency:"fire_hydrant"}},n2401:{id:"n2401",loc:[-85.641152,41.948257]},n2402:{id:"n2402",loc:[-85.641055,41.947304]},n2403:{id:"n2403",loc:[-85.638022,41.945897]},n2404:{id:"n2404",loc:[-85.638672,41.950778]},n2405:{id:"n2405",loc:[-85.63666,41.944492],tags:{name:"Memory Isle",place:"island"}},n2406:{id:"n2406",loc:[-85.635,41.946389],tags:{amenity:"post_office",name:"Three Rivers Post Office"}},n2407:{id:"n2407",loc:[-85.633676,41.946036]},n2408:{id:"n2408",loc:[-85.633736,41.946078]},n2409:{id:"n2409",loc:[-85.633997,41.946185]},n241:{id:"n241",loc:[-85.635795,41.941906]},n2410:{id:"n2410",loc:[-85.634448,41.945626],tags:{highway:"traffic_signals",traffic_signals:"signal"}},n2411:{id:"n2411",loc:[-85.63456,41.945731],tags:{crossing:"marked",highway:"crossing"}},n2412:{id:"n2412",loc:[-85.634592,41.94578]},n2413:{id:"n2413",loc:[-85.634607,41.945815]},n2414:{id:"n2414",loc:[-85.634614,41.945864]},n2415:{id:"n2415",loc:[-85.636066,41.946185]},n2416:{id:"n2416",loc:[-85.636128,41.946352]},n2417:{id:"n2417",loc:[-85.636142,41.946452]},n2418:{id:"n2418",loc:[-85.635327,41.945292]},n2419:{id:"n2419",loc:[-85.635648,41.94558]},n242:{id:"n242",loc:[-85.635909,41.941906]},n2420:{id:"n2420",loc:[-85.635769,41.945729]},n2421:{id:"n2421",loc:[-85.637349,41.945897]},n2422:{id:"n2422",loc:[-85.632211,41.95596],tags:{emergency:"fire_hydrant"}},n2423:{id:"n2423",loc:[-85.635942,41.94598]},n2424:{id:"n2424",loc:[-85.636443,41.946042]},n2425:{id:"n2425",loc:[-85.635819,41.946052]},n2426:{id:"n2426",loc:[-85.636669,41.946025]},n2427:{id:"n2427",loc:[-85.636832,41.946005]},n2428:{id:"n2428",loc:[-85.637039,41.945968]},n2429:{id:"n2429",loc:[-85.636291,41.946046]},n243:{id:"n243",loc:[-85.636359,41.941904]},n2430:{id:"n2430",loc:[-85.634005,41.943367]},n2431:{id:"n2431",loc:[-85.633366,41.943724]},n2432:{id:"n2432",loc:[-85.634617,41.946057]},n2433:{id:"n2433",loc:[-85.636534,41.944793]},n2434:{id:"n2434",loc:[-85.637055,41.945188]},n2435:{id:"n2435",loc:[-85.636153,41.944618]},n2436:{id:"n2436",loc:[-85.636803,41.944944]},n2437:{id:"n2437",loc:[-85.633389,41.945735]},n2438:{id:"n2438",loc:[-85.633536,41.94585]},n2439:{id:"n2439",loc:[-85.63363,41.945993]},n244:{id:"n244",loc:[-85.636351,41.941438]},n2440:{id:"n2440",loc:[-85.633268,41.94568]},n2441:{id:"n2441",loc:[-85.635947,41.94546]},n2442:{id:"n2442",loc:[-85.636277,41.945268]},n2443:{id:"n2443",loc:[-85.635203,41.944287]},n2444:{id:"n2444",loc:[-85.634876,41.944477]},n2445:{id:"n2445",loc:[-85.634975,41.944419]},n2446:{id:"n2446",loc:[-85.633877,41.943438]},n2447:{id:"n2447",loc:[-85.63508,41.945113]},n2448:{id:"n2448",loc:[-85.635372,41.944932]},n2449:{id:"n2449",loc:[-85.636594,41.945935]},n245:{id:"n245",loc:[-85.635903,41.941436]},n2450:{id:"n2450",loc:[-85.636901,41.945747]},n2451:{id:"n2451",loc:[-85.636329,41.945228]},n2452:{id:"n2452",loc:[-85.636025,41.945417]},n2453:{id:"n2453",loc:[-85.634002,41.944644]},n2454:{id:"n2454",loc:[-85.63407,41.944692]},n2455:{id:"n2455",loc:[-85.634114,41.944756]},n2456:{id:"n2456",loc:[-85.633762,41.944809]},n2457:{id:"n2457",loc:[-85.634184,41.944807]},n2458:{id:"n2458",loc:[-85.634291,41.944819]},n2459:{id:"n2459",loc:[-85.634639,41.944845]},n246:{id:"n246",loc:[-85.635788,41.941436]},n2460:{id:"n2460",loc:[-85.633822,41.944861]},n2461:{id:"n2461",loc:[-85.63411,41.944855]},n2462:{id:"n2462",loc:[-85.63435,41.944872]},n2463:{id:"n2463",loc:[-85.63441,41.944903]},n2464:{id:"n2464",loc:[-85.633883,41.944913]},n2465:{id:"n2465",loc:[-85.634164,41.944896]},n2466:{id:"n2466",loc:[-85.633487,41.944926]},n2467:{id:"n2467",loc:[-85.634736,41.944929]},n2468:{id:"n2468",loc:[-85.633944,41.944965]},n2469:{id:"n2469",loc:[-85.633555,41.944983]},n247:{id:"n247",loc:[-85.635929,41.941511]},n2470:{id:"n2470",loc:[-85.633995,41.945013]},n2471:{id:"n2471",loc:[-85.633614,41.945037]},n2472:{id:"n2472",loc:[-85.634848,41.945031]},n2473:{id:"n2473",loc:[-85.634049,41.945061]},n2474:{id:"n2474",loc:[-85.633678,41.945094]},n2475:{id:"n2475",loc:[-85.63317,41.945111]},n2476:{id:"n2476",loc:[-85.633357,41.945103]},n2477:{id:"n2477",loc:[-85.633728,41.945136]},n2478:{id:"n2478",loc:[-85.634146,41.945148]},n2479:{id:"n2479",loc:[-85.633416,41.945157]},n248:{id:"n248",loc:[-85.635929,41.941317]},n2480:{id:"n2480",loc:[-85.634625,41.945172]},n2481:{id:"n2481",loc:[-85.633239,41.945174]},n2482:{id:"n2482",loc:[-85.63469,41.945185]},n2483:{id:"n2483",loc:[-85.634661,41.945203]},n2484:{id:"n2484",loc:[-85.63348,41.945214]},n2485:{id:"n2485",loc:[-85.633578,41.945221]},n2486:{id:"n2486",loc:[-85.634742,41.945231]},n2487:{id:"n2487",loc:[-85.634251,41.94525]},n2488:{id:"n2488",loc:[-85.633524,41.945254]},n2489:{id:"n2489",loc:[-85.63468,41.945271]},n249:{id:"n249",loc:[-85.636414,41.941316]},n2490:{id:"n2490",loc:[-85.633885,41.945272]},n2491:{id:"n2491",loc:[-85.634795,41.945288]},n2492:{id:"n2492",loc:[-85.634742,41.94532]},n2493:{id:"n2493",loc:[-85.633946,41.945327]},n2494:{id:"n2494",loc:[-85.634844,41.945331]},n2495:{id:"n2495",loc:[-85.63435,41.945349]},n2496:{id:"n2496",loc:[-85.633733,41.945357]},n2497:{id:"n2497",loc:[-85.633987,41.945375]},n2498:{id:"n2498",loc:[-85.634911,41.945419]},n2499:{id:"n2499",loc:[-85.634049,41.945431]},n25:{id:"n25",loc:[-85.634333,41.942809]},n250:{id:"n250",loc:[-85.636414,41.941511]},n2500:{id:"n2500",loc:[-85.633705,41.945461]},n2501:{id:"n2501",loc:[-85.633642,41.945408]},n2502:{id:"n2502",loc:[-85.634493,41.945475]},n2503:{id:"n2503",loc:[-85.634106,41.945484]},n2504:{id:"n2504",loc:[-85.635008,41.945505]},n2505:{id:"n2505",loc:[-85.633757,41.945506]},n2506:{id:"n2506",loc:[-85.634542,41.945519]},n2507:{id:"n2507",loc:[-85.634162,41.945536]},n2508:{id:"n2508",loc:[-85.633843,41.945547]},n2509:{id:"n2509",loc:[-85.634919,41.94556]},n251:{id:"n251",loc:[-85.636819,41.941617]},n2510:{id:"n2510",loc:[-85.633818,41.945561]},n2511:{id:"n2511",loc:[-85.634638,41.94559]},n2512:{id:"n2512",loc:[-85.633901,41.945598]},n2513:{id:"n2513",loc:[-85.634257,41.945626]},n2514:{id:"n2514",loc:[-85.633967,41.945652]},n2515:{id:"n2515",loc:[-85.634735,41.945676]},n2516:{id:"n2516",loc:[-85.635057,41.945683]},n2517:{id:"n2517",loc:[-85.635296,41.945703]},n2518:{id:"n2518",loc:[-85.635112,41.945703]},n2519:{id:"n2519",loc:[-85.634782,41.945729]},n252:{id:"n252",loc:[-85.636718,41.941619]},n2520:{id:"n2520",loc:[-85.634052,41.945747]},n2521:{id:"n2521",loc:[-85.635296,41.945757]},n2522:{id:"n2522",loc:[-85.635314,41.945757]},n2523:{id:"n2523",loc:[-85.635112,41.945761]},n2524:{id:"n2524",loc:[-85.63484,41.945778]},n2525:{id:"n2525",loc:[-85.635314,41.945938]},n2526:{id:"n2526",loc:[-85.63484,41.945922]},n2527:{id:"n2527",loc:[-85.635461,41.944879]},n2528:{id:"n2528",loc:[-85.636024,41.945384]},n2529:{id:"n2529",loc:[-85.636145,41.945312]},n253:{id:"n253",loc:[-85.636716,41.941509]},n2530:{id:"n2530",loc:[-85.6356,41.944797]},n2531:{id:"n2531",loc:[-85.635135,41.944354]},n2532:{id:"n2532",loc:[-85.632988,41.945369]},n2533:{id:"n2533",loc:[-85.633376,41.94563]},n2534:{id:"n2534",loc:[-85.633539,41.945534]},n2535:{id:"n2535",loc:[-85.633238,41.945248]},n2536:{id:"n2536",loc:[-85.633166,41.945216]},n2537:{id:"n2537",loc:[-85.633114,41.945188]},n2538:{id:"n2538",loc:[-85.633078,41.945127]},n2539:{id:"n2539",loc:[-85.633066,41.94508]},n254:{id:"n254",loc:[-85.636732,41.941509]},n2540:{id:"n2540",loc:[-85.633222,41.945358]},n2541:{id:"n2541",loc:[-85.633425,41.945541]},n2542:{id:"n2542",loc:[-85.63299,41.9455]},n2543:{id:"n2543",loc:[-85.634374,41.944327]},n2544:{id:"n2544",loc:[-85.633648,41.943697]},n2545:{id:"n2545",loc:[-85.633533,41.943764]},n2546:{id:"n2546",loc:[-85.634239,41.944417]},n2547:{id:"n2547",loc:[-85.634122,41.944395]},n2548:{id:"n2548",loc:[-85.634235,41.944326]},n2549:{id:"n2549",loc:[-85.633613,41.943787]},n255:{id:"n255",loc:[-85.636731,41.941461]},n2550:{id:"n2550",loc:[-85.633915,41.943613]},n2551:{id:"n2551",loc:[-85.634015,41.943555]},n2552:{id:"n2552",loc:[-85.63433,41.943839]},n2553:{id:"n2553",loc:[-85.634236,41.943894]},n2554:{id:"n2554",loc:[-85.635413,41.946052]},n2555:{id:"n2555",loc:[-85.635405,41.94569]},n2556:{id:"n2556",loc:[-85.635684,41.945925]},n2557:{id:"n2557",loc:[-85.635614,41.945742]},n2558:{id:"n2558",loc:[-85.635401,41.945745]},n2559:{id:"n2559",loc:[-85.635406,41.945928]},n256:{id:"n256",loc:[-85.636799,41.941461]},n2560:{id:"n2560",loc:[-85.633478,41.943663]},n2561:{id:"n2561",loc:[-85.633291,41.943526]},n2562:{id:"n2562",loc:[-85.633094,41.943541]},n2563:{id:"n2563",loc:[-85.633302,41.943492]},n2564:{id:"n2564",loc:[-85.633047,41.943623]},n2565:{id:"n2565",loc:[-85.633275,41.943562]},n2566:{id:"n2566",loc:[-85.633351,41.943518]},n2567:{id:"n2567",loc:[-85.633224,41.9434]},n2568:{id:"n2568",loc:[-85.633235,41.943369]},n2569:{id:"n2569",loc:[-85.635179,41.943911]},n257:{id:"n257",loc:[-85.6368,41.9415]},n2570:{id:"n2570",loc:[-85.635146,41.943918]},n2571:{id:"n2571",loc:[-85.634888,41.943905]},n2572:{id:"n2572",loc:[-85.634832,41.943911]},n2573:{id:"n2573",loc:[-85.634638,41.944007]},n2574:{id:"n2574",loc:[-85.634568,41.94405]},n2575:{id:"n2575",loc:[-85.635994,41.94501]},n2576:{id:"n2576",loc:[-85.636388,41.944608]},n2577:{id:"n2577",loc:[-85.636215,41.944787]},n2578:{id:"n2578",loc:[-85.637948,41.944587]},n2579:{id:"n2579",loc:[-85.637849,41.944567]},n258:{id:"n258",loc:[-85.636814,41.9415]},n2580:{id:"n2580",loc:[-85.637895,41.944455]},n2581:{id:"n2581",loc:[-85.637996,41.944477]},n2582:{id:"n2582",loc:[-85.635525,41.94337]},n2583:{id:"n2583",loc:[-85.637847,41.943923]},n2584:{id:"n2584",loc:[-85.637891,41.944124]},n2585:{id:"n2585",loc:[-85.638167,41.944229]},n2586:{id:"n2586",loc:[-85.638236,41.944097]},n2587:{id:"n2587",loc:[-85.638207,41.944025]},n2588:{id:"n2588",loc:[-85.638141,41.943997]},n2589:{id:"n2589",loc:[-85.638057,41.944015]},n259:{id:"n259",loc:[-85.636815,41.941538]},n2590:{id:"n2590",loc:[-85.637902,41.944231]},n2591:{id:"n2591",loc:[-85.638134,41.944307]},n2592:{id:"n2592",loc:[-85.638242,41.944294]},n2593:{id:"n2593",loc:[-85.638274,41.944222]},n2594:{id:"n2594",loc:[-85.638236,41.944174]},n2595:{id:"n2595",loc:[-85.638207,41.944157]},n2596:{id:"n2596",loc:[-85.637818,41.943984]},n2597:{id:"n2597",loc:[-85.634996,41.944439]},n2598:{id:"n2598",loc:[-85.633946,41.945804]},n2599:{id:"n2599",loc:[-85.634102,41.945864]},n26:{id:"n26",loc:[-85.634346,41.942744]},n260:{id:"n260",loc:[-85.636827,41.941538]},n2600:{id:"n2600",loc:[-85.633819,41.945756]},n2601:{id:"n2601",loc:[-85.634025,41.945975]},n2602:{id:"n2602",loc:[-85.633742,41.945867]},n2603:{id:"n2603",loc:[-85.63373,41.946004]},n2604:{id:"n2604",loc:[-85.633947,41.946081]},n2605:{id:"n2605",loc:[-85.633872,41.945917]},n2606:{id:"n2606",loc:[-85.633825,41.945985]},n2607:{id:"n2607",loc:[-85.633762,41.94596]},n2608:{id:"n2608",loc:[-85.634224,41.946037]},n2609:{id:"n2609",loc:[-85.634357,41.945851]},n261:{id:"n261",loc:[-85.636828,41.941584]},n2610:{id:"n2610",loc:[-85.634398,41.945813]},n2611:{id:"n2611",loc:[-85.634461,41.945812]},n2612:{id:"n2612",loc:[-85.634501,41.945852]},n2613:{id:"n2613",loc:[-85.634503,41.94597]},n2614:{id:"n2614",loc:[-85.634462,41.945971]},n2615:{id:"n2615",loc:[-85.634465,41.946036]},n2616:{id:"n2616",loc:[-85.634235,41.946072]},n2617:{id:"n2617",loc:[-85.634447,41.946036]},n2618:{id:"n2618",loc:[-85.634448,41.946052]},n2619:{id:"n2619",loc:[-85.634494,41.946051]},n262:{id:"n262",loc:[-85.636819,41.941585]},n2620:{id:"n2620",loc:[-85.634497,41.946144]},n2621:{id:"n2621",loc:[-85.634453,41.946144]},n2622:{id:"n2622",loc:[-85.634454,41.94616]},n2623:{id:"n2623",loc:[-85.634393,41.946161]},n2624:{id:"n2624",loc:[-85.634394,41.94618]},n2625:{id:"n2625",loc:[-85.634345,41.94618]},n2626:{id:"n2626",loc:[-85.634344,41.946162]},n2627:{id:"n2627",loc:[-85.63427,41.946163]},n2628:{id:"n2628",loc:[-85.634266,41.946071]},n2629:{id:"n2629",loc:[-85.634148,41.946163]},n263:{id:"n263",loc:[-85.636854,41.941714]},n2630:{id:"n2630",loc:[-85.634213,41.946072]},n2631:{id:"n2631",loc:[-85.633293,41.946309]},n2632:{id:"n2632",loc:[-85.633122,41.946239]},n2633:{id:"n2633",loc:[-85.633295,41.946005]},n2634:{id:"n2634",loc:[-85.633395,41.946047]},n2635:{id:"n2635",loc:[-85.633404,41.946035]},n2636:{id:"n2636",loc:[-85.633459,41.946057]},n2637:{id:"n2637",loc:[-85.633387,41.946154]},n2638:{id:"n2638",loc:[-85.633403,41.946161]},n2639:{id:"n2639",loc:[-85.634176,41.946415]},n264:{id:"n264",loc:[-85.636855,41.941774]},n2640:{id:"n2640",loc:[-85.634179,41.946339]},n2641:{id:"n2641",loc:[-85.634455,41.946345]},n2642:{id:"n2642",loc:[-85.634452,41.946422]},n2643:{id:"n2643",loc:[-85.63437,41.946421]},n2644:{id:"n2644",loc:[-85.634367,41.946497]},n2645:{id:"n2645",loc:[-85.634289,41.946495]},n2646:{id:"n2646",loc:[-85.634291,41.946448]},n2647:{id:"n2647",loc:[-85.634269,41.946448]},n2648:{id:"n2648",loc:[-85.63427,41.946417]},n2649:{id:"n2649",loc:[-85.63484,41.946328]},n265:{id:"n265",loc:[-85.636822,41.941774]},n2650:{id:"n2650",loc:[-85.634839,41.946187]},n2651:{id:"n2651",loc:[-85.635148,41.946186]},n2652:{id:"n2652",loc:[-85.635148,41.946216]},n2653:{id:"n2653",loc:[-85.63521,41.946216]},n2654:{id:"n2654",loc:[-85.63521,41.946348]},n2655:{id:"n2655",loc:[-85.635154,41.946348]},n2656:{id:"n2656",loc:[-85.635153,41.946327]},n2657:{id:"n2657",loc:[-85.634037,41.946957]},n2658:{id:"n2658",loc:[-85.634253,41.946953]},n2659:{id:"n2659",loc:[-85.63481,41.946543]},n266:{id:"n266",loc:[-85.636822,41.941778]},n2660:{id:"n2660",loc:[-85.634809,41.946459]},n2661:{id:"n2661",loc:[-85.635154,41.946458]},n2662:{id:"n2662",loc:[-85.635155,41.946554]},n2663:{id:"n2663",loc:[-85.635022,41.946547]},n2664:{id:"n2664",loc:[-85.635022,41.946573]},n2665:{id:"n2665",loc:[-85.634909,41.946574]},n2666:{id:"n2666",loc:[-85.634909,41.946561]},n2667:{id:"n2667",loc:[-85.634896,41.947159]},n2668:{id:"n2668",loc:[-85.634894,41.947032]},n2669:{id:"n2669",loc:[-85.635024,41.947031]},n267:{id:"n267",loc:[-85.636756,41.941779]},n2670:{id:"n2670",loc:[-85.635026,41.947158]},n2671:{id:"n2671",loc:[-85.635233,41.947105]},n2672:{id:"n2672",loc:[-85.635236,41.946991]},n2673:{id:"n2673",loc:[-85.635369,41.946993]},n2674:{id:"n2674",loc:[-85.635366,41.947107]},n2675:{id:"n2675",loc:[-85.634824,41.946929]},n2676:{id:"n2676",loc:[-85.634825,41.946818]},n2677:{id:"n2677",loc:[-85.63512,41.946819]},n2678:{id:"n2678",loc:[-85.635119,41.94693]},n2679:{id:"n2679",loc:[-85.634796,41.946806]},n268:{id:"n268",loc:[-85.636756,41.941774]},n2680:{id:"n2680",loc:[-85.634792,41.946604]},n2681:{id:"n2681",loc:[-85.634948,41.946602]},n2682:{id:"n2682",loc:[-85.634949,41.946645]},n2683:{id:"n2683",loc:[-85.634975,41.946644]},n2684:{id:"n2684",loc:[-85.634974,41.946599]},n2685:{id:"n2685",loc:[-85.635117,41.946598]},n2686:{id:"n2686",loc:[-85.635122,41.946801]},n2687:{id:"n2687",loc:[-85.634981,41.946803]},n2688:{id:"n2688",loc:[-85.634979,41.946752]},n2689:{id:"n2689",loc:[-85.634952,41.946752]},n269:{id:"n269",loc:[-85.636721,41.941774]},n2690:{id:"n2690",loc:[-85.634953,41.946804]},n2691:{id:"n2691",loc:[-85.634649,41.946841]},n2692:{id:"n2692",loc:[-85.634331,41.94684]},n2693:{id:"n2693",loc:[-85.634183,41.946809]},n2694:{id:"n2694",loc:[-85.633699,41.946607]},n2695:{id:"n2695",loc:[-85.634487,41.946664]},n2696:{id:"n2696",loc:[-85.634486,41.946598]},n2697:{id:"n2697",loc:[-85.63423,41.946599]},n2698:{id:"n2698",loc:[-85.634231,41.946662]},n2699:{id:"n2699",loc:[-85.634284,41.946662]},n27:{id:"n27",loc:[-85.634136,41.943183]},n270:{id:"n270",loc:[-85.63672,41.941714]},n2700:{id:"n2700",loc:[-85.634284,41.946679]},n2701:{id:"n2701",loc:[-85.634365,41.946679]},n2702:{id:"n2702",loc:[-85.634365,41.946664]},n2703:{id:"n2703",loc:[-85.635443,41.947015]},n2704:{id:"n2704",loc:[-85.635442,41.946801]},n2705:{id:"n2705",loc:[-85.63603,41.9468]},n2706:{id:"n2706",loc:[-85.636028,41.947016]},n2707:{id:"n2707",loc:[-85.635457,41.946582]},n2708:{id:"n2708",loc:[-85.635455,41.946211]},n2709:{id:"n2709",loc:[-85.635636,41.946579]},n271:{id:"n271",loc:[-85.636767,41.941713]},n2710:{id:"n2710",loc:[-85.635716,41.9468]},n2711:{id:"n2711",loc:[-85.635969,41.9468]},n2712:{id:"n2712",loc:[-85.635973,41.946295]},n2713:{id:"n2713",loc:[-85.636019,41.946484]},n2714:{id:"n2714",loc:[-85.636022,41.946388]},n2715:{id:"n2715",loc:[-85.635961,41.946493]},n2716:{id:"n2716",loc:[-85.635713,41.94621]},n2717:{id:"n2717",loc:[-85.635416,41.946142]},n2718:{id:"n2718",loc:[-85.635759,41.946203]},n2719:{id:"n2719",loc:[-85.636153,41.946747]},n272:{id:"n272",loc:[-85.636767,41.941706]},n2720:{id:"n2720",loc:[-85.635417,41.946915]},n2721:{id:"n2721",loc:[-85.636154,41.946915]},n2722:{id:"n2722",loc:[-85.635866,41.946473]},n2723:{id:"n2723",loc:[-85.635717,41.946633]},n2724:{id:"n2724",loc:[-85.635556,41.946166]},n2725:{id:"n2725",loc:[-85.63556,41.946556]},n2726:{id:"n2726",loc:[-85.635731,41.946594]},n2727:{id:"n2727",loc:[-85.635866,41.946595]},n2728:{id:"n2728",loc:[-85.635456,41.947028]},n2729:{id:"n2729",loc:[-85.635796,41.947023]},n273:{id:"n273",loc:[-85.636779,41.941698]},n2730:{id:"n2730",loc:[-85.635798,41.947091]},n2731:{id:"n2731",loc:[-85.63573,41.947092]},n2732:{id:"n2732",loc:[-85.635733,41.947233]},n2733:{id:"n2733",loc:[-85.636283,41.946863]},n2734:{id:"n2734",loc:[-85.63628,41.946706]},n2735:{id:"n2735",loc:[-85.636341,41.946705]},n2736:{id:"n2736",loc:[-85.636273,41.946584]},n2737:{id:"n2737",loc:[-85.636396,41.946545]},n2738:{id:"n2738",loc:[-85.636474,41.946684]},n2739:{id:"n2739",loc:[-85.636511,41.946861]},n274:{id:"n274",loc:[-85.636798,41.941697]},n2740:{id:"n2740",loc:[-85.633713,41.947184]},n2741:{id:"n2741",loc:[-85.633651,41.94716]},n2742:{id:"n2742",loc:[-85.633704,41.947085]},n2743:{id:"n2743",loc:[-85.6336,41.947044]},n2744:{id:"n2744",loc:[-85.633506,41.947177]},n2745:{id:"n2745",loc:[-85.629586,41.952469]},n2746:{id:"n2746",loc:[-85.634723,41.953681]},n2747:{id:"n2747",loc:[-85.63478,41.959007]},n2748:{id:"n2748",loc:[-85.632793,41.94405],tags:{highway:"traffic_signals",traffic_signals:"signal","traffic_signals:direction":"both"}},n2749:{id:"n2749",loc:[-85.634648,41.947325]},n275:{id:"n275",loc:[-85.63681,41.941705]},n2750:{id:"n2750",loc:[-85.625078,41.952097]},n2751:{id:"n2751",loc:[-85.633195,41.94734]},n2752:{id:"n2752",loc:[-85.626447,41.957168]},n2753:{id:"n2753",loc:[-85.632023,41.949012]},n2754:{id:"n2754",loc:[-85.630835,41.950656]},n2755:{id:"n2755",loc:[-85.634655,41.948612]},n2756:{id:"n2756",loc:[-85.636182,41.948605]},n2757:{id:"n2757",loc:[-85.634729,41.954667]},n2758:{id:"n2758",loc:[-85.634686,41.951159]},n2759:{id:"n2759",loc:[-85.636206,41.951146]},n276:{id:"n276",loc:[-85.63681,41.941714]},n2760:{id:"n2760",loc:[-85.634668,41.949891]},n2761:{id:"n2761",loc:[-85.634701,41.952422]},n2762:{id:"n2762",loc:[-85.634747,41.955907]},n2763:{id:"n2763",loc:[-85.627975,41.954695]},n2764:{id:"n2764",loc:[-85.626832,41.954698]},n2765:{id:"n2765",loc:[-85.632278,41.948624]},n2766:{id:"n2766",loc:[-85.628639,41.953725]},n2767:{id:"n2767",loc:[-85.636233,41.95241]},n2768:{id:"n2768",loc:[-85.631385,41.949913]},n2769:{id:"n2769",loc:[-85.630486,41.951194]},n277:{id:"n277",loc:[-85.636861,41.942041]},n2770:{id:"n2770",loc:[-85.624937,41.952088]},n2771:{id:"n2771",loc:[-85.624945,41.952022]},n2772:{id:"n2772",loc:[-85.636162,41.94731]},n2773:{id:"n2773",loc:[-85.636188,41.949881]},n2774:{id:"n2774",loc:[-85.631422,41.948294]},n2775:{id:"n2775",loc:[-85.632844,41.945547]},n2776:{id:"n2776",loc:[-85.632484,41.945344]},n2777:{id:"n2777",loc:[-85.631775,41.944636]},n2778:{id:"n2778",loc:[-85.632656,41.945471]},n2779:{id:"n2779",loc:[-85.631959,41.944827]},n278:{id:"n278",loc:[-85.636862,41.942099]},n2780:{id:"n2780",loc:[-85.631679,41.94438]},n2781:{id:"n2781",loc:[-85.625129,41.959272]},n2782:{id:"n2782",loc:[-85.632446,41.944861]},n2783:{id:"n2783",loc:[-85.632804,41.945477]},n2784:{id:"n2784",loc:[-85.632255,41.944962]},n2785:{id:"n2785",loc:[-85.632736,41.944757]},n2786:{id:"n2786",loc:[-85.632543,41.94486]},n2787:{id:"n2787",loc:[-85.632889,41.945561]},n2788:{id:"n2788",loc:[-85.632091,41.944949]},n2789:{id:"n2789",loc:[-85.632537,41.944713]},n279:{id:"n279",loc:[-85.636807,41.942099]},n2790:{id:"n2790",loc:[-85.632279,41.94485]},n2791:{id:"n2791",loc:[-85.632749,41.943247]},n2792:{id:"n2792",loc:[-85.632824,41.943152]},n2793:{id:"n2793",loc:[-85.632929,41.94317]},n2794:{id:"n2794",loc:[-85.632897,41.943078]},n2795:{id:"n2795",loc:[-85.632626,41.943231]},n2796:{id:"n2796",loc:[-85.634048,41.947257]},n2797:{id:"n2797",loc:[-85.634264,41.947252]},n2798:{id:"n2798",loc:[-85.635418,41.947317]},n2799:{id:"n2799",loc:[-85.635461,41.947237]},n28:{id:"n28",loc:[-85.63821,41.944308]},n280:{id:"n280",loc:[-85.636807,41.942126]},n2800:{id:"n2800",loc:[-85.632868,41.946229]},n2801:{id:"n2801",loc:[-85.633673,41.947242]},n2802:{id:"n2802",loc:[-85.623604,41.945881],tags:{amenity:"school",name:"Barrows School"}},n2803:{id:"n2803",loc:[-85.627401,41.943496]},n2804:{id:"n2804",loc:[-85.627403,41.943625]},n2805:{id:"n2805",loc:[-85.626409,41.943215]},n2806:{id:"n2806",loc:[-85.624884,41.943508]},n2807:{id:"n2807",loc:[-85.625191,41.943509]},n2808:{id:"n2808",loc:[-85.624882,41.94382]},n2809:{id:"n2809",loc:[-85.624893,41.945618]},n281:{id:"n281",loc:[-85.636726,41.942126]},n2810:{id:"n2810",loc:[-85.624912,41.946524]},n2811:{id:"n2811",loc:[-85.622721,41.946535]},n2812:{id:"n2812",loc:[-85.627399,41.94469]},n2813:{id:"n2813",loc:[-85.622716,41.945622]},n2814:{id:"n2814",loc:[-85.624886,41.944724]},n2815:{id:"n2815",loc:[-85.622674,41.944737]},n2816:{id:"n2816",loc:[-85.625092,41.945063]},n2817:{id:"n2817",loc:[-85.625233,41.945064]},n2818:{id:"n2818",loc:[-85.625229,41.944871]},n2819:{id:"n2819",loc:[-85.625066,41.944871]},n282:{id:"n282",loc:[-85.636726,41.942098]},n2820:{id:"n2820",loc:[-85.625024,41.944901]},n2821:{id:"n2821",loc:[-85.625025,41.944924]},n2822:{id:"n2822",loc:[-85.625087,41.944926]},n2823:{id:"n2823",loc:[-85.625349,41.944506]},n2824:{id:"n2824",loc:[-85.625347,41.944388]},n2825:{id:"n2825",loc:[-85.625152,41.94439]},n2826:{id:"n2826",loc:[-85.625152,41.944431]},n2827:{id:"n2827",loc:[-85.625134,41.944431]},n2828:{id:"n2828",loc:[-85.625136,41.944508]},n2829:{id:"n2829",loc:[-85.623236,41.946341]},n283:{id:"n283",loc:[-85.636708,41.942098]},n2830:{id:"n2830",loc:[-85.623241,41.946067]},n2831:{id:"n2831",loc:[-85.623207,41.946067]},n2832:{id:"n2832",loc:[-85.623212,41.945827]},n2833:{id:"n2833",loc:[-85.622981,41.945825]},n2834:{id:"n2834",loc:[-85.622976,41.946063]},n2835:{id:"n2835",loc:[-85.623006,41.946063]},n2836:{id:"n2836",loc:[-85.623002,41.946256]},n2837:{id:"n2837",loc:[-85.623075,41.946256]},n2838:{id:"n2838",loc:[-85.623074,41.946339]},n2839:{id:"n2839",loc:[-85.624574,41.951755]},n284:{id:"n284",loc:[-85.636708,41.942041]},n2840:{id:"n2840",loc:[-85.62498,41.951844]},n2841:{id:"n2841",loc:[-85.625086,41.95188]},n2842:{id:"n2842",loc:[-85.625135,41.951922]},n2843:{id:"n2843",loc:[-85.615273,41.945637]},n2844:{id:"n2844",loc:[-85.620172,41.945627]},n2845:{id:"n2845",loc:[-85.625167,41.951985]},n2846:{id:"n2846",loc:[-85.622741,41.947437]},n2847:{id:"n2847",loc:[-85.624907,41.947428]},n2848:{id:"n2848",loc:[-85.627046,41.940995]},n2849:{id:"n2849",loc:[-85.627295,41.941304]},n285:{id:"n285",loc:[-85.635618,41.941852]},n2850:{id:"n2850",loc:[-85.627352,41.94148]},n2851:{id:"n2851",loc:[-85.62737,41.942261]},n2852:{id:"n2852",loc:[-85.6264,41.942263]},n2853:{id:"n2853",loc:[-85.622769,41.949228]},n2854:{id:"n2854",loc:[-85.624937,41.949218]},n2855:{id:"n2855",loc:[-85.630001,41.944664]},n2856:{id:"n2856",loc:[-85.624873,41.942022]},n2857:{id:"n2857",loc:[-85.622761,41.948333]},n2858:{id:"n2858",loc:[-85.624924,41.948334]},n2859:{id:"n2859",loc:[-85.620051,41.94383]},n286:{id:"n286",loc:[-85.635621,41.94202]},n2860:{id:"n2860",loc:[-85.627629,41.946498]},n2861:{id:"n2861",loc:[-85.622757,41.950111]},n2862:{id:"n2862",loc:[-85.623685,41.954624]},n2863:{id:"n2863",loc:[-85.621459,41.944756]},n2864:{id:"n2864",loc:[-85.628637,41.944676]},n2865:{id:"n2865",loc:[-85.630125,41.944654]},n2866:{id:"n2866",loc:[-85.625196,41.952097]},n2867:{id:"n2867",loc:[-85.630257,41.944637]},n2868:{id:"n2868",loc:[-85.631247,41.944459]},n2869:{id:"n2869",loc:[-85.624867,41.94159]},n287:{id:"n287",loc:[-85.63524,41.942023]},n2870:{id:"n2870",loc:[-85.624958,41.950343]},n2871:{id:"n2871",loc:[-85.624948,41.950484]},n2872:{id:"n2872",loc:[-85.624813,41.950983]},n2873:{id:"n2873",loc:[-85.624723,41.951789]},n2874:{id:"n2874",loc:[-85.624262,41.9512]},n2875:{id:"n2875",loc:[-85.62414,41.951201]},n2876:{id:"n2876",loc:[-85.624139,41.95112]},n2877:{id:"n2877",loc:[-85.628481,41.945611]},n2878:{id:"n2878",loc:[-85.620072,41.946538]},n2879:{id:"n2879",loc:[-85.622763,41.95099]},n288:{id:"n288",loc:[-85.635237,41.941855]},n2880:{id:"n2880",loc:[-85.62814,41.946963]},n2881:{id:"n2881",loc:[-85.628245,41.947031]},n2882:{id:"n2882",loc:[-85.628331,41.947066]},n2883:{id:"n2883",loc:[-85.629722,41.944444],tags:{leisure:"park",name:"Scouter Park"}},n2884:{id:"n2884",loc:[-85.629977,41.943907]},n2885:{id:"n2885",loc:[-85.629947,41.943775]},n2886:{id:"n2886",loc:[-85.629899,41.943625]},n2887:{id:"n2887",loc:[-85.632286,41.944257]},n2888:{id:"n2888",loc:[-85.632523,41.944179]},n2889:{id:"n2889",loc:[-85.632141,41.944293]},n289:{id:"n289",loc:[-85.635568,41.940475]},n2890:{id:"n2890",loc:[-85.631571,41.9444]},n2891:{id:"n2891",loc:[-85.643236,41.941895]},n2892:{id:"n2892",loc:[-85.62865,41.945353]},n2893:{id:"n2893",loc:[-85.628594,41.945481]},n2894:{id:"n2894",loc:[-85.628581,41.947169]},n2895:{id:"n2895",loc:[-85.631843,41.943793]},n2896:{id:"n2896",loc:[-85.632299,41.943472]},n2897:{id:"n2897",loc:[-85.631519,41.944881]},n2898:{id:"n2898",loc:[-85.628429,41.947219]},n2899:{id:"n2899",loc:[-85.63145,41.945162]},n29:{id:"n29",loc:[-85.637963,41.944263]},n290:{id:"n290",loc:[-85.634584,41.940477]},n2900:{id:"n2900",loc:[-85.630939,41.945519]},n2901:{id:"n2901",loc:[-85.62903,41.945719]},n2902:{id:"n2902",loc:[-85.630521,41.945559]},n2903:{id:"n2903",loc:[-85.629294,41.945585]},n2904:{id:"n2904",loc:[-85.629845,41.945543]},n2905:{id:"n2905",loc:[-85.631497,41.944625]},n2906:{id:"n2906",loc:[-85.630281,41.945553]},n2907:{id:"n2907",loc:[-85.628553,41.946973]},n2908:{id:"n2908",loc:[-85.631383,41.945338]},n2909:{id:"n2909",loc:[-85.628843,41.946103]},n291:{id:"n291",loc:[-85.634583,41.940203]},n2910:{id:"n2910",loc:[-85.631193,41.945473]},n2911:{id:"n2911",loc:[-85.628897,41.945944]},n2912:{id:"n2912",loc:[-85.628789,41.946454]},n2913:{id:"n2913",loc:[-85.632548,41.944563]},n2914:{id:"n2914",loc:[-85.627527,41.944555]},n2915:{id:"n2915",loc:[-85.62752,41.943726]},n2916:{id:"n2916",loc:[-85.627894,41.943723]},n2917:{id:"n2917",loc:[-85.627897,41.943919]},n2918:{id:"n2918",loc:[-85.627991,41.943934]},n2919:{id:"n2919",loc:[-85.628082,41.943966]},n292:{id:"n292",loc:[-85.635567,41.940201]},n2920:{id:"n2920",loc:[-85.628177,41.944015]},n2921:{id:"n2921",loc:[-85.628193,41.944048]},n2922:{id:"n2922",loc:[-85.628167,41.944054]},n2923:{id:"n2923",loc:[-85.628193,41.944094]},n2924:{id:"n2924",loc:[-85.628213,41.944144]},n2925:{id:"n2925",loc:[-85.628214,41.944199]},n2926:{id:"n2926",loc:[-85.62833,41.944196]},n2927:{id:"n2927",loc:[-85.628328,41.944262]},n2928:{id:"n2928",loc:[-85.628173,41.944262]},n2929:{id:"n2929",loc:[-85.628171,41.944293]},n293:{id:"n293",loc:[-85.635816,41.942673],tags:{crossing:"marked",highway:"crossing"}},n2930:{id:"n2930",loc:[-85.628039,41.944296]},n2931:{id:"n2931",loc:[-85.62804,41.944329]},n2932:{id:"n2932",loc:[-85.627829,41.944335]},n2933:{id:"n2933",loc:[-85.627835,41.94455]},n2936:{id:"n2936",loc:[-85.632823,41.945994]},n294:{id:"n294",loc:[-85.635696,41.942712]},n2940:{id:"n2940",loc:[-85.632192,41.945973]},n2941:{id:"n2941",loc:[-85.63226,41.94587]},n2942:{id:"n2942",loc:[-85.632721,41.946036]},n2943:{id:"n2943",loc:[-85.632641,41.946142]},n2944:{id:"n2944",loc:[-85.62937,41.947467]},n2945:{id:"n2945",loc:[-85.62959,41.942936]},n2946:{id:"n2946",loc:[-85.629551,41.94284]},n2947:{id:"n2947",loc:[-85.629501,41.942704]},n2948:{id:"n2948",loc:[-85.629472,41.942578]},n2949:{id:"n2949",loc:[-85.629361,41.941801]},n295:{id:"n295",loc:[-85.635679,41.941962]},n2950:{id:"n2950",loc:[-85.629339,41.941716]},n2951:{id:"n2951",loc:[-85.629315,41.94166]},n2952:{id:"n2952",loc:[-85.629279,41.941602]},n2953:{id:"n2953",loc:[-85.629227,41.941556]},n2954:{id:"n2954",loc:[-85.624261,41.95112]},n2955:{id:"n2955",loc:[-85.629153,41.941524]},n2956:{id:"n2956",loc:[-85.626904,41.941098]},n2957:{id:"n2957",loc:[-85.624588,41.951294]},n2958:{id:"n2958",loc:[-85.631844,41.942945]},n2959:{id:"n2959",loc:[-85.625854,41.949222]},n296:{id:"n296",loc:[-85.635672,41.941337]},n2960:{id:"n2960",loc:[-85.625146,41.955238]},n2961:{id:"n2961",loc:[-85.626745,41.948296]},n2962:{id:"n2962",loc:[-85.625721,41.95524]},n2963:{id:"n2963",loc:[-85.624706,41.952317]},n2964:{id:"n2964",loc:[-85.62609,41.956147]},n2965:{id:"n2965",loc:[-85.624401,41.954928]},n2966:{id:"n2966",loc:[-85.626558,41.955367]},n2967:{id:"n2967",loc:[-85.62468,41.955096]},n2968:{id:"n2968",loc:[-85.624159,41.953929]},n2969:{id:"n2969",loc:[-85.62506,41.951113]},n297:{id:"n297",loc:[-85.635658,41.941284]},n2970:{id:"n2970",loc:[-85.624942,41.951591]},n2971:{id:"n2971",loc:[-85.627399,41.947546]},n2972:{id:"n2972",loc:[-85.627695,41.947404]},n2973:{id:"n2973",loc:[-85.625925,41.94896]},n2974:{id:"n2974",loc:[-85.625725,41.950211]},n2975:{id:"n2975",loc:[-85.627008,41.947963]},n2976:{id:"n2976",loc:[-85.624373,41.953458]},n2977:{id:"n2977",loc:[-85.624137,41.954392]},n2978:{id:"n2978",loc:[-85.628257,41.947307]},n2979:{id:"n2979",loc:[-85.625281,41.95066]},n298:{id:"n298",loc:[-85.635602,41.941166]},n2980:{id:"n2980",loc:[-85.625865,41.949804]},n2981:{id:"n2981",loc:[-85.626508,41.955932]},n2982:{id:"n2982",loc:[-85.626333,41.955216]},n2983:{id:"n2983",loc:[-85.626637,41.955676]},n2984:{id:"n2984",loc:[-85.624223,41.954599]},n2985:{id:"n2985",loc:[-85.626219,41.948671]},n2986:{id:"n2986",loc:[-85.624556,41.953043]},n2987:{id:"n2987",loc:[-85.625598,41.956302]},n2988:{id:"n2988",loc:[-85.624571,41.952971]},n2989:{id:"n2989",loc:[-85.627141,41.940727]},n299:{id:"n299",loc:[-85.635598,41.941138]},n2990:{id:"n2990",loc:[-85.627102,41.939144]},n2991:{id:"n2991",loc:[-85.627127,41.940086]},n2992:{id:"n2992",loc:[-85.627116,41.940843]},n2993:{id:"n2993",loc:[-85.627132,41.9402]},n2994:{id:"n2994",loc:[-85.629734,41.940078]},n2995:{id:"n2995",loc:[-85.6276,41.937412]},n2996:{id:"n2996",loc:[-85.627451,41.937549]},n2997:{id:"n2997",loc:[-85.627375,41.937618]},n2998:{id:"n2998",loc:[-85.627278,41.937728]},n2999:{id:"n2999",loc:[-85.627199,41.937842]},n3:{id:"n3",loc:[-85.627345,41.953983]},n30:{id:"n30",loc:[-85.637882,41.944205]},n300:{id:"n300",loc:[-85.635614,41.941076]},n3000:{id:"n3000",loc:[-85.627141,41.937981]},n3001:{id:"n3001",loc:[-85.627109,41.938153]},n3002:{id:"n3002",loc:[-85.627101,41.938699]},n3003:{id:"n3003",loc:[-85.628311,41.942261]},n3004:{id:"n3004",loc:[-85.628439,41.940082]},n3005:{id:"n3005",loc:[-85.619538,41.942622],tags:{leisure:"slipway"}},n3006:{id:"n3006",loc:[-85.619872,41.942618]},n3007:{id:"n3007",loc:[-85.619755,41.942612]},n3008:{id:"n3008",loc:[-85.619647,41.942628]},n3009:{id:"n3009",loc:[-85.619415,41.942626]},n301:{id:"n301",loc:[-85.635659,41.940956]},n3010:{id:"n3010",loc:[-85.619212,41.942623]},n3011:{id:"n3011",loc:[-85.631485,41.942472]},n3012:{id:"n3012",loc:[-85.630986,41.941786]},n3013:{id:"n3013",loc:[-85.631797,41.942006]},n3014:{id:"n3014",loc:[-85.630972,41.941162]},n3015:{id:"n3015",loc:[-85.631396,41.941611],tags:{railway:"level_crossing"}},n3016:{id:"n3016",loc:[-85.631878,41.941545]},n3017:{id:"n3017",loc:[-85.630461,41.94055]},n3018:{id:"n3018",loc:[-85.629751,41.939539],tags:{railway:"level_crossing"}},n3019:{id:"n3019",loc:[-85.631663,41.941513]},n302:{id:"n302",loc:[-85.635666,41.940922]},n3020:{id:"n3020",loc:[-85.631328,41.941375]},n3021:{id:"n3021",loc:[-85.632554,41.941779]},n3022:{id:"n3022",loc:[-85.63245,41.941769]},n3023:{id:"n3023",loc:[-85.632475,41.941644]},n3024:{id:"n3024",loc:[-85.632581,41.941654]},n3025:{id:"n3025",loc:[-85.631957,41.941352]},n3026:{id:"n3026",loc:[-85.632293,41.941139]},n3027:{id:"n3027",loc:[-85.632315,41.941153]},n3028:{id:"n3028",loc:[-85.632302,41.941262]},n3029:{id:"n3029",loc:[-85.63237,41.941267]},n303:{id:"n303",loc:[-85.635667,41.940877]},n3030:{id:"n3030",loc:[-85.632356,41.941538]},n3031:{id:"n3031",loc:[-85.632134,41.941678]},n3032:{id:"n3032",loc:[-85.631942,41.941687]},n3033:{id:"n3033",loc:[-85.63203,41.941694]},n3034:{id:"n3034",loc:[-85.632166,41.941555]},n3035:{id:"n3035",loc:[-85.632412,41.941416]},n3036:{id:"n3036",loc:[-85.63248,41.941342]},n3037:{id:"n3037",loc:[-85.632502,41.941259]},n3038:{id:"n3038",loc:[-85.632453,41.941161]},n3039:{id:"n3039",loc:[-85.63235,41.941103]},n304:{id:"n304",loc:[-85.635668,41.940655]},n3040:{id:"n3040",loc:[-85.632236,41.941118]},n3041:{id:"n3041",loc:[-85.631894,41.941355]},n3042:{id:"n3042",loc:[-85.631859,41.941411]},n3043:{id:"n3043",loc:[-85.632011,41.941587]},n3044:{id:"n3044",loc:[-85.632446,41.941379]},n3045:{id:"n3045",loc:[-85.632511,41.941416]},n3046:{id:"n3046",loc:[-85.632545,41.941634]},n3047:{id:"n3047",loc:[-85.632612,41.94164]},n3048:{id:"n3048",loc:[-85.632595,41.942197]},n3049:{id:"n3049",loc:[-85.632565,41.942241]},n305:{id:"n305",loc:[-85.635628,41.940617]},n3050:{id:"n3050",loc:[-85.632515,41.942256]},n3051:{id:"n3051",loc:[-85.63245,41.94223]},n3052:{id:"n3052",loc:[-85.632401,41.942174]},n3053:{id:"n3053",loc:[-85.632391,41.942115]},n3054:{id:"n3054",loc:[-85.632029,41.941859]},n3055:{id:"n3055",loc:[-85.631828,41.941639]},n3056:{id:"n3056",loc:[-85.631829,41.941508]},n3057:{id:"n3057",loc:[-85.631281,41.94312]},n3058:{id:"n3058",loc:[-85.631421,41.943065]},n3059:{id:"n3059",loc:[-85.631339,41.942949]},n306:{id:"n306",loc:[-85.635623,41.940272]},n3060:{id:"n3060",loc:[-85.631199,41.943004]},n3061:{id:"n3061",loc:[-85.631102,41.942931]},n3062:{id:"n3062",loc:[-85.631009,41.942809]},n3063:{id:"n3063",loc:[-85.631383,41.94265]},n3064:{id:"n3064",loc:[-85.631477,41.942773]},n3065:{id:"n3065",loc:[-85.630638,41.942809]},n3066:{id:"n3066",loc:[-85.630738,41.942943]},n3067:{id:"n3067",loc:[-85.630841,41.9429]},n3068:{id:"n3068",loc:[-85.630741,41.942766]},n3069:{id:"n3069",loc:[-85.63054,41.942603]},n307:{id:"n307",loc:[-85.635651,41.940183]},n3070:{id:"n3070",loc:[-85.630498,41.942619]},n3071:{id:"n3071",loc:[-85.630567,41.942718]},n3072:{id:"n3072",loc:[-85.630616,41.942698]},n3073:{id:"n3073",loc:[-85.630642,41.94273]},n3074:{id:"n3074",loc:[-85.630686,41.942714]},n3075:{id:"n3075",loc:[-85.630715,41.942754]},n3076:{id:"n3076",loc:[-85.6309,41.942681]},n3077:{id:"n3077",loc:[-85.630843,41.942605]},n3078:{id:"n3078",loc:[-85.6309,41.942581]},n3079:{id:"n3079",loc:[-85.630832,41.942487]},n308:{id:"n308",loc:[-85.63577,41.940183],tags:{crossing:"marked",highway:"crossing"}},n3080:{id:"n3080",loc:[-85.630773,41.942509]},n3081:{id:"n3081",loc:[-85.630718,41.942436]},n3082:{id:"n3082",loc:[-85.630485,41.942524]},n3083:{id:"n3083",loc:[-85.631468,41.941233]},n3084:{id:"n3084",loc:[-85.631334,41.94114]},n3085:{id:"n3085",loc:[-85.632052,41.940568]},n3086:{id:"n3086",loc:[-85.63219,41.940663]},n3087:{id:"n3087",loc:[-85.631323,41.940834]},n3088:{id:"n3088",loc:[-85.631122,41.941002]},n3089:{id:"n3089",loc:[-85.631321,41.941133]},n309:{id:"n309",loc:[-85.636939,41.942544]},n3090:{id:"n3090",loc:[-85.631521,41.940966]},n3091:{id:"n3091",loc:[-85.631103,41.940253]},n3092:{id:"n3092",loc:[-85.631226,41.940211]},n3093:{id:"n3093",loc:[-85.631597,41.940805]},n3094:{id:"n3094",loc:[-85.631474,41.940847]},n3095:{id:"n3095",loc:[-85.631811,41.940534]},n3096:{id:"n3096",loc:[-85.631588,41.94061]},n3097:{id:"n3097",loc:[-85.631438,41.940366]},n3098:{id:"n3098",loc:[-85.631661,41.94029]},n3099:{id:"n3099",loc:[-85.630621,41.940041]},n31:{id:"n31",loc:[-85.63827,41.944203]},n310:{id:"n310",loc:[-85.636323,41.942552]},n3100:{id:"n3100",loc:[-85.630436,41.939773]},n3101:{id:"n3101",loc:[-85.63059,41.939714]},n3102:{id:"n3102",loc:[-85.630775,41.939983]},n3103:{id:"n3103",loc:[-85.63047,41.940167]},n3104:{id:"n3104",loc:[-85.63013,41.939686]},n3105:{id:"n3105",loc:[-85.630302,41.939618]},n3106:{id:"n3106",loc:[-85.630641,41.9401]},n3107:{id:"n3107",loc:[-85.630966,41.940619]},n3108:{id:"n3108",loc:[-85.630874,41.940493]},n3109:{id:"n3109",loc:[-85.630933,41.940469]},n311:{id:"n311",loc:[-85.636257,41.942555]},n3110:{id:"n3110",loc:[-85.630763,41.940236]},n3111:{id:"n3111",loc:[-85.63088,41.940189]},n3112:{id:"n3112",loc:[-85.631142,41.940548]},n3113:{id:"n3113",loc:[-85.630958,41.940871]},n3114:{id:"n3114",loc:[-85.630874,41.940778]},n3115:{id:"n3115",loc:[-85.631062,41.940684]},n3116:{id:"n3116",loc:[-85.631146,41.940777]},n3117:{id:"n3117",loc:[-85.632031,41.940575]},n3118:{id:"n3118",loc:[-85.631777,41.940186]},n3119:{id:"n3119",loc:[-85.631346,41.940179]},n312:{id:"n312",loc:[-85.636208,41.942561]},n3120:{id:"n3120",loc:[-85.631342,41.94012]},n3121:{id:"n3121",loc:[-85.631831,41.940118]},n3122:{id:"n3122",loc:[-85.632115,41.940543]},n3123:{id:"n3123",loc:[-85.631031,41.941683]},n3124:{id:"n3124",loc:[-85.630981,41.941608]},n3125:{id:"n3125",loc:[-85.631209,41.941516]},n3126:{id:"n3126",loc:[-85.631264,41.941586]},n3127:{id:"n3127",loc:[-85.630938,41.94155]},n3128:{id:"n3128",loc:[-85.631156,41.941462]},n3129:{id:"n3129",loc:[-85.631197,41.94152]},n313:{id:"n313",loc:[-85.636159,41.942573]},n3130:{id:"n3130",loc:[-85.630895,41.941485]},n3131:{id:"n3131",loc:[-85.630824,41.941389]},n3132:{id:"n3132",loc:[-85.630986,41.941323]},n3133:{id:"n3133",loc:[-85.631057,41.941419]},n3134:{id:"n3134",loc:[-85.630777,41.941328]},n3135:{id:"n3135",loc:[-85.630907,41.941274]},n3136:{id:"n3136",loc:[-85.630953,41.941335]},n3137:{id:"n3137",loc:[-85.630797,41.941247]},n3138:{id:"n3138",loc:[-85.630701,41.94117]},n3139:{id:"n3139",loc:[-85.630829,41.941113]},n314:{id:"n314",loc:[-85.635743,41.942881]},n3140:{id:"n3140",loc:[-85.6309,41.941201]},n3141:{id:"n3141",loc:[-85.630765,41.941206]},n3142:{id:"n3142",loc:[-85.630739,41.941218]},n3143:{id:"n3143",loc:[-85.630582,41.941039]},n3144:{id:"n3144",loc:[-85.630412,41.940818]},n3145:{id:"n3145",loc:[-85.630509,41.940777]},n3146:{id:"n3146",loc:[-85.630678,41.941004]},n3147:{id:"n3147",loc:[-85.630773,41.942166]},n3148:{id:"n3148",loc:[-85.630708,41.942074]},n3149:{id:"n3149",loc:[-85.630863,41.942013]},n315:{id:"n315",loc:[-85.635452,41.942966]},n3150:{id:"n3150",loc:[-85.630928,41.942105]},n3151:{id:"n3151",loc:[-85.630701,41.942026]},n3152:{id:"n3152",loc:[-85.630665,41.941971]},n3153:{id:"n3153",loc:[-85.630793,41.941918]},n3154:{id:"n3154",loc:[-85.630837,41.94197]},n3155:{id:"n3155",loc:[-85.630757,41.941871]},n3156:{id:"n3156",loc:[-85.630629,41.941923]},n3157:{id:"n3157",loc:[-85.630694,41.941783]},n3158:{id:"n3158",loc:[-85.630534,41.941847]},n3159:{id:"n3159",loc:[-85.630598,41.941935]},n316:{id:"n316",loc:[-85.634911,41.943118]},n3160:{id:"n3160",loc:[-85.631548,41.93938]},n3161:{id:"n3161",loc:[-85.631525,41.939919]},n3162:{id:"n3162",loc:[-85.631648,41.940043]},n3163:{id:"n3163",loc:[-85.624586,41.951121]},n3164:{id:"n3164",loc:[-85.622139,41.952064]},n3165:{id:"n3165",loc:[-85.622141,41.952144]},n3166:{id:"n3166",loc:[-85.621977,41.952146]},n3167:{id:"n3167",loc:[-85.621978,41.952211]},n3168:{id:"n3168",loc:[-85.62191,41.952212]},n3169:{id:"n3169",loc:[-85.633628,41.935437]},n317:{id:"n317",loc:[-85.634743,41.943167]},n3170:{id:"n3170",loc:[-85.632849,41.935518]},n3171:{id:"n3171",loc:[-85.632376,41.93574]},n3172:{id:"n3172",loc:[-85.631517,41.935897]},n3173:{id:"n3173",loc:[-85.630433,41.936124]},n3174:{id:"n3174",loc:[-85.630207,41.936427]},n3175:{id:"n3175",loc:[-85.630346,41.936795]},n3176:{id:"n3176",loc:[-85.62996,41.936974]},n3177:{id:"n3177",loc:[-85.629916,41.937488]},n3178:{id:"n3178",loc:[-85.629946,41.937802]},n3179:{id:"n3179",loc:[-85.629977,41.937905]},n318:{id:"n318",loc:[-85.634401,41.94328]},n3180:{id:"n3180",loc:[-85.63016,41.937909]},n3181:{id:"n3181",loc:[-85.630804,41.937791]},n3182:{id:"n3182",loc:[-85.631688,41.937808]},n3183:{id:"n3183",loc:[-85.631685,41.938008]},n3184:{id:"n3184",loc:[-85.631845,41.938116]},n3185:{id:"n3185",loc:[-85.63207,41.938181]},n3186:{id:"n3186",loc:[-85.632143,41.938371]},n3187:{id:"n3187",loc:[-85.632056,41.938435]},n3188:{id:"n3188",loc:[-85.631787,41.938457]},n3189:{id:"n3189",loc:[-85.631657,41.938728]},n319:{id:"n319",loc:[-85.634345,41.943299]},n3190:{id:"n3190",loc:[-85.631595,41.93775]},n3191:{id:"n3191",loc:[-85.630264,41.937839]},n3192:{id:"n3192",loc:[-85.628591,41.948536]},n3193:{id:"n3193",loc:[-85.63205,41.951181]},n3194:{id:"n3194",loc:[-85.632034,41.949909]},n3195:{id:"n3195",loc:[-85.630841,41.951191]},n3196:{id:"n3196",loc:[-85.632083,41.9537]},n3197:{id:"n3197",loc:[-85.630929,41.959037]},n3198:{id:"n3198",loc:[-85.632151,41.959028]},n3199:{id:"n3199",loc:[-85.630911,41.957428]},n32:{id:"n32",loc:[-85.638273,41.944246]},n320:{id:"n320",loc:[-85.634287,41.943326]},n3200:{id:"n3200",loc:[-85.63213,41.957427]},n3201:{id:"n3201",loc:[-85.632072,41.952447]},n3202:{id:"n3202",loc:[-85.632095,41.954677]},n3203:{id:"n3203",loc:[-85.632111,41.955911]},n3204:{id:"n3204",loc:[-85.630855,41.952457]},n3205:{id:"n3205",loc:[-85.630869,41.953709]},n3206:{id:"n3206",loc:[-85.63088,41.954682]},n3207:{id:"n3207",loc:[-85.630894,41.955913]},n3208:{id:"n3208",loc:[-85.633214,41.948619]},n3209:{id:"n3209",loc:[-85.633253,41.951171]},n321:{id:"n321",loc:[-85.634233,41.943354]},n3210:{id:"n3210",loc:[-85.633234,41.949901]},n3211:{id:"n3211",loc:[-85.633922,41.948616]},n3212:{id:"n3212",loc:[-85.625188,41.947832]},n3213:{id:"n3213",loc:[-85.625208,41.947775]},n3214:{id:"n3214",loc:[-85.625229,41.94776]},n3215:{id:"n3215",loc:[-85.625201,41.947749]},n3216:{id:"n3216",loc:[-85.625168,41.947707]},n3217:{id:"n3217",loc:[-85.625171,41.947609]},n3218:{id:"n3218",loc:[-85.625213,41.947564]},n3219:{id:"n3219",loc:[-85.62529,41.94756]},n322:{id:"n322",loc:[-85.634099,41.943429]},n3220:{id:"n3220",loc:[-85.625303,41.947533]},n3221:{id:"n3221",loc:[-85.625344,41.947482]},n3222:{id:"n3222",loc:[-85.625442,41.947468]},n3223:{id:"n3223",loc:[-85.62565,41.947494]},n3224:{id:"n3224",loc:[-85.625726,41.947613]},n3225:{id:"n3225",loc:[-85.625703,41.947728]},n3226:{id:"n3226",loc:[-85.625534,41.94781]},n3227:{id:"n3227",loc:[-85.625391,41.947822]},n3228:{id:"n3228",loc:[-85.625304,41.947859]},n3229:{id:"n3229",loc:[-85.625203,41.947885]},n323:{id:"n323",loc:[-85.633958,41.943507],tags:{highway:"crossing"}},n3230:{id:"n3230",loc:[-85.624691,41.948659]},n3231:{id:"n3231",loc:[-85.624328,41.948661]},n3232:{id:"n3232",loc:[-85.624331,41.949046]},n3233:{id:"n3233",loc:[-85.624694,41.949045]},n3234:{id:"n3234",loc:[-85.623623,41.949606]},n3235:{id:"n3235",loc:[-85.623623,41.9497]},n3236:{id:"n3236",loc:[-85.623357,41.9497]},n3237:{id:"n3237",loc:[-85.623357,41.949614]},n3238:{id:"n3238",loc:[-85.623974,41.949429]},n3239:{id:"n3239",loc:[-85.623974,41.949605]},n324:{id:"n324",loc:[-85.633698,41.943651],tags:{railway:"crossing"}},n3240:{id:"n3240",loc:[-85.624501,41.951226]},n3241:{id:"n3241",loc:[-85.624501,41.951123]},n3242:{id:"n3242",loc:[-85.624319,41.951123]},n3243:{id:"n3243",loc:[-85.624319,41.951226]},n3244:{id:"n3244",loc:[-85.624121,41.950866]},n3245:{id:"n3245",loc:[-85.624115,41.950525]},n3246:{id:"n3246",loc:[-85.624315,41.950523]},n3247:{id:"n3247",loc:[-85.62432,41.950865]},n3248:{id:"n3248",loc:[-85.624393,41.950867]},n3249:{id:"n3249",loc:[-85.62439,41.950596]},n325:{id:"n325",loc:[-85.633508,41.943757]},n3250:{id:"n3250",loc:[-85.624673,41.950594]},n3251:{id:"n3251",loc:[-85.624675,41.95082]},n3252:{id:"n3252",loc:[-85.62451,41.950821]},n3253:{id:"n3253",loc:[-85.62451,41.950866]},n3254:{id:"n3254",loc:[-85.624101,41.949346]},n3255:{id:"n3255",loc:[-85.624244,41.949346]},n3256:{id:"n3256",loc:[-85.624244,41.949368]},n3257:{id:"n3257",loc:[-85.62434,41.949368]},n3258:{id:"n3258",loc:[-85.624342,41.949351]},n3259:{id:"n3259",loc:[-85.624725,41.949348]},n326:{id:"n326",loc:[-85.634839,41.942974]},n3260:{id:"n3260",loc:[-85.624755,41.950495]},n3261:{id:"n3261",loc:[-85.624121,41.950502]},n3262:{id:"n3262",loc:[-85.625453,41.950163]},n3263:{id:"n3263",loc:[-85.625454,41.949976]},n3264:{id:"n3264",loc:[-85.625549,41.949977]},n3265:{id:"n3265",loc:[-85.62555,41.949833]},n3266:{id:"n3266",loc:[-85.625577,41.949833]},n3267:{id:"n3267",loc:[-85.625578,41.949656]},n3268:{id:"n3268",loc:[-85.625195,41.949655]},n3269:{id:"n3269",loc:[-85.625192,41.950162]},n327:{id:"n327",loc:[-85.634657,41.943028]},n3270:{id:"n3270",loc:[-85.622992,41.949614]},n3271:{id:"n3271",loc:[-85.622991,41.949431]},n3272:{id:"n3272",loc:[-85.620103,41.951]},n3273:{id:"n3273",loc:[-85.605644,41.947468]},n3274:{id:"n3274",loc:[-85.617421,41.947457]},n3275:{id:"n3275",loc:[-85.620078,41.947444]},n3276:{id:"n3276",loc:[-85.620087,41.94924]},n3277:{id:"n3277",loc:[-85.62156,41.948333]},n3278:{id:"n3278",loc:[-85.620106,41.950132]},n3279:{id:"n3279",loc:[-85.637412,41.951136]},n328:{id:"n328",loc:[-85.634222,41.943152]},n3280:{id:"n3280",loc:[-85.635429,41.948608]},n3281:{id:"n3281",loc:[-85.635047,41.947788]},n3282:{id:"n3282",loc:[-85.635048,41.947796]},n3283:{id:"n3283",loc:[-85.635002,41.947797]},n3284:{id:"n3284",loc:[-85.635002,41.947788]},n3285:{id:"n3285",loc:[-85.634914,41.94779]},n3286:{id:"n3286",loc:[-85.634913,41.947753]},n3287:{id:"n3287",loc:[-85.63494,41.947753]},n3288:{id:"n3288",loc:[-85.634938,41.947708]},n3289:{id:"n3289",loc:[-85.635124,41.947705]},n329:{id:"n329",loc:[-85.634099,41.943202]},n3290:{id:"n3290",loc:[-85.635126,41.947787]},n3291:{id:"n3291",loc:[-85.634972,41.947599]},n3292:{id:"n3292",loc:[-85.634921,41.9476]},n3293:{id:"n3293",loc:[-85.63485,41.947546]},n3294:{id:"n3294",loc:[-85.63485,41.947508]},n3295:{id:"n3295",loc:[-85.634924,41.947457]},n3296:{id:"n3296",loc:[-85.634967,41.947456]},n3297:{id:"n3297",loc:[-85.635041,41.947512]},n3298:{id:"n3298",loc:[-85.635041,41.947542]},n3299:{id:"n3299",loc:[-85.634244,41.947839]},n33:{id:"n33",loc:[-85.638257,41.944188]},n330:{id:"n330",loc:[-85.634093,41.943138]},n3300:{id:"n3300",loc:[-85.634243,41.947793]},n3301:{id:"n3301",loc:[-85.634244,41.947686]},n3302:{id:"n3302",loc:[-85.634243,41.947657]},n3303:{id:"n3303",loc:[-85.634462,41.947653]},n3304:{id:"n3304",loc:[-85.634468,41.947835]},n3305:{id:"n3305",loc:[-85.634416,41.948006]},n3306:{id:"n3306",loc:[-85.634415,41.947898]},n3307:{id:"n3307",loc:[-85.634275,41.947899]},n3308:{id:"n3308",loc:[-85.634275,41.947927]},n3309:{id:"n3309",loc:[-85.63425,41.947927]},n331:{id:"n331",loc:[-85.633938,41.943291]},n3310:{id:"n3310",loc:[-85.63425,41.947976]},n3311:{id:"n3311",loc:[-85.634274,41.947976]},n3312:{id:"n3312",loc:[-85.634275,41.948007]},n3313:{id:"n3313",loc:[-85.634342,41.947635]},n3314:{id:"n3314",loc:[-85.634339,41.947497]},n3315:{id:"n3315",loc:[-85.634313,41.94748]},n3316:{id:"n3316",loc:[-85.634287,41.947474]},n3317:{id:"n3317",loc:[-85.63498,41.94815]},n3318:{id:"n3318",loc:[-85.634891,41.94815]},n3319:{id:"n3319",loc:[-85.634892,41.948169]},n332:{id:"n332",loc:[-85.633535,41.943511],tags:{railway:"crossing"}},n3320:{id:"n3320",loc:[-85.634852,41.948169]},n3321:{id:"n3321",loc:[-85.634853,41.948268]},n3322:{id:"n3322",loc:[-85.634832,41.948268]},n3323:{id:"n3323",loc:[-85.634832,41.948296]},n3324:{id:"n3324",loc:[-85.634965,41.948295]},n3325:{id:"n3325",loc:[-85.634966,41.948321]},n3326:{id:"n3326",loc:[-85.634999,41.948321]},n3327:{id:"n3327",loc:[-85.634999,41.948295]},n3328:{id:"n3328",loc:[-85.635175,41.948293]},n3329:{id:"n3329",loc:[-85.635175,41.948262]},n333:{id:"n333",loc:[-85.63339,41.943596]},n3330:{id:"n3330",loc:[-85.635159,41.948262]},n3331:{id:"n3331",loc:[-85.635158,41.948152]},n3332:{id:"n3332",loc:[-85.635067,41.948152]},n3333:{id:"n3333",loc:[-85.635065,41.947966]},n3334:{id:"n3334",loc:[-85.634979,41.947966]},n3335:{id:"n3335",loc:[-85.634307,41.948326]},n3336:{id:"n3336",loc:[-85.634305,41.948298]},n3337:{id:"n3337",loc:[-85.634331,41.948055]},n3338:{id:"n3338",loc:[-85.634331,41.948046]},n3339:{id:"n3339",loc:[-85.634435,41.948047]},n334:{id:"n334",loc:[-85.632842,41.943895]},n3340:{id:"n3340",loc:[-85.634434,41.948375]},n3341:{id:"n3341",loc:[-85.634463,41.948373]},n3342:{id:"n3342",loc:[-85.634464,41.948456]},n3343:{id:"n3343",loc:[-85.63443,41.948457]},n3344:{id:"n3344",loc:[-85.634432,41.948505]},n3345:{id:"n3345",loc:[-85.637386,41.94906]},n3346:{id:"n3346",loc:[-85.637113,41.9486]},n3347:{id:"n3347",loc:[-85.635448,41.949424]},n335:{id:"n335",loc:[-85.633856,41.943315]},n3352:{id:"n3352",loc:[-85.635457,41.949787]},n3353:{id:"n3353",loc:[-85.635459,41.949886]},n336:{id:"n336",loc:[-85.633697,41.943405]},n337:{id:"n337",loc:[-85.63347,41.943181]},n3372:{id:"n3372",loc:[-85.634423,41.950964]},n3373:{id:"n3373",loc:[-85.634424,41.95074]},n3374:{id:"n3374",loc:[-85.634394,41.950284]},n3375:{id:"n3375",loc:[-85.634398,41.950626]},n3376:{id:"n3376",loc:[-85.63452,41.951063]},n3377:{id:"n3377",loc:[-85.634511,41.949977]},n3378:{id:"n3378",loc:[-85.637409,41.949873]},n3379:{id:"n3379",loc:[-85.634824,41.94996]},n338:{id:"n338",loc:[-85.633597,41.943109]},n3380:{id:"n3380",loc:[-85.635437,41.949954]},n3381:{id:"n3381",loc:[-85.634844,41.951064]},n3382:{id:"n3382",loc:[-85.635458,41.951058]},n3383:{id:"n3383",loc:[-85.633921,41.947333]},n3384:{id:"n3384",loc:[-85.634208,41.947793]},n3385:{id:"n3385",loc:[-85.634204,41.947687]},n3386:{id:"n3386",loc:[-85.63424,41.947475]},n3387:{id:"n3387",loc:[-85.63424,41.947635]},n3388:{id:"n3388",loc:[-85.634089,41.948328]},n3389:{id:"n3389",loc:[-85.63424,41.948299]},n339:{id:"n339",loc:[-85.633673,41.943184]},n3390:{id:"n3390",loc:[-85.634239,41.948212]},n3391:{id:"n3391",loc:[-85.634086,41.948214]},n3392:{id:"n3392",loc:[-85.63408,41.948056]},n3393:{id:"n3393",loc:[-85.634093,41.948506]},n3394:{id:"n3394",loc:[-85.64344,41.941866]},n3395:{id:"n3395",loc:[-85.63378,41.95099]},n3396:{id:"n3396",loc:[-85.633779,41.950967]},n3397:{id:"n3397",loc:[-85.63375,41.950746]},n3398:{id:"n3398",loc:[-85.63375,41.950697]},n3399:{id:"n3399",loc:[-85.633903,41.950696]},n34:{id:"n34",loc:[-85.638176,41.944312]},n340:{id:"n340",loc:[-85.633714,41.94316]},n3400:{id:"n3400",loc:[-85.633901,41.950436]},n3401:{id:"n3401",loc:[-85.633492,41.950438]},n3402:{id:"n3402",loc:[-85.633494,41.950756]},n3403:{id:"n3403",loc:[-85.633454,41.950756]},n3404:{id:"n3404",loc:[-85.633456,41.950992]},n3405:{id:"n3405",loc:[-85.633994,41.950284]},n3406:{id:"n3406",loc:[-85.633998,41.950628]},n3407:{id:"n3407",loc:[-85.633364,41.951068]},n3408:{id:"n3408",loc:[-85.633356,41.949982]},n3409:{id:"n3409",loc:[-85.643327,41.941903]},n341:{id:"n341",loc:[-85.633811,41.943256]},n3410:{id:"n3410",loc:[-85.633292,41.953691]},n3411:{id:"n3411",loc:[-85.637432,41.952399]},n3412:{id:"n3412",loc:[-85.633349,41.957422]},n3413:{id:"n3413",loc:[-85.633326,41.955909]},n3414:{id:"n3414",loc:[-85.633307,41.954673]},n3415:{id:"n3415",loc:[-85.633273,41.952436]},n3416:{id:"n3416",loc:[-85.633361,41.95823],tags:{highway:"turning_circle"}},n3417:{id:"n3417",loc:[-85.619899,41.945527]},n3418:{id:"n3418",loc:[-85.643422,41.941946]},n3419:{id:"n3419",loc:[-85.643505,41.942033]},n342:{id:"n342",loc:[-85.633801,41.943261]},n3420:{id:"n3420",loc:[-85.620088,41.945571]},n3421:{id:"n3421",loc:[-85.620051,41.945505]},n3422:{id:"n3422",loc:[-85.62001,41.94541]},n3423:{id:"n3423",loc:[-85.620982,41.944742]},n3424:{id:"n3424",loc:[-85.621305,41.944782]},n3425:{id:"n3425",loc:[-85.621174,41.944819]},n3426:{id:"n3426",loc:[-85.621029,41.944871]},n3427:{id:"n3427",loc:[-85.620741,41.945011]},n3428:{id:"n3428",loc:[-85.620616,41.945085]},n3429:{id:"n3429",loc:[-85.620506,41.945172]},n343:{id:"n343",loc:[-85.63374,41.943514]},n3430:{id:"n3430",loc:[-85.620394,41.945273]},n3431:{id:"n3431",loc:[-85.620316,41.94536]},n3432:{id:"n3432",loc:[-85.620257,41.945452]},n3433:{id:"n3433",loc:[-85.620212,41.945535]},n3434:{id:"n3434",loc:[-85.620101,41.945811]},n3435:{id:"n3435",loc:[-85.620081,41.945937]},n3436:{id:"n3436",loc:[-85.619899,41.943718]},n3437:{id:"n3437",loc:[-85.619969,41.943211]},n3438:{id:"n3438",loc:[-85.619894,41.943292]},n3439:{id:"n3439",loc:[-85.620047,41.944738]},n344:{id:"n344",loc:[-85.633665,41.943441]},n3440:{id:"n3440",loc:[-85.620226,41.946088]},n3441:{id:"n3441",loc:[-85.620225,41.945864]},n3442:{id:"n3442",loc:[-85.620518,41.945863]},n3443:{id:"n3443",loc:[-85.620519,41.945944]},n3444:{id:"n3444",loc:[-85.620388,41.945944]},n3445:{id:"n3445",loc:[-85.620389,41.946088]},n3446:{id:"n3446",loc:[-85.618405,41.946566]},n3447:{id:"n3447",loc:[-85.619156,41.946562]},n3448:{id:"n3448",loc:[-85.619154,41.946319]},n3449:{id:"n3449",loc:[-85.618736,41.946322]},n345:{id:"n345",loc:[-85.633162,41.942947]},n3450:{id:"n3450",loc:[-85.618733,41.94612]},n3451:{id:"n3451",loc:[-85.619317,41.946116]},n3452:{id:"n3452",loc:[-85.619316,41.946023]},n3453:{id:"n3453",loc:[-85.619622,41.946021]},n3454:{id:"n3454",loc:[-85.619624,41.946171]},n3455:{id:"n3455",loc:[-85.61977,41.94617]},n3456:{id:"n3456",loc:[-85.619769,41.94602]},n3457:{id:"n3457",loc:[-85.619732,41.94602]},n3458:{id:"n3458",loc:[-85.619731,41.945856]},n3459:{id:"n3459",loc:[-85.619617,41.945857]},n346:{id:"n346",loc:[-85.633598,41.943083]},n3460:{id:"n3460",loc:[-85.619616,41.945776]},n3461:{id:"n3461",loc:[-85.619447,41.945777]},n3462:{id:"n3462",loc:[-85.619415,41.945778]},n3463:{id:"n3463",loc:[-85.618378,41.945788]},n3464:{id:"n3464",loc:[-85.618384,41.946132]},n3465:{id:"n3465",loc:[-85.618503,41.94613]},n3466:{id:"n3466",loc:[-85.618506,41.946319]},n3467:{id:"n3467",loc:[-85.6184,41.94632]},n3468:{id:"n3468",loc:[-85.618248,41.946416]},n3469:{id:"n3469",loc:[-85.618247,41.946319]},n347:{id:"n347",loc:[-85.63343,41.943179]},n3470:{id:"n3470",loc:[-85.618039,41.946321]},n3471:{id:"n3471",loc:[-85.61804,41.946418]},n3472:{id:"n3472",loc:[-85.620118,41.951895]},n3473:{id:"n3473",loc:[-85.617075,41.95469]},n3474:{id:"n3474",loc:[-85.620107,41.952113]},n3475:{id:"n3475",loc:[-85.620091,41.95232]},n3476:{id:"n3476",loc:[-85.620047,41.952505]},n3477:{id:"n3477",loc:[-85.61998,41.952715]},n3478:{id:"n3478",loc:[-85.619861,41.952986]},n3479:{id:"n3479",loc:[-85.619622,41.953365]},n348:{id:"n348",loc:[-85.633669,41.94341]},n3480:{id:"n3480",loc:[-85.619441,41.953567]},n3481:{id:"n3481",loc:[-85.619259,41.953741]},n3482:{id:"n3482",loc:[-85.618835,41.954056]},n3483:{id:"n3483",loc:[-85.618602,41.954194]},n3484:{id:"n3484",loc:[-85.618305,41.954347]},n3485:{id:"n3485",loc:[-85.618006,41.954466]},n3486:{id:"n3486",loc:[-85.617611,41.954587]},n3487:{id:"n3487",loc:[-85.615094,41.943412]},n3488:{id:"n3488",loc:[-85.619337,41.943025]},n3489:{id:"n3489",loc:[-85.610477,41.945527]},n349:{id:"n349",loc:[-85.633566,41.943466]},n3490:{id:"n3490",loc:[-85.610477,41.943718]},n3491:{id:"n3491",loc:[-85.619804,41.942976]},n3492:{id:"n3492",loc:[-85.61921,41.942672]},n3493:{id:"n3493",loc:[-85.619862,41.942836]},n3494:{id:"n3494",loc:[-85.616326,41.942769]},n3495:{id:"n3495",loc:[-85.617953,41.942917]},n3496:{id:"n3496",loc:[-85.61972,41.942728]},n3497:{id:"n3497",loc:[-85.61944,41.942784]},n3498:{id:"n3498",loc:[-85.615323,41.942841]},n3499:{id:"n3499",loc:[-85.612923,41.943718]},n35:{id:"n35",loc:[-85.637928,41.944249]},n350:{id:"n350",loc:[-85.633031,41.942986]},n3500:{id:"n3500",loc:[-85.61958,41.942756]},n3501:{id:"n3501",loc:[-85.619643,41.942647],tags:{leisure:"fishing"}},n3502:{id:"n3502",loc:[-85.619935,41.942962]},n3503:{id:"n3503",loc:[-85.629677,41.954687]},n3504:{id:"n3504",loc:[-85.629083,41.953722]},n3505:{id:"n3505",loc:[-85.621907,41.952067]},n3506:{id:"n3506",loc:[-85.621788,41.952058]},n3507:{id:"n3507",loc:[-85.629665,41.953718]},n3508:{id:"n3508",loc:[-85.624454,41.954707]},n3509:{id:"n3509",loc:[-85.634609,41.954585]},n351:{id:"n351",loc:[-85.633238,41.94283]},n3510:{id:"n3510",loc:[-85.634595,41.953772]},n3511:{id:"n3511",loc:[-85.633425,41.953783]},n3512:{id:"n3512",loc:[-85.633439,41.954596]},n3517:{id:"n3517",loc:[-85.621789,41.952179]},n3518:{id:"n3518",loc:[-85.624105,41.954704]},n3519:{id:"n3519",loc:[-85.623306,41.954542]},n352:{id:"n352",loc:[-85.633173,41.943556]},n3520:{id:"n3520",loc:[-85.623123,41.954502]},n3521:{id:"n3521",loc:[-85.622965,41.954473]},n3522:{id:"n3522",loc:[-85.622822,41.954455]},n3523:{id:"n3523",loc:[-85.62269,41.954448]},n3524:{id:"n3524",loc:[-85.622388,41.954467]},n3525:{id:"n3525",loc:[-85.62403,41.954895]},n3526:{id:"n3526",loc:[-85.623579,41.954855]},n3527:{id:"n3527",loc:[-85.623836,41.954951]},n3528:{id:"n3528",loc:[-85.622473,41.954592]},n3529:{id:"n3529",loc:[-85.622753,41.95458]},n353:{id:"n353",loc:[-85.633127,41.943552]},n3530:{id:"n3530",loc:[-85.62404,41.955078]},n3531:{id:"n3531",loc:[-85.624126,41.954999]},n3532:{id:"n3532",loc:[-85.623171,41.954687]},n3533:{id:"n3533",loc:[-85.624276,41.955206]},n3534:{id:"n3534",loc:[-85.62491,41.952801]},n3535:{id:"n3535",loc:[-85.625186,41.952756]},n3536:{id:"n3536",loc:[-85.625552,41.952792]},n3537:{id:"n3537",loc:[-85.626001,41.952948]},n3538:{id:"n3538",loc:[-85.626528,41.952984]},n3539:{id:"n3539",loc:[-85.626942,41.952886]},n354:{id:"n354",loc:[-85.632745,41.943222]},n3540:{id:"n3540",loc:[-85.627092,41.952685]},n3541:{id:"n3541",loc:[-85.627212,41.95244]},n3542:{id:"n3542",loc:[-85.627158,41.952226]},n3543:{id:"n3543",loc:[-85.627002,41.951972]},n3544:{id:"n3544",loc:[-85.626822,41.951838]},n3545:{id:"n3545",loc:[-85.626528,41.951807]},n3546:{id:"n3546",loc:[-85.625653,41.951852]},n3547:{id:"n3547",loc:[-85.625348,41.951834]},n3548:{id:"n3548",loc:[-85.625114,41.951767]},n3549:{id:"n3549",loc:[-85.620627,41.954682]},n355:{id:"n355",loc:[-85.632756,41.943199]},n3550:{id:"n3550",loc:[-85.622758,41.951884]},n3551:{id:"n3551",loc:[-85.618135,41.954734]},n3552:{id:"n3552",loc:[-85.620229,41.95472]},n3553:{id:"n3553",loc:[-85.624491,41.955573]},n3554:{id:"n3554",loc:[-85.621792,41.958314]},n3555:{id:"n3555",loc:[-85.623395,41.960001]},n3556:{id:"n3556",loc:[-85.620461,41.956212]},n3557:{id:"n3557",loc:[-85.62109,41.956766]},n3558:{id:"n3558",loc:[-85.620246,41.956224]},n3559:{id:"n3559",loc:[-85.625017,41.956068]},n356:{id:"n356",loc:[-85.632855,41.943147]},n3560:{id:"n3560",loc:[-85.622795,41.959702]},n3561:{id:"n3561",loc:[-85.621573,41.958457]},n3562:{id:"n3562",loc:[-85.619631,41.9573]},n3563:{id:"n3563",loc:[-85.62095,41.956311]},n3564:{id:"n3564",loc:[-85.619694,41.957408]},n3565:{id:"n3565",loc:[-85.621079,41.957751]},n3566:{id:"n3566",loc:[-85.622426,41.961142]},n3567:{id:"n3567",loc:[-85.623251,41.960484]},n3568:{id:"n3568",loc:[-85.619084,41.956291]},n3569:{id:"n3569",loc:[-85.622227,41.959303]},n357:{id:"n357",loc:[-85.632888,41.94315]},n3570:{id:"n3570",loc:[-85.620976,41.959104]},n3571:{id:"n3571",loc:[-85.621208,41.95653]},n3572:{id:"n3572",loc:[-85.623531,41.95951]},n3573:{id:"n3573",loc:[-85.623556,41.957935]},n3574:{id:"n3574",loc:[-85.623037,41.95746]},n3575:{id:"n3575",loc:[-85.621175,41.956427]},n3576:{id:"n3576",loc:[-85.622651,41.960109]},n3577:{id:"n3577",loc:[-85.621803,41.960747]},n3578:{id:"n3578",loc:[-85.620791,41.961874]},n3579:{id:"n3579",loc:[-85.625295,41.956786]},n358:{id:"n358",loc:[-85.633232,41.943547]},n3580:{id:"n3580",loc:[-85.619662,41.956894]},n3581:{id:"n3581",loc:[-85.622442,41.958708]},n3582:{id:"n3582",loc:[-85.621744,41.955864]},n3583:{id:"n3583",loc:[-85.621336,41.959212]},n3584:{id:"n3584",loc:[-85.622801,41.957304]},n3585:{id:"n3585",loc:[-85.619973,41.957433]},n3586:{id:"n3586",loc:[-85.619556,41.955717]},n3587:{id:"n3587",loc:[-85.622978,41.958601]},n3588:{id:"n3588",loc:[-85.625396,41.956264]},n3589:{id:"n3589",loc:[-85.623525,41.958034]},n359:{id:"n359",loc:[-85.633302,41.94351]},n3590:{id:"n3590",loc:[-85.623299,41.959631]},n3591:{id:"n3591",loc:[-85.622678,41.959873]},n3592:{id:"n3592",loc:[-85.625553,41.956179]},n3593:{id:"n3593",loc:[-85.623557,41.959231]},n3594:{id:"n3594",loc:[-85.622843,41.957373]},n3595:{id:"n3595",loc:[-85.619378,41.955677]},n3596:{id:"n3596",loc:[-85.620092,41.955425]},n3597:{id:"n3597",loc:[-85.622666,41.96044]},n3598:{id:"n3598",loc:[-85.621996,41.960256]},n3599:{id:"n3599",loc:[-85.623273,41.959997]},n36:{id:"n36",loc:[-85.637894,41.945551]},n360:{id:"n360",loc:[-85.633442,41.943794],tags:{highway:"crossing"}},n3600:{id:"n3600",loc:[-85.62477,41.95689]},n3601:{id:"n3601",loc:[-85.621641,41.955015]},n3602:{id:"n3602",loc:[-85.622495,41.960392]},n3603:{id:"n3603",loc:[-85.61918,41.955565]},n3604:{id:"n3604",loc:[-85.620017,41.955505]},n3605:{id:"n3605",loc:[-85.621739,41.956315]},n3606:{id:"n3606",loc:[-85.622957,41.959837]},n3607:{id:"n3607",loc:[-85.620912,41.960919]},n3608:{id:"n3608",loc:[-85.625231,41.956235]},n3609:{id:"n3609",loc:[-85.620976,41.961868]},n361:{id:"n361",loc:[-85.633381,41.94383]},n3610:{id:"n3610",loc:[-85.620956,41.958908]},n3611:{id:"n3611",loc:[-85.619035,41.956139]},n3612:{id:"n3612",loc:[-85.623643,41.958669]},n3613:{id:"n3613",loc:[-85.61949,41.956539]},n3614:{id:"n3614",loc:[-85.621927,41.958242]},n3615:{id:"n3615",loc:[-85.620826,41.955721]},n3616:{id:"n3616",loc:[-85.621202,41.961321]},n3617:{id:"n3617",loc:[-85.624877,41.95594]},n3618:{id:"n3618",loc:[-85.62065,41.958369]},n3619:{id:"n3619",loc:[-85.621524,41.956279]},n362:{id:"n362",loc:[-85.632977,41.944053]},n3620:{id:"n3620",loc:[-85.624662,41.955932]},n3621:{id:"n3621",loc:[-85.623048,41.958509]},n3622:{id:"n3622",loc:[-85.62111,41.95754]},n3623:{id:"n3623",loc:[-85.621508,41.954847]},n3624:{id:"n3624",loc:[-85.620655,41.958601]},n3625:{id:"n3625",loc:[-85.62154,41.954971]},n3626:{id:"n3626",loc:[-85.621691,41.955521]},n3627:{id:"n3627",loc:[-85.62154,41.954739]},n3628:{id:"n3628",loc:[-85.621996,41.959913]},n3629:{id:"n3629",loc:[-85.622286,41.960699]},n363:{id:"n363",loc:[-85.632915,41.943981],tags:{crossing:"marked",highway:"crossing"}},n3630:{id:"n3630",loc:[-85.622844,41.9572]},n3631:{id:"n3631",loc:[-85.620252,41.955446]},n3632:{id:"n3632",loc:[-85.623434,41.957528]},n3633:{id:"n3633",loc:[-85.623429,41.956858]},n3634:{id:"n3634",loc:[-85.622957,41.957137]},n3635:{id:"n3635",loc:[-85.622554,41.959027]},n3636:{id:"n3636",loc:[-85.623289,41.958314]},n3637:{id:"n3637",loc:[-85.622977,41.960855]},n3638:{id:"n3638",loc:[-85.624008,41.956953]},n3639:{id:"n3639",loc:[-85.621278,41.960855]},n364:{id:"n364",loc:[-85.632724,41.943969],tags:{crossing:"marked",highway:"crossing"}},n3640:{id:"n3640",loc:[-85.623128,41.956993]},n3641:{id:"n3641",loc:[-85.622452,41.959183]},n3642:{id:"n3642",loc:[-85.621095,41.961082]},n3643:{id:"n3643",loc:[-85.622011,41.960544]},n3644:{id:"n3644",loc:[-85.621637,41.955385]},n3645:{id:"n3645",loc:[-85.620999,41.959271]},n3646:{id:"n3646",loc:[-85.620044,41.956347]},n3647:{id:"n3647",loc:[-85.621936,41.959682]},n3648:{id:"n3648",loc:[-85.623761,41.95685]},n3649:{id:"n3649",loc:[-85.621239,41.959343]},n365:{id:"n365",loc:[-85.632621,41.944034]},n3650:{id:"n3650",loc:[-85.621073,41.956012]},n3651:{id:"n3651",loc:[-85.621271,41.956184]},n3652:{id:"n3652",loc:[-85.623444,41.95778]},n3653:{id:"n3653",loc:[-85.62125,41.96186]},n3654:{id:"n3654",loc:[-85.62169,41.961059]},n3655:{id:"n3655",loc:[-85.620012,41.955637]},n3656:{id:"n3656",loc:[-85.621058,41.9573]},n3657:{id:"n3657",loc:[-85.621138,41.957663]},n3658:{id:"n3658",loc:[-85.620773,41.957895]},n3659:{id:"n3659",loc:[-85.62007,41.957157]},n366:{id:"n366",loc:[-85.632684,41.944109],tags:{crossing:"marked",highway:"crossing"}},n3660:{id:"n3660",loc:[-85.624534,41.955844]},n3661:{id:"n3661",loc:[-85.621932,41.960807]},n3662:{id:"n3662",loc:[-85.623358,41.958138]},n3663:{id:"n3663",loc:[-85.620456,41.955514]},n3664:{id:"n3664",loc:[-85.623504,41.957607]},n3665:{id:"n3665",loc:[-85.621444,41.960751]},n3666:{id:"n3666",loc:[-85.623492,41.960213]},n3667:{id:"n3667",loc:[-85.621669,41.954655]},n3668:{id:"n3668",loc:[-85.623106,41.958685]},n3669:{id:"n3669",loc:[-85.620922,41.957867]},n367:{id:"n367",loc:[-85.632738,41.944172]},n3670:{id:"n3670",loc:[-85.620092,41.957296]},n3671:{id:"n3671",loc:[-85.621669,41.955222]},n3672:{id:"n3672",loc:[-85.621614,41.960967]},n3673:{id:"n3673",loc:[-85.621691,41.955732]},n3674:{id:"n3674",loc:[-85.619207,41.956419]},n3675:{id:"n3675",loc:[-85.621116,41.956603]},n3676:{id:"n3676",loc:[-85.623311,41.956929]},n3677:{id:"n3677",loc:[-85.625671,41.956499]},n3678:{id:"n3678",loc:[-85.623525,41.956738]},n3679:{id:"n3679",loc:[-85.625381,41.956634]},n368:{id:"n368",loc:[-85.63287,41.944135],tags:{crossing:"marked",highway:"crossing"}},n3680:{id:"n3680",loc:[-85.620096,41.95677]},n3681:{id:"n3681",loc:[-85.623803,41.958745]},n3682:{id:"n3682",loc:[-85.623498,41.958457]},n3683:{id:"n3683",loc:[-85.624223,41.957009]},n3684:{id:"n3684",loc:[-85.620026,41.956946]},n3685:{id:"n3685",loc:[-85.623005,41.960124]},n3686:{id:"n3686",loc:[-85.619073,41.955832]},n3687:{id:"n3687",loc:[-85.621744,41.95501]},n3688:{id:"n3688",loc:[-85.620804,41.958781]},n3689:{id:"n3689",loc:[-85.619844,41.957448]},n369:{id:"n369",loc:[-85.63298,41.944076]},n3690:{id:"n3690",loc:[-85.623713,41.958872]},n3691:{id:"n3691",loc:[-85.622329,41.960507]},n3692:{id:"n3692",loc:[-85.620804,41.956244]},n3693:{id:"n3693",loc:[-85.621818,41.955968]},n3694:{id:"n3694",loc:[-85.621405,41.958697]},n3695:{id:"n3695",loc:[-85.620998,41.960996]},n3696:{id:"n3696",loc:[-85.621621,41.960444]},n3697:{id:"n3697",loc:[-85.620941,41.961637]},n3698:{id:"n3698",loc:[-85.622195,41.958333]},n3699:{id:"n3699",loc:[-85.621668,41.961529]},n37:{id:"n37",loc:[-85.637611,41.945383]},n370:{id:"n370",loc:[-85.633191,41.944471]},n3700:{id:"n3700",loc:[-85.621015,41.957049]},n3701:{id:"n3701",loc:[-85.619368,41.955521]},n3702:{id:"n3702",loc:[-85.651578,41.942534]},n3703:{id:"n3703",loc:[-85.651541,41.943847]},n3704:{id:"n3704",loc:[-85.651365,41.944817]},n3705:{id:"n3705",loc:[-85.651076,41.945985]},n3706:{id:"n3706",loc:[-85.650626,41.947213]},n3707:{id:"n3707",loc:[-85.649669,41.949161]},n3708:{id:"n3708",loc:[-85.641802,41.961801]},n3709:{id:"n3709",loc:[-85.623333,41.961987]},n371:{id:"n371",loc:[-85.633132,41.94372]},n3710:{id:"n3710",loc:[-85.620621,41.965658]},n3711:{id:"n3711",loc:[-85.605673,41.965764]},n3712:{id:"n3712",loc:[-85.605664,41.962094]},n3713:{id:"n3713",loc:[-85.583774,41.962178]},n3714:{id:"n3714",loc:[-85.583774,41.961789]},n3715:{id:"n3715",loc:[-85.581303,41.961783]},n3716:{id:"n3716",loc:[-85.581245,41.958394]},n3717:{id:"n3717",loc:[-85.585299,41.955483]},n3718:{id:"n3718",loc:[-85.585588,41.955331]},n3719:{id:"n3719",loc:[-85.586053,41.955163]},n372:{id:"n372",loc:[-85.633011,41.943788]},n3720:{id:"n3720",loc:[-85.58632,41.955076]},n3721:{id:"n3721",loc:[-85.586478,41.955025]},n3722:{id:"n3722",loc:[-85.58692,41.954947]},n3723:{id:"n3723",loc:[-85.587345,41.954913]},n3724:{id:"n3724",loc:[-85.605592,41.954766]},n3725:{id:"n3725",loc:[-85.605303,41.936236]},n3726:{id:"n3726",loc:[-85.606941,41.936117]},n3727:{id:"n3727",loc:[-85.60876,41.935856]},n3728:{id:"n3728",loc:[-85.610092,41.935451]},n3729:{id:"n3729",loc:[-85.610681,41.935247]},n373:{id:"n373",loc:[-85.632854,41.943632]},n3730:{id:"n3730",loc:[-85.611446,41.934955]},n3731:{id:"n3731",loc:[-85.612057,41.934696]},n3732:{id:"n3732",loc:[-85.613256,41.934084]},n3733:{id:"n3733",loc:[-85.613948,41.933682]},n3734:{id:"n3734",loc:[-85.614638,41.933212]},n3735:{id:"n3735",loc:[-85.619801,41.929305]},n3736:{id:"n3736",loc:[-85.619768,41.925548]},n3737:{id:"n3737",loc:[-85.625761,41.925597]},n3738:{id:"n3738",loc:[-85.6263,41.927323]},n3739:{id:"n3739",loc:[-85.633708,41.927402]},n374:{id:"n374",loc:[-85.632974,41.943565]},n3740:{id:"n3740",loc:[-85.633927,41.929109]},n3741:{id:"n3741",loc:[-85.639213,41.929088]},n3742:{id:"n3742",loc:[-85.639204,41.925488]},n3743:{id:"n3743",loc:[-85.651425,41.925406]},n3744:{id:"n3744",loc:[-85.643386,41.941933]},n3745:{id:"n3745",loc:[-85.642776,41.941161]},n3746:{id:"n3746",loc:[-85.637277,41.948812]},n3747:{id:"n3747",loc:[-85.637366,41.94897]},n3748:{id:"n3748",loc:[-85.637329,41.94889]},n3749:{id:"n3749",loc:[-85.629649,41.952596]},n375:{id:"n375",loc:[-85.632741,41.943351]},n3750:{id:"n3750",loc:[-85.630291,41.954684]},n3751:{id:"n3751",loc:[-85.630284,41.953713]},n3752:{id:"n3752",loc:[-85.630269,41.952463]},n3753:{id:"n3753",loc:[-85.633933,41.949896]},n3754:{id:"n3754",loc:[-85.629339,41.941467]},n3755:{id:"n3755",loc:[-85.629857,41.94316]},n3756:{id:"n3756",loc:[-85.629987,41.944025]},n3757:{id:"n3757",loc:[-85.628538,41.948604]},n3758:{id:"n3758",loc:[-85.627415,41.957442]},n3759:{id:"n3759",loc:[-85.627019,41.957369]},n376:{id:"n376",loc:[-85.63251,41.943481]},n3760:{id:"n3760",loc:[-85.62167,41.952179]},n3761:{id:"n3761",loc:[-85.62167,41.952138]},n3762:{id:"n3762",loc:[-85.621562,41.952139]},n3763:{id:"n3763",loc:[-85.621562,41.952058]},n3764:{id:"n3764",loc:[-85.621476,41.952043]},n3765:{id:"n3765",loc:[-85.621477,41.952132]},n3766:{id:"n3766",loc:[-85.621386,41.952132]},n3767:{id:"n3767",loc:[-85.621387,41.95214]},n3768:{id:"n3768",loc:[-85.621262,41.95214]},n3769:{id:"n3769",loc:[-85.621261,41.952038]},n377:{id:"n377",loc:[-85.632706,41.943715]},n3770:{id:"n3770",loc:[-85.621389,41.952038]},n3771:{id:"n3771",loc:[-85.621389,41.952043]},n3772:{id:"n3772",loc:[-85.620898,41.952024]},n3773:{id:"n3773",loc:[-85.620898,41.952085]},n3774:{id:"n3774",loc:[-85.620774,41.952084]},n3775:{id:"n3775",loc:[-85.620774,41.952023]},n3776:{id:"n3776",loc:[-85.620749,41.952036]},n3777:{id:"n3777",loc:[-85.620723,41.952097]},n3778:{id:"n3778",loc:[-85.626158,41.958996]},n3779:{id:"n3779",loc:[-85.626319,41.958686]},n378:{id:"n378",loc:[-85.638683,41.943295]},n3780:{id:"n3780",loc:[-85.626119,41.958629]},n3781:{id:"n3781",loc:[-85.626064,41.958733]},n3782:{id:"n3782",loc:[-85.626155,41.958759]},n3783:{id:"n3783",loc:[-85.626048,41.958965]},n3784:{id:"n3784",loc:[-85.620648,41.952079]},n3785:{id:"n3785",loc:[-85.63826,41.961213]},n3786:{id:"n3786",loc:[-85.638003,41.961614]},n3787:{id:"n3787",loc:[-85.638817,41.961902]},n3788:{id:"n3788",loc:[-85.639073,41.961501]},n3789:{id:"n3789",loc:[-85.620674,41.952018]},n379:{id:"n379",loc:[-85.638684,41.94323]},n3790:{id:"n3790",loc:[-85.62082,41.952106]},n3791:{id:"n3791",loc:[-85.620819,41.952143]},n3792:{id:"n3792",loc:[-85.620778,41.952143]},n3793:{id:"n3793",loc:[-85.620778,41.952106]},n3794:{id:"n3794",loc:[-85.620563,41.952276]},n3795:{id:"n3795",loc:[-85.620543,41.95238]},n3796:{id:"n3796",loc:[-85.620422,41.952367]},n3797:{id:"n3797",loc:[-85.620441,41.952263]},n3798:{id:"n3798",loc:[-85.620561,41.952266]},n3799:{id:"n3799",loc:[-85.620444,41.952254]},n38:{id:"n38",loc:[-85.63879,41.943295]},n380:{id:"n380",loc:[-85.638627,41.94322]},n3800:{id:"n3800",loc:[-85.620773,41.955585]},n3801:{id:"n3801",loc:[-85.621265,41.955989]},n3802:{id:"n3802",loc:[-85.620692,41.954969]},n3803:{id:"n3803",loc:[-85.620691,41.955367]},n3804:{id:"n3804",loc:[-85.620458,41.952178]},n3805:{id:"n3805",loc:[-85.620575,41.95219]},n3806:{id:"n3806",loc:[-85.617609,41.952712]},n3807:{id:"n3807",loc:[-85.617533,41.952801],tags:{entrance:"yes"}},n3808:{id:"n3808",loc:[-85.616816,41.952911]},n3809:{id:"n3809",loc:[-85.616797,41.952901]},n381:{id:"n381",loc:[-85.638624,41.943294]},n3810:{id:"n3810",loc:[-85.616343,41.952694]},n3811:{id:"n3811",loc:[-85.616336,41.952729]},n3812:{id:"n3812",loc:[-85.616343,41.952772]},n3813:{id:"n3813",loc:[-85.628479,41.948649]},n3814:{id:"n3814",loc:[-85.628413,41.948679]},n3815:{id:"n3815",loc:[-85.628336,41.948694]},n3816:{id:"n3816",loc:[-85.62826,41.948694]},n3817:{id:"n3817",loc:[-85.628185,41.948679]},n3818:{id:"n3818",loc:[-85.628103,41.948649]},n3819:{id:"n3819",loc:[-85.627482,41.948395]},n382:{id:"n382",loc:[-85.638437,41.943291]},n3820:{id:"n3820",loc:[-85.619957,41.951168]},n3821:{id:"n3821",loc:[-85.619955,41.952077]},n3822:{id:"n3822",loc:[-85.619843,41.952666]},n3823:{id:"n3823",loc:[-85.619513,41.95324]},n3824:{id:"n3824",loc:[-85.619163,41.953668]},n3825:{id:"n3825",loc:[-85.618813,41.953947]},n3826:{id:"n3826",loc:[-85.618265,41.954252]},n3827:{id:"n3827",loc:[-85.617691,41.954458]},n3828:{id:"n3828",loc:[-85.616978,41.95459]},n3829:{id:"n3829",loc:[-85.615408,41.954628]},n383:{id:"n383",loc:[-85.63844,41.943209]},n3830:{id:"n3830",loc:[-85.615374,41.951076]},n3831:{id:"n3831",loc:[-85.61932,41.947564]},n3832:{id:"n3832",loc:[-85.610553,41.94755]},n3833:{id:"n3833",loc:[-85.610572,41.951065]},n3834:{id:"n3834",loc:[-85.617548,41.94757]},n3835:{id:"n3835",loc:[-85.619842,41.947939]},n3836:{id:"n3836",loc:[-85.619874,41.950905]},n3837:{id:"n3837",loc:[-85.619695,41.950911]},n3838:{id:"n3838",loc:[-85.617591,41.951078]},n3839:{id:"n3839",loc:[-85.619551,41.951065]},n384:{id:"n384",loc:[-85.632616,41.944021]},n3840:{id:"n3840",loc:[-85.626813,41.947337]},n3841:{id:"n3841",loc:[-85.616371,41.952814]},n3842:{id:"n3842",loc:[-85.617205,41.951308]},n3843:{id:"n3843",loc:[-85.616795,41.950953]},n3844:{id:"n3844",loc:[-85.617441,41.950889]},n3845:{id:"n3845",loc:[-85.619155,41.949377]},n3846:{id:"n3846",loc:[-85.618556,41.949377]},n3847:{id:"n3847",loc:[-85.618557,41.948372]},n3848:{id:"n3848",loc:[-85.619156,41.948372]},n3849:{id:"n3849",loc:[-85.61927,41.949796]},n385:{id:"n385",loc:[-85.632319,41.944172]},n3850:{id:"n3850",loc:[-85.61926,41.948344]},n3851:{id:"n3851",loc:[-85.619219,41.948264]},n3852:{id:"n3852",loc:[-85.619147,41.948196]},n3853:{id:"n3853",loc:[-85.619049,41.948144]},n3854:{id:"n3854",loc:[-85.618942,41.948116]},n3855:{id:"n3855",loc:[-85.618822,41.948109]},n3856:{id:"n3856",loc:[-85.618699,41.94813]},n3857:{id:"n3857",loc:[-85.618937,41.951943]},n3858:{id:"n3858",loc:[-85.616762,41.952222]},n3859:{id:"n3859",loc:[-85.616799,41.95472]},n386:{id:"n386",loc:[-85.63221,41.944066]},n3860:{id:"n3860",loc:[-85.616458,41.954735]},n3861:{id:"n3861",loc:[-85.61763,41.951515]},n3862:{id:"n3862",loc:[-85.617735,41.951572]},n3863:{id:"n3863",loc:[-85.61929,41.951573]},n3864:{id:"n3864",loc:[-85.617134,41.951348]},n3865:{id:"n3865",loc:[-85.616598,41.95192]},n3866:{id:"n3866",loc:[-85.616557,41.951997]},n3867:{id:"n3867",loc:[-85.61658,41.952093]},n3868:{id:"n3868",loc:[-85.616636,41.952145]},n3869:{id:"n3869",loc:[-85.616918,41.952276]},n387:{id:"n387",loc:[-85.632524,41.943912]},n3870:{id:"n3870",loc:[-85.617098,41.952235]},n3871:{id:"n3871",loc:[-85.61892,41.951467]},n3872:{id:"n3872",loc:[-85.618035,41.951473]},n3873:{id:"n3873",loc:[-85.618036,41.951572]},n3874:{id:"n3874",loc:[-85.61892,41.951573]},n3875:{id:"n3875",loc:[-85.618919,41.951957]},n3876:{id:"n3876",loc:[-85.619457,41.952237]},n3877:{id:"n3877",loc:[-85.618178,41.953618]},n3878:{id:"n3878",loc:[-85.617658,41.953366]},n3879:{id:"n3879",loc:[-85.617987,41.953024]},n388:{id:"n388",loc:[-85.632268,41.943621]},n3880:{id:"n3880",loc:[-85.618429,41.953248]},n3881:{id:"n3881",loc:[-85.618554,41.953119]},n3882:{id:"n3882",loc:[-85.618077,41.952868]},n3883:{id:"n3883",loc:[-85.618039,41.952886]},n3884:{id:"n3884",loc:[-85.619375,41.952169]},n3885:{id:"n3885",loc:[-85.618137,41.953538]},n3886:{id:"n3886",loc:[-85.61799,41.953555]},n3887:{id:"n3887",loc:[-85.617729,41.953423]},n3888:{id:"n3888",loc:[-85.618101,41.953029]},n3889:{id:"n3889",loc:[-85.618516,41.953119]},n389:{id:"n389",loc:[-85.631951,41.943773]},n3890:{id:"n3890",loc:[-85.619132,41.952042]},n3891:{id:"n3891",loc:[-85.618235,41.952981]},n3892:{id:"n3892",loc:[-85.618485,41.952425]},n3893:{id:"n3893",loc:[-85.618676,41.952519]},n3894:{id:"n3894",loc:[-85.618942,41.952648]},n3895:{id:"n3895",loc:[-85.618287,41.953122]},n3896:{id:"n3896",loc:[-85.617914,41.953516]},n3897:{id:"n3897",loc:[-85.617836,41.953573]},n3898:{id:"n3898",loc:[-85.616477,41.95289]},n3899:{id:"n3899",loc:[-85.618441,41.953201]},n39:{id:"n39",loc:[-85.619931,41.951013]},n390:{id:"n390",loc:[-85.631981,41.943654]},n3900:{id:"n3900",loc:[-85.617537,41.953335]},n3901:{id:"n3901",loc:[-85.617221,41.953166]},n3902:{id:"n3902",loc:[-85.617253,41.953135]},n3903:{id:"n3903",loc:[-85.617211,41.953114]},n3904:{id:"n3904",loc:[-85.617197,41.95313]},n3905:{id:"n3905",loc:[-85.616802,41.952925]},n3906:{id:"n3906",loc:[-85.616771,41.952928]},n3907:{id:"n3907",loc:[-85.616493,41.952785]},n3908:{id:"n3908",loc:[-85.616823,41.952426]},n3909:{id:"n3909",loc:[-85.617191,41.952616]},n391:{id:"n391",loc:[-85.631886,41.943699]},n3910:{id:"n3910",loc:[-85.61724,41.952559]},n3911:{id:"n3911",loc:[-85.61721,41.952542]},n3912:{id:"n3912",loc:[-85.617395,41.952351]},n3913:{id:"n3913",loc:[-85.617426,41.952368]},n3914:{id:"n3914",loc:[-85.617483,41.952309]},n3915:{id:"n3915",loc:[-85.617332,41.952229]},n3916:{id:"n3916",loc:[-85.617451,41.952102]},n3917:{id:"n3917",loc:[-85.617477,41.952115]},n3918:{id:"n3918",loc:[-85.617658,41.951923]},n3919:{id:"n3919",loc:[-85.617634,41.95191]},n392:{id:"n392",loc:[-85.631807,41.943606]},n3920:{id:"n3920",loc:[-85.617747,41.951786]},n3921:{id:"n3921",loc:[-85.618268,41.952056]},n3922:{id:"n3922",loc:[-85.618211,41.952122]},n3923:{id:"n3923",loc:[-85.618386,41.95222]},n3924:{id:"n3924",loc:[-85.618098,41.952527]},n3925:{id:"n3925",loc:[-85.617916,41.95243]},n3926:{id:"n3926",loc:[-85.617854,41.952498]},n3927:{id:"n3927",loc:[-85.617769,41.952453]},n3928:{id:"n3928",loc:[-85.617476,41.952773]},n3929:{id:"n3929",loc:[-85.617876,41.952973]},n393:{id:"n393",loc:[-85.631902,41.943561]},n3930:{id:"n3930",loc:[-85.617174,41.953638]},n3931:{id:"n3931",loc:[-85.618016,41.953578]},n3932:{id:"n3932",loc:[-85.618107,41.953628]},n3933:{id:"n3933",loc:[-85.618067,41.954268]},n3934:{id:"n3934",loc:[-85.617864,41.954263]},n3935:{id:"n3935",loc:[-85.61762,41.954205]},n3936:{id:"n3936",loc:[-85.617437,41.954103]},n3937:{id:"n3937",loc:[-85.617294,41.953978]},n3938:{id:"n3938",loc:[-85.617217,41.95384]},n3939:{id:"n3939",loc:[-85.616814,41.954327]},n394:{id:"n394",loc:[-85.63236,41.943543]},n3940:{id:"n3940",loc:[-85.616778,41.95381]},n3941:{id:"n3941",loc:[-85.616585,41.953707]},n3942:{id:"n3942",loc:[-85.616458,41.954318]},n3943:{id:"n3943",loc:[-85.616643,41.954345]},n3944:{id:"n3944",loc:[-85.618133,41.951412]},n3945:{id:"n3945",loc:[-85.618326,41.951411]},n3946:{id:"n3946",loc:[-85.618503,41.95141]},n3947:{id:"n3947",loc:[-85.618681,41.951409]},n3948:{id:"n3948",loc:[-85.618868,41.951408]},n3949:{id:"n3949",loc:[-85.617047,41.95136]},n395:{id:"n395",loc:[-85.633839,41.944082]},n3950:{id:"n3950",loc:[-85.616502,41.951946]},n3951:{id:"n3951",loc:[-85.616497,41.952072]},n3952:{id:"n3952",loc:[-85.616565,41.952165]},n3953:{id:"n3953",loc:[-85.616663,41.952218]},n3954:{id:"n3954",loc:[-85.616733,41.952255]},n3955:{id:"n3955",loc:[-85.617238,41.952512],tags:{entrance:"yes"}},n3956:{id:"n3956",loc:[-85.617043,41.952406]},n3957:{id:"n3957",loc:[-85.617691,41.951711]},n3958:{id:"n3958",loc:[-85.617773,41.951679]},n3959:{id:"n3959",loc:[-85.619085,41.951681]},n396:{id:"n396",loc:[-85.63376,41.944097]},n3960:{id:"n3960",loc:[-85.617943,41.952895]},n3961:{id:"n3961",loc:[-85.618039,41.952938]},n3962:{id:"n3962",loc:[-85.61763,41.95336]},n3963:{id:"n3963",loc:[-85.617554,41.95344]},n3964:{id:"n3964",loc:[-85.617381,41.952366],tags:{entrance:"yes"}},n3965:{id:"n3965",loc:[-85.617184,41.952254]},n3966:{id:"n3966",loc:[-85.617208,41.952496]},n3967:{id:"n3967",loc:[-85.617124,41.952581],tags:{entrance:"yes"}},n3968:{id:"n3968",loc:[-85.618094,41.952735]},n3969:{id:"n3969",loc:[-85.617702,41.952525],tags:{entrance:"yes"}},n397:{id:"n397",loc:[-85.63361,41.943957]},n3970:{id:"n3970",loc:[-85.617554,41.952686],tags:{entrance:"yes"}},n3971:{id:"n3971",loc:[-85.617959,41.952878]},n3972:{id:"n3972",loc:[-85.616367,41.952655]},n3973:{id:"n3973",loc:[-85.616416,41.952851]},n3974:{id:"n3974",loc:[-85.619777,41.951075]},n3975:{id:"n3975",loc:[-85.618611,41.94817]},n3976:{id:"n3976",loc:[-85.618538,41.948229]},n3977:{id:"n3977",loc:[-85.617421,41.947559]},n3978:{id:"n3978",loc:[-85.617395,41.951039]},n3979:{id:"n3979",loc:[-85.618488,41.94829]},n398:{id:"n398",loc:[-85.633309,41.943886]},n3980:{id:"n3980",loc:[-85.610238,41.954774]},n3981:{id:"n3981",loc:[-85.617449,41.950756]},n3982:{id:"n3982",loc:[-85.617288,41.951286]},n3983:{id:"n3983",loc:[-85.61745,41.950197]},n3984:{id:"n3984",loc:[-85.617436,41.948908]},n3985:{id:"n3985",loc:[-85.615915,41.953804]},n3986:{id:"n3986",loc:[-85.615953,41.953968]},n3987:{id:"n3987",loc:[-85.616031,41.954085]},n3988:{id:"n3988",loc:[-85.616135,41.954181]},n3989:{id:"n3989",loc:[-85.616273,41.954263]},n399:{id:"n399",loc:[-85.633226,41.943931]},n3990:{id:"n3990",loc:[-85.618327,41.951083]},n3991:{id:"n3991",loc:[-85.618135,41.951084]},n3992:{id:"n3992",loc:[-85.618503,41.951082]},n3993:{id:"n3993",loc:[-85.618682,41.951081]},n3994:{id:"n3994",loc:[-85.618864,41.951082]},n3995:{id:"n3995",loc:[-85.616761,41.950101]},n3996:{id:"n3996",loc:[-85.617317,41.947558]},n3997:{id:"n3997",loc:[-85.617336,41.948883]},n3998:{id:"n3998",loc:[-85.616779,41.949295]},n3999:{id:"n3999",loc:[-85.616754,41.949349]},n4:{id:"n4",loc:[-85.622764,41.950892],tags:{highway:"stop",direction:"forward",stop:"minor"}},n40:{id:"n40",loc:[-85.619841,41.951037]},n400:{id:"n400",loc:[-85.63326,41.943966]},n4000:{id:"n4000",loc:[-85.616761,41.950865]},n4001:{id:"n4001",loc:[-85.616883,41.951041]},n4002:{id:"n4002",loc:[-85.617004,41.951142]},n4003:{id:"n4003",loc:[-85.617062,41.951248]},n4004:{id:"n4004",loc:[-85.616809,41.949273]},n4005:{id:"n4005",loc:[-85.616755,41.949489]},n4006:{id:"n4006",loc:[-85.616759,41.949971]},n4007:{id:"n4007",loc:[-85.616757,41.949702]},n4008:{id:"n4008",loc:[-85.618456,41.94836]},n4009:{id:"n4009",loc:[-85.618447,41.948428]},n401:{id:"n401",loc:[-85.63324,41.943976]},n4010:{id:"n4010",loc:[-85.618437,41.949322]},n4011:{id:"n4011",loc:[-85.618447,41.949418]},n4012:{id:"n4012",loc:[-85.618478,41.949491]},n4013:{id:"n4013",loc:[-85.618535,41.949559]},n4014:{id:"n4014",loc:[-85.618623,41.94962]},n4015:{id:"n4015",loc:[-85.618721,41.94966]},n4016:{id:"n4016",loc:[-85.618838,41.949674]},n4017:{id:"n4017",loc:[-85.618967,41.949667]},n4018:{id:"n4018",loc:[-85.619065,41.949632]},n4019:{id:"n4019",loc:[-85.61915,41.949578]},n402:{id:"n402",loc:[-85.63327,41.944006]},n4020:{id:"n4020",loc:[-85.619216,41.949507]},n4021:{id:"n4021",loc:[-85.61927,41.949399]},n4022:{id:"n4022",loc:[-85.619074,41.947639]},n4023:{id:"n4023",loc:[-85.619073,41.947793]},n4024:{id:"n4024",loc:[-85.618912,41.947793]},n4025:{id:"n4025",loc:[-85.618911,41.947947]},n4026:{id:"n4026",loc:[-85.618752,41.947947]},n4027:{id:"n4027",loc:[-85.618754,41.947637]},n4028:{id:"n4028",loc:[-85.617896,41.947599]},n4029:{id:"n4029",loc:[-85.617898,41.947811]},n403:{id:"n403",loc:[-85.633278,41.944002]},n4030:{id:"n4030",loc:[-85.617717,41.947812]},n4031:{id:"n4031",loc:[-85.617715,41.9476]},n4032:{id:"n4032",loc:[-85.619003,41.949828]},n4033:{id:"n4033",loc:[-85.619003,41.949882]},n4034:{id:"n4034",loc:[-85.618926,41.949882]},n4035:{id:"n4035",loc:[-85.618926,41.949828]},n4036:{id:"n4036",loc:[-85.618861,41.949809]},n4037:{id:"n4037",loc:[-85.618861,41.949898]},n4038:{id:"n4038",loc:[-85.618688,41.949898]},n4039:{id:"n4039",loc:[-85.618687,41.94981]},n404:{id:"n404",loc:[-85.63331,41.944036]},n4040:{id:"n4040",loc:[-85.618349,41.949473]},n4041:{id:"n4041",loc:[-85.618287,41.949473]},n4042:{id:"n4042",loc:[-85.618287,41.94942]},n4043:{id:"n4043",loc:[-85.618348,41.949419]},n4044:{id:"n4044",loc:[-85.62316,41.951604]},n4045:{id:"n4045",loc:[-85.623026,41.951605]},n4046:{id:"n4046",loc:[-85.623023,41.951466]},n4047:{id:"n4047",loc:[-85.623134,41.951465]},n4048:{id:"n4048",loc:[-85.623136,41.951539]},n4049:{id:"n4049",loc:[-85.623159,41.951539]},n405:{id:"n405",loc:[-85.633348,41.944015]},n4050:{id:"n4050",loc:[-85.623025,41.95155]},n4051:{id:"n4051",loc:[-85.622955,41.951551]},n4052:{id:"n4052",loc:[-85.622953,41.951507]},n4053:{id:"n4053",loc:[-85.623024,41.951506]},n4054:{id:"n4054",loc:[-85.623318,41.951242]},n4055:{id:"n4055",loc:[-85.623175,41.951241]},n4056:{id:"n4056",loc:[-85.623176,41.951153]},n4057:{id:"n4057",loc:[-85.623319,41.951154]},n4058:{id:"n4058",loc:[-85.623077,41.951191]},n4059:{id:"n4059",loc:[-85.622973,41.951191]},n406:{id:"n406",loc:[-85.63338,41.944048]},n4060:{id:"n4060",loc:[-85.622972,41.951349]},n4061:{id:"n4061",loc:[-85.623059,41.95135]},n4062:{id:"n4062",loc:[-85.62306,41.951301]},n4063:{id:"n4063",loc:[-85.623077,41.951301]},n4064:{id:"n4064",loc:[-85.623117,41.951405]},n4065:{id:"n4065",loc:[-85.62312,41.951087]},n4066:{id:"n4066",loc:[-85.623118,41.951274]},n4067:{id:"n4067",loc:[-85.62328,41.951275]},n4068:{id:"n4068",loc:[-85.62328,41.951242]},n4069:{id:"n4069",loc:[-85.623179,41.951392]},n407:{id:"n407",loc:[-85.633431,41.94402]},n4070:{id:"n4070",loc:[-85.623141,41.951392]},n4071:{id:"n4071",loc:[-85.623142,41.95136]},n4072:{id:"n4072",loc:[-85.623179,41.951361]},n4073:{id:"n4073",loc:[-85.622565,41.951639]},n4074:{id:"n4074",loc:[-85.622565,41.951741]},n4075:{id:"n4075",loc:[-85.622463,41.95174]},n4076:{id:"n4076",loc:[-85.622463,41.95173]},n4077:{id:"n4077",loc:[-85.622442,41.95173]},n4078:{id:"n4078",loc:[-85.622442,41.951742]},n4079:{id:"n4079",loc:[-85.622361,41.951742]},n408:{id:"n408",loc:[-85.633425,41.944014]},n4080:{id:"n4080",loc:[-85.622362,41.951667]},n4081:{id:"n4081",loc:[-85.622441,41.951667]},n4082:{id:"n4082",loc:[-85.622441,41.951688]},n4083:{id:"n4083",loc:[-85.622461,41.951688]},n4084:{id:"n4084",loc:[-85.622461,41.951638]},n4085:{id:"n4085",loc:[-85.62255,41.951587]},n4086:{id:"n4086",loc:[-85.622449,41.95159]},n4087:{id:"n4087",loc:[-85.622441,41.951448]},n4088:{id:"n4088",loc:[-85.62253,41.951445]},n4089:{id:"n4089",loc:[-85.622532,41.951486]},n409:{id:"n409",loc:[-85.633457,41.943997]},n4090:{id:"n4090",loc:[-85.622555,41.951485]},n4091:{id:"n4091",loc:[-85.622558,41.951531]},n4092:{id:"n4092",loc:[-85.622547,41.951531]},n4093:{id:"n4093",loc:[-85.622451,41.95159]},n4094:{id:"n4094",loc:[-85.622452,41.95161]},n4095:{id:"n4095",loc:[-85.622106,41.951617]},n4096:{id:"n4096",loc:[-85.622133,41.951443]},n4097:{id:"n4097",loc:[-85.622552,41.951379]},n4098:{id:"n4098",loc:[-85.622443,41.95138]},n4099:{id:"n4099",loc:[-85.622441,41.951281]},n41:{id:"n41",loc:[-85.636233,41.942764]},n410:{id:"n410",loc:[-85.633429,41.943969]},n4100:{id:"n4100",loc:[-85.62255,41.95128]},n4101:{id:"n4101",loc:[-85.622541,41.951437]},n4102:{id:"n4102",loc:[-85.622441,41.951438]},n4103:{id:"n4103",loc:[-85.621561,41.951444]},n4104:{id:"n4104",loc:[-85.622302,41.951479]},n4105:{id:"n4105",loc:[-85.6223,41.95152]},n4106:{id:"n4106",loc:[-85.622169,41.951517]},n4107:{id:"n4107",loc:[-85.622171,41.951476]},n4108:{id:"n4108",loc:[-85.622543,41.951228]},n4109:{id:"n4109",loc:[-85.622433,41.951228]},n411:{id:"n411",loc:[-85.633442,41.943962]},n4110:{id:"n4110",loc:[-85.622433,41.951133]},n4111:{id:"n4111",loc:[-85.622543,41.951133]},n4112:{id:"n4112",loc:[-85.622356,41.951256]},n4113:{id:"n4113",loc:[-85.622293,41.951256]},n4114:{id:"n4114",loc:[-85.622292,41.9512]},n4115:{id:"n4115",loc:[-85.622313,41.9512]},n4116:{id:"n4116",loc:[-85.622312,41.951173]},n4117:{id:"n4117",loc:[-85.622364,41.951173]},n4118:{id:"n4118",loc:[-85.622365,41.951231]},n4119:{id:"n4119",loc:[-85.622355,41.951231]},n412:{id:"n412",loc:[-85.633411,41.943932]},n4120:{id:"n4120",loc:[-85.62197,41.951155]},n4121:{id:"n4121",loc:[-85.62197,41.951213]},n4122:{id:"n4122",loc:[-85.621848,41.951213]},n4123:{id:"n4123",loc:[-85.621848,41.951155]},n4124:{id:"n4124",loc:[-85.622193,41.951268]},n4125:{id:"n4125",loc:[-85.622194,41.951305]},n4126:{id:"n4126",loc:[-85.622121,41.951306]},n4127:{id:"n4127",loc:[-85.622121,41.951322]},n4128:{id:"n4128",loc:[-85.621984,41.951324]},n4129:{id:"n4129",loc:[-85.621983,41.951271]},n413:{id:"n413",loc:[-85.633421,41.943926]},n4130:{id:"n4130",loc:[-85.622171,41.9514]},n4131:{id:"n4131",loc:[-85.622148,41.951382]},n4132:{id:"n4132",loc:[-85.6221,41.951414]},n4133:{id:"n4133",loc:[-85.622122,41.951433]},n4134:{id:"n4134",loc:[-85.621782,41.951148]},n4135:{id:"n4135",loc:[-85.621783,41.951219]},n4136:{id:"n4136",loc:[-85.62164,41.951221]},n4137:{id:"n4137",loc:[-85.62164,41.951236]},n4138:{id:"n4138",loc:[-85.621556,41.951237]},n4139:{id:"n4139",loc:[-85.621555,41.95117]},n414:{id:"n414",loc:[-85.633376,41.94388]},n4140:{id:"n4140",loc:[-85.621644,41.951169]},n4141:{id:"n4141",loc:[-85.621643,41.951139]},n4142:{id:"n4142",loc:[-85.621719,41.951138]},n4143:{id:"n4143",loc:[-85.621719,41.951148]},n4144:{id:"n4144",loc:[-85.621409,41.951322]},n4145:{id:"n4145",loc:[-85.621338,41.951322]},n4146:{id:"n4146",loc:[-85.621336,41.95115]},n4147:{id:"n4147",loc:[-85.621521,41.951149]},n4148:{id:"n4148",loc:[-85.621522,41.951228]},n4149:{id:"n4149",loc:[-85.621408,41.951228]},n415:{id:"n415",loc:[-85.633348,41.943895]},n4150:{id:"n4150",loc:[-85.621284,41.951219]},n4151:{id:"n4151",loc:[-85.621153,41.951219]},n4152:{id:"n4152",loc:[-85.621152,41.951152]},n4153:{id:"n4153",loc:[-85.621283,41.951152]},n4154:{id:"n4154",loc:[-85.621159,41.951241]},n4155:{id:"n4155",loc:[-85.62116,41.951301]},n4156:{id:"n4156",loc:[-85.621088,41.951302]},n4157:{id:"n4157",loc:[-85.621088,41.951241]},n4158:{id:"n4158",loc:[-85.621049,41.951158]},n4159:{id:"n4159",loc:[-85.62105,41.951229]},n416:{id:"n416",loc:[-85.633341,41.943888]},n4160:{id:"n4160",loc:[-85.620976,41.951229]},n4161:{id:"n4161",loc:[-85.620977,41.951295]},n4162:{id:"n4162",loc:[-85.620887,41.951296]},n4163:{id:"n4163",loc:[-85.620886,41.951229]},n4164:{id:"n4164",loc:[-85.620862,41.951229]},n4165:{id:"n4165",loc:[-85.620861,41.951159]},n4166:{id:"n4166",loc:[-85.620626,41.951133]},n4167:{id:"n4167",loc:[-85.620626,41.951205]},n4168:{id:"n4168",loc:[-85.620412,41.951206]},n4169:{id:"n4169",loc:[-85.620411,41.951134]},n417:{id:"n417",loc:[-85.633321,41.943898]},n4170:{id:"n4170",loc:[-85.621775,41.951443]},n4171:{id:"n4171",loc:[-85.621777,41.951264]},n4172:{id:"n4172",loc:[-85.621565,41.951654]},n4173:{id:"n4173",loc:[-85.621331,41.951439]},n4174:{id:"n4174",loc:[-85.621031,41.951443]},n4175:{id:"n4175",loc:[-85.621836,41.951724]},n4176:{id:"n4176",loc:[-85.621834,41.951621]},n4177:{id:"n4177",loc:[-85.62197,41.951619]},n4178:{id:"n4178",loc:[-85.621972,41.951722]},n4179:{id:"n4179",loc:[-85.621772,41.951638]},n418:{id:"n418",loc:[-85.633547,41.943896]},n4180:{id:"n4180",loc:[-85.621772,41.951715]},n4181:{id:"n4181",loc:[-85.621699,41.951716]},n4182:{id:"n4182",loc:[-85.6217,41.951722]},n4183:{id:"n4183",loc:[-85.621641,41.951722]},n4184:{id:"n4184",loc:[-85.62164,41.951639]},n4185:{id:"n4185",loc:[-85.621505,41.951655]},n4186:{id:"n4186",loc:[-85.621505,41.951729]},n4187:{id:"n4187",loc:[-85.621389,41.951729]},n4188:{id:"n4188",loc:[-85.62139,41.951654]},n4189:{id:"n4189",loc:[-85.621105,41.951635]},n419:{id:"n419",loc:[-85.633467,41.944075]},n4190:{id:"n4190",loc:[-85.621104,41.951576]},n4191:{id:"n4191",loc:[-85.621168,41.951576]},n4192:{id:"n4192",loc:[-85.621168,41.951595]},n4193:{id:"n4193",loc:[-85.621261,41.951595]},n4194:{id:"n4194",loc:[-85.621261,41.951646]},n4195:{id:"n4195",loc:[-85.621294,41.951646]},n4196:{id:"n4196",loc:[-85.621294,41.951732]},n4197:{id:"n4197",loc:[-85.621251,41.951732]},n4198:{id:"n4198",loc:[-85.621251,41.95174]},n4199:{id:"n4199",loc:[-85.621175,41.951741]},n42:{id:"n42",loc:[-85.635996,41.942727]},n420:{id:"n420",loc:[-85.633578,41.944055]},n4200:{id:"n4200",loc:[-85.621175,41.951651]},n4201:{id:"n4201",loc:[-85.621189,41.951651]},n4202:{id:"n4202",loc:[-85.621189,41.951635]},n4203:{id:"n4203",loc:[-85.620554,41.951641]},n4204:{id:"n4204",loc:[-85.620555,41.951742]},n4205:{id:"n4205",loc:[-85.620719,41.951742]},n4206:{id:"n4206",loc:[-85.620719,41.951731]},n4207:{id:"n4207",loc:[-85.620803,41.95173]},n4208:{id:"n4208",loc:[-85.620803,41.951603]},n4209:{id:"n4209",loc:[-85.62072,41.951603]},n421:{id:"n421",loc:[-85.633462,41.944125]},n4210:{id:"n4210",loc:[-85.620721,41.951641]},n4211:{id:"n4211",loc:[-85.620269,41.953053]},n4212:{id:"n4212",loc:[-85.620229,41.953051]},n4213:{id:"n4213",loc:[-85.620231,41.953013]},n4214:{id:"n4214",loc:[-85.620271,41.953015]},n4215:{id:"n4215",loc:[-85.620215,41.953133]},n4216:{id:"n4216",loc:[-85.62013,41.953134]},n4217:{id:"n4217",loc:[-85.620129,41.953083]},n4218:{id:"n4218",loc:[-85.620214,41.953082]},n4219:{id:"n4219",loc:[-85.62016,41.953272]},n422:{id:"n422",loc:[-85.633372,41.944061]},n4220:{id:"n4220",loc:[-85.620046,41.953273]},n4221:{id:"n4221",loc:[-85.620045,41.953171]},n4222:{id:"n4222",loc:[-85.620088,41.953171]},n4223:{id:"n4223",loc:[-85.620087,41.953162]},n4224:{id:"n4224",loc:[-85.620121,41.953162]},n4225:{id:"n4225",loc:[-85.620121,41.953173]},n4226:{id:"n4226",loc:[-85.620157,41.953173]},n4227:{id:"n4227",loc:[-85.620158,41.953196]},n4228:{id:"n4228",loc:[-85.620189,41.953196]},n4229:{id:"n4229",loc:[-85.620189,41.953246]},n423:{id:"n423",loc:[-85.633509,41.943981]},n4230:{id:"n4230",loc:[-85.62016,41.953246]},n4231:{id:"n4231",loc:[-85.6195,41.954012]},n4232:{id:"n4232",loc:[-85.619438,41.954057]},n4233:{id:"n4233",loc:[-85.619418,41.954043]},n4234:{id:"n4234",loc:[-85.619381,41.954069]},n4235:{id:"n4235",loc:[-85.619399,41.954083]},n4236:{id:"n4236",loc:[-85.619339,41.954126]},n4237:{id:"n4237",loc:[-85.619584,41.954313]},n4238:{id:"n4238",loc:[-85.619743,41.954198]},n4239:{id:"n4239",loc:[-85.619453,41.954727]},n424:{id:"n424",loc:[-85.635421,41.945367]},n4240:{id:"n4240",loc:[-85.619503,41.954581]},n4241:{id:"n4241",loc:[-85.619597,41.954472]},n4242:{id:"n4242",loc:[-85.619862,41.95419]},n4243:{id:"n4243",loc:[-85.619506,41.953907]},n4244:{id:"n4244",loc:[-85.619261,41.9541]},n4245:{id:"n4245",loc:[-85.619246,41.954139]},n4246:{id:"n4246",loc:[-85.619244,41.9542]},n4247:{id:"n4247",loc:[-85.619259,41.954243]},n4248:{id:"n4248",loc:[-85.619285,41.954274]},n4249:{id:"n4249",loc:[-85.619123,41.954381]},n425:{id:"n425",loc:[-85.634425,41.943552]},n4250:{id:"n4250",loc:[-85.619641,41.954607]},n4251:{id:"n4251",loc:[-85.619383,41.954615]},n4252:{id:"n4252",loc:[-85.61896,41.954391]},n4253:{id:"n4253",loc:[-85.619211,41.954178]},n4254:{id:"n4254",loc:[-85.619115,41.954102]},n4255:{id:"n4255",loc:[-85.619519,41.953821]},n4256:{id:"n4256",loc:[-85.619956,41.954156]},n4257:{id:"n4257",loc:[-85.619851,41.954266]},n4258:{id:"n4258",loc:[-85.619779,41.95436]},n4259:{id:"n4259",loc:[-85.620525,41.954364]},n426:{id:"n426",loc:[-85.634248,41.943654]},n4260:{id:"n4260",loc:[-85.620398,41.954365]},n4261:{id:"n4261",loc:[-85.620398,41.954324]},n4262:{id:"n4262",loc:[-85.620525,41.954323]},n4263:{id:"n4263",loc:[-85.620359,41.954588]},n4264:{id:"n4264",loc:[-85.620321,41.954588]},n4265:{id:"n4265",loc:[-85.620321,41.954599]},n4266:{id:"n4266",loc:[-85.620296,41.954599]},n4267:{id:"n4267",loc:[-85.620296,41.954587]},n4268:{id:"n4268",loc:[-85.620262,41.954588]},n4269:{id:"n4269",loc:[-85.620261,41.954516]},n427:{id:"n427",loc:[-85.634177,41.943585]},n4270:{id:"n4270",loc:[-85.620282,41.954516]},n4271:{id:"n4271",loc:[-85.620282,41.954373]},n4272:{id:"n4272",loc:[-85.620378,41.954373]},n4273:{id:"n4273",loc:[-85.620379,41.954486]},n4274:{id:"n4274",loc:[-85.620348,41.954486]},n4275:{id:"n4275",loc:[-85.620348,41.954537]},n4276:{id:"n4276",loc:[-85.620359,41.954537]},n4277:{id:"n4277",loc:[-85.620463,41.95521]},n4278:{id:"n4278",loc:[-85.620409,41.955273]},n4279:{id:"n4279",loc:[-85.620205,41.955177]},n428:{id:"n428",loc:[-85.634354,41.943484]},n4280:{id:"n4280",loc:[-85.620288,41.955079]},n4281:{id:"n4281",loc:[-85.620379,41.955121]},n4282:{id:"n4282",loc:[-85.620349,41.955157]},n4283:{id:"n4283",loc:[-85.620083,41.955101]},n4284:{id:"n4284",loc:[-85.620083,41.954986]},n4285:{id:"n4285",loc:[-85.620016,41.954986]},n4286:{id:"n4286",loc:[-85.620016,41.954999]},n4287:{id:"n4287",loc:[-85.619941,41.954999]},n4288:{id:"n4288",loc:[-85.619941,41.954988]},n4289:{id:"n4289",loc:[-85.619815,41.954988]},n429:{id:"n429",loc:[-85.638577,41.943212]},n4290:{id:"n4290",loc:[-85.619815,41.955075]},n4291:{id:"n4291",loc:[-85.619948,41.955075]},n4292:{id:"n4292",loc:[-85.619948,41.955082]},n4293:{id:"n4293",loc:[-85.620004,41.955082]},n4294:{id:"n4294",loc:[-85.620004,41.955101]},n4295:{id:"n4295",loc:[-85.619293,41.955127]},n4296:{id:"n4296",loc:[-85.619208,41.955124]},n4297:{id:"n4297",loc:[-85.619212,41.955061]},n4298:{id:"n4298",loc:[-85.619297,41.955064]},n4299:{id:"n4299",loc:[-85.619068,41.954936]},n43:{id:"n43",loc:[-85.637047,41.943054]},n430:{id:"n430",loc:[-85.638576,41.943219]},n4300:{id:"n4300",loc:[-85.619003,41.954936]},n4301:{id:"n4301",loc:[-85.619004,41.955003]},n4302:{id:"n4302",loc:[-85.618994,41.955003]},n4303:{id:"n4303",loc:[-85.618994,41.955016]},n4304:{id:"n4304",loc:[-85.618973,41.955016]},n4305:{id:"n4305",loc:[-85.618973,41.955071]},n4306:{id:"n4306",loc:[-85.619061,41.955071]},n4307:{id:"n4307",loc:[-85.61906,41.955024]},n4308:{id:"n4308",loc:[-85.619105,41.955024]},n4309:{id:"n4309",loc:[-85.619105,41.954956]},n431:{id:"n431",loc:[-85.638653,41.943078]},n4310:{id:"n4310",loc:[-85.619068,41.954956]},n4311:{id:"n4311",loc:[-85.618294,41.954596]},n4312:{id:"n4312",loc:[-85.618235,41.954602]},n4313:{id:"n4313",loc:[-85.618222,41.954535]},n4314:{id:"n4314",loc:[-85.618281,41.954529]},n4315:{id:"n4315",loc:[-85.618593,41.954556]},n4316:{id:"n4316",loc:[-85.618551,41.954565]},n4317:{id:"n4317",loc:[-85.618545,41.954552]},n4318:{id:"n4318",loc:[-85.618493,41.954563]},n4319:{id:"n4319",loc:[-85.618449,41.954455]},n432:{id:"n432",loc:[-85.638654,41.943148]},n4320:{id:"n4320",loc:[-85.618544,41.954434]},n4321:{id:"n4321",loc:[-85.622545,41.950775]},n4322:{id:"n4322",loc:[-85.622546,41.950843]},n4323:{id:"n4323",loc:[-85.622503,41.950844]},n4324:{id:"n4324",loc:[-85.622503,41.950853]},n4325:{id:"n4325",loc:[-85.622479,41.950853]},n4326:{id:"n4326",loc:[-85.622478,41.950843]},n4327:{id:"n4327",loc:[-85.622425,41.950843]},n4328:{id:"n4328",loc:[-85.622425,41.950808]},n4329:{id:"n4329",loc:[-85.622366,41.950809]},n433:{id:"n433",loc:[-85.638387,41.943151]},n4330:{id:"n4330",loc:[-85.622364,41.950673]},n4331:{id:"n4331",loc:[-85.622448,41.950673]},n4332:{id:"n4332",loc:[-85.622449,41.950732]},n4333:{id:"n4333",loc:[-85.622479,41.950731]},n4334:{id:"n4334",loc:[-85.622479,41.950775]},n4335:{id:"n4335",loc:[-85.621909,41.950641]},n4336:{id:"n4336",loc:[-85.621864,41.950641]},n4337:{id:"n4337",loc:[-85.621865,41.950567]},n4338:{id:"n4338",loc:[-85.62191,41.950567]},n4339:{id:"n4339",loc:[-85.621787,41.950829]},n434:{id:"n434",loc:[-85.638386,41.94308]},n4340:{id:"n4340",loc:[-85.621786,41.950775]},n4341:{id:"n4341",loc:[-85.621588,41.950776]},n4342:{id:"n4342",loc:[-85.621589,41.950848]},n4343:{id:"n4343",loc:[-85.621737,41.950847]},n4344:{id:"n4344",loc:[-85.621737,41.950829]},n4345:{id:"n4345",loc:[-85.621509,41.950846]},n4346:{id:"n4346",loc:[-85.621399,41.950846]},n4347:{id:"n4347",loc:[-85.621398,41.95073]},n4348:{id:"n4348",loc:[-85.621509,41.95073]},n4349:{id:"n4349",loc:[-85.621217,41.950841]},n435:{id:"n435",loc:[-85.634427,41.943533]},n4350:{id:"n4350",loc:[-85.6211,41.95084]},n4351:{id:"n4351",loc:[-85.6211,41.950777]},n4352:{id:"n4352",loc:[-85.621218,41.950778]},n4353:{id:"n4353",loc:[-85.621055,41.950764]},n4354:{id:"n4354",loc:[-85.621054,41.950826]},n4355:{id:"n4355",loc:[-85.620988,41.950826]},n4356:{id:"n4356",loc:[-85.620988,41.950843]},n4357:{id:"n4357",loc:[-85.620842,41.950843]},n4358:{id:"n4358",loc:[-85.620842,41.950764]},n4359:{id:"n4359",loc:[-85.620825,41.950922]},n436:{id:"n436",loc:[-85.63428,41.943229]},n4360:{id:"n4360",loc:[-85.620824,41.950553]},n4361:{id:"n4361",loc:[-85.620543,41.950771]},n4362:{id:"n4362",loc:[-85.620431,41.950772]},n4363:{id:"n4363",loc:[-85.62043,41.950585]},n4364:{id:"n4364",loc:[-85.620542,41.950585]},n4365:{id:"n4365",loc:[-85.62068,41.950505]},n4366:{id:"n4366",loc:[-85.620681,41.950552]},n4367:{id:"n4367",loc:[-85.620589,41.950553]},n4368:{id:"n4368",loc:[-85.620588,41.950506]},n4369:{id:"n4369",loc:[-85.620539,41.950407]},n437:{id:"n437",loc:[-85.634499,41.943461]},n4370:{id:"n4370",loc:[-85.62054,41.950504]},n4371:{id:"n4371",loc:[-85.620416,41.950504]},n4372:{id:"n4372",loc:[-85.620416,41.950408]},n4373:{id:"n4373",loc:[-85.620742,41.95038]},n4374:{id:"n4374",loc:[-85.620527,41.95038]},n4375:{id:"n4375",loc:[-85.620528,41.950408]},n4376:{id:"n4376",loc:[-85.622449,41.950373]},n4377:{id:"n4377",loc:[-85.622452,41.950397]},n4378:{id:"n4378",loc:[-85.622336,41.950404]},n4379:{id:"n4379",loc:[-85.622333,41.950379]},n438:{id:"n438",loc:[-85.634514,41.943486]},n4380:{id:"n4380",loc:[-85.622263,41.950324]},n4381:{id:"n4381",loc:[-85.622261,41.950256]},n4382:{id:"n4382",loc:[-85.62236,41.950254]},n4383:{id:"n4383",loc:[-85.62236,41.95027]},n4384:{id:"n4384",loc:[-85.622402,41.950281]},n4385:{id:"n4385",loc:[-85.622403,41.9503]},n4386:{id:"n4386",loc:[-85.622439,41.950299]},n4387:{id:"n4387",loc:[-85.62244,41.950334]},n4388:{id:"n4388",loc:[-85.622414,41.950335]},n4389:{id:"n4389",loc:[-85.622414,41.95036]},n439:{id:"n439",loc:[-85.63452,41.943511]},n4390:{id:"n4390",loc:[-85.62231,41.950362]},n4391:{id:"n4391",loc:[-85.622309,41.950323]},n4392:{id:"n4392",loc:[-85.622015,41.950539]},n4393:{id:"n4393",loc:[-85.621909,41.95054]},n4394:{id:"n4394",loc:[-85.621909,41.950472]},n4395:{id:"n4395",loc:[-85.622015,41.950471]},n4396:{id:"n4396",loc:[-85.62199,41.950439]},n4397:{id:"n4397",loc:[-85.621956,41.95044]},n4398:{id:"n4398",loc:[-85.621955,41.950405]},n4399:{id:"n4399",loc:[-85.621988,41.950404]},n44:{id:"n44",loc:[-85.636799,41.943055]},n440:{id:"n440",loc:[-85.63451,41.943534]},n4400:{id:"n4400",loc:[-85.621668,41.950418]},n4401:{id:"n4401",loc:[-85.621667,41.950343]},n4402:{id:"n4402",loc:[-85.621745,41.950342]},n4403:{id:"n4403",loc:[-85.621744,41.950306]},n4404:{id:"n4404",loc:[-85.621764,41.950306]},n4405:{id:"n4405",loc:[-85.621763,41.950254]},n4406:{id:"n4406",loc:[-85.621861,41.950253]},n4407:{id:"n4407",loc:[-85.621861,41.950274]},n4408:{id:"n4408",loc:[-85.621896,41.950273]},n4409:{id:"n4409",loc:[-85.621898,41.950389]},n441:{id:"n441",loc:[-85.634483,41.943556]},n4410:{id:"n4410",loc:[-85.621843,41.95039]},n4411:{id:"n4411",loc:[-85.621843,41.950425]},n4412:{id:"n4412",loc:[-85.621789,41.950425]},n4413:{id:"n4413",loc:[-85.621789,41.950386]},n4414:{id:"n4414",loc:[-85.621752,41.950387]},n4415:{id:"n4415",loc:[-85.621753,41.950417]},n4416:{id:"n4416",loc:[-85.621556,41.950562]},n4417:{id:"n4417",loc:[-85.621552,41.950217]},n4418:{id:"n4418",loc:[-85.621788,41.950562]},n4419:{id:"n4419",loc:[-85.621155,41.950562]},n442:{id:"n442",loc:[-85.63419,41.943713]},n4420:{id:"n4420",loc:[-85.622473,41.950551]},n4421:{id:"n4421",loc:[-85.622043,41.950551]},n4422:{id:"n4422",loc:[-85.62142,41.950454]},n4423:{id:"n4423",loc:[-85.621315,41.950455]},n4424:{id:"n4424",loc:[-85.621313,41.950311]},n4425:{id:"n4425",loc:[-85.621388,41.950311]},n4426:{id:"n4426",loc:[-85.621387,41.950261]},n4427:{id:"n4427",loc:[-85.621468,41.95026]},n4428:{id:"n4428",loc:[-85.621468,41.950271]},n4429:{id:"n4429",loc:[-85.621503,41.95027]},n443:{id:"n443",loc:[-85.634462,41.943294]},n4430:{id:"n4430",loc:[-85.621505,41.950353]},n4431:{id:"n4431",loc:[-85.621483,41.950354]},n4432:{id:"n4432",loc:[-85.621483,41.950392]},n4433:{id:"n4433",loc:[-85.621419,41.950393]},n4434:{id:"n4434",loc:[-85.621213,41.95039]},n4435:{id:"n4435",loc:[-85.621127,41.950391]},n4436:{id:"n4436",loc:[-85.621126,41.950357]},n4437:{id:"n4437",loc:[-85.621094,41.950357]},n4438:{id:"n4438",loc:[-85.621094,41.950391]},n4439:{id:"n4439",loc:[-85.620977,41.950392]},n444:{id:"n444",loc:[-85.634298,41.943389]},n4440:{id:"n4440",loc:[-85.620975,41.950278]},n4441:{id:"n4441",loc:[-85.621087,41.950277]},n4442:{id:"n4442",loc:[-85.621088,41.950331]},n4443:{id:"n4443",loc:[-85.621211,41.950312]},n4444:{id:"n4444",loc:[-85.621104,41.950313]},n4445:{id:"n4445",loc:[-85.621105,41.950331]},n4446:{id:"n4446",loc:[-85.620706,41.950328]},n4447:{id:"n4447",loc:[-85.620606,41.950327]},n4448:{id:"n4448",loc:[-85.620607,41.950261]},n4449:{id:"n4449",loc:[-85.620707,41.950262]},n445:{id:"n445",loc:[-85.634527,41.943623]},n4450:{id:"n4450",loc:[-85.620599,41.950336]},n4451:{id:"n4451",loc:[-85.620559,41.950336]},n4452:{id:"n4452",loc:[-85.620559,41.950299]},n4453:{id:"n4453",loc:[-85.620599,41.950299]},n4454:{id:"n4454",loc:[-85.620545,41.950357]},n4455:{id:"n4455",loc:[-85.620418,41.950357]},n4456:{id:"n4456",loc:[-85.620417,41.950257]},n4457:{id:"n4457",loc:[-85.620544,41.950256]},n4458:{id:"n4458",loc:[-85.620246,41.950131],tags:{highway:"crossing"}},n4459:{id:"n4459",loc:[-85.620252,41.950956]},n446:{id:"n446",loc:[-85.634608,41.943577]},n4460:{id:"n4460",loc:[-85.620245,41.950179]},n4461:{id:"n4461",loc:[-85.620246,41.950088]},n4462:{id:"n4462",loc:[-85.620251,41.950885]},n4463:{id:"n4463",loc:[-85.620103,41.950884],tags:{crossing:"marked",highway:"crossing"}},n4464:{id:"n4464",loc:[-85.619992,41.950884]},n4465:{id:"n4465",loc:[-85.619704,41.951008]},n4466:{id:"n4466",loc:[-85.619599,41.951122]},n4467:{id:"n4467",loc:[-85.619264,41.951486]},n4468:{id:"n4468",loc:[-85.619179,41.951573],tags:{highway:"crossing"}},n4469:{id:"n4469",loc:[-85.620251,41.950999],tags:{highway:"crossing"}},n447:{id:"n447",loc:[-85.634555,41.943531]},n4470:{id:"n4470",loc:[-85.620249,41.951066]},n4471:{id:"n4471",loc:[-85.620256,41.951374]},n4472:{id:"n4472",loc:[-85.620249,41.951389]},n4473:{id:"n4473",loc:[-85.620249,41.951407]},n4474:{id:"n4474",loc:[-85.620255,41.951423]},n4475:{id:"n4475",loc:[-85.62026,41.951853]},n4476:{id:"n4476",loc:[-85.620262,41.951894],tags:{highway:"crossing"}},n4477:{id:"n4477",loc:[-85.620265,41.951957]},n4478:{id:"n4478",loc:[-85.620262,41.952135]},n4479:{id:"n4479",loc:[-85.620241,41.952424]},n448:{id:"n448",loc:[-85.634555,41.943482]},n4480:{id:"n4480",loc:[-85.620213,41.952583]},n4481:{id:"n4481",loc:[-85.620158,41.952754]},n4482:{id:"n4482",loc:[-85.620065,41.952942]},n4483:{id:"n4483",loc:[-85.619753,41.953439]},n4484:{id:"n4484",loc:[-85.619605,41.953626]},n4485:{id:"n4485",loc:[-85.619381,41.953834]},n4486:{id:"n4486",loc:[-85.619069,41.954066]},n4487:{id:"n4487",loc:[-85.618674,41.95429]},n4488:{id:"n4488",loc:[-85.621816,41.952389]},n4489:{id:"n4489",loc:[-85.6217,41.952386]},n449:{id:"n449",loc:[-85.634509,41.943427]},n4490:{id:"n4490",loc:[-85.621705,41.952306]},n4491:{id:"n4491",loc:[-85.621821,41.95231]},n4492:{id:"n4492",loc:[-85.621819,41.952272]},n4493:{id:"n4493",loc:[-85.621778,41.952272]},n4494:{id:"n4494",loc:[-85.621778,41.952199]},n4495:{id:"n4495",loc:[-85.621818,41.952199]},n4496:{id:"n4496",loc:[-85.621754,41.952281]},n4497:{id:"n4497",loc:[-85.621701,41.95228]},n4498:{id:"n4498",loc:[-85.621702,41.952197]},n4499:{id:"n4499",loc:[-85.621755,41.952197]},n45:{id:"n45",loc:[-85.636791,41.942792]},n450:{id:"n450",loc:[-85.63453,41.943365]},n4500:{id:"n4500",loc:[-85.628201,41.954694],tags:{highway:"stop",stop:"all",direction:"forward"}},n4501:{id:"n4501",loc:[-85.627921,41.954783],tags:{highway:"stop",stop:"all",direction:"backward"}},n4502:{id:"n4502",loc:[-85.62775,41.954696],tags:{highway:"stop",stop:"all",direction:"backward"}},n4503:{id:"n4503",loc:[-85.628046,41.954591],tags:{highway:"stop",stop:"all",direction:"forward"}},n4504:{id:"n4504",loc:[-85.631074,41.957428],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4505:{id:"n4505",loc:[-85.630768,41.957429],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4506:{id:"n4506",loc:[-85.629888,41.957432],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4507:{id:"n4507",loc:[-85.629565,41.957433],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4508:{id:"n4508",loc:[-85.629559,41.957343]},n4509:{id:"n4509",loc:[-85.628723,41.95735]},n451:{id:"n451",loc:[-85.634356,41.943468]},n4510:{id:"n4510",loc:[-85.62842,41.957515]},n4511:{id:"n4511",loc:[-85.627561,41.957525]},n4512:{id:"n4512",loc:[-85.630323,41.957508]},n4513:{id:"n4513",loc:[-85.630811,41.957506]},n4514:{id:"n4514",loc:[-85.630839,41.960874]},n4515:{id:"n4515",loc:[-85.631035,41.957506]},n4516:{id:"n4516",loc:[-85.632027,41.9575]},n4517:{id:"n4517",loc:[-85.631038,41.958066]},n4518:{id:"n4518",loc:[-85.630787,41.954769]},n4519:{id:"n4519",loc:[-85.630806,41.957342]},n452:{id:"n452",loc:[-85.634123,41.943596]},n4520:{id:"n4520",loc:[-85.630809,41.957428],tags:{highway:"crossing"}},n4521:{id:"n4521",loc:[-85.630912,41.957506],tags:{highway:"crossing"}},n4522:{id:"n4522",loc:[-85.631033,41.957428],tags:{highway:"crossing"}},n4523:{id:"n4523",loc:[-85.631032,41.957341]},n4524:{id:"n4524",loc:[-85.63091,41.957341],tags:{highway:"crossing"}},n4525:{id:"n4525",loc:[-85.631027,41.95597]},n4526:{id:"n4526",loc:[-85.631027,41.955913],tags:{highway:"crossing"}},n4527:{id:"n4527",loc:[-85.631025,41.955873]},n4528:{id:"n4528",loc:[-85.631073,41.955913],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4529:{id:"n4529",loc:[-85.631007,41.954766]},n453:{id:"n453",loc:[-85.634709,41.943926]},n4530:{id:"n4530",loc:[-85.630881,41.954768],tags:{highway:"crossing"}},n4531:{id:"n4531",loc:[-85.628022,41.954776]},n4532:{id:"n4532",loc:[-85.627385,41.95584]},n4533:{id:"n4533",loc:[-85.627329,41.955937]},n4534:{id:"n4534",loc:[-85.626583,41.957153]},n4535:{id:"n4535",loc:[-85.629675,41.954564],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4536:{id:"n4536",loc:[-85.630881,41.954806],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4537:{id:"n4537",loc:[-85.630879,41.954564],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4538:{id:"n4538",loc:[-85.630784,41.954682],tags:{highway:"crossing"}},n4539:{id:"n4539",loc:[-85.63078,41.954595]},n454:{id:"n454",loc:[-85.63525,41.943855]},n4540:{id:"n4540",loc:[-85.630879,41.954595],tags:{highway:"crossing"}},n4541:{id:"n4541",loc:[-85.631004,41.954594]},n4542:{id:"n4542",loc:[-85.631006,41.954681],tags:{highway:"crossing"}},n4543:{id:"n4543",loc:[-85.631045,41.959036],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4544:{id:"n4544",loc:[-85.632071,41.959029],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4545:{id:"n4545",loc:[-85.632257,41.959027],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4546:{id:"n4546",loc:[-85.631966,41.957427],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4547:{id:"n4547",loc:[-85.632297,41.957426],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4548:{id:"n4548",loc:[-85.631976,41.955911],tags:{highway:"give_way",direction:"forward"}},n4549:{id:"n4549",loc:[-85.632272,41.955911],tags:{highway:"give_way",direction:"backward"}},n455:{id:"n455",loc:[-85.635224,41.943869]},n4550:{id:"n4550",loc:[-85.632097,41.954805],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4551:{id:"n4551",loc:[-85.632094,41.954566],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4552:{id:"n4552",loc:[-85.626519,41.957256]},n4553:{id:"n4553",loc:[-85.625334,41.959165]},n4554:{id:"n4554",loc:[-85.626483,41.95806]},n4555:{id:"n4555",loc:[-85.626481,41.958175]},n4556:{id:"n4556",loc:[-85.626412,41.958174]},n4557:{id:"n4557",loc:[-85.626412,41.958202]},n4558:{id:"n4558",loc:[-85.62628,41.958201]},n4559:{id:"n4559",loc:[-85.626283,41.958057]},n456:{id:"n456",loc:[-85.638854,41.943104]},n4560:{id:"n4560",loc:[-85.622763,41.95109],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4561:{id:"n4561",loc:[-85.622858,41.950876],tags:{emergency:"fire_hydrant"}},n4562:{id:"n4562",loc:[-85.624073,41.950393]},n4563:{id:"n4563",loc:[-85.624077,41.950924]},n4564:{id:"n4564",loc:[-85.624599,41.950984],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4565:{id:"n4565",loc:[-85.624831,41.95119],tags:{emergency:"fire_hydrant"}},n4566:{id:"n4566",loc:[-85.624437,41.952568],tags:{emergency:"fire_hydrant"}},n4567:{id:"n4567",loc:[-85.624077,41.954606],tags:{emergency:"fire_hydrant"}},n4568:{id:"n4568",loc:[-85.624263,41.954888]},n4569:{id:"n4569",loc:[-85.624206,41.954919]},n457:{id:"n457",loc:[-85.635186,41.943901]},n4570:{id:"n4570",loc:[-85.624154,41.954865]},n4571:{id:"n4571",loc:[-85.624212,41.954835]},n4572:{id:"n4572",loc:[-85.622442,41.954401],tags:{emergency:"fire_hydrant"}},n4573:{id:"n4573",loc:[-85.619751,41.954658],tags:{emergency:"fire_hydrant"}},n4574:{id:"n4574",loc:[-85.617785,41.954534]},n4575:{id:"n4575",loc:[-85.617416,41.954721]},n4576:{id:"n4576",loc:[-85.617662,41.95474]},n4577:{id:"n4577",loc:[-85.618014,41.954717]},n4578:{id:"n4578",loc:[-85.617886,41.954671]},n4579:{id:"n4579",loc:[-85.617831,41.954612]},n458:{id:"n458",loc:[-85.635162,41.943917]},n4580:{id:"n4580",loc:[-85.617968,41.954752]},n4581:{id:"n4581",loc:[-85.617815,41.954752]},n4582:{id:"n4582",loc:[-85.617938,41.954695]},n4583:{id:"n4583",loc:[-85.617856,41.954642],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4584:{id:"n4584",loc:[-85.619116,41.954164],tags:{man_made:"flagpole"}},n4585:{id:"n4585",loc:[-85.619569,41.953255],tags:{emergency:"fire_hydrant"}},n4586:{id:"n4586",loc:[-85.620352,41.951894],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4587:{id:"n4587",loc:[-85.620485,41.951948],tags:{emergency:"fire_hydrant"}},n4588:{id:"n4588",loc:[-85.620316,41.950999],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4589:{id:"n4589",loc:[-85.620311,41.950131],tags:{highway:"stop",direction:"backward",stop:"minor"}},n459:{id:"n459",loc:[-85.634856,41.943905]},n4590:{id:"n4590",loc:[-85.620374,41.95018],tags:{emergency:"fire_hydrant"}},n4591:{id:"n4591",loc:[-85.620301,41.949239],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4592:{id:"n4592",loc:[-85.620278,41.947443],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4593:{id:"n4593",loc:[-85.619844,41.947444],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4594:{id:"n4594",loc:[-85.620191,41.947352],tags:{emergency:"fire_hydrant"}},n4595:{id:"n4595",loc:[-85.622819,41.947493],tags:{emergency:"fire_hydrant"}},n4596:{id:"n4596",loc:[-85.622744,41.947541],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4597:{id:"n4597",loc:[-85.622739,41.947316],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4598:{id:"n4598",loc:[-85.622909,41.948333],tags:{highway:"give_way"}},n4599:{id:"n4599",loc:[-85.622593,41.948333],tags:{highway:"give_way"}},n46:{id:"n46",loc:[-85.637131,41.94307]},n460:{id:"n460",loc:[-85.634811,41.944007]},n4600:{id:"n4600",loc:[-85.622835,41.948387],tags:{emergency:"fire_hydrant"}},n4601:{id:"n4601",loc:[-85.622768,41.949125],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4602:{id:"n4602",loc:[-85.622769,41.949325],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4603:{id:"n4603",loc:[-85.622837,41.949329],tags:{emergency:"fire_hydrant"}},n4604:{id:"n4604",loc:[-85.622614,41.950113],tags:{highway:"give_way",direction:"forward"}},n4605:{id:"n4605",loc:[-85.624777,41.949219],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4606:{id:"n4606",loc:[-85.624849,41.949106],tags:{emergency:"fire_hydrant"}},n4607:{id:"n4607",loc:[-85.624858,41.950119],tags:{emergency:"fire_hydrant"}},n4608:{id:"n4608",loc:[-85.624752,41.948334],tags:{highway:"give_way"}},n4609:{id:"n4609",loc:[-85.624845,41.948422],tags:{emergency:"fire_hydrant"}},n461:{id:"n461",loc:[-85.634987,41.943112]},n4610:{id:"n4610",loc:[-85.62484,41.947539],tags:{emergency:"fire_hydrant"}},n4611:{id:"n4611",loc:[-85.62476,41.947428],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4612:{id:"n4612",loc:[-85.620286,41.950926]},n4613:{id:"n4613",loc:[-85.618237,41.950963]},n4614:{id:"n4614",loc:[-85.618107,41.950876]},n4615:{id:"n4615",loc:[-85.618131,41.950393]},n4616:{id:"n4616",loc:[-85.618232,41.949913]},n4617:{id:"n4617",loc:[-85.619138,41.950212]},n4618:{id:"n4618",loc:[-85.619299,41.950388]},n4619:{id:"n4619",loc:[-85.619306,41.950897]},n462:{id:"n462",loc:[-85.634698,41.943194]},n4620:{id:"n4620",loc:[-85.619155,41.950958]},n4621:{id:"n4621",loc:[-85.620079,41.947715]},n4622:{id:"n4622",loc:[-85.619674,41.947728]},n4623:{id:"n4623",loc:[-85.619634,41.947735]},n4624:{id:"n4624",loc:[-85.619587,41.947756],tags:{barrier:"gate"}},n4625:{id:"n4625",loc:[-85.61953,41.947796]},n4626:{id:"n4626",loc:[-85.619475,41.947847]},n4627:{id:"n4627",loc:[-85.619433,41.947903]},n4628:{id:"n4628",loc:[-85.619402,41.947982]},n4629:{id:"n4629",loc:[-85.619394,41.948043]},n463:{id:"n463",loc:[-85.634632,41.943219]},n4630:{id:"n4630",loc:[-85.619395,41.948476]},n4631:{id:"n4631",loc:[-85.618367,41.947452]},n4632:{id:"n4632",loc:[-85.618371,41.947567],tags:{barrier:"gate"}},n4633:{id:"n4633",loc:[-85.618341,41.947622]},n4634:{id:"n4634",loc:[-85.618138,41.94773]},n4635:{id:"n4635",loc:[-85.618078,41.947814]},n4636:{id:"n4636",loc:[-85.618072,41.948009]},n4637:{id:"n4637",loc:[-85.618269,41.947666]},n4638:{id:"n4638",loc:[-85.618099,41.947765]},n4639:{id:"n4639",loc:[-85.618378,41.954453]},n464:{id:"n464",loc:[-85.63459,41.943239]},n4640:{id:"n4640",loc:[-85.618198,41.95453]},n4641:{id:"n4641",loc:[-85.618212,41.954623]},n4642:{id:"n4642",loc:[-85.635211,41.943103],tags:{leisure:"picnic_table"}},n4643:{id:"n4643",loc:[-85.635345,41.943448],tags:{leisure:"picnic_table"}},n4644:{id:"n4644",loc:[-85.635901,41.943353],tags:{amenity:"bench"}},n4645:{id:"n4645",loc:[-85.635815,41.942638],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4646:{id:"n4646",loc:[-85.635355,41.942044],tags:{leisure:"picnic_table"}},n4647:{id:"n4647",loc:[-85.635206,41.942045],tags:{leisure:"picnic_table"}},n4648:{id:"n4648",loc:[-85.63504,41.941992],tags:{leisure:"picnic_table"}},n4649:{id:"n4649",loc:[-85.635185,41.942001]},n465:{id:"n465",loc:[-85.634555,41.943263]},n4650:{id:"n4650",loc:[-85.635176,41.942021]},n4651:{id:"n4651",loc:[-85.635127,41.942008]},n4652:{id:"n4652",loc:[-85.635136,41.941988]},n4653:{id:"n4653",loc:[-85.635,41.941709],tags:{emergency:"fire_hydrant"}},n4654:{id:"n4654",loc:[-85.634893,41.941801]},n4655:{id:"n4655",loc:[-85.634937,41.941843]},n4656:{id:"n4656",loc:[-85.634963,41.941859]},n4657:{id:"n4657",loc:[-85.635027,41.941904]},n4658:{id:"n4658",loc:[-85.63494,41.94187]},n4659:{id:"n4659",loc:[-85.634951,41.941871]},n466:{id:"n466",loc:[-85.634526,41.943289]},n4660:{id:"n4660",loc:[-85.634753,41.941701],tags:{amenity:"drinking_water"}},n4661:{id:"n4661",loc:[-85.634717,41.941804],tags:{amenity:"bench"}},n4662:{id:"n4662",loc:[-85.634554,41.941883],tags:{amenity:"bench"}},n4663:{id:"n4663",loc:[-85.635002,41.941579],tags:{amenity:"fountain"}},n4664:{id:"n4664",loc:[-85.635258,41.94188],tags:{amenity:"waste_basket"}},n4665:{id:"n4665",loc:[-85.635262,41.941581],tags:{amenity:"bench"}},n4666:{id:"n4666",loc:[-85.635319,41.941744],tags:{amenity:"bench"}},n4667:{id:"n4667",loc:[-85.634702,41.941473],tags:{amenity:"waste_basket"}},n4668:{id:"n4668",loc:[-85.633981,41.941966],tags:{amenity:"bench"}},n4669:{id:"n4669",loc:[-85.63388,41.941743]},n467:{id:"n467",loc:[-85.635163,41.944985]},n4670:{id:"n4670",loc:[-85.633746,41.941741]},n4671:{id:"n4671",loc:[-85.633749,41.941664]},n4672:{id:"n4672",loc:[-85.633883,41.941667]},n4673:{id:"n4673",loc:[-85.634283,41.941183],tags:{leisure:"picnic_table"}},n4674:{id:"n4674",loc:[-85.634046,41.941102],tags:{amenity:"bbq"}},n4675:{id:"n4675",loc:[-85.63401,41.941093],tags:{amenity:"bbq"}},n4676:{id:"n4676",loc:[-85.633408,41.940862],tags:{amenity:"bench"}},n4677:{id:"n4677",loc:[-85.633359,41.940651],tags:{amenity:"bench"}},n4678:{id:"n4678",loc:[-85.634109,41.940831]},n4679:{id:"n4679",loc:[-85.63396,41.940867]},n468:{id:"n468",loc:[-85.635095,41.945035]},n4680:{id:"n4680",loc:[-85.633816,41.940913]},n4681:{id:"n4681",loc:[-85.633237,41.940455]},n4682:{id:"n4682",loc:[-85.634453,41.940025],tags:{emergency:"fire_hydrant"}},n4683:{id:"n4683",loc:[-85.635692,41.940218],tags:{emergency:"fire_hydrant"}},n4684:{id:"n4684",loc:[-85.635566,41.940102],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4685:{id:"n4685",loc:[-85.635961,41.940125],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4686:{id:"n4686",loc:[-85.635883,41.94012],tags:{crossing:"marked",highway:"crossing"}},n4687:{id:"n4687",loc:[-85.635883,41.94006]},n4688:{id:"n4688",loc:[-85.635768,41.940051],tags:{crossing:"marked",highway:"crossing"}},n4689:{id:"n4689",loc:[-85.635669,41.940043]},n469:{id:"n469",loc:[-85.634269,41.944431]},n4690:{id:"n4690",loc:[-85.635661,41.940107],tags:{crossing:"marked",highway:"crossing"}},n4691:{id:"n4691",loc:[-85.635424,41.941005],tags:{amenity:"fountain"}},n4692:{id:"n4692",loc:[-85.635542,41.941371],tags:{amenity:"bench"}},n4693:{id:"n4693",loc:[-85.635709,41.941341],tags:{emergency:"fire_hydrant"}},n4694:{id:"n4694",loc:[-85.637038,41.942513],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4695:{id:"n4695",loc:[-85.637174,41.941354],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4696:{id:"n4696",loc:[-85.637091,41.941273],tags:{emergency:"fire_hydrant"}},n4697:{id:"n4697",loc:[-85.638058,41.941346],tags:{highway:"give_way",direction:"forward"}},n4698:{id:"n4698",loc:[-85.638359,41.941344],tags:{highway:"give_way",direction:"backward"}},n4699:{id:"n4699",loc:[-85.638288,41.941236],tags:{emergency:"fire_hydrant"}},n47:{id:"n47",loc:[-85.636693,41.943073]},n470:{id:"n470",loc:[-85.634352,41.944376]},n4700:{id:"n4700",loc:[-85.63935,41.94128],tags:{emergency:"fire_hydrant"}},n4701:{id:"n4701",loc:[-85.639277,41.941337],tags:{highway:"give_way",direction:"forward"}},n4702:{id:"n4702",loc:[-85.639548,41.941334],tags:{highway:"give_way",direction:"backward"}},n4703:{id:"n4703",loc:[-85.642191,41.940039]},n4704:{id:"n4704",loc:[-85.640585,41.941263],tags:{emergency:"fire_hydrant"}},n4705:{id:"n4705",loc:[-85.64049,41.941327],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4706:{id:"n4706",loc:[-85.640803,41.941324],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4707:{id:"n4707",loc:[-85.641717,41.941317],tags:{highway:"stop",direction:"forward",stop:"all"}},n4708:{id:"n4708",loc:[-85.641846,41.941415],tags:{highway:"stop",direction:"backward",stop:"all"}},n4709:{id:"n4709",loc:[-85.641756,41.941392],tags:{emergency:"fire_hydrant"}},n471:{id:"n471",loc:[-85.634747,41.944561],tags:{railway:"crossing"}},n4710:{id:"n4710",loc:[-85.642014,41.941313],tags:{highway:"stop",direction:"forward",stop:"all"}},n4711:{id:"n4711",loc:[-85.641854,41.942455],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4712:{id:"n4712",loc:[-85.641859,41.942739],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4713:{id:"n4713",loc:[-85.640754,41.942707],tags:{emergency:"fire_hydrant"}},n4714:{id:"n4714",loc:[-85.640669,41.942716],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4715:{id:"n4715",loc:[-85.640664,41.942478],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4716:{id:"n4716",loc:[-85.63964,41.94274],tags:{man_made:"flagpole"}},n4717:{id:"n4717",loc:[-85.639455,41.942731],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4718:{id:"n4718",loc:[-85.63945,41.942492],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4719:{id:"n4719",loc:[-85.639527,41.942505],tags:{emergency:"fire_hydrant"}},n472:{id:"n472",loc:[-85.634667,41.944613]},n4720:{id:"n4720",loc:[-85.638238,41.942745],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4721:{id:"n4721",loc:[-85.638233,41.942511],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4722:{id:"n4722",loc:[-85.638018,41.94299],tags:{amenity:"waste_disposal"}},n4723:{id:"n4723",loc:[-85.637918,41.944152],tags:{amenity:"waste_basket"}},n4724:{id:"n4724",loc:[-85.635902,41.943291],tags:{leisure:"picnic_table"}},n4725:{id:"n4725",loc:[-85.63704,41.942741],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4726:{id:"n4726",loc:[-85.633467,41.943818],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4727:{id:"n4727",loc:[-85.633987,41.943531],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4728:{id:"n4728",loc:[-85.632154,41.943539],tags:{emergency:"fire_hydrant"}},n4729:{id:"n4729",loc:[-85.633567,41.944641],tags:{amenity:"bench"}},n473:{id:"n473",loc:[-85.634161,41.944371]},n4730:{id:"n4730",loc:[-85.633127,41.944574],tags:{amenity:"bench"}},n4731:{id:"n4731",loc:[-85.633439,41.944871],tags:{amenity:"bench"}},n4732:{id:"n4732",loc:[-85.633676,41.944799],tags:{amenity:"waste_basket"}},n4733:{id:"n4733",loc:[-85.633466,41.944862],tags:{amenity:"waste_basket"}},n4734:{id:"n4734",loc:[-85.633451,41.944847],tags:{emergency:"fire_hydrant"}},n4735:{id:"n4735",loc:[-85.634202,41.945543],tags:{amenity:"waste_basket"}},n4736:{id:"n4736",loc:[-85.634652,41.945472],tags:{leisure:"picnic_table"}},n4737:{id:"n4737",loc:[-85.6347,41.945445],tags:{leisure:"picnic_table"}},n4738:{id:"n4738",loc:[-85.634646,41.945662],tags:{emergency:"fire_hydrant"}},n4739:{id:"n4739",loc:[-85.634673,41.945687],tags:{amenity:"waste_basket"}},n474:{id:"n474",loc:[-85.633861,41.944117]},n4740:{id:"n4740",loc:[-85.63449,41.945827],tags:{amenity:"clock",display:"analog"}},n4741:{id:"n4741",loc:[-85.63481,41.946056],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4742:{id:"n4742",loc:[-85.634814,41.946176],tags:{amenity:"post_box"}},n4743:{id:"n4743",loc:[-85.638744,41.945328]},n4744:{id:"n4744",loc:[-85.63867,41.945228],tags:{amenity:"bench"}},n4745:{id:"n4745",loc:[-85.639487,41.945042],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4746:{id:"n4746",loc:[-85.639635,41.94387],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4747:{id:"n4747",loc:[-85.639549,41.943756],tags:{emergency:"fire_hydrant"}},n4748:{id:"n4748",loc:[-85.64055,41.943862],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4749:{id:"n4749",loc:[-85.640864,41.943859],tags:{highway:"stop",stop:"minor",direction:"backward"}},n475:{id:"n475",loc:[-85.633906,41.943535]},n4750:{id:"n4750",loc:[-85.640718,41.945022],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4751:{id:"n4751",loc:[-85.640664,41.945076],tags:{emergency:"fire_hydrant"}},n4752:{id:"n4752",loc:[-85.641913,41.94502],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4753:{id:"n4753",loc:[-85.641838,41.945076],tags:{emergency:"fire_hydrant"}},n4754:{id:"n4754",loc:[-85.642045,41.94385],tags:{highway:"give_way",direction:"backward"}},n4755:{id:"n4755",loc:[-85.641738,41.943852],tags:{highway:"give_way",direction:"forward"}},n4756:{id:"n4756",loc:[-85.642928,41.943843],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4757:{id:"n4757",loc:[-85.64305,41.943902],tags:{emergency:"fire_hydrant"}},n4758:{id:"n4758",loc:[-85.642986,41.945105],tags:{highway:"stop",direction:"backward",stop:"all"}},n4759:{id:"n4759",loc:[-85.643136,41.94502],tags:{highway:"stop",stop:"all",direction:"forward"}},n476:{id:"n476",loc:[-85.63423,41.943692]},n4760:{id:"n4760",loc:[-85.63169,41.947812]},n4761:{id:"n4761",loc:[-85.631307,41.947655]},n4762:{id:"n4762",loc:[-85.631407,41.947413]},n4763:{id:"n4763",loc:[-85.631173,41.947306]},n4764:{id:"n4764",loc:[-85.631316,41.947145]},n4765:{id:"n4765",loc:[-85.631476,41.947087]},n4766:{id:"n4766",loc:[-85.631793,41.946871]},n4767:{id:"n4767",loc:[-85.631884,41.946723]},n4768:{id:"n4768",loc:[-85.631814,41.946397]},n4769:{id:"n4769",loc:[-85.631382,41.947685]},n477:{id:"n477",loc:[-85.635096,41.942814]},n4770:{id:"n4770",loc:[-85.63109,41.947819]},n4771:{id:"n4771",loc:[-85.630921,41.947961]},n4772:{id:"n4772",loc:[-85.630249,41.947709]},n4773:{id:"n4773",loc:[-85.630149,41.947451]},n4774:{id:"n4774",loc:[-85.629733,41.947339]},n4775:{id:"n4775",loc:[-85.629755,41.946948]},n4776:{id:"n4776",loc:[-85.630457,41.947103]},n4777:{id:"n4777",loc:[-85.630934,41.946939]},n4778:{id:"n4778",loc:[-85.631277,41.946852]},n4779:{id:"n4779",loc:[-85.63142,41.946781]},n478:{id:"n478",loc:[-85.635058,41.942795]},n4780:{id:"n4780",loc:[-85.631116,41.946474]},n4781:{id:"n4781",loc:[-85.63073,41.945965]},n4782:{id:"n4782",loc:[-85.631337,41.94571]},n4783:{id:"n4783",loc:[-85.631589,41.945487]},n4784:{id:"n4784",loc:[-85.632278,41.945784]},n4785:{id:"n4785",loc:[-85.632105,41.946034]},n4786:{id:"n4786",loc:[-85.632532,41.946198]},n4787:{id:"n4787",loc:[-85.632566,41.946151]},n4788:{id:"n4788",loc:[-85.632684,41.946196]},n4789:{id:"n4789",loc:[-85.628676,41.947106]},n479:{id:"n479",loc:[-85.635002,41.94279]},n4790:{id:"n4790",loc:[-85.628973,41.946476]},n4791:{id:"n4791",loc:[-85.629094,41.946079]},n4792:{id:"n4792",loc:[-85.629226,41.94578]},n4793:{id:"n4793",loc:[-85.629479,41.945682]},n4794:{id:"n4794",loc:[-85.630606,41.94569]},n4795:{id:"n4795",loc:[-85.631255,41.945588]},n4796:{id:"n4796",loc:[-85.631546,41.945281]},n4797:{id:"n4797",loc:[-85.631629,41.944823]},n4798:{id:"n4798",loc:[-85.631766,41.944958]},n4799:{id:"n4799",loc:[-85.631689,41.945318]},n48:{id:"n48",loc:[-85.636689,41.94276]},n480:{id:"n480",loc:[-85.634908,41.94279]},n4800:{id:"n4800",loc:[-85.615069,41.945527]},n4801:{id:"n4801",loc:[-85.615058,41.946677]},n4802:{id:"n4802",loc:[-85.613692,41.946689]},n4803:{id:"n4803",loc:[-85.613475,41.946531]},n4804:{id:"n4804",loc:[-85.611717,41.946252]},n4805:{id:"n4805",loc:[-85.611353,41.946385]},n4806:{id:"n4806",loc:[-85.611304,41.947397]},n4807:{id:"n4807",loc:[-85.610564,41.947401]},n4808:{id:"n4808",loc:[-85.610553,41.947122]},n4809:{id:"n4809",loc:[-85.610194,41.946992]},n481:{id:"n481",loc:[-85.634478,41.942342]},n4810:{id:"n4810",loc:[-85.609976,41.946628]},n4811:{id:"n4811",loc:[-85.609769,41.946523]},n4812:{id:"n4812",loc:[-85.609307,41.946523]},n4813:{id:"n4813",loc:[-85.609035,41.946462]},n4814:{id:"n4814",loc:[-85.609018,41.943277]},n4815:{id:"n4815",loc:[-85.609617,41.943423]},n4816:{id:"n4816",loc:[-85.610471,41.943447]},n4817:{id:"n4817",loc:[-85.621491,41.949168]},n4818:{id:"n4818",loc:[-85.620266,41.94917]},n4819:{id:"n4819",loc:[-85.620262,41.947557]},n482:{id:"n482",loc:[-85.634521,41.942254]},n4820:{id:"n4820",loc:[-85.620825,41.947556]},n4821:{id:"n4821",loc:[-85.620827,41.948371]},n4822:{id:"n4822",loc:[-85.621489,41.94837]},n4823:{id:"n4823",loc:[-85.622865,41.950928]},n4824:{id:"n4824",loc:[-85.622858,41.949744]},n4825:{id:"n4825",loc:[-85.623696,41.949714]},n4826:{id:"n4826",loc:[-85.623696,41.949647]},n4827:{id:"n4827",loc:[-85.624019,41.949647]},n4828:{id:"n4828",loc:[-85.624024,41.950093]},n4829:{id:"n4829",loc:[-85.622885,41.949711]},n483:{id:"n483",loc:[-85.63425,41.941819]},n4830:{id:"n4830",loc:[-85.624584,41.951049]},n4831:{id:"n4831",loc:[-85.624669,41.9511]},n4832:{id:"n4832",loc:[-85.624316,41.952218]},n4833:{id:"n4833",loc:[-85.623819,41.952094]},n4834:{id:"n4834",loc:[-85.623385,41.952101]},n4835:{id:"n4835",loc:[-85.623456,41.951238]},n4836:{id:"n4836",loc:[-85.623535,41.951051]},n4837:{id:"n4837",loc:[-85.624693,41.950921]},n4838:{id:"n4838",loc:[-85.624727,41.950897]},n4839:{id:"n4839",loc:[-85.624869,41.950341]},n484:{id:"n484",loc:[-85.634324,41.942131]},n4840:{id:"n4840",loc:[-85.624859,41.949284]},n4841:{id:"n4841",loc:[-85.624788,41.949262]},n4842:{id:"n4842",loc:[-85.62402,41.949265]},n4843:{id:"n4843",loc:[-85.610382,41.954663]},n4844:{id:"n4844",loc:[-85.605675,41.954667]},n4845:{id:"n4845",loc:[-85.605669,41.949407]},n4846:{id:"n4846",loc:[-85.610376,41.949404]},n4847:{id:"n4847",loc:[-85.605552,41.958536]},n4848:{id:"n4848",loc:[-85.595755,41.958588]},n4849:{id:"n4849",loc:[-85.595732,41.956419]},n485:{id:"n485",loc:[-85.634211,41.941374]},n4850:{id:"n4850",loc:[-85.596908,41.955605]},n4851:{id:"n4851",loc:[-85.597723,41.955596]},n4852:{id:"n4852",loc:[-85.597715,41.954967]},n4853:{id:"n4853",loc:[-85.5874,41.955018]},n4854:{id:"n4854",loc:[-85.586615,41.955124]},n4855:{id:"n4855",loc:[-85.58613,41.955293]},n4856:{id:"n4856",loc:[-85.586166,41.962122]},n4857:{id:"n4857",loc:[-85.587008,41.955052]},n4858:{id:"n4858",loc:[-85.591685,41.95499]},n4859:{id:"n4859",loc:[-85.591718,41.956649]},n486:{id:"n486",loc:[-85.634085,41.940704]},n4860:{id:"n4860",loc:[-85.591133,41.956649]},n4861:{id:"n4861",loc:[-85.591061,41.95582]},n4862:{id:"n4862",loc:[-85.590677,41.95613]},n4863:{id:"n4863",loc:[-85.590826,41.956369]},n4864:{id:"n4864",loc:[-85.591016,41.954991]},n4865:{id:"n4865",loc:[-85.587656,41.954855]},n4866:{id:"n4866",loc:[-85.5964,41.955274]},n4867:{id:"n4867",loc:[-85.58776,41.96178]},n4868:{id:"n4868",loc:[-85.601172,41.960448]},n4869:{id:"n4869",loc:[-85.589489,41.960478]},n487:{id:"n487",loc:[-85.635567,41.940944]},n4870:{id:"n4870",loc:[-85.586664,41.960493]},n4871:{id:"n4871",loc:[-85.591227,41.95676]},n4872:{id:"n4872",loc:[-85.589424,41.958093]},n4873:{id:"n4873",loc:[-85.588779,41.957611]},n4874:{id:"n4874",loc:[-85.590583,41.956278]},n4875:{id:"n4875",loc:[-85.590759,41.957106]},n4876:{id:"n4876",loc:[-85.592213,41.958218]},n4877:{id:"n4877",loc:[-85.592262,41.958279]},n4878:{id:"n4878",loc:[-85.592304,41.958358]},n4879:{id:"n4879",loc:[-85.592351,41.95849]},n488:{id:"n488",loc:[-85.635542,41.940919]},n4880:{id:"n4880",loc:[-85.592363,41.958605]},n4881:{id:"n4881",loc:[-85.592383,41.96047]},n4882:{id:"n4882",loc:[-85.592376,41.959808]},n4883:{id:"n4883",loc:[-85.600825,41.959779]},n4884:{id:"n4884",loc:[-85.601084,41.959844]},n4885:{id:"n4885",loc:[-85.601144,41.959908]},n4886:{id:"n4886",loc:[-85.601164,41.960008]},n4887:{id:"n4887",loc:[-85.601162,41.960125]},n4888:{id:"n4888",loc:[-85.601134,41.960221]},n4889:{id:"n4889",loc:[-85.600993,41.960353]},n489:{id:"n489",loc:[-85.635514,41.940906]},n4890:{id:"n4890",loc:[-85.600794,41.960449]},n4891:{id:"n4891",loc:[-85.60098,41.959792]},n4892:{id:"n4892",loc:[-85.601067,41.960294]},n4893:{id:"n4893",loc:[-85.596829,41.959793]},n4894:{id:"n4894",loc:[-85.596839,41.960459]},n4895:{id:"n4895",loc:[-85.589364,41.958048]},n4896:{id:"n4896",loc:[-85.587374,41.959511]},n4897:{id:"n4897",loc:[-85.587286,41.959564]},n4898:{id:"n4898",loc:[-85.587163,41.959632]},n4899:{id:"n4899",loc:[-85.586694,41.959865]},n49:{id:"n49",loc:[-85.637127,41.942757]},n490:{id:"n490",loc:[-85.635469,41.940896]},n4900:{id:"n4900",loc:[-85.586634,41.959921]},n4901:{id:"n4901",loc:[-85.586607,41.960001]},n4902:{id:"n4902",loc:[-85.586599,41.960099]},n4903:{id:"n4903",loc:[-85.586602,41.96034]},n4904:{id:"n4904",loc:[-85.586669,41.960439]},n4905:{id:"n4905",loc:[-85.586758,41.960493]},n4906:{id:"n4906",loc:[-85.586618,41.960391]},n4907:{id:"n4907",loc:[-85.591201,41.956352]},n4908:{id:"n4908",loc:[-85.59112,41.954843]},n4909:{id:"n4909",loc:[-85.591536,41.956349]},n491:{id:"n491",loc:[-85.635667,41.940826]},n4910:{id:"n4910",loc:[-85.590953,41.956354]},n4911:{id:"n4911",loc:[-85.591468,41.956406]},n4912:{id:"n4912",loc:[-85.591469,41.956478]},n4913:{id:"n4913",loc:[-85.591123,41.956481]},n4914:{id:"n4914",loc:[-85.591121,41.956409]},n4915:{id:"n4915",loc:[-85.590826,41.955954]},n4916:{id:"n4916",loc:[-85.590612,41.956115]},n4917:{id:"n4917",loc:[-85.590402,41.955962]},n4918:{id:"n4918",loc:[-85.590622,41.955804]},n4919:{id:"n4919",loc:[-85.59011,41.956502]},n492:{id:"n492",loc:[-85.636197,41.940599]},n4920:{id:"n4920",loc:[-85.589877,41.956668]},n4921:{id:"n4921",loc:[-85.589777,41.95659]},n4922:{id:"n4922",loc:[-85.59001,41.956424]},n4923:{id:"n4923",loc:[-85.589595,41.956427]},n4924:{id:"n4924",loc:[-85.589434,41.956549]},n4925:{id:"n4925",loc:[-85.589262,41.956424]},n4926:{id:"n4926",loc:[-85.589422,41.956302]},n4927:{id:"n4927",loc:[-85.589358,41.956286]},n4928:{id:"n4928",loc:[-85.5892,41.956408]},n4929:{id:"n4929",loc:[-85.589032,41.956288]},n493:{id:"n493",loc:[-85.6362,41.940686]},n4930:{id:"n4930",loc:[-85.58919,41.956166]},n4931:{id:"n4931",loc:[-85.589165,41.956132]},n4932:{id:"n4932",loc:[-85.589002,41.956253]},n4933:{id:"n4933",loc:[-85.588826,41.956122]},n4934:{id:"n4934",loc:[-85.588989,41.956001]},n4935:{id:"n4935",loc:[-85.588673,41.955757]},n4936:{id:"n4936",loc:[-85.588502,41.955882]},n4937:{id:"n4937",loc:[-85.588339,41.955759]},n4938:{id:"n4938",loc:[-85.58851,41.955633]},n4939:{id:"n4939",loc:[-85.590382,41.955892]},n494:{id:"n494",loc:[-85.635969,41.94069]},n4940:{id:"n4940",loc:[-85.589923,41.956231]},n4941:{id:"n4941",loc:[-85.58984,41.956168]},n4942:{id:"n4942",loc:[-85.5903,41.95583]},n4943:{id:"n4943",loc:[-85.589636,41.956038]},n4944:{id:"n4944",loc:[-85.589546,41.956105]},n4945:{id:"n4945",loc:[-85.589045,41.955729]},n4946:{id:"n4946",loc:[-85.589135,41.955662]},n4947:{id:"n4947",loc:[-85.590718,41.955293]},n4948:{id:"n4948",loc:[-85.590718,41.955374]},n4949:{id:"n4949",loc:[-85.589211,41.955369]},n495:{id:"n495",loc:[-85.635965,41.940561]},n4950:{id:"n4950",loc:[-85.589212,41.955287]},n4951:{id:"n4951",loc:[-85.589675,41.956817]},n4952:{id:"n4952",loc:[-85.58947,41.95697]},n4953:{id:"n4953",loc:[-85.589219,41.956784]},n4954:{id:"n4954",loc:[-85.589425,41.95663]},n4955:{id:"n4955",loc:[-85.589373,41.95702]},n4956:{id:"n4956",loc:[-85.589171,41.957172]},n4957:{id:"n4957",loc:[-85.588962,41.957019]},n4958:{id:"n4958",loc:[-85.589164,41.956867]},n4959:{id:"n4959",loc:[-85.588881,41.955006]},n496:{id:"n496",loc:[-85.636031,41.94056]},n4960:{id:"n4960",loc:[-85.588804,41.955006]},n4961:{id:"n4961",loc:[-85.604773,41.954521]},n4962:{id:"n4962",loc:[-85.601603,41.954527]},n4963:{id:"n4963",loc:[-85.600823,41.954169]},n4964:{id:"n4964",loc:[-85.600828,41.950191]},n4965:{id:"n4965",loc:[-85.601673,41.949457]},n4966:{id:"n4966",loc:[-85.604464,41.949488]},n4967:{id:"n4967",loc:[-85.60538,41.950212]},n4968:{id:"n4968",loc:[-85.605395,41.954108]},n4969:{id:"n4969",loc:[-85.604771,41.954109]},n497:{id:"n497",loc:[-85.636032,41.940602]},n4970:{id:"n4970",loc:[-85.600613,41.953916]},n4971:{id:"n4971",loc:[-85.599758,41.954649]},n4972:{id:"n4972",loc:[-85.591194,41.954663]},n4973:{id:"n4973",loc:[-85.591182,41.950465]},n4974:{id:"n4974",loc:[-85.591871,41.950464]},n4975:{id:"n4975",loc:[-85.591868,41.949209]},n4976:{id:"n4976",loc:[-85.592155,41.949209]},n4977:{id:"n4977",loc:[-85.592155,41.94848]},n4978:{id:"n4978",loc:[-85.600615,41.948482]},n4979:{id:"n4979",loc:[-85.605421,41.949378]},n498:{id:"n498",loc:[-85.635776,41.940583]},n4980:{id:"n4980",loc:[-85.600614,41.949373]},n4981:{id:"n4981",loc:[-85.601316,41.94849]},n4982:{id:"n4982",loc:[-85.601592,41.947641]},n4983:{id:"n4983",loc:[-85.60395,41.947618]},n4984:{id:"n4984",loc:[-85.603973,41.948114]},n4985:{id:"n4985",loc:[-85.605398,41.948103]},n4986:{id:"n4986",loc:[-85.614017,41.965566]},n4987:{id:"n4987",loc:[-85.605787,41.965619]},n4988:{id:"n4988",loc:[-85.60577,41.963821]},n4989:{id:"n4989",loc:[-85.612886,41.963808]},n499:{id:"n499",loc:[-85.63589,41.940578]},n4990:{id:"n4990",loc:[-85.613207,41.963705]},n4991:{id:"n4991",loc:[-85.613511,41.963525]},n4992:{id:"n4992",loc:[-85.613667,41.963305]},n4993:{id:"n4993",loc:[-85.613779,41.962983]},n4994:{id:"n4994",loc:[-85.613797,41.959709]},n4995:{id:"n4995",loc:[-85.613663,41.95936]},n4996:{id:"n4996",loc:[-85.61339,41.959064]},n4997:{id:"n4997",loc:[-85.610503,41.956898]},n4998:{id:"n4998",loc:[-85.610485,41.956595]},n4999:{id:"n4999",loc:[-85.613892,41.956621]},n5:{id:"n5",loc:[-85.622744,41.95268]},n50:{id:"n50",loc:[-85.636673,41.943143]},n500:{id:"n500",loc:[-85.636198,41.940578]},n5000:{id:"n5000",loc:[-85.613866,41.958574]},n5001:{id:"n5001",loc:[-85.615262,41.958561]},n5002:{id:"n5002",loc:[-85.615279,41.959541]},n5003:{id:"n5003",loc:[-85.615314,41.95597]},n5004:{id:"n5004",loc:[-85.613887,41.955988]},n5005:{id:"n5005",loc:[-85.613074,41.962244]},n5006:{id:"n5006",loc:[-85.611678,41.963354]},n5007:{id:"n5007",loc:[-85.611678,41.963487]},n5008:{id:"n5008",loc:[-85.606906,41.963502]},n5009:{id:"n5009",loc:[-85.605777,41.962657]},n501:{id:"n501",loc:[-85.636251,41.940584]},n5010:{id:"n5010",loc:[-85.605711,41.9599]},n5011:{id:"n5011",loc:[-85.608139,41.9585]},n5012:{id:"n5012",loc:[-85.60814,41.956306]},n5013:{id:"n5013",loc:[-85.608854,41.95581]},n5014:{id:"n5014",loc:[-85.610039,41.955883]},n5015:{id:"n5015",loc:[-85.610068,41.956754]},n5016:{id:"n5016",loc:[-85.613058,41.959411]},n5017:{id:"n5017",loc:[-85.610234,41.957068]},n5018:{id:"n5018",loc:[-85.609826,41.95581]},n5019:{id:"n5019",loc:[-85.606987,41.958505]},n502:{id:"n502",loc:[-85.636279,41.940605]},n5020:{id:"n5020",loc:[-85.606498,41.958846]},n5021:{id:"n5021",loc:[-85.606013,41.959342]},n5022:{id:"n5022",loc:[-85.614553,41.961581]},n5023:{id:"n5023",loc:[-85.61465,41.96214]},n5024:{id:"n5024",loc:[-85.615277,41.962442]},n5025:{id:"n5025",loc:[-85.615451,41.962972]},n5026:{id:"n5026",loc:[-85.614355,41.964826]},n5027:{id:"n5027",loc:[-85.615133,41.964589]},n5028:{id:"n5028",loc:[-85.615342,41.963818]},n5029:{id:"n5029",loc:[-85.615971,41.963792]},n503:{id:"n503",loc:[-85.636285,41.940633]},n5030:{id:"n5030",loc:[-85.615751,41.963122]},n5031:{id:"n5031",loc:[-85.616575,41.963123]},n5032:{id:"n5032",loc:[-85.612527,41.963846]},n5033:{id:"n5033",loc:[-85.630653,41.940709]},n5034:{id:"n5034",loc:[-85.629858,41.939568]},n5035:{id:"n5035",loc:[-85.629847,41.937926]},n504:{id:"n504",loc:[-85.636281,41.940662]},n505:{id:"n505",loc:[-85.636266,41.940688]},n506:{id:"n506",loc:[-85.636236,41.940701]},n507:{id:"n507",loc:[-85.63619,41.940706]},n508:{id:"n508",loc:[-85.635892,41.940707]},n509:{id:"n509",loc:[-85.635777,41.9407]},n51:{id:"n51",loc:[-85.636673,41.942864]},n510:{id:"n510",loc:[-85.636044,41.940578]},n511:{id:"n511",loc:[-85.635946,41.940578]},n512:{id:"n512",loc:[-85.636475,41.940732]},n513:{id:"n513",loc:[-85.636475,41.940777]},n514:{id:"n514",loc:[-85.636405,41.940777]},n515:{id:"n515",loc:[-85.636405,41.940732]},n516:{id:"n516",loc:[-85.636471,41.940916]},n517:{id:"n517",loc:[-85.636471,41.940961]},n518:{id:"n518",loc:[-85.636404,41.940961]},n519:{id:"n519",loc:[-85.636404,41.940916]},n52:{id:"n52",loc:[-85.636227,41.942864]},n520:{id:"n520",loc:[-85.636286,41.941127]},n521:{id:"n521",loc:[-85.636203,41.941126]},n522:{id:"n522",loc:[-85.636204,41.941083]},n523:{id:"n523",loc:[-85.636287,41.941083]},n524:{id:"n524",loc:[-85.636124,41.941064]},n525:{id:"n525",loc:[-85.636,41.941065]},n526:{id:"n526",loc:[-85.636,41.940964]},n527:{id:"n527",loc:[-85.636045,41.940964]},n528:{id:"n528",loc:[-85.636045,41.940928]},n529:{id:"n529",loc:[-85.636111,41.940928]},n53:{id:"n53",loc:[-85.636227,41.943143]},n530:{id:"n530",loc:[-85.636111,41.940961]},n531:{id:"n531",loc:[-85.636123,41.940961]},n532:{id:"n532",loc:[-85.636124,41.940997]},n533:{id:"n533",loc:[-85.636164,41.940997]},n534:{id:"n534",loc:[-85.636164,41.941044]},n535:{id:"n535",loc:[-85.636124,41.941044]},n536:{id:"n536",loc:[-85.636534,41.941256]},n537:{id:"n537",loc:[-85.63645,41.941246]},n538:{id:"n538",loc:[-85.636462,41.941189]},n539:{id:"n539",loc:[-85.636546,41.941199]},n54:{id:"n54",loc:[-85.636198,41.943119]},n540:{id:"n540",loc:[-85.636802,41.941226]},n541:{id:"n541",loc:[-85.636701,41.941215]},n542:{id:"n542",loc:[-85.636709,41.941174]},n543:{id:"n543",loc:[-85.636656,41.941168]},n544:{id:"n544",loc:[-85.636666,41.941122]},n545:{id:"n545",loc:[-85.636781,41.941136]},n546:{id:"n546",loc:[-85.636774,41.94117]},n547:{id:"n547",loc:[-85.636812,41.941175]},n548:{id:"n548",loc:[-85.636803,41.941047]},n549:{id:"n549",loc:[-85.636785,41.941047]},n55:{id:"n55",loc:[-85.635945,41.94312]},n550:{id:"n550",loc:[-85.636785,41.941058]},n551:{id:"n551",loc:[-85.636644,41.941059]},n552:{id:"n552",loc:[-85.636644,41.941038]},n553:{id:"n553",loc:[-85.636581,41.941039]},n554:{id:"n554",loc:[-85.636581,41.940995]},n555:{id:"n555",loc:[-85.636746,41.940995]},n556:{id:"n556",loc:[-85.636746,41.940978]},n557:{id:"n557",loc:[-85.636803,41.940978]},n558:{id:"n558",loc:[-85.636781,41.940768]},n559:{id:"n559",loc:[-85.636783,41.940828]},n56:{id:"n56",loc:[-85.635943,41.942909]},n560:{id:"n560",loc:[-85.636761,41.940828]},n561:{id:"n561",loc:[-85.636762,41.940857]},n562:{id:"n562",loc:[-85.636641,41.940859]},n563:{id:"n563",loc:[-85.63664,41.940805]},n564:{id:"n564",loc:[-85.636676,41.940804]},n565:{id:"n565",loc:[-85.636675,41.940769]},n566:{id:"n566",loc:[-85.636733,41.94033]},n567:{id:"n567",loc:[-85.636471,41.940334]},n568:{id:"n568",loc:[-85.636469,41.940262]},n569:{id:"n569",loc:[-85.636731,41.940257]},n57:{id:"n57",loc:[-85.636227,41.942909]},n570:{id:"n570",loc:[-85.636798,41.940419]},n571:{id:"n571",loc:[-85.6368,41.940524]},n572:{id:"n572",loc:[-85.63664,41.940526]},n573:{id:"n573",loc:[-85.636638,41.940421]},n574:{id:"n574",loc:[-85.636372,41.940551]},n575:{id:"n575",loc:[-85.636338,41.94055]},n576:{id:"n576",loc:[-85.636339,41.940524]},n577:{id:"n577",loc:[-85.636373,41.940525]},n578:{id:"n578",loc:[-85.636388,41.940435]},n579:{id:"n579",loc:[-85.636222,41.940436]},n58:{id:"n58",loc:[-85.63627,41.943175]},n580:{id:"n580",loc:[-85.636222,41.940366]},n581:{id:"n581",loc:[-85.636387,41.940365]},n582:{id:"n582",loc:[-85.636158,41.940482]},n583:{id:"n583",loc:[-85.635963,41.940484]},n584:{id:"n584",loc:[-85.635961,41.940399]},n585:{id:"n585",loc:[-85.636156,41.940397]},n586:{id:"n586",loc:[-85.635987,41.940314]},n587:{id:"n587",loc:[-85.635987,41.940268]},n588:{id:"n588",loc:[-85.635968,41.940268]},n589:{id:"n589",loc:[-85.635967,41.940212]},n59:{id:"n59",loc:[-85.635531,41.943176]},n590:{id:"n590",loc:[-85.636082,41.940211]},n591:{id:"n591",loc:[-85.636083,41.94027]},n592:{id:"n592",loc:[-85.636064,41.94027]},n593:{id:"n593",loc:[-85.636064,41.940313]},n594:{id:"n594",loc:[-85.638071,41.941562]},n595:{id:"n595",loc:[-85.637953,41.941562]},n596:{id:"n596",loc:[-85.637952,41.941522]},n597:{id:"n597",loc:[-85.637876,41.941523]},n598:{id:"n598",loc:[-85.637876,41.941471]},n599:{id:"n599",loc:[-85.638035,41.94147]},n6:{id:"n6",loc:[-85.624925,41.950604]},n60:{id:"n60",loc:[-85.63542,41.942883]},n600:{id:"n600",loc:[-85.638035,41.941513]},n601:{id:"n601",loc:[-85.638071,41.941512]},n602:{id:"n602",loc:[-85.637038,41.942543],tags:{crossing:"marked",highway:"crossing"}},n603:{id:"n603",loc:[-85.637134,41.942542]},n604:{id:"n604",loc:[-85.638122,41.942532]},n605:{id:"n605",loc:[-85.638121,41.942478]},n606:{id:"n606",loc:[-85.638104,41.941424]},n607:{id:"n607",loc:[-85.637115,41.941438]},n608:{id:"n608",loc:[-85.637133,41.942453]},n609:{id:"n609",loc:[-85.637429,41.942004]},n61:{id:"n61",loc:[-85.635701,41.942802]},n610:{id:"n610",loc:[-85.637125,41.942004]},n611:{id:"n611",loc:[-85.637022,41.942004]},n612:{id:"n612",loc:[-85.635952,41.943579]},n613:{id:"n613",loc:[-85.635872,41.943594]},n614:{id:"n614",loc:[-85.635857,41.943551]},n615:{id:"n615",loc:[-85.635937,41.943535]},n616:{id:"n616",loc:[-85.63671,41.94344]},n617:{id:"n617",loc:[-85.636427,41.94334]},n618:{id:"n618",loc:[-85.635353,41.943279]},n619:{id:"n619",loc:[-85.635319,41.943257]},n62:{id:"n62",loc:[-85.6358,41.942997]},n620:{id:"n620",loc:[-85.638786,41.943105]},n621:{id:"n621",loc:[-85.634957,41.943146]},n622:{id:"n622",loc:[-85.635012,41.943119]},n623:{id:"n623",loc:[-85.632409,41.944222]},n624:{id:"n624",loc:[-85.631863,41.944749]},n625:{id:"n625",loc:[-85.631915,41.944722]},n626:{id:"n626",loc:[-85.631884,41.94464]},n627:{id:"n627",loc:[-85.631792,41.944359]},n628:{id:"n628",loc:[-85.631817,41.944703]},n629:{id:"n629",loc:[-85.633464,41.945787]},n63:{id:"n63",loc:[-85.635808,41.943176]},n630:{id:"n630",loc:[-85.633583,41.945919]},n631:{id:"n631",loc:[-85.63382,41.945698]},n632:{id:"n632",loc:[-85.633681,41.945571]},n633:{id:"n633",loc:[-85.634217,41.946824]},n634:{id:"n634",loc:[-85.634271,41.946836]},n635:{id:"n635",loc:[-85.634319,41.94573]},n636:{id:"n636",loc:[-85.634377,41.945672]},n637:{id:"n637",loc:[-85.634909,41.945354]},n638:{id:"n638",loc:[-85.634726,41.945493],tags:{artwork_type:"mural",tourism:"artwork"}},n639:{id:"n639",loc:[-85.63546,41.945612]},n64:{id:"n64",loc:[-85.63631,41.943253]},n640:{id:"n640",loc:[-85.635561,41.945493]},n641:{id:"n641",loc:[-85.635417,41.945565]},n642:{id:"n642",loc:[-85.635315,41.945583]},n643:{id:"n643",loc:[-85.63506,41.945383]},n644:{id:"n644",loc:[-85.635198,41.945199]},n645:{id:"n645",loc:[-85.635361,41.94558]},n646:{id:"n646",loc:[-85.635017,41.945066]},n647:{id:"n647",loc:[-85.634779,41.945206]},n648:{id:"n648",loc:[-85.63425,41.945655]},n649:{id:"n649",loc:[-85.634247,41.945631]},n65:{id:"n65",loc:[-85.635398,41.943259]},n650:{id:"n650",loc:[-85.634889,41.945921]},n651:{id:"n651",loc:[-85.634889,41.945939]},n652:{id:"n652",loc:[-85.634889,41.945761]},n653:{id:"n653",loc:[-85.634889,41.945778]},n654:{id:"n654",loc:[-85.635112,41.945715]},n655:{id:"n655",loc:[-85.635025,41.945714]},n656:{id:"n656",loc:[-85.635027,41.945761]},n657:{id:"n657",loc:[-85.635438,41.945665]},n658:{id:"n658",loc:[-85.635416,41.945676]},n659:{id:"n659",loc:[-85.635401,41.945709]},n66:{id:"n66",loc:[-85.635336,41.943036]},n660:{id:"n660",loc:[-85.635271,41.945566]},n661:{id:"n661",loc:[-85.636106,41.946268]},n662:{id:"n662",loc:[-85.635867,41.946747]},n663:{id:"n663",loc:[-85.636476,41.946797]},n664:{id:"n664",loc:[-85.63651,41.946796]},n665:{id:"n665",loc:[-85.635367,41.946389]},n666:{id:"n666",loc:[-85.635367,41.946437]},n667:{id:"n667",loc:[-85.634787,41.946441]},n668:{id:"n668",loc:[-85.6358,41.946243]},n669:{id:"n669",loc:[-85.635784,41.94622]},n67:{id:"n67",loc:[-85.635911,41.942899]},n670:{id:"n670",loc:[-85.635727,41.946195]},n671:{id:"n671",loc:[-85.635708,41.946588]},n672:{id:"n672",loc:[-85.635648,41.946561]},n673:{id:"n673",loc:[-85.635624,41.946555]},n674:{id:"n674",loc:[-85.635417,41.946559]},n675:{id:"n675",loc:[-85.634866,41.946561]},n676:{id:"n676",loc:[-85.634866,41.946543]},n677:{id:"n677",loc:[-85.635085,41.946546]},n678:{id:"n678",loc:[-85.635085,41.946554]},n679:{id:"n679",loc:[-85.634584,41.94488]},n68:{id:"n68",loc:[-85.635915,41.943156]},n680:{id:"n680",loc:[-85.634557,41.944882]},n681:{id:"n681",loc:[-85.634455,41.944943]},n682:{id:"n682",loc:[-85.634305,41.944968]},n683:{id:"n683",loc:[-85.634261,41.944927]},n684:{id:"n684",loc:[-85.634132,41.944741]},n685:{id:"n685",loc:[-85.633705,41.944759]},n686:{id:"n686",loc:[-85.633918,41.944616]},n687:{id:"n687",loc:[-85.633974,41.944663]},n688:{id:"n688",loc:[-85.6336,41.944665]},n689:{id:"n689",loc:[-85.633817,41.944528]},n69:{id:"n69",loc:[-85.63631,41.943157]},n690:{id:"n690",loc:[-85.633889,41.944485]},n691:{id:"n691",loc:[-85.633931,41.944525]},n692:{id:"n692",loc:[-85.633864,41.944563]},n693:{id:"n693",loc:[-85.633456,41.944524]},n694:{id:"n694",loc:[-85.633676,41.944399]},n695:{id:"n695",loc:[-85.633352,41.944415]},n696:{id:"n696",loc:[-85.633655,41.944234]},n697:{id:"n697",loc:[-85.633761,41.94435]},n698:{id:"n698",loc:[-85.633254,41.944318]},n699:{id:"n699",loc:[-85.633472,41.944188]},n7:{id:"n7",loc:[-85.638791,41.943231]},n70:{id:"n70",loc:[-85.63579,41.942967]},n700:{id:"n700",loc:[-85.633524,41.944237]},n701:{id:"n701",loc:[-85.633583,41.944202]},n702:{id:"n702",loc:[-85.633632,41.944247]},n703:{id:"n703",loc:[-85.633165,41.944228]},n704:{id:"n704",loc:[-85.633388,41.944105]},n705:{id:"n705",loc:[-85.633117,41.944175]},n706:{id:"n706",loc:[-85.633302,41.944077]},n707:{id:"n707",loc:[-85.633352,41.944126]},n708:{id:"n708",loc:[-85.633052,41.944107]},n709:{id:"n709",loc:[-85.633237,41.944009]},n71:{id:"n71",loc:[-85.637506,41.942824]},n710:{id:"n710",loc:[-85.633187,41.943955]},n711:{id:"n711",loc:[-85.633,41.944054]},n712:{id:"n712",loc:[-85.633155,41.944265]},n713:{id:"n713",loc:[-85.633669,41.944765]},n714:{id:"n714",loc:[-85.634468,41.945503]},n715:{id:"n715",loc:[-85.63455,41.945566]},n716:{id:"n716",loc:[-85.634737,41.945729]},n717:{id:"n717",loc:[-85.634753,41.945752]},n718:{id:"n718",loc:[-85.634756,41.945781]},n719:{id:"n719",loc:[-85.634758,41.945978]},n72:{id:"n72",loc:[-85.637511,41.943056]},n720:{id:"n720",loc:[-85.634363,41.945548],tags:{crossing:"marked",highway:"crossing"}},n721:{id:"n721",loc:[-85.634245,41.945599]},n722:{id:"n722",loc:[-85.633474,41.944889]},n723:{id:"n723",loc:[-85.632997,41.944418]},n724:{id:"n724",loc:[-85.63278,41.944183]},n725:{id:"n725",loc:[-85.63331,41.944429]},n726:{id:"n726",loc:[-85.633568,41.944829],tags:{crossing:"marked",highway:"crossing"}},n727:{id:"n727",loc:[-85.634669,41.94567]},n728:{id:"n728",loc:[-85.634462,41.945787]},n729:{id:"n729",loc:[-85.634272,41.945625]},n73:{id:"n73",loc:[-85.637361,41.943058]},n730:{id:"n730",loc:[-85.634344,41.945699],tags:{crossing:"marked",highway:"crossing"}},n731:{id:"n731",loc:[-85.634426,41.945783]},n732:{id:"n732",loc:[-85.632425,41.944137]},n733:{id:"n733",loc:[-85.632302,41.944192]},n734:{id:"n734",loc:[-85.632762,41.944174]},n735:{id:"n735",loc:[-85.632713,41.944179]},n736:{id:"n736",loc:[-85.632411,41.944327]},n737:{id:"n737",loc:[-85.632362,41.944341]},n738:{id:"n738",loc:[-85.632236,41.944204]},n739:{id:"n739",loc:[-85.634939,41.942165]},n74:{id:"n74",loc:[-85.637356,41.942825]},n740:{id:"n740",loc:[-85.635079,41.941535]},n741:{id:"n741",loc:[-85.635112,41.941595]},n742:{id:"n742",loc:[-85.635113,41.941633]},n743:{id:"n743",loc:[-85.635067,41.941652]},n744:{id:"n744",loc:[-85.634989,41.941651]},n745:{id:"n745",loc:[-85.634921,41.941609]},n746:{id:"n746",loc:[-85.634881,41.941544]},n747:{id:"n747",loc:[-85.635537,41.940939]},n748:{id:"n748",loc:[-85.635573,41.941048]},n749:{id:"n749",loc:[-85.635453,41.94091]},n75:{id:"n75",loc:[-85.638097,41.942833]},n750:{id:"n750",loc:[-85.635319,41.940943]},n751:{id:"n751",loc:[-85.637057,41.943224]},n752:{id:"n752",loc:[-85.636989,41.943296]},n753:{id:"n753",loc:[-85.636851,41.943299]},n754:{id:"n754",loc:[-85.636848,41.94322]},n755:{id:"n755",loc:[-85.636986,41.943217]},n756:{id:"n756",loc:[-85.637569,41.943454]},n757:{id:"n757",loc:[-85.637437,41.943458]},n758:{id:"n758",loc:[-85.637432,41.943384]},n759:{id:"n759",loc:[-85.637564,41.94338]},n76:{id:"n76",loc:[-85.638098,41.942912]},n760:{id:"n760",loc:[-85.637213,41.943378]},n761:{id:"n761",loc:[-85.637217,41.943435]},n762:{id:"n762",loc:[-85.637235,41.943434]},n763:{id:"n763",loc:[-85.637237,41.943465]},n764:{id:"n764",loc:[-85.637424,41.943459]},n765:{id:"n765",loc:[-85.637418,41.943371]},n766:{id:"n766",loc:[-85.638094,41.943149]},n767:{id:"n767",loc:[-85.638096,41.943201]},n768:{id:"n768",loc:[-85.638041,41.943202]},n769:{id:"n769",loc:[-85.638042,41.943216]},n77:{id:"n77",loc:[-85.637705,41.942913]},n770:{id:"n770",loc:[-85.637927,41.943218]},n771:{id:"n771",loc:[-85.637926,41.943201]},n772:{id:"n772",loc:[-85.637897,41.943201]},n773:{id:"n773",loc:[-85.637896,41.943155]},n774:{id:"n774",loc:[-85.637962,41.943153]},n775:{id:"n775",loc:[-85.637962,41.943134]},n776:{id:"n776",loc:[-85.638017,41.943132]},n777:{id:"n777",loc:[-85.638018,41.943151]},n778:{id:"n778",loc:[-85.638045,41.943289]},n779:{id:"n779",loc:[-85.638048,41.943363]},n78:{id:"n78",loc:[-85.637705,41.942834]},n780:{id:"n780",loc:[-85.637842,41.943367]},n781:{id:"n781",loc:[-85.637839,41.943296]},n782:{id:"n782",loc:[-85.637896,41.943295]},n783:{id:"n783",loc:[-85.637897,41.943314]},n784:{id:"n784",loc:[-85.637957,41.943312]},n785:{id:"n785",loc:[-85.637957,41.943291]},n786:{id:"n786",loc:[-85.637816,41.943375]},n787:{id:"n787",loc:[-85.637815,41.943416]},n788:{id:"n788",loc:[-85.637715,41.943415]},n789:{id:"n789",loc:[-85.637716,41.943374]},n79:{id:"n79",loc:[-85.638071,41.942298]},n790:{id:"n790",loc:[-85.637912,41.943545]},n791:{id:"n791",loc:[-85.637909,41.943479]},n792:{id:"n792",loc:[-85.637967,41.943477]},n793:{id:"n793",loc:[-85.637967,41.94346]},n794:{id:"n794",loc:[-85.638077,41.943457]},n795:{id:"n795",loc:[-85.638078,41.943473]},n796:{id:"n796",loc:[-85.638124,41.943471]},n797:{id:"n797",loc:[-85.638126,41.943514]},n798:{id:"n798",loc:[-85.638079,41.943515]},n799:{id:"n799",loc:[-85.638079,41.943532]},n8:{id:"n8",loc:[-85.635241,41.941948]},n80:{id:"n80",loc:[-85.638074,41.942431]},n800:{id:"n800",loc:[-85.638028,41.943534]},n801:{id:"n801",loc:[-85.638028,41.943542]},n802:{id:"n802",loc:[-85.638845,41.942983]},n803:{id:"n803",loc:[-85.638846,41.94305]},n804:{id:"n804",loc:[-85.638661,41.943052]},n805:{id:"n805",loc:[-85.63866,41.942984]},n806:{id:"n806",loc:[-85.638579,41.942753]},n807:{id:"n807",loc:[-85.638445,41.942755]},n808:{id:"n808",loc:[-85.638452,41.942978]},n809:{id:"n809",loc:[-85.638545,41.942976]},n81:{id:"n81",loc:[-85.637836,41.942433]},n810:{id:"n810",loc:[-85.638543,41.942935]},n811:{id:"n811",loc:[-85.638571,41.942934]},n812:{id:"n812",loc:[-85.63857,41.942901]},n813:{id:"n813",loc:[-85.638611,41.9429]},n814:{id:"n814",loc:[-85.638607,41.942769]},n815:{id:"n815",loc:[-85.63858,41.94277]},n816:{id:"n816",loc:[-85.638597,41.942614]},n817:{id:"n817",loc:[-85.638601,41.94273]},n818:{id:"n818",loc:[-85.638686,41.942731]},n819:{id:"n819",loc:[-85.638689,41.942917]},n82:{id:"n82",loc:[-85.637835,41.94242]},n820:{id:"n820",loc:[-85.638558,41.943018]},n821:{id:"n821",loc:[-85.638243,41.943019]},n822:{id:"n822",loc:[-85.637536,41.943887]},n823:{id:"n823",loc:[-85.63749,41.943926]},n824:{id:"n824",loc:[-85.63743,41.943886]},n825:{id:"n825",loc:[-85.637476,41.943847]},n826:{id:"n826",loc:[-85.637527,41.943846]},n827:{id:"n827",loc:[-85.637141,41.943728]},n828:{id:"n828",loc:[-85.637201,41.943755]},n829:{id:"n829",loc:[-85.636987,41.943608]},n83:{id:"n83",loc:[-85.63776,41.942421]},n830:{id:"n830",loc:[-85.637441,41.943807]},n831:{id:"n831",loc:[-85.637673,41.94399]},n832:{id:"n832",loc:[-85.637783,41.944137]},n833:{id:"n833",loc:[-85.63845,41.944333]},n834:{id:"n834",loc:[-85.638159,41.944248]},n835:{id:"n835",loc:[-85.637859,41.94416]},n836:{id:"n836",loc:[-85.638685,41.944542]},n837:{id:"n837",loc:[-85.638714,41.944611]},n838:{id:"n838",loc:[-85.638711,41.944757]},n839:{id:"n839",loc:[-85.638774,41.945069]},n84:{id:"n84",loc:[-85.637758,41.942339]},n840:{id:"n840",loc:[-85.638742,41.945205]},n841:{id:"n841",loc:[-85.640267,41.942403]},n842:{id:"n842",loc:[-85.640154,41.942404]},n843:{id:"n843",loc:[-85.640152,41.942249]},n844:{id:"n844",loc:[-85.640266,41.942248]},n845:{id:"n845",loc:[-85.640366,41.942599]},n846:{id:"n846",loc:[-85.640362,41.942192]},n847:{id:"n847",loc:[-85.640146,41.942191]},n848:{id:"n848",loc:[-85.640122,41.942196]},n849:{id:"n849",loc:[-85.640108,41.942211]},n85:{id:"n85",loc:[-85.637836,41.942339]},n850:{id:"n850",loc:[-85.640101,41.942236]},n851:{id:"n851",loc:[-85.640103,41.94241]},n852:{id:"n852",loc:[-85.64011,41.942435]},n853:{id:"n853",loc:[-85.640126,41.942445]},n854:{id:"n854",loc:[-85.640153,41.942451]},n855:{id:"n855",loc:[-85.640183,41.942452]},n856:{id:"n856",loc:[-85.640364,41.942452]},n857:{id:"n857",loc:[-85.640007,41.942452]},n858:{id:"n858",loc:[-85.639449,41.942461]},n859:{id:"n859",loc:[-85.640049,41.942391]},n86:{id:"n86",loc:[-85.637835,41.942301]},n860:{id:"n860",loc:[-85.640052,41.942503]},n861:{id:"n861",loc:[-85.639575,41.94251]},n862:{id:"n862",loc:[-85.639572,41.942398]},n863:{id:"n863",loc:[-85.638782,41.942227]},n864:{id:"n864",loc:[-85.63843,41.942226]},n865:{id:"n865",loc:[-85.63823,41.942183]},n866:{id:"n866",loc:[-85.638363,41.942216],tags:{barrier:"gate"}},n867:{id:"n867",loc:[-85.6384,41.942223]},n868:{id:"n868",loc:[-85.636042,41.942797]},n869:{id:"n869",loc:[-85.636308,41.942752]},n87:{id:"n87",loc:[-85.637566,41.942367]},n870:{id:"n870",loc:[-85.636516,41.942729]},n871:{id:"n871",loc:[-85.636782,41.942712]},n872:{id:"n872",loc:[-85.636944,41.942706]},n873:{id:"n873",loc:[-85.63704,41.942706]},n874:{id:"n874",loc:[-85.637237,41.942703]},n875:{id:"n875",loc:[-85.637553,41.9427]},n876:{id:"n876",loc:[-85.638236,41.942697]},n877:{id:"n877",loc:[-85.636284,41.942781]},n878:{id:"n878",loc:[-85.636551,41.942641]},n879:{id:"n879",loc:[-85.633914,41.943693]},n88:{id:"n88",loc:[-85.637566,41.94241]},n880:{id:"n880",loc:[-85.63389,41.943708]},n881:{id:"n881",loc:[-85.633866,41.943686]},n882:{id:"n882",loc:[-85.63389,41.943671]},n883:{id:"n883",loc:[-85.633857,41.943609]},n884:{id:"n884",loc:[-85.634858,41.944474]},n885:{id:"n885",loc:[-85.633988,41.943234]},n886:{id:"n886",loc:[-85.633999,41.943485]},n887:{id:"n887",loc:[-85.634109,41.943449],tags:{emergency:"fire_hydrant"}},n888:{id:"n888",loc:[-85.635728,41.942655],tags:{emergency:"fire_hydrant"}},n889:{id:"n889",loc:[-85.636499,41.942845],tags:{man_made:"flagpole"}},n89:{id:"n89",loc:[-85.637455,41.94241]},n890:{id:"n890",loc:[-85.636197,41.943073]},n891:{id:"n891",loc:[-85.636227,41.943073]},n892:{id:"n892",loc:[-85.637433,41.942933],tags:{"addr:city":"Three Rivers","addr:housenumber":"401","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",amenity:"restaurant",cuisine:"pizza",name:"Pizza Hut"}},n893:{id:"n893",loc:[-85.637907,41.942879],tags:{amenity:"car_wash"}},n894:{id:"n894",loc:[-85.637661,41.943018]},n895:{id:"n895",loc:[-85.636933,41.942733],tags:{emergency:"fire_hydrant"}},n896:{id:"n896",loc:[-85.637661,41.94304]},n897:{id:"n897",loc:[-85.637562,41.943041]},n898:{id:"n898",loc:[-85.637556,41.942725]},n899:{id:"n899",loc:[-85.637656,41.942724]},n9:{id:"n9",loc:[-85.635159,41.941926]},n90:{id:"n90",loc:[-85.637454,41.942367]},n900:{id:"n900",loc:[-85.637657,41.942779]},n901:{id:"n901",loc:[-85.637983,41.942777]},n902:{id:"n902",loc:[-85.637982,41.942616]},n903:{id:"n903",loc:[-85.637777,41.942778]},n904:{id:"n904",loc:[-85.637775,41.942699]},n905:{id:"n905",loc:[-85.637772,41.942618]},n906:{id:"n906",loc:[-85.637982,41.942698]},n907:{id:"n907",loc:[-85.637941,41.942378],tags:{"addr:city":"Three Rivers","addr:housenumber":"416","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",name:"Gem Pawnbroker",shop:"pawnbroker"}},n908:{id:"n908",loc:[-85.637515,41.942394],tags:{second_hand:"only",shop:"car"}},n909:{id:"n909",loc:[-85.638743,41.942374],tags:{"addr:city":"Three Rivers","addr:housenumber":"500","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",name:"William Towing","service:vehicle:towing":"yes","service:vehicle:tyres":"yes",shop:"car_repair"}},n91:{id:"n91",loc:[-85.637565,41.942341]},n910:{id:"n910",loc:[-85.638594,41.942357]},n911:{id:"n911",loc:[-85.634312,41.943562],tags:{"addr:city":"Three Rivers","addr:housenumber":"145","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",amenity:"cafe",cuisine:"coffee_shop",name:"L.A.'s Coffee Cafe",outdoor_seating:"yes"}},n912:{id:"n912",loc:[-85.634404,41.943512]},n913:{id:"n913",loc:[-85.634391,41.943519],tags:{entrance:"yes"}},n914:{id:"n914",loc:[-85.634259,41.943538],tags:{entrance:"yes"}},n915:{id:"n915",loc:[-85.634247,41.943528]},n916:{id:"n916",loc:[-85.633747,41.943322],tags:{"addr:city":"Three Rivers","addr:housenumber":"132","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",name:"Preferred Insurance Services",office:"insurance"}},n917:{id:"n917",loc:[-85.63299,41.943686],tags:{"addr:city":"Three Rivers","addr:housenumber":"101","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Lynn's Garage","service:vehicle:tyres":"yes",shop:"car_repair"}},n918:{id:"n918",loc:[-85.633438,41.944883]},n919:{id:"n919",loc:[-85.633265,41.944983]},n92:{id:"n92",loc:[-85.637481,41.942341]},n920:{id:"n920",loc:[-85.633315,41.945027]},n921:{id:"n921",loc:[-85.633376,41.944827]},n922:{id:"n922",loc:[-85.633199,41.944922]},n923:{id:"n923",loc:[-85.633316,41.944772]},n924:{id:"n924",loc:[-85.633147,41.944867]},n925:{id:"n925",loc:[-85.633261,41.944719]},n926:{id:"n926",loc:[-85.633096,41.944812]},n927:{id:"n927",loc:[-85.633191,41.944645]},n928:{id:"n928",loc:[-85.632981,41.94476]},n929:{id:"n929",loc:[-85.633062,41.94483]},n93:{id:"n93",loc:[-85.637481,41.94226]},n930:{id:"n930",loc:[-85.633146,41.944602]},n931:{id:"n931",loc:[-85.632969,41.944703]},n932:{id:"n932",loc:[-85.633008,41.944745]},n933:{id:"n933",loc:[-85.633088,41.944545]},n934:{id:"n934",loc:[-85.632868,41.944655]},n935:{id:"n935",loc:[-85.632941,41.944718]},n936:{id:"n936",loc:[-85.633028,41.944483]},n937:{id:"n937",loc:[-85.632817,41.944605]},n938:{id:"n938",loc:[-85.632923,41.944373]},n939:{id:"n939",loc:[-85.632692,41.944485]},n94:{id:"n94",loc:[-85.637565,41.94226]},n940:{id:"n940",loc:[-85.632871,41.944316]},n941:{id:"n941",loc:[-85.632655,41.944421]},n942:{id:"n942",loc:[-85.632711,41.944478]},n943:{id:"n943",loc:[-85.632825,41.94426]},n944:{id:"n944",loc:[-85.632606,41.944363]},n945:{id:"n945",loc:[-85.63275,41.94418]},n946:{id:"n946",loc:[-85.632588,41.944256]},n947:{id:"n947",loc:[-85.632611,41.944279]},n948:{id:"n948",loc:[-85.632548,41.944306]},n949:{id:"n949",loc:[-85.632512,41.944406]},n95:{id:"n95",loc:[-85.637188,41.942217]},n950:{id:"n950",loc:[-85.632565,41.944463]},n951:{id:"n951",loc:[-85.632579,41.944456]},n952:{id:"n952",loc:[-85.632634,41.944518]},n953:{id:"n953",loc:[-85.632686,41.944569]},n954:{id:"n954",loc:[-85.632745,41.944537]},n955:{id:"n955",loc:[-85.632659,41.944587]},n956:{id:"n956",loc:[-85.632778,41.944705]},n957:{id:"n957",loc:[-85.632815,41.944301],tags:{"addr:city":"Three Rivers","addr:housenumber":"5","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Access Point Employment",office:"employment_agency"}},n958:{id:"n958",loc:[-85.6332,41.944174],tags:{"addr:city":"Three Rivers","addr:housenumber":"6","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Paisley Emporium",shop:"second_hand"}},n959:{id:"n959",loc:[-85.633578,41.944568],tags:{"addr:city":"Three Rivers","addr:housenumber":"22","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Lowry's Books",shop:"books"}},n96:{id:"n96",loc:[-85.637189,41.942303]},n960:{id:"n960",loc:[-85.63344,41.944443],tags:{"addr:city":"Three Rivers","addr:housenumber":"16","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",amenity:"restaurant",cuisine:"pizza",name:"Paisano's Bar and Grill"}},n961:{id:"n961",loc:[-85.633009,41.944542],tags:{"addr:city":"Three Rivers","addr:housenumber":"13","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",amenity:"cafe",cuisine:"american",internet_access:"yes",name:"Main Street Cafe"}},n962:{id:"n962",loc:[-85.633674,41.944682],tags:{"addr:city":"Three Rivers","addr:housenumber":"28","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",leisure:"fitness_centre",name:"Main Street Fitness"}},n963:{id:"n963",loc:[-85.633376,41.944868],tags:{"addr:city":"Three Rivers","addr:housenumber":"27","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",leisure:"fitness_centre",name:"Main Street Barbell"}},n964:{id:"n964",loc:[-85.633366,41.944783]},n965:{id:"n965",loc:[-85.633296,41.94482]},n966:{id:"n966",loc:[-85.633214,41.94487]},n967:{id:"n967",loc:[-85.633005,41.944988]},n968:{id:"n968",loc:[-85.633269,41.944816]},n969:{id:"n969",loc:[-85.633215,41.944842]},n97:{id:"n97",loc:[-85.637299,41.942302]},n970:{id:"n970",loc:[-85.633245,41.944871]},n971:{id:"n971",loc:[-85.633296,41.944845]},n972:{id:"n972",loc:[-85.633254,41.944845],tags:{natural:"tree"}},n973:{id:"n973",loc:[-85.633557,41.945515]},n974:{id:"n974",loc:[-85.633279,41.945246]},n975:{id:"n975",loc:[-85.63324,41.945226]},n976:{id:"n976",loc:[-85.6332,41.945213]},n977:{id:"n977",loc:[-85.633133,41.945164]},n978:{id:"n978",loc:[-85.63312,41.945132]},n979:{id:"n979",loc:[-85.633095,41.945081]},n98:{id:"n98",loc:[-85.637299,41.942314]},n980:{id:"n980",loc:[-85.633064,41.945047]},n981:{id:"n981",loc:[-85.632739,41.944742]},n982:{id:"n982",loc:[-85.633281,41.945026]},n983:{id:"n983",loc:[-85.633155,41.944903]},n984:{id:"n984",loc:[-85.633079,41.944829]},n985:{id:"n985",loc:[-85.63304,41.944853]},n986:{id:"n986",loc:[-85.632949,41.944776]},n987:{id:"n987",loc:[-85.632921,41.944725]},n988:{id:"n988",loc:[-85.632859,41.944673]},n989:{id:"n989",loc:[-85.632895,41.94505]},n99:{id:"n99",loc:[-85.637396,41.942313]},n990:{id:"n990",loc:[-85.633336,41.945138]},n991:{id:"n991",loc:[-85.633466,41.945265]},n992:{id:"n992",loc:[-85.633367,41.945327]},n993:{id:"n993",loc:[-85.633163,41.945189]},n994:{id:"n994",loc:[-85.633678,41.945309]},n995:{id:"n995",loc:[-85.633619,41.945261]},n996:{id:"n996",loc:[-85.63355,41.945301]},n997:{id:"n997",loc:[-85.633607,41.945352]},n998:{id:"n998",loc:[-85.633579,41.945327],tags:{entrance:"yes"}},n999:{id:"n999",loc:[-85.633445,41.945404]},r2:{id:"r2",members:[{id:"w225",role:"outer",type:"way"}],tags:{type:"multipolygon",waterway:"riverbank"}},r5:{id:"r5",members:[{id:"w642",role:"outer",type:"way"}],tags:{admin_level:"8",border_type:"city",boundary:"administrative",name:"Three Rivers",place:"city",type:"boundary"}},w1:{id:"w1",nodes:["n5","n1797"],tags:{highway:"residential",name:"12th Avenue"}},w10:{id:"w10",nodes:["n54","n55","n56","n57","n891","n890","n54"],tags:{building:"yes"}},w100:{id:"w100",nodes:["n451","n915","n452"],tags:{highway:"footway"}},w101:{id:"w101",nodes:["n461","n462","n463","n464","n465","n466"],tags:{barrier:"fence"}},w102:{id:"w102",nodes:["n467","n468","n469","n470","n472","n467"],tags:{amenity:"parking"}},w103:{id:"w103",nodes:["n2597","n2444","n471","n472"],tags:{highway:"footway"}},w104:{id:"w104",nodes:["n473","n474","n325"],tags:{footway:"sidewalk",highway:"footway"}},w105:{id:"w105",nodes:["n475","n324","n325"],tags:{footway:"sidewalk",highway:"footway"}},w106:{id:"w106",nodes:["n886","n452","n476"],tags:{footway:"sidewalk",highway:"footway"}},w107:{id:"w107",nodes:["n485","n4678","n486","n18"],tags:{highway:"service"}},w108:{id:"w108",nodes:["n300","n487","n488","n489","n490"],tags:{highway:"footway"}},w109:{id:"w109",nodes:["n490","n491"],tags:{highway:"footway"}},w11:{id:"w11",nodes:["n58","n63","n59","n315","n60"],tags:{highway:"service"}},w110:{id:"w110",nodes:["n492","n493","n494","n495","n496","n497","n492"],tags:{building:"yes"}},w111:{id:"w111",nodes:["n498","n499","n511"],tags:{highway:"service"}},w112:{id:"w112",nodes:["n510","n500","n501","n502","n503","n504","n505","n506","n507","n508","n509"],tags:{highway:"service"}},w113:{id:"w113",nodes:["n511","n510"],tags:{covered:"yes",highway:"service"}},w114:{id:"w114",nodes:["n512","n513","n514","n515","n512"],tags:{building:"yes"}},w115:{id:"w115",nodes:["n516","n517","n518","n519","n516"],tags:{building:"yes"}},w116:{id:"w116",nodes:["n520","n521","n522","n523","n520"],tags:{building:"yes"}},w117:{id:"w117",nodes:["n524","n525","n526","n527","n528","n529","n530","n531","n532","n533","n534","n535","n524"],tags:{building:"yes"}},w118:{id:"w118",nodes:["n536","n537","n538","n539","n536"],tags:{building:"yes"}},w119:{id:"w119",nodes:["n540","n541","n542","n543","n544","n545","n546","n547","n540"],tags:{building:"yes"}},w12:{id:"w12",nodes:["n61","n314","n70","n62","n63"],tags:{highway:"service"}},w120:{id:"w120",nodes:["n548","n549","n550","n551","n552","n553","n554","n555","n556","n557","n548"],tags:{building:"yes"}},w121:{id:"w121",nodes:["n558","n559","n560","n561","n562","n563","n564","n565","n558"],tags:{building:"yes"}},w122:{id:"w122",nodes:["n566","n567","n568","n569","n566"],tags:{building:"yes"}},w123:{id:"w123",nodes:["n570","n571","n572","n573","n570"],tags:{building:"yes"}},w124:{id:"w124",nodes:["n574","n575","n576","n577","n574"],tags:{building:"yes"}},w125:{id:"w125",nodes:["n578","n579","n580","n581","n578"],tags:{building:"yes"}},w126:{id:"w126",nodes:["n582","n583","n584","n585","n582"],tags:{building:"yes"}},w127:{id:"w127",nodes:["n586","n587","n588","n589","n590","n591","n592","n593","n586"],tags:{building:"yes"}},w128:{id:"w128",nodes:["n594","n595","n596","n597","n598","n599","n600","n601","n594"],tags:{building:"yes"}},w129:{id:"w129",nodes:["n309","n602","n603"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w13:{id:"w13",nodes:["n64","n65","n66","n67","n68","n69","n64"],tags:{amenity:"parking"}},w130:{id:"w130",nodes:["n603","n604"],tags:{footway:"sidewalk",highway:"footway"}},w131:{id:"w131",nodes:["n604","n605","n606"],tags:{footway:"sidewalk",highway:"footway"}},w132:{id:"w132",nodes:["n606","n607"],tags:{footway:"sidewalk",highway:"footway"}},w133:{id:"w133",nodes:["n607","n610","n608","n603"],tags:{footway:"sidewalk",highway:"footway"}},w134:{id:"w134",nodes:["n609","n610","n611"],tags:{highway:"service",service:"driveway",surface:"unpaved"}},w135:{id:"w135",nodes:["n244","n245","n246"],tags:{highway:"service"}},w136:{id:"w136",nodes:["n612","n613","n614","n615","n612"],tags:{amenity:"shelter",building:"yes"}},w137:{id:"w137",nodes:["n2779","n2788","n2776","n2778","n2775","n2787","n2440","n2437","n629","n2438","n630","n2439","n2407","n2408","n2409"],tags:{highway:"residential",name:"Foster Street"}},w138:{id:"w138",nodes:["n2779","n625","n626","n627"],tags:{highway:"residential",name:"Foster Street",oneway:"yes"}},w139:{id:"w139",nodes:["n630","n631","n632","n2437"],tags:{highway:"service"}},w14:{id:"w14",nodes:["n71","n72","n73","n74","n71"],tags:{building:"yes"}},w140:{id:"w140",nodes:["n643","n637","n715","n2410"],tags:{highway:"footway",name:"Mural Mall"}},w141:{id:"w141",nodes:["n639","n2516"],tags:{barrier:"wall"}},w142:{id:"w142",nodes:["n640","n641","n645","n642","n660","n643","n644"],tags:{highway:"service"}},w143:{id:"w143",nodes:["n646","n647"],tags:{highway:"service"}},w144:{id:"w144",nodes:["n654","n655","n656"],tags:{barrier:"wall"}},w145:{id:"w145",nodes:["n665","n666","n667"],tags:{barrier:"wall"}},w146:{id:"w146",nodes:["n2727","n662","n2719"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w147:{id:"w147",nodes:["n2725","n674"],tags:{highway:"service",oneway:"yes"}},w148:{id:"w148",nodes:["n2464","n2460","n2454","n684","n2455","n2464"],tags:{building:"yes"}},w149:{id:"w149",nodes:["n2456","n685","n686","n687","n2456"],tags:{building:"yes"}},w15:{id:"w15",nodes:["n75","n76","n77","n78","n75"],tags:{building:"yes"}},w150:{id:"w150",nodes:["n685","n688","n689","n690","n691","n692","n686","n685"],tags:{building:"yes"}},w151:{id:"w151",nodes:["n688","n693","n694","n689","n688"],tags:{building:"yes"}},w152:{id:"w152",nodes:["n693","n695","n702","n696","n697","n694","n693"],tags:{building:"yes"}},w153:{id:"w153",nodes:["n695","n698","n699","n700","n701","n702","n695"],tags:{building:"yes"}},w154:{id:"w154",nodes:["n698","n703","n707","n704","n699","n698"],tags:{building:"yes"}},w155:{id:"w155",nodes:["n703","n705","n706","n707","n703"],tags:{building:"yes"}},w156:{id:"w156",nodes:["n705","n708","n709","n706","n705"],tags:{building:"yes"}},w157:{id:"w157",nodes:["n709","n710","n711","n708","n709"],tags:{building:"yes"}},w158:{id:"w158",nodes:["n369","n712","n725","n713","n714","n715","n727","n716","n717","n718","n719"],tags:{footway:"sidewalk",highway:"footway"}},w159:{id:"w159",nodes:["n714","n720","n721"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w16:{id:"w16",nodes:["n79","n80","n81","n82","n83","n84","n85","n86","n79"],tags:{building:"yes"}},w160:{id:"w160",nodes:["n729","n721","n722","n964","n723","n724"],tags:{footway:"sidewalk",highway:"footway"}},w161:{id:"w161",nodes:["n713","n726","n722"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w162:{id:"w162",nodes:["n727","n2411","n728"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w163:{id:"w163",nodes:["n729","n730","n731"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w164:{id:"w164",nodes:["n365","n732","n733","n738"],tags:{footway:"sidewalk",highway:"footway"}},w165:{id:"w165",nodes:["n724","n734","n367","n735","n736","n737"],tags:{footway:"sidewalk",highway:"footway"}},w166:{id:"w166",nodes:["n739","n2037","n2038","n2039","n2040","n1623","n2032"],tags:{highway:"footway"}},w167:{id:"w167",nodes:["n150","n751"],tags:{highway:"service"}},w168:{id:"w168",nodes:["n752","n753","n754","n755","n752"],tags:{building:"yes"}},w169:{id:"w169",nodes:["n756","n757","n758","n759","n756"],tags:{building:"yes"}},w17:{id:"w17",nodes:["n87","n88","n89","n90","n87"],tags:{building:"yes"}},w170:{id:"w170",nodes:["n760","n761","n762","n763","n764","n765","n760"],tags:{building:"yes"}},w171:{id:"w171",nodes:["n766","n767","n768","n769","n770","n771","n772","n773","n774","n775","n776","n777","n766"],tags:{building:"yes"}},w172:{id:"w172",nodes:["n778","n779","n780","n781","n782","n783","n784","n785","n778"],tags:{building:"yes"}},w173:{id:"w173",nodes:["n786","n787","n788","n789","n786"],tags:{building:"yes"}},w174:{id:"w174",nodes:["n790","n791","n792","n793","n794","n795","n796","n797","n798","n799","n800","n801","n790"],tags:{building:"yes"}},w175:{id:"w175",nodes:["n802","n803","n804","n805","n802"],tags:{building:"yes"}},w176:{id:"w176",nodes:["n806","n807","n808","n809","n810","n811","n812","n813","n814","n815","n806"],tags:{building:"yes"}},w177:{id:"w177",nodes:["n816","n1140","n817","n818","n819","n820","n821"],tags:{highway:"service"}},w178:{id:"w178",nodes:["n822","n823","n824","n825","n822"],tags:{building:"yes"}},w179:{id:"w179",nodes:["n841","n842","n843","n844","n841"],tags:{building:"yes"}},w18:{id:"w18",nodes:["n91","n92","n93","n94","n91"],tags:{building:"yes"}},w180:{id:"w180",nodes:["n845","n856","n846"],tags:{highway:"service"}},w181:{id:"w181",nodes:["n846","n847","n848","n849","n850","n851","n852","n853","n854","n855","n856"],tags:{highway:"service",oneway:"yes",service:"drive-through"}},w182:{id:"w182",nodes:["n857","n858"],tags:{highway:"service"}},w183:{id:"w183",nodes:["n859","n860","n861","n862","n859"],tags:{amenity:"parking"}},w184:{id:"w184",nodes:["n863","n864","n867","n866","n865"],tags:{highway:"service"}},w185:{id:"w185",nodes:["n883","n884"],tags:{barrier:"fence"}},w186:{id:"w186",nodes:["n1954","n622","n1955"],tags:{highway:"path",name:"Riverwalk Trail"}},w187:{id:"w187",nodes:["n621","n1954"],tags:{highway:"steps",incline:"up",name:"Riverwalk Trail",surface:"wood"}},w188:{id:"w188",nodes:["n2274","n2275","n2276","n2277","n2278","n2279","n1953","n621"],tags:{highway:"path",name:"Riverwalk Trail",surface:"wood"}},w189:{id:"w189",nodes:["n2273","n2274"],tags:{highway:"steps",incline:"down",name:"Riverwalk Trail",surface:"wood"}},w19:{id:"w19",nodes:["n95","n96","n97","n98","n99","n100","n101","n102","n95"],tags:{building:"yes"}},w190:{id:"w190",nodes:["n821","n894","n900","n903","n901"],tags:{highway:"service"}},w191:{id:"w191",nodes:["n896","n897","n898","n899","n900","n894","n896"],tags:{amenity:"parking"}},w192:{id:"w192",nodes:["n903","n904","n905"],tags:{highway:"service"}},w193:{id:"w193",nodes:["n901","n906","n902"],tags:{highway:"service"}},w194:{id:"w194",nodes:["n912","n913"],tags:{highway:"footway"}},w195:{id:"w195",nodes:["n914","n915"],tags:{highway:"footway"}},w196:{id:"w196",nodes:["n2466","n918","n919","n920","n2466"],tags:{building:"yes"}},w197:{id:"w197",nodes:["n918","n921","n922","n919","n918"],tags:{building:"yes"}},w198:{id:"w198",nodes:["n923","n925","n926","n924","n923"],tags:{building:"yes"}},w199:{id:"w199",nodes:["n925","n927","n932","n928","n929","n926","n925"],tags:{building:"yes"}},w2:{id:"w2",nodes:["n3523","n2182","n2160"],tags:{highway:"service"}},w20:{id:"w20",nodes:["n103","n104","n105","n106","n107","n108","n109","n110","n111","n112","n113","n114","n103"],tags:{building:"yes"}},w200:{id:"w200",nodes:["n927","n930","n931","n932","n927"],tags:{building:"yes"}},w201:{id:"w201",nodes:["n930","n933","n934","n935","n931","n930"],tags:{building:"yes"}},w202:{id:"w202",nodes:["n933","n936","n937","n934","n933"],tags:{building:"yes"}},w203:{id:"w203",nodes:["n936","n938","n942","n939","n954","n937","n936"],tags:{building:"yes"}},w204:{id:"w204",nodes:["n938","n940","n941","n942","n938"],tags:{building:"yes"}},w205:{id:"w205",nodes:["n940","n943","n944","n941","n940"],tags:{building:"yes"}},w206:{id:"w206",nodes:["n943","n945","n946","n947","n948","n944","n943"],tags:{building:"yes"}},w207:{id:"w207",nodes:["n944","n949","n950","n951","n941","n944"],tags:{building:"yes"}},w208:{id:"w208",nodes:["n941","n951","n952","n939","n942","n941"],tags:{building:"yes"}},w209:{id:"w209",nodes:["n952","n953","n954","n939","n952"],tags:{building:"yes"}},w21:{id:"w21",nodes:["n115","n116","n117","n118","n115"],tags:{building:"yes"}},w210:{id:"w210",nodes:["n953","n955","n956","n934","n937","n954","n953"],tags:{building:"yes"}},w211:{id:"w211",nodes:["n964","n965"],tags:{highway:"footway"}},w212:{id:"w212",nodes:["n966","n983","n967","n989"],tags:{highway:"footway"}},w213:{id:"w213",nodes:["n965","n968","n969","n966","n970","n971","n965"],tags:{highway:"footway"}},w214:{id:"w214",nodes:["n973","n999","n992","n974","n975","n976","n993","n977","n978","n979","n980","n967","n981","n1000","n1001","n1002","n1003","n1004","n1005","n1006","n1007","n1008","n1009"],tags:{footway:"sidewalk",highway:"footway"}},w215:{id:"w215",nodes:["n978","n982","n983","n984","n985","n986","n987","n988","n981"],tags:{highway:"footway"}},w216:{id:"w216",nodes:["n976","n990","n991","n992"],tags:{highway:"footway"}},w217:{id:"w217",nodes:["n998","n999"],tags:{highway:"footway"}},w218:{id:"w218",nodes:["n1019","n1020","n1021","n1022","n731","n728","n1023","n1025","n1024","n1019"],tags:{footway:"sidewalk",highway:"footway"}},w219:{id:"w219",nodes:["n719","n1026","n1027"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w22:{id:"w22",nodes:["n119","n120","n121","n122","n119"],tags:{building:"yes"}},w220:{id:"w220",nodes:["n1027","n1028","n1019"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w221:{id:"w221",nodes:["n2080","n1828","n1863","n1829"],tags:{highway:"tertiary",name:"Constantine Street"}},w222:{id:"w222",nodes:["n1029","n1030","n1031"],tags:{highway:"service"}},w223:{id:"w223",nodes:["n2213","n2171","n2183","n2180","n2205","n2177","n2179","n2218","n2200","n2188","n2169","n2196","n2162","n2170","n2211","n2216","n2204","n2220","n2164","n2210","n2217","n2189","n460","n453","n2282"],tags:{name:"Rocky River",waterway:"river"}},w224:{id:"w224",nodes:["n3750","n3751","n3752"],tags:{highway:"service",service:"alley",surface:"unpaved"}},w225:{id:"w225",nodes:["n2134","n2127","n2313","n2109","n2112","n2129","n2156","n2146","n2126","n2153","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n2122","n2114","n2149","n2119","n2106","n2111","n2145","n2113","n2117","n2159","n2143","n2123","n2142","n2116","n2154","n2139","n2150","n2157","n2120","n2138","n2130","n2136","n2155","n2107","n2141","n2124","n3754","n2121","n2105","n2108","n3755","n2128","n2110","n2152","n2125","n2135","n2186","n2115","n2144","n2137","n2133","n2148","n2118","n1871","n1875","n1872","n2041","n1873","n2042","n1874","n1884","n1870","n2151","n2147","n2158","n2104","n2134"]},w226:{id:"w226",nodes:["n2243","n2280","n2244","n2245","n2246","n2247","n1931","n1932","n1933","n1934","n1935","n1936","n1937","n1938","n4681","n1939","n1940","n1941","n1942","n1943","n1944","n1945","n1946","n1947"],tags:{highway:"path",name:"Riverwalk Trail",surface:"asphalt",width:"3"}},w227:{id:"w227",nodes:["n2994","n3012","n3011","n2958"],tags:{highway:"secondary",name:"Main Street"}},w228:{id:"w228",nodes:["n2747","n2762","n2757","n2746","n2761","n2758","n2760","n2755","n2749","n2691","n1028","n2432","n2414","n2413","n2412","n2411","n2410","n720","n726","n370","n368","n2748"],tags:{highway:"primary",name:"Main Street"}},w229:{id:"w229",nodes:["n2083","n2103","n2102","n2084","n2085","n2086","n2087","n2242","n471","n324","n2101","n332","n1868"],tags:{name:"Conrail Railroad",railway:"rail"}},w23:{id:"w23",nodes:["n123","n124","n125","n126","n123"],tags:{building:"yes"}},w230:{id:"w230",nodes:["n2232","n2236","n2231","n2230","n2226","n2241","n2237","n2227","n1182","n2233","n2228","n2229","n1183","n2234","n19","n1891","n20","n2223","n2224","n2238","n2235","n2240","n2225","n2239"],tags:{name:"Saint Joseph River",waterway:"river"}},w231:{id:"w231",nodes:["n456","n1036","n1037","n1038"],tags:{barrier:"wall"}},w232:{id:"w232",nodes:["n1034","n1039","n1040"],tags:{barrier:"wall"}},w233:{id:"w233",nodes:["n1041","n1042","n1043","n1044","n1045","n1046","n1041"],tags:{access:"private",leisure:"swimming_pool"}},w234:{id:"w234",nodes:["n1047","n1048"],tags:{barrier:"hedge"}},w235:{id:"w235",nodes:["n1049","n1050","n1051","n1052","n1049"],tags:{building:"yes"}},w236:{id:"w236",nodes:["n1053","n1054","n1055","n1056","n1057","n1058","n1059","n1060","n1053"],tags:{building:"yes"}},w237:{id:"w237",nodes:["n1061","n1062","n1063","n1064","n1065","n1061"],tags:{building:"yes"}},w238:{id:"w238",nodes:["n1066","n1067","n1068","n1069","n1070","n1071","n1066"],tags:{building:"yes"}},w239:{id:"w239",nodes:["n1072","n1073","n1074","n1075","n1072"],tags:{building:"yes"}},w24:{id:"w24",nodes:["n127","n128","n129","n130","n127"],tags:{building:"yes"}},w240:{id:"w240",nodes:["n1076","n1077","n1078","n1079","n1080","n1081","n1076"],tags:{building:"yes"}},w241:{id:"w241",nodes:["n1082","n1083","n1084","n1085","n1082"],tags:{building:"yes"}},w242:{id:"w242",nodes:["n1086","n1087","n1088","n1089","n1086"],tags:{building:"yes"}},w243:{id:"w243",nodes:["n1090","n1091","n1092","n1093","n1094","n1095","n1096","n1097","n1090"],tags:{building:"yes"}},w244:{id:"w244",nodes:["n1098","n1099","n1100","n1101"],tags:{barrier:"fence"}},w245:{id:"w245",nodes:["n1102","n835","n30","n2590","n35","n29","n2591","n34","n28","n2592","n2312","n32","n2593","n31","n33","n2594","n2595","n1102"],tags:{highway:"service"}},w246:{id:"w246",nodes:["n1103","n1139","n1104"],tags:{barrier:"fence"}},w247:{id:"w247",nodes:["n1105","n1106","n1107","n1108","n1109","n1110","n1111","n1112","n1113","n1114","n1105"],tags:{building:"yes"}},w248:{id:"w248",nodes:["n1115","n1116","n1117","n1118","n1119","n1120","n1115"],tags:{building:"yes"}},w249:{id:"w249",nodes:["n1121","n1122","n1123","n1124","n1121"],tags:{building:"yes"}},w25:{id:"w25",nodes:["n131","n132","n133","n134","n135","n136","n137","n138","n139","n140","n141","n142","n131"],tags:{building:"yes"}},w250:{id:"w250",nodes:["n1125","n1126","n1127","n1128","n1129","n1130","n1131","n1132","n1133","n1134","n1135","n1136","n1125"],tags:{building:"yes"}},w251:{id:"w251",nodes:["n1137","n1138","n1139"],tags:{barrier:"fence"}},w252:{id:"w252",nodes:["n876","n1140","n1141"],tags:{footway:"sidewalk",highway:"footway"}},w253:{id:"w253",nodes:["n1141","n1142","n1143","n1144","n1145","n1146"],tags:{footway:"sidewalk",highway:"footway"}},w254:{id:"w254",nodes:["n1146","n4743","n1147","n1148"],tags:{footway:"sidewalk",highway:"footway"}},w255:{id:"w255",nodes:["n1148","n1149","n1150","n1151"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w256:{id:"w256",nodes:["n1151","n1153","n1154","n1155"],tags:{footway:"sidewalk",highway:"footway"}},w257:{id:"w257",nodes:["n1155","n1156"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w258:{id:"w258",nodes:["n1157","n1158"],tags:{barrier:"retaining_wall"}},w259:{id:"w259",nodes:["n1156","n1161","n1159","n1160","n719"],tags:{footway:"sidewalk",highway:"footway"}},w26:{id:"w26",nodes:["n143","n608","n144"],tags:{highway:"service"}},w260:{id:"w260",nodes:["n1162","n1163","n1164","n1165","n1166","n1167","n1168","n1169","n1170","n2528"],tags:{highway:"footway"}},w261:{id:"w261",nodes:["n1171","n1172","n1173"],tags:{barrier:"wall"}},w262:{id:"w262",nodes:["n1175","n1176","n1177","n1178","n1179","n1180","n1181","n1175"],tags:{natural:"wood"}},w263:{id:"w263",nodes:["n1947","n1184","n1948","n1185","n1949","n1957","n1950","n480","n1951","n479","n478","n477","n1952","n1851","n1956","n2248","n619","n618","n2249","n2250","n2251","n617","n2252","n616","n2253","n829","n2254","n827","n828","n2255","n830","n2256","n826","n2257","n831","n2258","n832","n835","n834","n2312","n2267","n2259","n833","n2268","n2260","n836","n2261","n837","n2262","n838","n2263","n2264","n839","n2265","n840","n2266"],tags:{highway:"path",name:"Riverwalk Trail",surface:"asphalt",width:"3"}},w264:{id:"w264",nodes:["n1186","n1187","n1188","n1189","n1186"],tags:{building:"yes"}},w265:{id:"w265",nodes:["n1190","n1191","n1192","n1193","n1190"],tags:{building:"yes"}},w266:{id:"w266",nodes:["n1194","n1195","n1196","n1197","n1198","n1199","n1200","n1201","n1194"],tags:{building:"yes"}},w267:{id:"w267",nodes:["n1205","n1206","n1207","n1208","n1209","n1210","n1205"],tags:{building:"house"}},w268:{id:"w268",nodes:["n1211","n1212","n1213","n1214","n1215","n1216","n1217","n1218","n1219","n1220","n1211"],tags:{building:"house"}},w269:{id:"w269",nodes:["n1221","n1225","n1222","n1223","n1224","n1221"],tags:{building:"house"}},w27:{id:"w27",nodes:["n145","n147","n146"],tags:{highway:"footway"}},w270:{id:"w270",nodes:["n1225","n1226","n1227","n1229","n1228"],tags:{barrier:"fence"}},w271:{id:"w271",nodes:["n1229","n1230"],tags:{barrier:"fence"}},w272:{id:"w272",nodes:["n1231","n1232","n1233","n1234","n1235","n1236","n1237","n1238","n1231"],tags:{building:"house"}},w273:{id:"w273",nodes:["n1239","n1240","n1241","n1242","n1243","n1244","n1245","n1246","n1239"],tags:{building:"house"}},w274:{id:"w274",nodes:["n1247","n1248","n1249","n1250","n1247"],tags:{building:"house"}},w275:{id:"w275",nodes:["n1251","n1252","n1253","n1254","n1255","n1256","n1251"],tags:{building:"house"}},w276:{id:"w276",nodes:["n1257","n1258","n1259","n1260","n1257"],tags:{building:"shed"}},w277:{id:"w277",nodes:["n1261","n1262","n1263","n1264","n1265","n1266","n1267","n1268","n1261"],tags:{building:"house"}},w278:{id:"w278",nodes:["n1269","n1270","n1271","n1272","n1273","n1274","n1284","n1269"],tags:{building:"house"}},w279:{id:"w279",nodes:["n1275","n1276","n1277","n1278","n1279","n1280","n1275"],tags:{building:"house"}},w28:{id:"w28",nodes:["n147","n148"],tags:{highway:"footway"}},w280:{id:"w280",nodes:["n1281","n1282","n1283","n1284"],tags:{barrier:"fence"}},w281:{id:"w281",nodes:["n1285","n1286","n1287","n1288","n1285"],tags:{building:"house"}},w282:{id:"w282",nodes:["n1289","n1290","n1291","n1292","n1293","n1294","n1295","n1296","n1289"],tags:{building:"house"}},w283:{id:"w283",nodes:["n1297","n1298","n1299","n1300","n1301","n1302","n1297"],tags:{access:"private",leisure:"swimming_pool"}},w284:{id:"w284",nodes:["n1303","n1304","n1305","n1306","n1307","n1308","n1309","n1310","n1311","n1312","n1303"],tags:{building:"house"}},w285:{id:"w285",nodes:["n1313","n1314","n1315","n1316","n1313"],tags:{building:"house"}},w286:{id:"w286",nodes:["n1317","n1318","n1319","n1320","n1321","n1322","n1323","n1324","n1325","n1326","n1327","n1328","n1329","n1330","n1317"],tags:{building:"house"}},w287:{id:"w287",nodes:["n1331","n1332","n1333","n1334","n1465","n1335","n1336","n1331"],tags:{building:"yes"}},w288:{id:"w288",nodes:["n1349","n1350","n1351","n1352","n1353","n1354","n1355","n1337","n1338","n1341","n1342","n1343","n1344","n1345","n1346","n1347","n1348","n1339","n1340","n1349"],tags:{access:"private",leisure:"swimming_pool"}},w289:{id:"w289",nodes:["n1356","n1331"],tags:{barrier:"fence"}},w29:{id:"w29",nodes:["n149","n874","n150","n151","n897","n898","n875","n152"],tags:{highway:"service",oneway:"yes"}},w290:{id:"w290",nodes:["n1357","n1358","n1359","n1360","n1357"],tags:{building:"shed"}},w291:{id:"w291",nodes:["n1358","n1361","n1362"],tags:{barrier:"fence"}},w292:{id:"w292",nodes:["n1363","n1364","n1365","n1366","n1367","n1368","n1363"],tags:{building:"house"}},w293:{id:"w293",nodes:["n1369","n1370","n1371","n1372","n1373","n1374","n1369"],tags:{leisure:"swimming_pool"}},w294:{id:"w294",nodes:["n1367","n1375","n1376","n1377"],tags:{barrier:"fence"}},w295:{id:"w295",nodes:["n1378","n1379","n1380","n1381","n1378"],tags:{building:"house"}},w296:{id:"w296",nodes:["n1382","n1383","n1384","n1385","n1386","n1387","n1382"],tags:{building:"house"}},w297:{id:"w297",nodes:["n1388","n1389","n1390","n1391","n1392","n1393","n1388"],tags:{building:"house"}},w298:{id:"w298",nodes:["n1394","n1395","n1396","n1397","n1394"],tags:{building:"house"}},w299:{id:"w299",nodes:["n1398","n1399","n1400","n1401","n1398"],tags:{access:"private3",leisure:"swimming_pool"}},w3:{id:"w3",nodes:["n1","n2"],tags:{highway:"track",name:"Water Street"}},w30:{id:"w30",nodes:["n153","n154","n155","n156","n153"],tags:{amenity:"parking"}},w300:{id:"w300",nodes:["n1402","n1403","n1404","n1405","n1406","n1407","n1408","n1409","n1410","n1411","n1412","n1413","n1402"],tags:{building:"house"}},w301:{id:"w301",nodes:["n1414","n1415","n1416","n1417","n1414"],tags:{building:"garage"}},w302:{id:"w302",nodes:["n1406","n1418","n1419","n1403"],tags:{barrier:"fence"}},w303:{id:"w303",nodes:["n1423","n1424","n1425","n1426","n1427","n1428","n1429","n1430","n1431","n1432","n1423"],tags:{building:"house"}},w304:{id:"w304",nodes:["n1433","n1434","n1435","n1446","n1436","n1437","n1438","n1439","n1444","n1440","n1441","n1445","n1442","n1443","n1433"],tags:{access:"private",leisure:"swimming_pool"}},w305:{id:"w305",nodes:["n1447","n1448","n1452","n1453","n1454","n1451","n1449","n1450","n1447"],tags:{building:"house"}},w306:{id:"w306",nodes:["n1455","n1456","n1457","n1458","n1455"],tags:{building:"shed"}},w307:{id:"w307",nodes:["n1459","n1460","n1461","n1462","n1459"],tags:{building:"shed"}},w308:{id:"w308",nodes:["n1463","n1464"],tags:{barrier:"fence"}},w309:{id:"w309",nodes:["n1465","n1466","n1467","n1468"],tags:{barrier:"fence"}},w31:{id:"w31",nodes:["n157","n605","n158"],tags:{highway:"service"}},w310:{id:"w310",nodes:["n1469","n1481","n1463"],tags:{barrier:"hedge"}},w311:{id:"w311",nodes:["n1470","n1471","n1472","n1473","n1474","n1475","n1480","n1476","n1477","n1478","n1479","n1470"],tags:{building:"house"}},w312:{id:"w312",nodes:["n1480","n1481"],tags:{barrier:"wall"}},w313:{id:"w313",nodes:["n1482","n1483","n1484","n1485","n1486","n1487","n1488","n1489","n1490","n1491","n1482"],tags:{access:"private",leisure:"swimming_pool"}},w314:{id:"w314",nodes:["n1492","n1493","n1494","n1495","n1496","n1497","n1498","n1499","n1500","n1501","n1502","n1503","n1504","n1505","n1492"],tags:{building:"house"}},w315:{id:"w315",nodes:["n1506","n1507","n1508","n1509","n1510","n1511","n1512","n1513","n1514","n1515","n1506"],tags:{building:"house"}},w316:{id:"w316",nodes:["n1516","n1517","n1518","n1519","n1520","n1521","n1522","n1523","n1516"],tags:{building:"house"}},w317:{id:"w317",nodes:["n1524","n1525","n1526","n1527","n1528","n1529","n1530","n1531","n1524"],tags:{building:"house"}},w318:{id:"w318",nodes:["n1532","n1533"],tags:{barrier:"fence"}},w319:{id:"w319",nodes:["n1534","n1532","n1535"],tags:{barrier:"fence"}},w32:{id:"w32",nodes:["n159","n160","n161","n162","n159"],tags:{amenity:"parking"}},w320:{id:"w320",nodes:["n1536","n1537","n1538","n1539","n1536"],tags:{building:"shed"}},w321:{id:"w321",nodes:["n1540","n1541","n1542","n1543","n1540"],tags:{building:"shed"}},w322:{id:"w322",nodes:["n1544","n1545","n1546","n1547","n1544"],tags:{building:"shed"}},w323:{id:"w323",nodes:["n1548","n1549","n1550","n1551","n1548"],tags:{building:"house"}},w324:{id:"w324",nodes:["n1552","n1553","n1554","n1555","n1556","n1557","n1558","n1559","n1552"],tags:{building:"house"}},w325:{id:"w325",nodes:["n1560","n1561","n1562","n1563","n1564","n1565","n1566","n1567","n1560"],tags:{building:"house"}},w326:{id:"w326",nodes:["n1561","n1568","n1569","n1570"],tags:{barrier:"wall"}},w327:{id:"w327",nodes:["n1571","n1572"],tags:{barrier:"fence"}},w328:{id:"w328",nodes:["n1573","n1574","n1575","n1576","n1573"],tags:{building:"house"}},w329:{id:"w329",nodes:["n1577","n1578","n1579","n1580","n1581","n1582","n1583","n1584","n1585","n1586","n1577"],tags:{building:"house"}},w33:{id:"w33",nodes:["n157","n163"],tags:{highway:"service"}},w330:{id:"w330",nodes:["n1587","n1588","n1589","n1590","n1591","n1592","n1593","n1594","n1587"],tags:{building:"house"}},w331:{id:"w331",nodes:["n1595","n1596","n1597","n1598","n1599","n1600","n1601","n1595"],tags:{access:"private",leisure:"swimming_pool"}},w332:{id:"w332",nodes:["n1602","n1603","n1604","n1605","n1606","n1607","n1608","n1609","n1611","n1610","n1612","n1613","n1602"],tags:{building:"house"}},w333:{id:"w333",nodes:["n2018","n1626","n1627","n2017","n2018"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w334:{id:"w334",nodes:["n2","n3","n2764"],tags:{highway:"service",name:"Water Street"}},w335:{id:"w335",nodes:["n3","n1628","n1614"],tags:{highway:"service"}},w336:{id:"w336",nodes:["n3198","n4545","n2747"],tags:{highway:"residential",name:"Morris Avenue"}},w337:{id:"w337",nodes:["n1629","n3504"],tags:{highway:"service",service:"alley",surface:"unpaved"}},w338:{id:"w338",nodes:["n1813","n1635","n1814","n1634","n1815","n1632","n1816","n1817"],tags:{highway:"service",service:"parking_aisle"}},w339:{id:"w339",nodes:["n1827","n4684","n4690","n1842","n4686","n4685","n1826","n1828","n1846","n1645","n1637","n4703","n1641"],tags:{highway:"residential",name:"Millard Street"}},w34:{id:"w34",nodes:["n164","n165","n166","n171","n866","n172","n167","n168","n169","n910","n170","n164"],tags:{amenity:"parking"}},w340:{id:"w340",nodes:["n1824","n1825"],tags:{highway:"service",service:"parking_aisle"}},w341:{id:"w341",nodes:["n1701","n1702","n1703","n1704","n1705","n1706","n1701"],tags:{building:"yes"}},w342:{id:"w342",nodes:["n1855","n1860","n1856","n1775","n1804","n1776","n1855"],tags:{amenity:"parking",fee:"no"}},w343:{id:"w343",nodes:["n1757","n1758","n1759","n1760","n1757"],tags:{building:"yes"}},w344:{id:"w344",nodes:["n1659","n1660","n1661","n1662","n1663","n1664","n1665","n1666","n1659"],tags:{building:"school"}},w345:{id:"w345",nodes:["n1751","n1752","n1753","n1754","n1755","n1756","n1751"],tags:{building:"yes"}},w346:{id:"w346",nodes:["n1641","n1676","n1673","n1639","n1810","n1642","n1849","n4759","n1845"],tags:{highway:"residential",name:"Douglas Avenue"}},w347:{id:"w347",nodes:["n1642","n1643","n1031","n1630","n845","n1631","n816","n1831","n902","n905","n152","n149","n1832","n1850","n878","n1833","n1852","n42","n1834","n61","n60","n1851","n1835"],tags:{highway:"primary",name:"Michigan Avenue"}},w348:{id:"w348",nodes:["n1650","n1651","n1652","n1653","n1654","n1655","n1656","n1657","n1658","n1650"],tags:{leisure:"playground"}},w349:{id:"w349",nodes:["n1861","n1818","n1819","n1820","n1821","n1825","n1823","n1639"],tags:{highway:"service"}},w35:{id:"w35",nodes:["n168","n167","n172"],tags:{barrier:"fence",fence_type:"chain_link"}},w350:{id:"w350",nodes:["n1783","n1819","n1784","n1857","n1861","n1858","n1783"],tags:{amenity:"parking"}},w351:{id:"w351",nodes:["n1717","n1718","n1719","n1720","n1717"],tags:{building:"yes"}},w352:{id:"w352",nodes:["n1743","n1744","n1745","n1746","n1747","n1748","n1749","n1750","n1743"],tags:{building:"yes"}},w353:{id:"w353",nodes:["n1637","n1636","n1029","n4715","n1630"],tags:{highway:"residential",name:"Lincoln Avenue"}},w354:{id:"w354",nodes:["n1713","n1714","n1715","n1716","n1713"],tags:{building:"yes"}},w355:{id:"w355",nodes:["n1689","n1690","n1691","n1692","n1693","n1694","n1695","n1696","n1689"],tags:{building:"yes"}},w356:{id:"w356",nodes:["n1631","n4717","n1840","n4745","n1841"],tags:{highway:"residential",name:"Hook Avenue"}},w357:{id:"w357",nodes:["n1737","n1738","n1739","n1740","n1741","n1742","n1737"],tags:{building:"yes"}},w358:{id:"w358",nodes:["n1707","n1708","n1709","n1710","n1711","n1712","n1707"],tags:{building:"yes"}},w359:{id:"w359",nodes:["n1829","n4695","n4697","n1843","n4698","n4701","n1638","n4702","n4705","n1636","n4706","n4707","n1633"],tags:{highway:"residential",name:"South Street"}},w36:{id:"w36",nodes:["n910","n171","n866","n172"],tags:{barrier:"fence",fence_type:"chain_link"}},w360:{id:"w360",nodes:["n1767","n1768","n1769","n1770","n1771","n1772","n1773","n1774","n1767"],tags:{building:"yes"}},w361:{id:"w361",nodes:["n1859","n1860","n1804","n1640","n1805","n1817","n1806","n1644","n1811","n1807","n1808","n3419","n1812","n1790","n3418","n3744","n1809","n1813","n1810"],tags:{highway:"service"}},w362:{id:"w362",nodes:["n1639","n1683","n4710","n1633"],tags:{highway:"residential",name:"South Street",oneway:"yes"}},w363:{id:"w363",nodes:["n1646","n1647","n1648","n1649","n1646"],tags:{leisure:"pitch",pitch:"basketball"}},w364:{id:"w364",nodes:["n3820","n3821","n3822","n3823","n3824","n3825","n3826","n3827","n3828","n3829","n3830","n3838","n3839","n3820"],tags:{amenity:"school",name:"Three Rivers Middle School"}},w365:{id:"w365",nodes:["n1721","n1722","n1723","n1724","n1725","n1726","n1727","n1728","n1729","n1730","n1731","n1732","n1733","n1734","n1735","n1736","n1721"],tags:{building:"yes"}},w366:{id:"w366",nodes:["n1791","n1792","n1793","n1794","n1795","n1796","n1798","n1799","n1800","n1801","n1802","n1803","n1791"],tags:{amenity:"parking"}},w367:{id:"w367",nodes:["n1633","n4708","n4711","n1643","n4712","n1838","n4752","n1839"],tags:{highway:"residential",name:"Grant Avenue"}},w368:{id:"w368",nodes:["n1853","n1687","n1688","n1854","n1853"],tags:{amenity:"library",building:"yes",name:"Three Rivers Public Library"}},w369:{id:"w369",nodes:["n1777","n1778","n1779","n1780","n1781","n1782","n1777"],tags:{amenity:"parking"}},w37:{id:"w37",nodes:["n173","n174","n175","n176","n177","n178","n179","n180","n173"],tags:{building:"yes"}},w370:{id:"w370",nodes:["n1645","n1638","n858","n4718","n1631"],tags:{highway:"residential",name:"Hook Avenue"}},w371:{id:"w371",nodes:["n3836","n3835","n4624","n3831","n4632","n3834","n3832","n3833","n3830","n3838","n3839","n3837","n3836"],tags:{amenity:"school",name:"Three Rivers High School"}},w372:{id:"w372",nodes:["n1697","n1698","n1699","n1700","n1697"],tags:{building:"yes"}},w373:{id:"w373",nodes:["n2891","n1785","n1786","n3394","n1787","n1788","n1789","n1830","n1836","n1837","n1848","n3409","n2891"],tags:{amenity:"parking"}},w374:{id:"w374",nodes:["n1761","n1762","n1763","n1764","n1765","n1766","n1761"],tags:{building:"yes"}},w375:{id:"w375",nodes:["n1822","n1823"],tags:{highway:"service",service:"parking_aisle"}},w376:{id:"w376",nodes:["n1677","n1678","n1679","n1680","n1681","n1682","n1677"],tags:{amenity:"parking"}},w377:{id:"w377",nodes:["n1676","n1675","n1674","n1673"],tags:{highway:"service",oneway:"yes"}},w378:{id:"w378",nodes:["n1667","n1668","n1669","n1670","n1671","n1672","n1667"],tags:{amenity:"school",name:"Andrews Elementary School"}},w379:{id:"w379",nodes:["n1630","n4714","n1847","n4750","n1844"],tags:{highway:"residential",name:"Lincoln Avenue"}},w38:{id:"w38",nodes:["n181","n182","n183","n185","n184","n181"],tags:{building:"yes"}},w380:{id:"w380",nodes:["n1683","n3745","n1686","n1633"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w381:{id:"w381",nodes:["n2022","n2037"],tags:{highway:"footway"}},w382:{id:"w382",nodes:["n1826","n1863"],tags:{highway:"residential"}},w383:{id:"w383",nodes:["n2011","n2012","n739","n2013","n2014","n2029","n2011"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w384:{id:"w384",nodes:["n2064","n2065","n2066","n2067","n2068","n2069","n2070","n2071","n2072","n2073","n2074","n2075","n2076","n2077","n2078","n2079","n2064"],tags:{building:"yes"}},w385:{id:"w385",nodes:["n1923","n1924","n1925","n1926","n1927","n1928","n1930","n1929","n1923"],tags:{natural:"water"}},w386:{id:"w386",nodes:["n1827","n14","n1886","n15","n1887","n16","n1888","n18","n17","n1889","n12","n13","n1890","n485","n1864","n11","n10","n2058","n2036","n1865","n2020","n9","n8","n1866","n295","n1867"],tags:{highway:"service"}},w387:{id:"w387",nodes:["n1846","n1843","n865","n157","n4721","n1831"],tags:{highway:"residential",name:"Andrews Street"}},w388:{id:"w388",nodes:["n2019","n2020","n2021","n2022","n2023","n2024","n2025","n2026","n2027","n2028","n2029"],tags:{highway:"footway"}},w389:{id:"w389",nodes:["n2217","n2222","n2221","n2219","n1877","n1879","n1882","n1883","n484","n1885","n483","n1880","n1881","n1878","n1884","n2223"],tags:{name:"Rocky River",waterway:"river"}},w39:{id:"w39",nodes:["n185","n186","n187"],tags:{barrier:"fence"}},w390:{id:"w390",nodes:["n2050","n2051","n2052","n2053","n2050"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w391:{id:"w391",nodes:["n2089","n2090","n2091","n2092","n2093","n2094","n2311","n2095","n2096","n2097","n2098","n1174","n2099","n751","n43","n2062","n4725","n873","n1832"],tags:{highway:"residential",name:"Constantine Street"}},w392:{id:"w392",nodes:["n1869","n212","n436","n2281","n2081"],tags:{highway:"primary",name:"Michigan Avenue"}},w393:{id:"w393",nodes:["n1829","n611","n144","n4694","n602","n1832"],tags:{highway:"tertiary",name:"Constantine Street"}},w394:{id:"w394",nodes:["n1997","n1998","n2000","n1999"],tags:{highway:"service",service:"parking_aisle"}},w395:{id:"w395",nodes:["n1835","n1869"],tags:{bridge:"yes",highway:"primary",name:"Michigan Avenue"}},w396:{id:"w396",nodes:["n2000","n2001"],tags:{highway:"service",service:"parking_aisle"}},w397:{id:"w397",nodes:["n2082","n4688","n1842","n308","n498","n509","n246","n241","n1867","n4645","n293","n1834"],tags:{highway:"residential",name:"Spring Street"}},w398:{id:"w398",nodes:["n2015","n2016","n2017","n2018","n2015"],tags:{building:"yes"}},w399:{id:"w399",nodes:["n2062","n45","n2063","n877","n41","n1852"],tags:{highway:"service"}},w4:{id:"w4",nodes:["n7","n38","n378","n379","n7"],tags:{building:"yes"}},w40:{id:"w40",nodes:["n188","n189","n190","n191","n192","n193","n188"],tags:{building:"house"}},w400:{id:"w400",nodes:["n1968","n1969","n1970","n1971","n2007","n1972","n1973","n1978","n1974","n1977","n1976","n1975","n1968"],tags:{amenity:"parking"}},w401:{id:"w401",nodes:["n1963","n1964"],tags:{bridge:"yes",highway:"footway"}},w402:{id:"w402",nodes:["n1892","n1893","n1894","n1895","n1896","n1897","n1898","n1899","n1900","n1901","n1902","n1903","n1892"],tags:{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street",barrier:"fence",name:"Scidmore Park Petting Zoo",tourism:"zoo",zoo:"petting_zoo"}},w403:{id:"w403",nodes:["n1957","n1958","n1959","n481","n1960","n482","n1949"],tags:{highway:"path"}},w404:{id:"w404",nodes:["n2281","n27","n330","n1987","n1988"],tags:{highway:"service"}},w405:{id:"w405",nodes:["n2249","n2269","n2270","n2271","n2272","n454","n455","n2273"],tags:{highway:"path",name:"Riverwalk Trail"}},w406:{id:"w406",nodes:["n1947","n1624","n1625","n2030","n2033","n4658","n4659","n2031","n2032","n2021"],tags:{highway:"footway"}},w407:{id:"w407",nodes:["n2034","n2036","n2009"],tags:{highway:"footway"}},w408:{id:"w408",nodes:["n1964","n1965","n2002","n1966","n21","n1967","n1969"],tags:{highway:"footway"}},w409:{id:"w409",nodes:["n1904","n1905","n1906","n1907","n1908","n1909","n748","n1910","n747","n1911","n749","n1912","n750","n1913","n1922","n1914","n1921","n1915","n746","n1916","n745","n1917","n744","n1918","n743","n742","n1919","n741","n1920","n740","n1904"],tags:{natural:"water"}},w41:{id:"w41",nodes:["n194","n195","n196","n197","n198","n199","n200","n201","n202","n203","n204","n205","n194"],tags:{building:"house"}},w410:{id:"w410",nodes:["n1868","n2088"],tags:{bridge:"yes",name:"Conrail Railroad",railway:"rail"}},w411:{id:"w411",nodes:["n2010","n2019","n2009","n2008","n2058","n2035","n1961","n1962","n1947","n1963"],tags:{highway:"footway"}},w412:{id:"w412",nodes:["n2290","n2043","n2044","n2045","n1872","n2041","n1873","n2042","n1874","n2046","n2047","n2048","n2049","n2290"],tags:{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street",leisure:"park",name:"Scidmore Park"}},w413:{id:"w413",nodes:["n1831","n876","n4720","n821","n2089"],tags:{highway:"residential",name:"Andrews Street"}},w414:{id:"w414",nodes:["n2002","n2003","n2004","n2005","n2006","n2007"],tags:{highway:"footway"}},w415:{id:"w415",nodes:["n1979","n1980","n1981","n1982","n1979"],tags:{amenity:"parking"}},w416:{id:"w416",nodes:["n2054","n2055","n2056","n2057","n2054"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w417:{id:"w417",nodes:["n2291","n2292","n2293","n2294","n2295","n2296","n2297","n2298","n2299","n1098","n2300","n2301","n2302","n2303","n2304","n2059","n2060","n2305","n2307","n2306","n2310","n2308","n2309","n2291"],tags:{leisure:"park",name:"Memory Isle Park"}},w418:{id:"w418",nodes:["n2033","n2034","n2035"],tags:{highway:"footway"}},w419:{id:"w419",nodes:["n1983","n1984","n1985","n1986","n1983"],tags:{amenity:"parking"}},w42:{id:"w42",nodes:["n206","n207","n208","n209","n210","n211","n206"],tags:{building:"house"}},w420:{id:"w420",nodes:["n1840","n4746","n4748","n1847","n4749","n4755","n1838","n4754","n4756","n1849"],tags:{highway:"residential",name:"French Street"}},w421:{id:"w421",nodes:["n2337","n2268"],tags:{highway:"path"}},w422:{id:"w422",nodes:["n2338","n2339","n2320","n2317","n2319","n2318","n2340","n2341","n2342","n2343","n2344","n2345","n2346","n2347","n2348","n2338"],tags:{natural:"water"}},w423:{id:"w423",nodes:["n2180","n2349","n2350","n2351","n2352","n2404","n2353","n2354","n2355","n2356","n2357","n2358","n2359","n2360","n2361","n2362","n2363","n2364","n2365","n2366","n2370","n2371","n2372","n2373","n2374","n2375","n2377","n2378","n2380","n2381","n2382","n2383","n2386","n2389","n2390","n2391","n2392","n2393","n2396","n2397","n2401","n2402","n2321","n2322","n2323","n2403","n2180"],tags:{natural:"wetland"}},w424:{id:"w424",nodes:["n2324","n2316","n1841","n2315","n2314","n1844","n1839","n4758","n1845"],tags:{highway:"residential",name:"Pealer Street"}},w425:{id:"w425",nodes:["n2267","n2337","n2336","n2335","n2334","n2333","n2332","n2331","n2330","n37","n2329","n2328","n2327","n36","n2326","n2325","n2266"],tags:{highway:"path",name:"Riverwalk Trail"}},w426:{id:"w426",nodes:["n2478","n681","n680","n679","n2459","n2467","n2487","n2478"],tags:{building:"yes"}},w427:{id:"w427",nodes:["n2671","n2672","n2673","n2674","n2671"],tags:{building:"yes"}},w428:{id:"w428",nodes:["n2483","n2482","n2486","n2489","n2492","n2502","n2495","n2480","n2483"],tags:{building:"yes"}},w429:{id:"w429",nodes:["n2707","n2708","n2716","n2712","n2714","n2713","n2715","n2711","n2710","n2723","n2709","n2707"],tags:{amenity:"parking"}},w43:{id:"w43",nodes:["n1955","n1956"],tags:{footway:"sidewalk",highway:"footway",name:"Riverwalk Trail"}},w430:{id:"w430",nodes:["n2471","n2474","n2484","n2479","n2471"],tags:{building:"yes"}},w431:{id:"w431",nodes:["n2218","n2434","n2436","n2433","n2435","n2210"],tags:{name:"Rocky River",waterway:"river"}},w432:{id:"w432",nodes:["n2782","n2532","n2783","n2784","n2782"],tags:{amenity:"parking"}},w433:{id:"w433",nodes:["n2513","n649","n2520","n2514","n2507","n2513"],tags:{building:"yes"}},w434:{id:"w434",nodes:["n2470","n2468","n2461","n2465","n2470"],tags:{building:"yes"}},w435:{id:"w435",nodes:["n2598","n2599","n648","n649","n2520","n2598"],tags:{building:"yes"}},w436:{id:"w436",nodes:["n2639","n2640","n2641","n2642","n2643","n2644","n2645","n2646","n2647","n2648","n2639"],tags:{building:"yes"}},w437:{id:"w437",nodes:["n2503","n2512","n2508","n2499","n2503"],tags:{building:"yes"}},w438:{id:"w438",nodes:["n2440","n2800","n2774","n1"],tags:{highway:"residential",name:"Water Street"}},w439:{id:"w439",nodes:["n2675","n2676","n2677","n2678","n2675"],tags:{building:"yes"}},w44:{id:"w44",nodes:["n213","n214","n215","n216","n213"],tags:{building:"yes"}},w440:{id:"w440",nodes:["n2512","n2503","n2507","n2514","n2512"],tags:{building:"yes"}},w441:{id:"w441",nodes:["n2554","n2717","n674","n2720","n2798"],tags:{highway:"service",oneway:"yes"}},w442:{id:"w442",nodes:["n2583","n2596","n2584","n2585","n2595","n2586","n2587","n2588","n2589","n2583"],tags:{amenity:"parking"}},w443:{id:"w443",nodes:["n2629","n2627","n2628","n2616","n2630","n2629"],tags:{building:"yes"}},w444:{id:"w444",nodes:["n2717","n2724","n670","n2718","n669","n668","n2722","n2727"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w445:{id:"w445",nodes:["n2572","n2573"],tags:{bridge:"yes",highway:"path",name:"Riverwalk Trail"}},w446:{id:"w446",nodes:["n2603","n2604","n2601","n2605","n2606","n2607","n2603"],tags:{building:"yes"}},w447:{id:"w447",nodes:["n2780","n2777","n628","n624","n2779"],tags:{highway:"residential",name:"Foster Street",oneway:"yes"}},w448:{id:"w448",nodes:["n2733","n2734","n2735","n2736","n2737","n2738","n663","n664","n2739","n2733"],tags:{building:"yes"}},w449:{id:"w449",nodes:["n2564","n2565","n2566","n2567","n2568","n2794","n2795","n2564"],tags:{amenity:"parking"}},w45:{id:"w45",nodes:["n217","n218","n219","n220","n217"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w450:{id:"w450",nodes:["n2799","n2728","n2729","n2730","n2731","n2732","n2799"],tags:{building:"yes"}},w451:{id:"w451",nodes:["n2441","n1170","n2442","n2575","n2443","n2445","n2444","n2448","n2441"],tags:{amenity:"parking"}},w452:{id:"w452",nodes:["n2273","n457","n2569","n458","n2570"],tags:{highway:"path",name:"Riverwalk Trail"}},w453:{id:"w453",nodes:["n2447","n2242","n2448","n2527","n2530"],tags:{highway:"service"}},w454:{id:"w454",nodes:["n2560","n333","n2561"],tags:{highway:"service",service:"parking_aisle"}},w455:{id:"w455",nodes:["n2679","n2680","n2681","n2682","n2683","n2684","n2685","n2686","n2687","n2688","n2689","n2690","n2679"],tags:{building:"yes"}},w456:{id:"w456",nodes:["n2425","n2429","n2424"],tags:{bridge:"yes",highway:"residential",name:"Moore Street"}},w457:{id:"w457",nodes:["n2487","n2467","n2472","n2480","n2495","n2487"],tags:{building:"yes"}},w458:{id:"w458",nodes:["n2659","n2660","n2661","n2662","n678","n677","n2663","n2664","n2665","n2666","n675","n676","n2659"],tags:{building:"yes"}},w459:{id:"w459",nodes:["n2600","n2598","n2599","n2601","n2605","n2602","n2600"],tags:{building:"yes"}},w46:{id:"w46",nodes:["n221","n222","n223","n224","n221"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w460:{id:"w460",nodes:["n2468","n2464","n2455","n2457","n2461","n2468"],tags:{building:"yes"}},w461:{id:"w461",nodes:["n2478","n2473","n683","n682","n2463","n681","n2478"],tags:{building:"yes"}},w462:{id:"w462",nodes:["n2547","n473","n2548","n2549"],tags:{highway:"service",service:"parking_aisle"}},w463:{id:"w463",nodes:["n2573","n2574"],tags:{highway:"path",name:"Riverwalk Trail"}},w464:{id:"w464",nodes:["n2445","n2597","n2527","n2528","n2529","n2530","n2531","n2597"],tags:{highway:"service",service:"parking_aisle"}},w465:{id:"w465",nodes:["n2571","n459","n2572"],tags:{highway:"path",name:"Riverwalk Trail"}},w466:{id:"w466",nodes:["n2445","n2574","n2552","n442","n2551","n4727","n323","n2446"],tags:{highway:"service"}},w467:{id:"w467",nodes:["n2484","n2474","n2477","n2485","n2488","n2484"],tags:{building:"yes"}},w468:{id:"w468",nodes:["n2695","n2696","n2697","n2698","n2699","n2700","n2701","n2702","n2695"],tags:{building:"yes"}},w469:{id:"w469",nodes:["n2469","n2476","n2481","n2475","n920","n2466","n2469"],tags:{building:"yes"}},w47:{id:"w47",nodes:["n1988","n1997","n1989","n25","n24","n1990","n26","n1991","n21","n1992","n2006","n1993","n22","n1994","n23","n1995","n1999","n1996","n2001","n1988"],tags:{highway:"service"}},w470:{id:"w470",nodes:["n2473","n2470","n2465","n2458","n2462","n683","n2473"],tags:{building:"yes"}},w471:{id:"w471",nodes:["n2490","n2496","n994","n997","n998","n996","n995","n2485","n2477","n2490"],tags:{building:"yes"}},w472:{id:"w472",nodes:["n2424","n2426","n2427","n2428"],tags:{highway:"residential",name:"Moore Street"}},w473:{id:"w473",nodes:["n2432","n1026","n4741","n2554","n2425"],tags:{highway:"residential",name:"Moore Street"}},w474:{id:"w474",nodes:["n2577","n2576"],tags:{bridge:"yes",highway:"footway"}},w475:{id:"w475",nodes:["n2497","n2505","n2500","n2493","n2497"],tags:{building:"yes"}},w476:{id:"w476",nodes:["n2493","n2500","n2501","n2496","n2490","n2493"],tags:{building:"yes"}},w477:{id:"w477",nodes:["n2431","n360","n4726","n418","n397","n396","n2547","n646","n2447","n644","n2418","n424","n640","n2419","n2420","n2423"],tags:{highway:"residential",name:"Railroad Drive"}},w478:{id:"w478",nodes:["n2515","n2511","n2498","n2504","n2509","n2515"],tags:{building:"yes"}},w479:{id:"w479",nodes:["n2525","n651","n650","n2526","n2524","n653","n652","n656","n2523","n654","n2518","n2517","n2521","n2522","n2525"],tags:{building:"yes"}},w48:{id:"w48",nodes:["n225","n237","n226","n227","n228","n229","n230","n231","n232","n233","n234","n235","n236","n225"],tags:{building:"yes"}},w480:{id:"w480",nodes:["n2703","n2704","n2710","n2711","n2705","n2706","n2703"],tags:{amenity:"parking"}},w481:{id:"w481",nodes:["n2796","n2657","n2658","n2797","n2796"],tags:{building:"yes"}},w482:{id:"w482",nodes:["n2550","n2551","n442","n2552","n2553","n2550"],tags:{amenity:"parking"}},w483:{id:"w483",nodes:["n2790","n2542"],tags:{highway:"service",service:"parking_aisle"}},w484:{id:"w484",nodes:["n2311","n1102"],tags:{highway:"service"}},w485:{id:"w485",nodes:["n2515","n2509","n2516","n2519","n2515"],tags:{building:"yes"}},w486:{id:"w486",nodes:["n2506","n2502","n2492","n2491","n2494","n2506"],tags:{building:"yes"}},w487:{id:"w487",nodes:["n2667","n2668","n2669","n2670","n2667"],tags:{building:"yes"}},w488:{id:"w488",nodes:["n2616","n2608","n2617","n2618","n2619","n2620","n2621","n2622","n2623","n2624","n2625","n2626","n2627","n2628","n2616"],tags:{building:"yes"}},w489:{id:"w489",nodes:["n2081","n2430"],tags:{bridge:"yes",highway:"primary",name:"Michigan Avenue"}},w49:{id:"w49",nodes:["n237","n238"],tags:{highway:"footway"}},w490:{id:"w490",nodes:["n2410","n636","n730","n635","n2409","n2694","n2751","n2765","n2753","n2768","n2754","n2769","n2745","n2766","n4503","n2763","n4501","n2752","n2781"],tags:{highway:"residential",name:"Portage Avenue"}},w491:{id:"w491",nodes:["n2578","n2579","n2580","n2581","n2578"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w492:{id:"w492",nodes:["n2556","n2557","n2558","n2559","n2556"],tags:{amenity:"parking"}},w493:{id:"w493",nodes:["n2460","n2456","n687","n2453","n2454","n2460"],tags:{building:"yes"}},w494:{id:"w494",nodes:["n2471","n2479","n2476","n2469","n2471"],tags:{building:"yes"}},w495:{id:"w495",nodes:["n2724","n2725","n673","n672","n671","n2726","n2727"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w496:{id:"w496",nodes:["n2649","n2650","n2651","n2652","n2653","n2654","n2655","n2656","n2649"],tags:{building:"yes"}},w497:{id:"w497",nodes:["n2430","n2446","n343","n2101","n2560","n2431","n363","n2748"],tags:{highway:"primary",name:"Michigan Avenue"}},w498:{id:"w498",nodes:["n2691","n2692","n634","n633","n2693","n2694"],tags:{highway:"service"}},w499:{id:"w499",nodes:["n2423","n2415","n661","n2416","n2417","n2719","n2721","n2772","n2756","n2773","n2759","n2767"],tags:{highway:"residential",name:"West Street"}},w5:{id:"w5",nodes:["n380","n381","n382","n383","n429","n430","n380"],tags:{building:"yes"}},w50:{id:"w50",nodes:["n239","n499","n508","n245","n238","n242","n240"],tags:{footway:"sidewalk",highway:"footway"}},w500:{id:"w500",nodes:["n2428","n1152","n2421","n2324"],tags:{bridge:"yes",highway:"residential",name:"Moore Street"}},w501:{id:"w501",nodes:["n2608","n2609","n2610","n2611","n2612","n2613","n2614","n2615","n2617","n2608"],tags:{building:"yes"}},w502:{id:"w502",nodes:["n2570","n2571"],tags:{bridge:"yes",highway:"path",name:"Riverwalk Trail"}},w503:{id:"w503",nodes:["n2540","n2542","n2787"],tags:{highway:"service"}},w504:{id:"w504",nodes:["n2269","n2582","n2250"],tags:{highway:"path"}},w505:{id:"w505",nodes:["n2631","n2632","n2633","n2634","n2635","n2636","n2637","n2638","n2631"],tags:{building:"yes"}},w506:{id:"w506",nodes:["n2543","n2544","n2545","n395","n2546","n2543"],tags:{amenity:"parking"}},w507:{id:"w507",nodes:["n2449","n2450","n2451","n2452","n1162","n2449"],tags:{leisure:"pitch",sport:"tennis"}},w508:{id:"w508",nodes:["n2554","n1160","n2559","n2558","n659","n2555","n658","n657","n2419"],tags:{highway:"service"}},w509:{id:"w509",nodes:["n2499","n2508","n2510","n2505","n2497","n2499"],tags:{building:"yes"}},w51:{id:"w51",nodes:["n241","n242","n243","n244"],tags:{highway:"service",surface:"unpaved"}},w510:{id:"w510",nodes:["n2575","n2577"],tags:{highway:"footway"}},w511:{id:"w511",nodes:["n2533","n2534","n2535","n2536","n2537","n2538","n2539","n2785","n2786","n2533"],tags:{amenity:"parking"}},w512:{id:"w512",nodes:["n2801","n2740","n2741","n2742","n2743","n2744","n2801"],tags:{building:"yes"}},w513:{id:"w513",nodes:["n2720","n2721"],tags:{highway:"service",service:"parking_aisle"}},w514:{id:"w514",nodes:["n2788","n2790","n2789","n989","n2540","n2541"],tags:{highway:"service",service:"parking_aisle"}},w515:{id:"w515",nodes:["n2848","n2849","n2850","n2851","n2803","n2804","n2812"],tags:{highway:"residential",name:"Middle Street"}},w516:{id:"w516",nodes:["n2852","n2805"],tags:{access:"private",highway:"service",name:"Battle Street"}},w517:{id:"w517",nodes:["n2863","n2815","n2814","n2812","n2864","n2855","n2865","n2867","n2868"],tags:{highway:"secondary",name:"Michigan Avenue",name_1:"State Highway 60",ref:"M 60"}},w518:{id:"w518",nodes:["n2859","n2808"],tags:{highway:"residential",name:"2nd Avenue"}},w519:{id:"w519",nodes:["n2823","n2824","n2825","n2826","n2827","n2828","n2823"],tags:{building:"yes"}},w52:{id:"w52",nodes:["n247","n248","n249","n250","n247"],tags:{amenity:"parking"}},w520:{id:"w520",nodes:["n2806","n2807","n2803"],tags:{highway:"residential",name:"2nd Avenue"}},w521:{id:"w521",nodes:["n2829","n2830","n2831","n2832","n2833","n2834","n2835","n2836","n2837","n2838","n2829"],tags:{building:"yes"}},w522:{id:"w522",nodes:["n2815","n2813","n2811","n4597","n2846","n4596","n2857","n4601","n2853","n4602","n2861","n4","n2879","n4560","n3550","n5","n1685"],tags:{highway:"residential",name:"Washington Street"}},w523:{id:"w523",nodes:["n2878","n2811","n2810","n2860","n2880","n2881","n2882"],tags:{highway:"residential",name:"5th Avenue"}},w524:{id:"w524",nodes:["n2816","n2817","n2818","n2819","n2820","n2821","n2822","n2816"],tags:{building:"yes"}},w525:{id:"w525",nodes:["n2869","n2856","n2806","n2808","n2814","n2809","n2810","n2847","n2858","n2854","n2870","n2871","n6","n2872","n2839","n2862"],tags:{highway:"residential",name:"Wood Street"}},w526:{id:"w526",nodes:["n2877","n2809","n2813","n2844","n2843"],tags:{highway:"residential",name:"4th Avenue"}},w527:{id:"w527",nodes:["n4785","n4784","n2936","n4788","n4787","n4786","n4785"],tags:{amenity:"parking"}},w528:{id:"w528",nodes:["n2864","n2892","n2893","n2877","n2860","n3840"],tags:{highway:"residential",name:"Garden Street"}},w529:{id:"w529",nodes:["n2868","n2890"],tags:{bridge:"yes",highway:"secondary",name:"Michigan Avenue",name_1:"State Highway 60",ref:"M 60"}},w53:{id:"w53",nodes:["n251","n252","n253","n254","n255","n256","n257","n258","n259","n260","n261","n262","n251"],tags:{building:"yes"}},w530:{id:"w530",nodes:["n2914","n2915","n2916","n2917","n2918","n2919","n2920","n2921","n2922","n2923","n2924","n2925","n2926","n2927","n2928","n2929","n2930","n2931","n2932","n2933","n2914"],tags:{building:"yes"}},w531:{id:"w531",nodes:["n2958","n2896"],tags:{bridge:"yes",highway:"secondary",name:"Main Street"}},w532:{id:"w532",nodes:["n2896","n394","n364","n2748"],tags:{highway:"secondary",name:"Main Street"}},w533:{id:"w533",nodes:["n2800","n2943","n2940","n2941","n2942","n2943"],tags:{highway:"service",service:"parking_aisle"}},w534:{id:"w534",nodes:["n3836","n3837","n3839","n3838","n3834","n4632","n3831","n4624","n3835","n3836"],tags:{barrier:"fence"}},w535:{id:"w535",nodes:["n2894","n2944","n2774","n2765"],tags:{highway:"residential",name:"5th Avenue"}},w536:{id:"w536",nodes:["n2890","n2780","n627","n2889","n2887","n623","n2888","n366","n2748"],tags:{highway:"secondary",name:"Michigan Avenue",name_1:"State Highway 60",ref:"M 60"}},w537:{id:"w537",nodes:["n2895","n738","n2887","n737","n2913"],tags:{highway:"residential",name:"Water Street"}},w538:{id:"w538",nodes:["n2855","n3756","n2884","n2885","n2886","n2945","n2946","n2947","n2948","n2949","n2950","n2951","n2952","n2953","n2955","n2848","n2956","n2856"],tags:{highway:"residential",name:"River Drive"}},w539:{id:"w539",nodes:["n2882","n2894"],tags:{bridge:"yes",highway:"residential",name:"5th Avenue"}},w54:{id:"w54",nodes:["n263","n264","n265","n266","n267","n268","n269","n270","n271","n272","n273","n274","n275","n276","n263"],tags:{building:"yes"}},w540:{id:"w540",nodes:["n2987","n2964","n2981","n2983","n2966","n2982","n2962","n2960","n2967","n2965","n2984","n2977","n2968","n2976","n2986","n2988","n2963","n2970","n2969","n2979","n2974","n2980","n2959","n2973","n2985","n2961","n2975","n2971","n2972","n2978","n2898","n2907","n2912","n2909","n2911","n2901","n2903","n2904","n2906","n2902","n2900","n2910","n2908","n2899","n2897","n2905","n2186","n2233"],tags:{name:"Portage River",waterway:"river"}},w541:{id:"w541",nodes:["n2852","n2851","n3003"],tags:{highway:"residential",name:"1st Avenue"}},w542:{id:"w542",nodes:["n2991","n3004","n2994"],tags:{highway:"residential",name:"River Street"}},w543:{id:"w543",nodes:["n2993","n2989"],tags:{bridge:"yes",highway:"residential",name:"6th Street"}},w544:{id:"w544",nodes:["n2995","n2996","n2997","n2998","n2999","n3000","n3001","n3002","n2990","n2991","n2993"],tags:{highway:"residential",name:"6th Street"}},w545:{id:"w545",nodes:["n2989","n2992","n2848"],tags:{highway:"residential",name:"6th Street"}},w546:{id:"w546",nodes:["n2313","n3169","n3170","n3171","n3172","n3173","n3174","n3175","n3176","n3177","n3178","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2146","n2156","n2129","n2112","n2109","n2313"],tags:{natural:"wetland"}},w547:{id:"w547",nodes:["n2088","n3013","n3015","n3014","n3017","n3018"],tags:{name:"Conrail Railroad",railway:"rail"}},w548:{id:"w548",nodes:["n3083","n3084","n3085","n3086","n3083"],tags:{building:"yes"}},w549:{id:"w549",nodes:["n3020","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n3020"],tags:{leisure:"park",name:"Conservation Park"}},w55:{id:"w55",nodes:["n277","n278","n279","n280","n281","n282","n283","n284","n277"],tags:{building:"yes"}},w550:{id:"w550",nodes:["n3056","n3042","n3041","n3040","n3039","n3038","n3037","n3036","n3044","n3035","n3034","n3043","n3016","n3056","n3019","n3015","n3012"],tags:{highway:"service"}},w551:{id:"w551",nodes:["n3044","n3045","n3046","n3047","n3048","n3049","n3050","n3051","n3052","n3053","n3054","n3055","n3016"],tags:{highway:"footway"}},w552:{id:"w552",nodes:["n3117","n3118","n3119","n3120","n3121","n3122","n3117"],tags:{building:"yes"}},w553:{id:"w553",nodes:["n3123","n3124","n3129","n3125","n3126","n3123"],tags:{building:"yes"}},w554:{id:"w554",nodes:["n3069","n3070","n3071","n3072","n3073","n3074","n3075","n3076","n3077","n3078","n3079","n3080","n3081","n3082","n3069"],tags:{building:"yes"}},w555:{id:"w555",nodes:["n3087","n3088","n3089","n3090","n3087"],tags:{building:"yes"}},w556:{id:"w556",nodes:["n3113","n3114","n3115","n3116","n3113"],tags:{building:"yes"}},w557:{id:"w557",nodes:["n3103","n3104","n3105","n3106","n3103"],tags:{building:"yes"}},w558:{id:"w558",nodes:["n3127","n3128","n3129","n3124","n3127"],tags:{building:"yes"}},w559:{id:"w559",nodes:["n3137","n3141","n3142","n3138","n3139","n3140","n3137"],tags:{building:"yes"}},w56:{id:"w56",nodes:["n285","n286","n287","n288","n285"],tags:{amenity:"parking"}},w560:{id:"w560",nodes:["n3091","n3092","n3093","n3094","n3091"],tags:{building:"yes"}},w561:{id:"w561",nodes:["n3155","n3157","n3158","n3159","n3156","n3155"],tags:{building:"yes"}},w562:{id:"w562",nodes:["n3057","n3058","n3059","n3060","n3057"],tags:{building:"yes"}},w563:{id:"w563",nodes:["n3107","n3108","n3109","n3110","n3111","n3112","n3107"],tags:{building:"yes"}},w564:{id:"w564",nodes:["n3134","n3135","n3136","n3131","n3134"],tags:{building:"yes"}},w565:{id:"w565",nodes:["n3143","n3144","n3145","n3146","n3143"],tags:{building:"yes"}},w566:{id:"w566",nodes:["n3095","n3096","n3097","n3098","n3095"],tags:{building:"yes"}},w567:{id:"w567",nodes:["n3130","n3131","n3136","n3132","n3133","n3130"],tags:{building:"yes"}},w568:{id:"w568",nodes:["n3025","n3026","n3027","n3028","n3029","n3030","n3031","n3033","n3032","n3025"],tags:{amenity:"parking"}},w569:{id:"w569",nodes:["n3061","n3062","n3063","n3064","n3061"],tags:{building:"yes"}},w57:{id:"w57",nodes:["n289","n290","n291","n292","n289"],tags:{amenity:"parking"}},w570:{id:"w570",nodes:["n3155","n3156","n3152","n3153","n3155"],tags:{building:"yes"}},w571:{id:"w571",nodes:["n3099","n3100","n3101","n3102","n3099"],tags:{building:"yes"}},w572:{id:"w572",nodes:["n3147","n3148","n3149","n3150","n3147"],tags:{building:"yes"}},w573:{id:"w573",nodes:["n3039","n2284"],tags:{highway:"service"}},w574:{id:"w574",nodes:["n3151","n3152","n3153","n3154","n3151"],tags:{building:"yes"}},w575:{id:"w575",nodes:["n3021","n3022","n3023","n3024","n3021"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w576:{id:"w576",nodes:["n3065","n3066","n3067","n3068","n3065"],tags:{building:"yes"}},w577:{id:"w577",nodes:["n2944","n3192","n3757","n3813","n3814","n3815","n3816","n3817","n3818","n3819"],tags:{highway:"service",name:"Willow Drive",service:"driveway",surface:"unpaved"}},w578:{id:"w578",nodes:["n2163","n2165","n2166","n2167","n2168","n2172","n2173","n2174","n2175","n2176","n2178","n2181","n2163"],tags:{building:"yes"}},w579:{id:"w579",nodes:["n2754","n3195","n3204","n3205","n4537","n4540","n3206","n4530","n4536","n3207","n4524","n3199","n4521","n3197","n1032"],tags:{highway:"residential",name:"Elm Street"}},w58:{id:"w58",nodes:["n240","n293","n294"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w580:{id:"w580",nodes:["n2184","n2185","n2187","n2190","n2191","n2192","n2184"],tags:{building:"yes"}},w581:{id:"w581",nodes:["n2765","n3208","n3211","n2755","n3280","n2756","n3346"],tags:{highway:"residential",name:"Kelsey Street"}},w582:{id:"w582",nodes:["n2753","n3194","n3193","n3201","n3196","n4551","n3202","n4550","n3203","n3200","n3198","n1033"],tags:{highway:"residential",name:"Walnut Street"}},w583:{id:"w583",nodes:["n3272","n4469","n4588","n2879","n4564","n2872"],tags:{highway:"residential",name:"10th Avenue"}},w584:{id:"w584",nodes:["n3243","n3242","n3241","n3240","n3243"],tags:{building:"industrial"}},w585:{id:"w585",nodes:["n3273","n3274","n4631","n4593","n3275","n4592","n2846","n4611","n2847"],tags:{highway:"residential",name:"6th Avenue"}},w586:{id:"w586",nodes:["n3276","n4591","n2853","n4605","n2854"],tags:{highway:"residential",name:"8th Avenue"}},w587:{id:"w587",nodes:["n3269","n3268","n3267","n3266","n3265","n3264","n3263","n3262","n3269"],tags:{building:"industrial"}},w588:{id:"w588",nodes:["n3277","n4599","n2857","n4598","n4608","n2858"],tags:{highway:"residential",name:"7th Avenue"}},w589:{id:"w589",nodes:["n3239","n3238","n3271","n3270","n3237","n3236","n3235","n3234","n3239"],tags:{building:"yes"}},w59:{id:"w59",nodes:["n294","n295","n296","n297","n298","n299","n300","n301","n302","n303","n491","n304","n305","n306","n307"],tags:{footway:"sidewalk",highway:"footway"}},w590:{id:"w590",nodes:["n3278","n4458","n4589","n4604","n2861"],tags:{highway:"residential",name:"9th Avenue"}},w591:{id:"w591",nodes:["n3253","n3252","n3251","n3250","n3249","n3248","n3253"],tags:{building:"industrial"}},w592:{id:"w592",nodes:["n3229","n3228","n3227","n3226","n3225","n3224","n3223","n3222","n3221","n3220","n3219","n3218","n3217","n3216","n3215","n3214","n3213","n3212","n3229"],tags:{natural:"water",water:"pond"}},w593:{id:"w593",nodes:["n3261","n3260","n3259","n3258","n3257","n3256","n3255","n3254","n3261"],tags:{building:"industrial"}},w594:{id:"w594",nodes:["n3233","n3232","n3231","n3230","n3233"],tags:{building:"yes"}},w595:{id:"w595",nodes:["n3247","n3246","n3245","n3244","n3247"],tags:{building:"industrial"}},w596:{id:"w596",nodes:["n2769","n3195","n3193","n3209","n2758","n2759","n3279"],tags:{highway:"residential",name:"Armitage Street"}},w597:{id:"w597",nodes:["n2193","n2194","n2195","n2197","n2193"],tags:{building:"yes"}},w598:{id:"w598",nodes:["n3404","n3403","n3402","n3401","n3400","n3399","n3398","n3397","n3373","n3372","n3396","n3395","n3404"],tags:{building:"school"}},w6:{id:"w6",nodes:["n879","n880","n881","n882","n879"],tags:{building:"shed"}},w60:{id:"w60",nodes:["n239","n308","n307"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w600:{id:"w600",nodes:["n3387","n3386","n3316","n3315","n3314","n3313","n3387"],tags:{building:"yes"}},w601:{id:"w601",nodes:["n3304","n3303","n3302","n3301","n3385","n3384","n3300","n3299","n3304"],tags:{building:"yes"}},w602:{id:"w602",nodes:["n3334","n3333","n3332","n3331","n3330","n3329","n3328","n3327","n3326","n3325","n3324","n3323","n3322","n3321","n3320","n3319","n3318","n3317","n3334"],tags:{building:"yes"}},w603:{id:"w603",nodes:["n3353","n3352","n3347","n3280","n2798"],tags:{highway:"service",service:"alley",surface:"unpaved"}},w604:{id:"w604",nodes:["n3753","n3211","n3383"],tags:{highway:"service",service:"alley"}},w605:{id:"w605",nodes:["n3290","n3289","n3288","n3287","n3286","n3285","n3284","n3283","n3282","n3281","n3290"],tags:{building:"yes"}},w606:{id:"w606",nodes:["n2198","n2199","n2201","n2202","n2203","n2206","n2198"],tags:{building:"yes"}},w607:{id:"w607",nodes:["n2198","n2207"],tags:{barrier:"wall"}},w608:{id:"w608",nodes:["n2751","n3208","n3210","n3209","n3415","n3410","n3414","n3413","n3412","n3416"],tags:{highway:"residential",name:"East Street"}},w609:{id:"w609",nodes:["n2772","n3346","n3746","n3748","n3747","n3345","n3378","n3279","n3411"],tags:{highway:"residential",name:"Maple Street"}},w61:{id:"w61",nodes:["n309","n310","n311","n312","n313","n240"],tags:{footway:"sidewalk",highway:"footway"}},w610:{id:"w610",nodes:["n3379","n3380","n3382","n3381","n3379"],tags:{leisure:"park",name:"LaFayette Park"}},w611:{id:"w611",nodes:["n2768","n3194","n3210","n3753","n2760","n3353","n2773","n3378"],tags:{highway:"residential",name:"Bennett Street"}},w612:{id:"w612",nodes:["n2751","n3383","n2749","n2798","n2772"],tags:{highway:"residential",name:"Market Street"}},w613:{id:"w613",nodes:["n3298","n3297","n3296","n3295","n3294","n3293","n3292","n3291","n3298"],tags:{building:"yes"}},w614:{id:"w614",nodes:["n3375","n3406","n3405","n3374","n3375"],tags:{leisure:"playground"}},w615:{id:"w615",nodes:["n3393","n3344","n3343","n3342","n3341","n3340","n3339","n3338","n3337","n3392","n3391","n3390","n3389","n3336","n3335","n3388","n3393"],tags:{building:"yes"}},w616:{id:"w616",nodes:["n3376","n3407","n3408","n3377","n3376"],tags:{amenity:"school",name:"Three Rivers Elementary School"}},w617:{id:"w617",nodes:["n3312","n3311","n3310","n3309","n3308","n3307","n3306","n3305","n3312"],tags:{building:"yes"}},w619:{id:"w619",nodes:["n2863","n3424","n3425","n3426","n3427","n3428","n3429","n3430","n3431","n3432","n3433","n2844"],tags:{highway:"secondary",name:"Michigan Avenue",ref:"M 60"}},w62:{id:"w62",nodes:["n876","n906","n904","n875","n874","n873","n872","n871","n870","n869","n41","n868","n146","n314","n315","n1956"],tags:{footway:"sidewalk",highway:"footway"}},w620:{id:"w620",nodes:["n2844","n3420","n3421","n3422","n3439","n2859","n3437","n3493","n3496","n3500","n3497"],tags:{highway:"residential"}},w621:{id:"w621",nodes:["n3468","n3469","n3470","n3471","n3468"],tags:{building:"yes"}},w622:{id:"w622",nodes:["n3417","n3436","n3438","n3491","n3488","n3492","n3495","n3494","n3498","n3487","n3499","n3490","n3489","n4800","n3417"],tags:{landuse:"cemetery",name:"Riverside Cemetery"}},w623:{id:"w623",nodes:["n3440","n3441","n3442","n3443","n3444","n3445","n3440"],tags:{building:"yes"}},w624:{id:"w624",nodes:["n3446","n3447","n3448","n3449","n3450","n3451","n3452","n3453","n3454","n3455","n3456","n3457","n3458","n3459","n3460","n3461","n3462","n3463","n3464","n3465","n3466","n3467","n3446"],tags:{building:"yes"}},w625:{id:"w625",nodes:["n2844","n3434","n3435","n2878","n3275","n4621","n3276","n3278","n4463","n3272","n3472","n3474","n3475","n3476","n3477","n3478","n1202","n3479","n3480","n3481","n1203","n3482","n3483","n3484","n3485","n4574","n3486","n3473"],tags:{highway:"secondary",name:"Jefferson Street",name_1:"State Highway 60",ref:"M 60"}},w626:{id:"w626",nodes:["n3439","n3423","n2863"],tags:{highway:"unclassified",name:"Michigan Avenue",name_1:"State Highway 60"}},w627:{id:"w627",nodes:["n3500","n3005"],tags:{highway:"service"}},w628:{id:"w628",nodes:["n3491","n3488","n3492","n3010","n3009","n3005","n3008","n3007","n3006","n3502","n3491"],tags:{leisure:"park",name:"Marina Park"}},w629:{id:"w629",nodes:["n2208","n2209","n2212","n2214","n2208"],tags:{building:"yes"}},w63:{id:"w63",nodes:["n1955","n316"],tags:{footway:"sidewalk",highway:"footway"}},w630:{id:"w630",nodes:["n2757","n3414","n3202","n4542","n3206","n4538","n3750","n3503","n1629","n4500","n2763","n4502","n2764","n3508"],tags:{highway:"residential",name:"Hoffman Street"}},w631:{id:"w631",nodes:["n2215","n2750","n2770","n2771","n2215"],tags:{building:"yes"}},w632:{id:"w632",nodes:["n2766","n3504","n3507","n3751","n3205","n3196","n3410","n2746"],tags:{highway:"residential",name:"Cushman Street"}},w633:{id:"w633",nodes:["n2745","n3749","n3507","n4535","n3503"],tags:{highway:"residential",name:"Pine Street"}},w634:{id:"w634",nodes:["n3510","n3511","n3512","n3509","n3510"],tags:{leisure:"park",name:"Bowman Park"}},w636:{id:"w636",nodes:["n2745","n3752","n3204","n3201","n3415","n2761","n2767","n3411"],tags:{highway:"residential",name:"Wheeler Street"}},w637:{id:"w637",nodes:["n3550","n4586","n4476","n3472"],tags:{highway:"residential",name:"11th Avenue"}},w638:{id:"w638",nodes:["n3508","n3518"],tags:{bridge:"yes",highway:"residential",name:"Hoffman Street"}},w639:{id:"w639",nodes:["n3518","n1204","n2862","n3519","n3520","n3521","n3522","n3523","n2161","n3524","n3549","n3552","n4239","n3551","n4577","n4582","n4578","n4583","n4579","n4574"],tags:{highway:"residential",name:"Hoffman Street"}},w64:{id:"w64",nodes:["n316","n317"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w640:{id:"w640",nodes:["n3634","n3640","n3676","n3633","n3678","n3648","n3638","n3683","n3600","n3579","n3679","n3677","n2987","n3592","n3588","n3608","n3559","n3617","n3620","n3660","n3553","n3533","n3530","n3531","n3525","n3527","n3526","n3532","n3529","n3528","n3667","n3627","n3623","n3625","n3601","n3687","n3671","n3644","n3626","n3673","n3582","n3693","n3605","n3619","n3651","n3650","n3615","n3663","n3631","n3596","n3604","n3655","n3586","n3595","n3701","n3603","n3686","n3611","n3568","n3674","n3613","n3580","n3562","n3564","n3689","n3585","n3670","n3659","n3684","n3680","n3646","n3558","n3556","n3692","n3563","n3575","n3571","n3675","n3557","n3700","n3656","n3622","n3657","n3565","n3669","n3658","n3618","n3624","n3688","n3610","n3570","n3645","n3649","n3583","n3694","n3561","n3554","n3614","n3698","n3581","n3635","n3641","n3569","n3647","n3628","n3598","n3696","n3665","n3639","n3607","n3695","n3642","n3672","n3577","n3643","n3691","n3602","n3576","n3591","n3560","n3606","n3685","n3597","n3629","n3661","n3654","n3616","n3697","n3578","n3609","n3653","n3699","n3566","n3637","n3567","n3666","n3555","n3599","n3590","n3572","n3593","n3690","n3681","n3612","n3682","n3668","n3587","n3621","n3636","n3662","n3589","n3573","n3652","n3664","n3632","n3574","n3594","n3584","n3630","n3634"],tags:{landuse:"reservoir",name:"Hoffman Pond",natural:"water"}},w641:{id:"w641",nodes:["n2988","n3534","n3535","n3536","n3537","n3538","n3539","n3540","n3541","n3542","n3543","n3544","n3545","n3546","n3547","n3548","n2970"],tags:{waterway:"river"}},w642:{id:"w642",nodes:["n3702","n3703","n3704","n3705","n3706","n3707","n3708","n3709","n3710","n3711","n3712","n3713","n3714","n3715","n3716","n3717","n3718","n3719","n3720","n3721","n3722","n3723","n3724","n3725","n3726","n3727","n3728","n3729","n3730","n3731","n3732","n3733","n3734","n3735","n3736","n3737","n3738","n3739","n3740","n3741","n3742","n3743","n3702"],tags:{admin_level:"8",boundary:"administrative"}},w643:{id:"w643",nodes:["n2839","n2873"],tags:{highway:"service",service:"driveway"}},w644:{id:"w644",nodes:["n2873","n2840"],tags:{bridge:"yes",highway:"service",layer:"1",service:"driveway"}},w645:{id:"w645",nodes:["n2840","n2841","n2842","n2845","n2866"],tags:{highway:"service",service:"driveway",surface:"unpaved"}},w646:{id:"w646",nodes:["n2752","n3759","n1420","n1421","n1422","n3758","n4507","n4506","n4505","n4520","n3199","n4522","n4504","n4546","n3200","n4547","n3412"],tags:{highway:"residential",name:"Flower Street"}},w647:{id:"w647",nodes:["n2874","n2875","n2876","n2954","n2874"],tags:{building:"industrial"}},w648:{id:"w648",nodes:["n3778","n3779","n3780","n3781","n3782","n3783","n3778"],tags:{building:"yes"}},w649:{id:"w649",nodes:["n3197","n4543","n4544","n3198"],tags:{highway:"residential",name:"Morris Avenue",surface:"unpaved"}},w65:{id:"w65",nodes:["n317","n318","n319","n320","n321"],tags:{footway:"sidewalk",highway:"footway"}},w650:{id:"w650",nodes:["n3207","n4526","n4528","n4548","n3203","n4549","n3413","n2762"],tags:{highway:"residential",name:"Adams Street"}},w651:{id:"w651",nodes:["n3788","n3785","n3786","n3787","n3788"],tags:{power:"station"}},w652:{id:"w652",nodes:["n2957","n3163","n3241"],tags:{barrier:"wall"}},w653:{id:"w653",nodes:["n3549","n3802","n3803","n3800","n3801"],tags:{highway:"service",surface:"unpaved"}},w654:{id:"w654",nodes:["n3164","n3165","n3166","n3167","n3168","n3505","n3164"],tags:{building:"yes"}},w655:{id:"w655",nodes:["n3506","n3517","n3760","n3761","n3762","n3763","n3506"],tags:{building:"yes"}},w656:{id:"w656",nodes:["n3764","n3765","n3766","n3767","n3768","n3769","n3770","n3771","n3764"],tags:{building:"yes"}},w657:{id:"w657",nodes:["n3772","n3773","n3774","n3775","n3772"],tags:{building:"yes"}},w658:{id:"w658",nodes:["n3776","n3777","n3784","n3789","n3776"],tags:{building:"yes"}},w659:{id:"w659",nodes:["n3930","n3931","n3932","n3933","n3934","n3935","n3936","n3937","n3938","n3930"],tags:{leisure:"pitch",sport:"baseball"}},w66:{id:"w66",nodes:["n321","n322"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w660:{id:"w660",nodes:["n3982","n3842","n3864","n3865","n2938","n3866","n2939","n3867","n3868","n3858","n2937","n3869","n2935","n2934","n3870","n3348","n3862"],tags:{highway:"service"}},w661:{id:"w661",nodes:["n3968","n3969"],tags:{highway:"footway"}},w662:{id:"w662",nodes:["n3875","n3876","n3877","n3878","n3879","n3880","n3881","n3882","n3875"],tags:{amenity:"parking"}},w663:{id:"w663",nodes:["n3964","n3965"],tags:{highway:"footway"}},w664:{id:"w664",nodes:["n3966","n3967"],tags:{highway:"footway"}},w665:{id:"w665",nodes:["n3857","n3890","n3884","n3894","n3889","n3899","n3885","n3886","n3896","n3887"],tags:{highway:"service",service:"parking_aisle"}},w666:{id:"w666",nodes:["n3895","n3896"],tags:{highway:"service",service:"parking_aisle"}},w667:{id:"w667",nodes:["n3274","n3977","n3984","n3983","n3981","n3844","n3978","n3982","n3861","n3862","n3873","n3874","n4468","n3863"],tags:{access:"private",highway:"service",name:"Collins Drive"}},w668:{id:"w668",nodes:["n3900","n3901","n3902","n3903","n3904","n3905","n3808","n3809","n3906","n3907","n3908","n3967","n3909","n3910","n3911","n3955","n3964","n3912","n3913","n3914","n3915","n3916","n3917","n3918","n3919","n3920","n3921","n3922","n3923","n3924","n3925","n3926","n3927","n3969","n3970","n3928","n3807","n3929","n3900"],tags:{building:"school"}},w669:{id:"w669",nodes:["n3272","n39","n40","n3974","n3863","n3857","n3892","n3883","n3891","n3889"],tags:{highway:"service"}},w67:{id:"w67",nodes:["n322","n886","n323","n475"],tags:{footway:"crossing",highway:"footway"}},w670:{id:"w670",nodes:["n3473","n3859","n3860","n3980","n4908","n4865"],tags:{highway:"secondary",name:"Hoffman Street",ref:"M 60"}},w671:{id:"w671",nodes:["n3970","n3806","n3971"],tags:{highway:"footway"}},w672:{id:"w672",nodes:["n3892","n3893","n3894"],tags:{highway:"service",service:"parking_aisle"}},w673:{id:"w673",nodes:["n3945","n3946","n3992","n3990","n3945"],tags:{leisure:"pitch",sport:"tennis"}},w674:{id:"w674",nodes:["n3890","n3893","n3891"],tags:{highway:"service",service:"parking_aisle"}},w675:{id:"w675",nodes:["n3947","n3948","n3994","n3993","n3947"],tags:{leisure:"pitch",sport:"tennis"}},w676:{id:"w676",nodes:["n3858","n3954","n3972","n3810","n3811","n3812","n3841","n3973","n3898","n3963","n3897","n3896"],tags:{highway:"service"}},w677:{id:"w677",nodes:["n3977","n3996","n3997","n4004","n3998","n3999","n4005","n4007","n4006","n3995","n4000","n3843","n4001","n4002","n4003","n3949","n3351","n3950","n3354","n3350","n3951","n3349","n3952","n3953","n3954","n3956","n3966","n3955"],tags:{highway:"footway"}},w678:{id:"w678",nodes:["n3887","n3888","n3895","n3899"],tags:{highway:"service",service:"parking_aisle"}},w679:{id:"w679",nodes:["n3946","n3947","n3993","n3992","n3946"],tags:{leisure:"pitch",sport:"tennis"}},w68:{id:"w68",nodes:["n294","n1952","n326"],tags:{footway:"sidewalk",highway:"footway"}},w680:{id:"w680",nodes:["n3939","n3940","n3941","n3985","n3986","n3987","n3988","n3989","n3942","n3943","n3939"],tags:{leisure:"pitch",sport:"baseball"}},w681:{id:"w681",nodes:["n3990","n3991","n3944","n3945","n3990"],tags:{leisure:"pitch",sport:"tennis"}},w682:{id:"w682",nodes:["n3871","n3872","n3873","n3874","n3871"],tags:{amenity:"parking"}},w683:{id:"w683",nodes:["n3956","n3965","n3957","n3958","n3959"],tags:{footway:"sidewalk",highway:"footway"}},w684:{id:"w684",nodes:["n3790","n3791","n3792","n3793","n3790"],tags:{building:"shed"}},w685:{id:"w685",nodes:["n3794","n3795","n3796","n3797","n3794"],tags:{building:"yes"}},w686:{id:"w686",nodes:["n3798","n3799","n3804","n3805","n3798"],tags:{building:"yes"}},w687:{id:"w687",nodes:["n3806","n3807"],tags:{highway:"footway"}},w688:{id:"w688",nodes:["n3845","n3846","n3847","n3848","n3845"],tags:{leisure:"pitch",sport:"american_football"}},w689:{id:"w689",nodes:["n3849","n4021","n3850","n3851","n3852","n3853","n3854","n3855","n3856","n3975","n3976","n3979","n4008","n4009","n4010","n4011","n4012","n4013","n4014","n4015","n4016","n4017","n4018","n4019","n4020","n4021"],tags:{leisure:"track",sport:"running"}},w69:{id:"w69",nodes:["n326","n327"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w690:{id:"w690",nodes:["n4022","n4023","n4024","n4025","n4026","n4027","n4022"],tags:{building:"yes"}},w691:{id:"w691",nodes:["n4028","n4029","n4030","n4031","n4028"],tags:{building:"yes"}},w692:{id:"w692",nodes:["n4032","n4033","n4034","n4035","n4032"],tags:{building:"yes"}},w693:{id:"w693",nodes:["n4036","n4037","n4038","n4039","n4036"],tags:{building:"yes"}},w694:{id:"w694",nodes:["n4040","n4041","n4042","n4043","n4040"],tags:{building:"yes"}},w695:{id:"w695",nodes:["n4044","n4045","n4050","n4053","n4046","n4047","n4048","n4049","n4044"],tags:{building:"yes"}},w696:{id:"w696",nodes:["n4050","n4051","n4052","n4053","n4050"],tags:{building:"roof"}},w697:{id:"w697",nodes:["n4054","n4068","n4055","n4056","n4057","n4054"],tags:{building:"yes"}},w698:{id:"w698",nodes:["n4058","n4059","n4060","n4061","n4062","n4063","n4058"],tags:{building:"yes"}},w699:{id:"w699",nodes:["n4064","n4066","n4065"],tags:{barrier:"fence"}},w7:{id:"w7",nodes:["n43","n44","n45"],tags:{highway:"service"}},w70:{id:"w70",nodes:["n327","n328","n27","n329"],tags:{footway:"sidewalk",highway:"footway"}},w700:{id:"w700",nodes:["n4066","n4067","n4068"],tags:{barrier:"fence"}},w701:{id:"w701",nodes:["n4069","n4070","n4071","n4072","n4069"],tags:{building:"shed"}},w702:{id:"w702",nodes:["n4073","n4074","n4075","n4076","n4077","n4078","n4079","n4080","n4081","n4082","n4083","n4084","n4073"],tags:{building:"yes"}},w703:{id:"w703",nodes:["n4085","n4093","n4086","n4087","n4088","n4089","n4090","n4091","n4092","n4085"],tags:{building:"yes"}},w704:{id:"w704",nodes:["n4093","n4094","n4095","n4096"],tags:{barrier:"fence"}},w705:{id:"w705",nodes:["n4097","n4098","n4099","n4100","n4097"],tags:{building:"yes"}},w706:{id:"w706",nodes:["n4098","n4102","n4087"],tags:{barrier:"fence"}},w707:{id:"w707",nodes:["n4101","n4102","n4096","n4170","n4103"],tags:{barrier:"fence"}},w708:{id:"w708",nodes:["n4104","n4105","n4106","n4107","n4104"],tags:{access:"private",leisure:"swimming_pool"}},w709:{id:"w709",nodes:["n4108","n4109","n4110","n4111","n4108"],tags:{building:"yes"}},w71:{id:"w71",nodes:["n329","n331"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w710:{id:"w710",nodes:["n4112","n4113","n4114","n4115","n4116","n4117","n4118","n4119","n4112"],tags:{building:"yes"}},w711:{id:"w711",nodes:["n4120","n4121","n4122","n4123","n4120"],tags:{building:"yes"}},w712:{id:"w712",nodes:["n4124","n4125","n4126","n4127","n4128","n4129","n4124"],tags:{building:"yes"}},w713:{id:"w713",nodes:["n4130","n4131","n4132","n4133","n4130"],tags:{building:"shed"}},w714:{id:"w714",nodes:["n4134","n4135","n4136","n4137","n4138","n4139","n4140","n4141","n4142","n4143","n4134"],tags:{building:"yes"}},w715:{id:"w715",nodes:["n4144","n4145","n4146","n4147","n4148","n4149","n4144"],tags:{building:"yes"}},w716:{id:"w716",nodes:["n4150","n4151","n4152","n4153","n4150"],tags:{building:"yes"}},w717:{id:"w717",nodes:["n4154","n4155","n4156","n4157","n4154"],tags:{building:"yes"}},w718:{id:"w718",nodes:["n4158","n4159","n4160","n4161","n4162","n4163","n4164","n4165","n4158"],tags:{building:"yes"}},w719:{id:"w719",nodes:["n4166","n4167","n4168","n4169","n4166"],tags:{building:"yes"}},w72:{id:"w72",nodes:["n331","n344","n332","n333","n334"],tags:{footway:"sidewalk",highway:"footway"}},w720:{id:"w720",nodes:["n4170","n4171"],tags:{barrier:"fence"}},w721:{id:"w721",nodes:["n4138","n4103"],tags:{barrier:"fence"}},w722:{id:"w722",nodes:["n4103","n4172"],tags:{barrier:"fence"}},w723:{id:"w723",nodes:["n4173","n4174"],tags:{barrier:"fence"}},w724:{id:"w724",nodes:["n4175","n4176","n4177","n4178","n4175"],tags:{building:"yes"}},w725:{id:"w725",nodes:["n4179","n4180","n4181","n4182","n4183","n4184","n4179"],tags:{building:"yes"}},w726:{id:"w726",nodes:["n4185","n4186","n4187","n4188","n4185"],tags:{building:"yes"}},w727:{id:"w727",nodes:["n4189","n4190","n4191","n4192","n4193","n4194","n4195","n4196","n4197","n4198","n4199","n4200","n4201","n4202","n4189"],tags:{building:"yes"}},w728:{id:"w728",nodes:["n4203","n4204","n4205","n4206","n4207","n4208","n4209","n4210","n4203"],tags:{building:"yes"}},w729:{id:"w729",nodes:["n4211","n4212","n4213","n4214","n4211"],tags:{building:"shed"}},w73:{id:"w73",nodes:["n335","n336","n337","n338","n339","n340","n341","n342","n335"],tags:{building:"yes"}},w730:{id:"w730",nodes:["n4215","n4216","n4217","n4218","n4215"],tags:{building:"yes"}},w731:{id:"w731",nodes:["n4219","n4220","n4221","n4222","n4223","n4224","n4225","n4226","n4227","n4228","n4229","n4230","n4219"],tags:{building:"yes"}},w732:{id:"w732",nodes:["n4231","n4232","n4233","n4234","n4235","n4236","n4237","n4238","n4231"],tags:{building:"yes"}},w733:{id:"w733",nodes:["n4239","n4240","n4241","n4242","n4243","n4244","n4245","n4246","n4247","n4248","n4241"],tags:{highway:"service"}},w734:{id:"w734",nodes:["n4240","n4249","n4248"],tags:{highway:"service",service:"parking_aisle"}},w735:{id:"w735",nodes:["n4250","n4251","n4252","n4253","n4254","n4255","n4256","n4257","n4258","n4250"],tags:{amenity:"parking"}},w736:{id:"w736",nodes:["n4259","n4260","n4261","n4262","n4259"],tags:{building:"yes"}},w737:{id:"w737",nodes:["n4263","n4264","n4265","n4266","n4267","n4268","n4269","n4270","n4271","n4272","n4273","n4274","n4275","n4276","n4263"],tags:{building:"yes"}},w738:{id:"w738",nodes:["n4277","n4278","n4279","n4280","n4281","n4282","n4277"],tags:{building:"yes"}},w739:{id:"w739",nodes:["n4283","n4284","n4285","n4286","n4287","n4288","n4289","n4290","n4291","n4292","n4293","n4294","n4283"],tags:{building:"yes"}},w74:{id:"w74",nodes:["n343","n344","n345"],tags:{highway:"service"}},w740:{id:"w740",nodes:["n4295","n4296","n4297","n4298","n4295"],tags:{building:"yes"}},w741:{id:"w741",nodes:["n4299","n4300","n4301","n4302","n4303","n4304","n4305","n4306","n4307","n4308","n4309","n4310","n4299"],tags:{building:"yes"}},w742:{id:"w742",nodes:["n4311","n4312","n4313","n4314","n4311"],tags:{building:"shed"}},w743:{id:"w743",nodes:["n4315","n4316","n4317","n4318","n4319","n4320","n4315"],tags:{building:"yes"}},w744:{id:"w744",nodes:["n4321","n4322","n4323","n4324","n4325","n4326","n4327","n4328","n4329","n4330","n4331","n4332","n4333","n4334","n4321"],tags:{building:"yes"}},w745:{id:"w745",nodes:["n4335","n4336","n4337","n4338","n4335"],tags:{building:"shed"}},w746:{id:"w746",nodes:["n4339","n4340","n4341","n4342","n4343","n4344","n4339"],tags:{building:"yes"}},w747:{id:"w747",nodes:["n4345","n4346","n4347","n4348","n4345"],tags:{building:"yes"}},w748:{id:"w748",nodes:["n4349","n4350","n4351","n4352","n4349"],tags:{building:"yes"}},w749:{id:"w749",nodes:["n4353","n4354","n4355","n4356","n4357","n4358","n4353"],tags:{building:"yes"}},w75:{id:"w75",nodes:["n346","n347","n348","n349","n350","n351","n346"],tags:{amenity:"parking"}},w750:{id:"w750",nodes:["n4612","n4359","n4360"],tags:{barrier:"fence"}},w751:{id:"w751",nodes:["n4361","n4362","n4363","n4364","n4361"],tags:{building:"yes"}},w752:{id:"w752",nodes:["n4365","n4366","n4367","n4368","n4365"],tags:{building:"yes"}},w753:{id:"w753",nodes:["n4369","n4370","n4371","n4372","n4375","n4369"],tags:{building:"yes"}},w754:{id:"w754",nodes:["n4373","n4374","n4375"],tags:{barrier:"fence"}},w755:{id:"w755",nodes:["n4376","n4377","n4378","n4379","n4376"],tags:{building:"shed"}},w756:{id:"w756",nodes:["n4380","n4381","n4382","n4383","n4384","n4385","n4386","n4387","n4388","n4389","n4390","n4391","n4380"],tags:{building:"yes"}},w757:{id:"w757",nodes:["n4392","n4393","n4394","n4395","n4392"],tags:{building:"yes"}},w758:{id:"w758",nodes:["n4396","n4397","n4398","n4399","n4396"],tags:{building:"shed"}},w759:{id:"w759",nodes:["n4400","n4401","n4402","n4403","n4404","n4405","n4406","n4407","n4408","n4409","n4410","n4411","n4412","n4413","n4414","n4415","n4400"],tags:{building:"yes"}},w76:{id:"w76",nodes:["n2561","n359","n2563","n2793","n357","n356","n2792","n355","n354","n2791","n2562","n353","n352","n358","n2561"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w760:{id:"w760",nodes:["n4416","n4417"],tags:{barrier:"fence"}},w761:{id:"w761",nodes:["n4418","n4416","n4419"],tags:{barrier:"fence"}},w762:{id:"w762",nodes:["n4420","n4421"],tags:{barrier:"fence"}},w763:{id:"w763",nodes:["n4422","n4423","n4424","n4425","n4426","n4427","n4428","n4429","n4430","n4431","n4432","n4433","n4422"],tags:{building:"yes"}},w764:{id:"w764",nodes:["n4434","n4435","n4436","n4437","n4438","n4439","n4440","n4441","n4442","n4445","n4444","n4443","n4434"],tags:{building:"yes"}},w765:{id:"w765",nodes:["n4446","n4447","n4448","n4449","n4446"],tags:{building:"yes"}},w766:{id:"w766",nodes:["n4450","n4451","n4452","n4453","n4450"],tags:{building:"yes"}},w767:{id:"w767",nodes:["n4454","n4455","n4456","n4457","n4454"],tags:{building:"yes"}},w768:{id:"w768",nodes:["n4461","n4458","n4460"],tags:{footway:"crossing",highway:"footway"}},w769:{id:"w769",nodes:["n4460","n4462","n4459"],tags:{footway:"sidewalk",highway:"footway"}},w77:{id:"w77",nodes:["n325","n360","n361"],tags:{footway:"crossing",highway:"footway"}},w770:{id:"w770",nodes:["n4462","n4463","n4464"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w771:{id:"w771",nodes:["n4464","n4465","n4466","n4467"],tags:{footway:"sidewalk",highway:"footway"}},w772:{id:"w772",nodes:["n3959","n3968","n3971","n3960","n3961","n3962","n3963"],tags:{footway:"sidewalk",highway:"footway"}},w773:{id:"w773",nodes:["n4467","n4468","n3959"],tags:{footway:"crossing",highway:"footway"}},w774:{id:"w774",nodes:["n4459","n4469","n4470"],tags:{footway:"crossing",highway:"footway"}},w775:{id:"w775",nodes:["n4470","n4471","n4472","n4473","n4474","n4475"],tags:{footway:"sidewalk",highway:"footway"}},w776:{id:"w776",nodes:["n4475","n4476","n4477"],tags:{footway:"crossing",highway:"footway"}},w777:{id:"w777",nodes:["n4477","n4478","n4479","n4480","n4481","n4482","n4483","n4484","n4485","n4486","n4487"],tags:{footway:"sidewalk",highway:"footway"}},w778:{id:"w778",nodes:["n4488","n4489","n4490","n4491","n4488"],tags:{building:"yes"}},w779:{id:"w779",nodes:["n4492","n4493","n4494","n4495","n4492"],tags:{building:"yes"}},w78:{id:"w78",nodes:["n361","n362","n369"],tags:{footway:"sidewalk",highway:"footway"}},w780:{id:"w780",nodes:["n4496","n4497","n4498","n4499","n4496"],tags:{access:"private",leisure:"swimming_pool"}},w781:{id:"w781",nodes:["n4508","n4509"],tags:{footway:"sidewalk",highway:"footway"}},w782:{id:"w782",nodes:["n4510","n4511"],tags:{footway:"sidewalk",highway:"footway"}},w783:{id:"w783",nodes:["n4512","n4513"],tags:{footway:"sidewalk",highway:"footway"}},w784:{id:"w784",nodes:["n4513","n4514"],tags:{footway:"sidewalk",highway:"footway"}},w785:{id:"w785",nodes:["n4515","n4516"],tags:{footway:"sidewalk",highway:"footway"}},w786:{id:"w786",nodes:["n4517","n4515"],tags:{footway:"sidewalk",highway:"footway"}},w787:{id:"w787",nodes:["n4518","n4519"],tags:{footway:"sidewalk",highway:"footway"}},w788:{id:"w788",nodes:["n4519","n4520","n4513"],tags:{footway:"crossing",highway:"footway"}},w789:{id:"w789",nodes:["n4515","n4521","n4513"],tags:{footway:"crossing",highway:"footway"}},w79:{id:"w79",nodes:["n362","n363","n334"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w790:{id:"w790",nodes:["n4515","n4522","n4523"],tags:{footway:"crossing",highway:"footway"}},w791:{id:"w791",nodes:["n4523","n4524","n4519"],tags:{footway:"crossing",highway:"footway"}},w792:{id:"w792",nodes:["n4523","n4525"],tags:{footway:"sidewalk",highway:"footway"}},w793:{id:"w793",nodes:["n4525","n4526","n4527"],tags:{footway:"crossing",highway:"footway"}},w794:{id:"w794",nodes:["n4527","n4529"],tags:{footway:"sidewalk",highway:"footway"}},w795:{id:"w795",nodes:["n4529","n4530","n4518"],tags:{footway:"crossing",highway:"footway"}},w796:{id:"w796",nodes:["n4518","n4531"],tags:{footway:"sidewalk",highway:"footway"}},w797:{id:"w797",nodes:["n4531","n4532"],tags:{footway:"sidewalk",highway:"footway"}},w798:{id:"w798",nodes:["n4533","n4534"],tags:{footway:"sidewalk",highway:"footway"}},w799:{id:"w799",nodes:["n4518","n4538","n4539"],tags:{footway:"crossing",highway:"footway"}},w8:{id:"w8",nodes:["n46","n47","n145","n48","n49","n46"],tags:{amenity:"parking"}},w80:{id:"w80",nodes:["n334","n364","n365"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w800:{id:"w800",nodes:["n4539","n4540","n4541"],tags:{footway:"crossing",highway:"footway"}},w801:{id:"w801",nodes:["n4541","n4542","n4529"],tags:{footway:"crossing",highway:"footway"}},w802:{id:"w802",nodes:["n4552","n4553"],tags:{footway:"sidewalk",highway:"footway"}},w803:{id:"w803",nodes:["n4554","n4555","n4556","n4557","n4558","n4559","n4554"],tags:{building:"yes"}},w804:{id:"w804",nodes:["n4562","n4563"],tags:{barrier:"retaining_wall"}},w805:{id:"w805",nodes:["n4568","n4569","n4570","n4571","n4568"],tags:{building:"yes"}},w806:{id:"w806",nodes:["n3473","n4575","n4576","n4581","n4580","n3551"],tags:{highway:"residential",oneway:"yes"}},w807:{id:"w807",nodes:["n4613","n4614","n4615","n4616","n4617","n4618","n4619","n4620","n4613"],tags:{leisure:"pitch",sport:"baseball"}},w808:{id:"w808",nodes:["n4621","n4622","n4623","n4624","n4625","n4626","n4627","n4628","n4629","n4630"],tags:{highway:"service"}},w809:{id:"w809",nodes:["n4631","n4632","n4633","n4637","n4634","n4638","n4635","n4636"],tags:{highway:"service"}},w81:{id:"w81",nodes:["n365","n366","n367"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w810:{id:"w810",nodes:["n4639","n4640","n4641"],tags:{barrier:"fence"}},w811:{id:"w811",nodes:["n4649","n4650","n4651","n4652","n4649"],tags:{building:"yes"}},w812:{id:"w812",nodes:["n4654","n4655"],tags:{barrier:"fence"}},w813:{id:"w813",nodes:["n4656","n4657"],tags:{barrier:"fence"}},w814:{id:"w814",nodes:["n4669","n4670","n4671","n4672","n4669"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w815:{id:"w815",nodes:["n4678","n4679","n4680","n1889"],tags:{highway:"service"}},w816:{id:"w816",nodes:["n239","n4686","n4687"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w817:{id:"w817",nodes:["n4687","n4688","n4689"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w818:{id:"w818",nodes:["n4689","n4690","n307"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w819:{id:"w819",nodes:["n2266","n4743"],tags:{highway:"path"}},w82:{id:"w82",nodes:["n724","n368","n369"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w820:{id:"w820",nodes:["n4785","n4786","n4787","n4788","n1684","n4760","n4769","n4761","n4762","n4763","n4764","n4765","n4766","n4767","n4768","n4785"],tags:{natural:"wood"}},w821:{id:"w821",nodes:["n4769","n4770","n4771","n4772","n4773","n4774","n4775","n4776","n4777","n4778","n4779","n4780","n4781","n4782","n4783","n4784","n4785","n4768","n4767","n4766","n4765","n4764","n4763","n4762","n4761","n4769"],tags:{natural:"scrub"}},w822:{id:"w822",nodes:["n4772","n4789","n4790","n4791","n4792","n4793","n4794","n4795","n4796","n4797","n4798","n4799","n4783","n4782","n4781","n4780","n4779","n4778","n4777","n4776","n4775","n4774","n4773","n4772"],tags:{natural:"wood"}},w823:{id:"w823",nodes:["n4800","n4801","n4802","n4803","n4804","n4805","n4806","n4807","n4808","n4809","n4810","n4811","n4812","n4813","n4814","n4815","n4816","n3490","n3489","n4800"],tags:{natural:"wood"}},w824:{id:"w824",nodes:["n4817","n4818","n4819","n4820","n4821","n4822","n4817"],tags:{landuse:"recreation_ground"}},w825:{id:"w825",nodes:["n4563","n4823","n4824","n4829","n4825","n4826","n4827","n4828","n4562","n4563"],tags:{landuse:"recreation_ground"}},w826:{id:"w826",nodes:["n4830","n4831","n4832","n4833","n4834","n4835","n4836","n4830"],tags:{landuse:"industrial"}},w827:{id:"w827",nodes:["n4563","n4837","n4838","n4839","n4840","n4841","n4842","n4827","n4828","n4562","n4563"],tags:{landuse:"industrial"}},w828:{id:"w828",nodes:["n4843","n4844","n4845","n4846","n4843"],tags:{landuse:"farmland"}},w829:{id:"w829",nodes:["n3712","n4847","n4848","n4849","n4850","n4851","n4852","n4858","n4864","n4959","n4960","n4853","n4857","n4854","n4855","n4856","n3712"],tags:{aeroway:"aerodrome",name:"Three Rivers Municipal Airport"}},w83:{id:"w83",nodes:["n371","n372","n373","n374","n371"],tags:{building:"yes"}},w830:{id:"w830",nodes:["n4855","n4854","n4857","n4853","n4960"],tags:{barrier:"fence"}},w831:{id:"w831",nodes:["n4860","n4859","n4858","n4852","n4851"],tags:{barrier:"fence"}},w832:{id:"w832",nodes:["n4866","n4878","n4869","n4867"],tags:{aeroway:"runway",ref:"5/23"}},w833:{id:"w833",nodes:["n4868","n4890","n4894","n4881","n4869","n4905","n4870"],tags:{aeroway:"runway",ref:"9/27"}},w834:{id:"w834",nodes:["n4871","n4875","n4872","n4895","n4873","n4874","n4871"],tags:{aeroway:"apron"}},w835:{id:"w835",nodes:["n4875","n4876","n4877","n4878","n4879","n4880","n4882","n4881"],tags:{aeroway:"taxiway"}},w836:{id:"w836",nodes:["n4882","n4893","n4883","n4891","n4884","n4885","n4886","n4887","n4888","n4892","n4889","n4890"],tags:{aeroway:"taxiway"}},w837:{id:"w837",nodes:["n4893","n4894"],tags:{aeroway:"taxiway"}},w838:{id:"w838",nodes:["n4895","n4896","n4897","n4898","n4899","n4900","n4901","n4902","n4903","n4906","n4904","n4905"],tags:{aeroway:"taxiway"}},w839:{id:"w839",nodes:["n4907","n4908"],tags:{highway:"service"}},w84:{id:"w84",nodes:["n374","n375","n376","n377","n373","n374"],tags:{building:"yes"}},w840:{id:"w840",nodes:["n4909","n4907","n4910"],tags:{highway:"service"}},w841:{id:"w841",nodes:["n4911","n4912","n4913","n4914","n4911"],tags:{building:"yes"}},w842:{id:"w842",nodes:["n4915","n4916","n4917","n4918","n4915"],tags:{aeroway:"hangar",building:"yes"}},w843:{id:"w843",nodes:["n4919","n4920","n4921","n4922","n4919"],tags:{building:"yes"}},w844:{id:"w844",nodes:["n4923","n4924","n4925","n4926","n4923"],tags:{aeroway:"hangar",building:"yes"}},w845:{id:"w845",nodes:["n4927","n4928","n4929","n4930","n4927"],tags:{aeroway:"hangar",building:"yes"}},w846:{id:"w846",nodes:["n4931","n4932","n4933","n4934","n4931"],tags:{aeroway:"hangar",building:"yes"}},w847:{id:"w847",nodes:["n4935","n4936","n4937","n4938","n4935"],tags:{aeroway:"hangar",building:"yes"}},w848:{id:"w848",nodes:["n4939","n4940","n4941","n4942","n4939"],tags:{aeroway:"hangar",building:"yes"}},w849:{id:"w849",nodes:["n4943","n4944","n4945","n4946","n4943"],tags:{aeroway:"hangar",building:"yes"}},w85:{id:"w85",nodes:["n431","n432","n1038","n433","n434","n1040","n431"],tags:{building:"yes"}},w850:{id:"w850",nodes:["n4947","n4948","n4949","n4950","n4947"],tags:{aeroway:"hangar",building:"yes"}},w851:{id:"w851",nodes:["n4951","n4952","n4953","n4954","n4951"],tags:{aeroway:"hangar",building:"yes"}},w852:{id:"w852",nodes:["n4955","n4956","n4957","n4958","n4955"],tags:{aeroway:"hangar",building:"yes"}},w853:{id:"w853",nodes:["n4959","n4864","n4861","n4862","n4863"],tags:{barrier:"fence"}},w854:{id:"w854",nodes:["n4961","n4962","n4963","n4964","n4965","n4966","n4967","n4968","n4969","n4961"],tags:{landuse:"farmland"}},w855:{id:"w855",nodes:["n4970","n4971","n4972","n4973","n4974","n4975","n4976","n4977","n4978","n4980","n4970"],tags:{landuse:"farmland"}},w856:{id:"w856",nodes:["n4979","n4980","n4978","n4981","n4982","n4983","n4984","n4985","n4979"],tags:{natural:"scrub"}},w857:{id:"w857",nodes:["n4986","n4987","n4988","n5032","n4989","n4990","n4991","n4992","n4993","n4994","n4995","n4996","n4997","n4998","n4999","n5000","n5001","n5002","n5022","n5023","n5024","n5025","n5030","n5031","n5029","n5028","n5027","n5026","n4986"],tags:{landuse:"farmland"}},w858:{id:"w858",nodes:["n5001","n5003","n5004","n4999","n5000","n5001"],tags:{natural:"scrub"}},w859:{id:"w859",nodes:["n5005","n5006","n5007","n5008","n5009","n5010","n5021","n5020","n5019","n5011","n5012","n5013","n5018","n5014","n5015","n5017","n5016","n5005"],tags:{landuse:"farmland"}},w86:{id:"w86",nodes:["n384","n385","n386","n387","n384"],tags:{building:"yes"}},w860:{id:"w860",nodes:["n3020","n5033","n5034","n5035","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2153","n2288","n3020"],tags:{landuse:"industrial"}},w87:{id:"w87",nodes:["n387","n388","n389","n386","n387"],tags:{building:"yes"}},w88:{id:"w88",nodes:["n390","n391","n392","n393","n390"],tags:{building:"yes"}},w89:{id:"w89",nodes:["n394","n2895"],tags:{highway:"service"}},w9:{id:"w9",nodes:["n50","n51","n148","n52","n57","n891","n53","n50"],tags:{building:"yes"}},w90:{id:"w90",nodes:["n398","n399","n400","n401","n402","n403","n404","n405","n406","n407","n408","n409","n410","n411","n412","n413","n414","n415","n416","n417","n398"],tags:{building:"yes"}},w91:{id:"w91",nodes:["n418","n423","n419"],tags:{highway:"service"}},w92:{id:"w92",nodes:["n420","n421","n422","n423","n420"],tags:{amenity:"parking"}},w93:{id:"w93",nodes:["n2282","n1876"],tags:{name:"Rocky River",tunnel:"building_passage",waterway:"river"}},w94:{id:"w94",nodes:["n1876","n885","n1875","n2234"],tags:{name:"Rocky River",waterway:"river"}},w95:{id:"w95",nodes:["n425","n426","n427","n914","n428","n913","n425"],tags:{building:"yes"}},w96:{id:"w96",nodes:["n456","n620","n1034","n1035","n456"],tags:{building:"yes"}},w97:{id:"w97",nodes:["n435","n912","n451","n321"],tags:{highway:"footway"}},w98:{id:"w98",nodes:["n436","n319","n437","n438","n439","n440","n441","n476","n442"],tags:{highway:"service"}},w99:{id:"w99",nodes:["n443","n444","n445","n446","n447","n448","n449","n450","n443"],tags:{amenity:"parking"}},n2934:{id:"n2934",loc:[-85.617051,41.952263]},n2935:{id:"n2935",loc:[-85.61699,41.952276]},n2937:{id:"n2937",loc:[-85.616847,41.952262]},n2938:{id:"n2938",loc:[-85.616577,41.951956]},n2939:{id:"n2939",loc:[-85.61656,41.952044]},n3348:{id:"n3348",loc:[-85.61714,41.9522]},n3349:{id:"n3349",loc:[-85.616517,41.95212]},n3350:{id:"n3350",loc:[-85.616489,41.952033]},n3351:{id:"n3351",loc:[-85.616529,41.951907]},n3354:{id:"n3354",loc:[-85.616488,41.951994]}};
59417
59418   // Tooltips and svg mask used to highlight certain features
59419   function uiCurtain() {
59420
59421       var surface = select(null),
59422           tooltip = select(null),
59423           darkness = select(null);
59424
59425       function curtain(selection$$1) {
59426           surface = selection$$1
59427               .append('svg')
59428               .attr('id', 'curtain')
59429               .style('z-index', 1000)
59430               .style('pointer-events', 'none')
59431               .style('position', 'absolute')
59432               .style('top', 0)
59433               .style('left', 0);
59434
59435           darkness = surface.append('path')
59436               .attr('x', 0)
59437               .attr('y', 0)
59438               .attr('class', 'curtain-darkness');
59439
59440           select(window).on('resize.curtain', resize);
59441
59442           tooltip = selection$$1.append('div')
59443               .attr('class', 'tooltip')
59444               .style('z-index', 1002);
59445
59446           tooltip
59447               .append('div')
59448               .attr('class', 'tooltip-arrow');
59449
59450           tooltip
59451               .append('div')
59452               .attr('class', 'tooltip-inner');
59453
59454           resize();
59455
59456
59457           function resize() {
59458               surface
59459                   .attr('width', window.innerWidth)
59460                   .attr('height', window.innerHeight);
59461               curtain.cut(darkness.datum());
59462           }
59463       }
59464
59465
59466       /**
59467        * Reveal cuts the curtain to highlight the given box,
59468        * and shows a tooltip with instructions next to the box.
59469        *
59470        * @param  {String|ClientRect} [box]   box used to cut the curtain
59471        * @param  {String}    [text]          text for a tooltip
59472        * @param  {Object}    [options]
59473        * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
59474        * @param  {integer}   [options.duration]        transition time in milliseconds
59475        * @param  {string}    [options.buttonText]      if set, create a button with this text label
59476        * @param  {function}  [options.buttonCallback]  if set, the callback for the button
59477        * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
59478        */
59479       curtain.reveal = function(box, text, options) {
59480           if (typeof box === 'string') {
59481               box = select(box).node();
59482           }
59483           if (box && box.getBoundingClientRect) {
59484               box = copyBox(box.getBoundingClientRect());
59485           }
59486
59487           options = options || {};
59488
59489           var tooltipBox;
59490           if (options.tooltipBox) {
59491               tooltipBox = options.tooltipBox;
59492               if (typeof tooltipBox === 'string') {
59493                   tooltipBox = select(tooltipBox).node();
59494               }
59495               if (tooltipBox && tooltipBox.getBoundingClientRect) {
59496                   tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
59497               }
59498           } else {
59499               tooltipBox = box;
59500           }
59501
59502           if (tooltipBox && text) {
59503               // pseudo markdown bold text for the instruction section..
59504               var parts = text.split('**');
59505               var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
59506               if (parts[1]) {
59507                   html += '<span class="instruction">' + parts[1] + '</span>';
59508               }
59509
59510               html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
59511               html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
59512
59513               if (options.buttonText && options.buttonCallback) {
59514                   html += '<div class="button-section">' +
59515                       '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
59516               }
59517
59518               var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
59519               tooltip
59520                   .classed(classes, true)
59521                   .selectAll('.tooltip-inner')
59522                   .html(html);
59523
59524               if (options.buttonText && options.buttonCallback) {
59525                   var button = tooltip.selectAll('.button-section .button.action');
59526                   button
59527                       .on('click', function() {
59528                           event.preventDefault();
59529                           options.buttonCallback();
59530                       });
59531               }
59532
59533               var tip = copyBox(tooltip.node().getBoundingClientRect()),
59534                   w = window.innerWidth,
59535                   h = window.innerHeight,
59536                   tooltipWidth = 200,
59537                   tooltipArrow = 5,
59538                   side, pos;
59539
59540
59541               // hack: this will have bottom placement,
59542               // so need to reserve extra space for the tooltip illustration.
59543               if (options.tooltipClass === 'intro-mouse') {
59544                   tip.height += 80;
59545               }
59546
59547               // trim box dimensions to just the portion that fits in the window..
59548               if (tooltipBox.top + tooltipBox.height > h) {
59549                   tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
59550               }
59551               if (tooltipBox.left + tooltipBox.width > w) {
59552                   tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
59553               }
59554
59555               // determine tooltip placement..
59556
59557               if (tooltipBox.top + tooltipBox.height < 100) {
59558                   // tooltip below box..
59559                   side = 'bottom';
59560                   pos = [
59561                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
59562                       tooltipBox.top + tooltipBox.height
59563                   ];
59564
59565               } else if (tooltipBox.top > h - 140) {
59566                   // tooltip above box..
59567                   side = 'top';
59568                   pos = [
59569                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
59570                       tooltipBox.top - tip.height
59571                   ];
59572
59573               } else {
59574                   // tooltip to the side of the tooltipBox..
59575                   var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
59576
59577                   if (textDirection === 'rtl') {
59578                       if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
59579                           side = 'right';
59580                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
59581
59582                       } else {
59583                           side = 'left';
59584                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
59585                       }
59586
59587                   } else {
59588                       if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
59589                           side = 'left';
59590                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
59591                       }
59592                       else {
59593                           side = 'right';
59594                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
59595                       }
59596                   }
59597               }
59598
59599               if (options.duration !== 0 || !tooltip.classed(side)) {
59600                   tooltip.call(uiToggle(true));
59601               }
59602
59603               tooltip
59604                   .style('top', pos[1] + 'px')
59605                   .style('left', pos[0] + 'px')
59606                   .attr('class', classes + ' ' + side);
59607
59608
59609               // shift tooltip-inner if it is very close to the top or bottom edge
59610               // (doesn't affect the placement of the tooltip-arrow)
59611               var shiftY = 0;
59612               if (side === 'left' || side === 'right') {
59613                   if (pos[1] < 60) {
59614                       shiftY = 60 - pos[1];
59615                   }
59616                   else if (pos[1] + tip.height > h - 100) {
59617                       shiftY = h - pos[1] - tip.height - 100;
59618                   }
59619               }
59620               tooltip.selectAll('.tooltip-inner')
59621                   .style('top', shiftY + 'px');
59622
59623           } else {
59624               tooltip
59625                   .classed('in', false)
59626                   .call(uiToggle(false));
59627           }
59628
59629           curtain.cut(box, options.duration);
59630
59631           return tooltip;
59632       };
59633
59634
59635       curtain.cut = function(datum, duration) {
59636           darkness.datum(datum)
59637               .interrupt();
59638
59639           var selection$$1;
59640           if (duration === 0) {
59641               selection$$1 = darkness;
59642           } else {
59643               selection$$1 = darkness
59644                   .transition()
59645                   .duration(duration || 600)
59646                   .ease(linear$1);
59647           }
59648
59649           selection$$1
59650               .attr('d', function(d) {
59651                   var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
59652                       window.innerWidth + ',' + window.innerHeight + 'L' +
59653                       window.innerWidth + ',0 Z';
59654
59655                   if (!d) return string;
59656                   return string + 'M' +
59657                       d.left + ',' + d.top + 'L' +
59658                       d.left + ',' + (d.top + d.height) + 'L' +
59659                       (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
59660                       (d.left + d.width) + ',' + (d.top) + 'Z';
59661
59662               });
59663       };
59664
59665
59666       curtain.remove = function() {
59667           surface.remove();
59668           tooltip.remove();
59669           select(window).on('resize.curtain', null);
59670       };
59671
59672
59673       // ClientRects are immutable, so copy them to an object,
59674       // in case we need to trim the height/width.
59675       function copyBox(src) {
59676           return {
59677               top: src.top,
59678               right: src.right,
59679               bottom: src.bottom,
59680               left: src.left,
59681               width: src.width,
59682               height: src.height
59683           };
59684       }
59685
59686
59687       return curtain;
59688   }
59689
59690   function uiIntroWelcome(context, reveal) {
59691       var dispatch$$1 = dispatch('done');
59692       var listener = clickListener();
59693
59694       var chapter = {
59695           title: 'intro.welcome.title'
59696       };
59697
59698
59699       function welcome() {
59700           context.map().centerZoom([-85.63591, 41.94285], 19);
59701           reveal('.intro-nav-wrap .chapter-welcome',
59702               t('intro.welcome.welcome'),
59703               { buttonText: t('intro.ok'), buttonCallback: practice }
59704           );
59705       }
59706
59707       function practice() {
59708           reveal('.intro-nav-wrap .chapter-welcome',
59709               t('intro.welcome.practice'),
59710               { buttonText: t('intro.ok'), buttonCallback: words }
59711           );
59712       }
59713
59714       function words() {
59715           reveal('.intro-nav-wrap .chapter-welcome',
59716               t('intro.welcome.words'),
59717               { buttonText: t('intro.ok'), buttonCallback: mouse$$1 }
59718           );
59719       }
59720
59721
59722       function mouse$$1() {
59723           reveal('.intro-nav-wrap .chapter-welcome',
59724               t('intro.welcome.mouse'),
59725               { buttonText: t('intro.ok'), buttonCallback: leftClick }
59726           );
59727       }
59728
59729
59730       function leftClick() {
59731           var counter = 0;
59732           var times = 5;
59733
59734           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
59735               t('intro.welcome.leftclick', { num: times }),
59736               { tooltipClass: 'intro-mouse' }
59737           );
59738
59739           tooltip.selectAll('.tooltip-inner')
59740               .insert('svg', 'span')
59741               .attr('class', 'tooltip-illustration')
59742               .append('use')
59743               .attr('xlink:href', '#iD-walkthrough-mouse');
59744
59745           tooltip
59746               .append('div')
59747               .attr('class', 'counter');
59748
59749           tooltip.call(listener);
59750
59751           listener.on('click', function(which) {
59752               if (which === 'left') {
59753                   select('.curtain-tooltip.intro-mouse .counter')
59754                       .text(String(++counter));
59755
59756                   if (counter === times) {
59757                       window.setTimeout(function() { continueTo(rightClick); }, 1000);
59758                   }
59759               }
59760           });
59761
59762           function continueTo(nextStep) {
59763               listener.on('click', null);
59764               tooltip.call(listener.off);
59765               tooltip.select('.counter').remove();
59766               nextStep();
59767           }
59768       }
59769
59770
59771       function rightClick() {
59772           var counter = 0;
59773           var times = 5;
59774
59775           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
59776               t('intro.welcome.rightclick', { num: times }),
59777               { tooltipClass: 'intro-mouse' }
59778           );
59779
59780           tooltip.selectAll('.tooltip-inner')
59781               .insert('svg', 'span')
59782               .attr('class', 'tooltip-illustration')
59783               .append('use')
59784               .attr('xlink:href', '#iD-walkthrough-mouse');
59785
59786           tooltip
59787               .append('div')
59788               .attr('class', 'counter');
59789
59790           tooltip.call(listener);
59791
59792           listener.on('click', function(which) {
59793               if (which === 'right') {
59794                   select('.curtain-tooltip.intro-mouse .counter')
59795                       .text(String(++counter));
59796
59797                   if (counter === times) {
59798                       window.setTimeout(function() { continueTo(chapters); }, 1000);
59799                   }
59800               }
59801           });
59802
59803           function continueTo(nextStep) {
59804               listener.on('click', null);
59805               tooltip.call(listener.off);
59806               tooltip.select('.counter').remove();
59807               nextStep();
59808           }
59809       }
59810
59811
59812       function chapters() {
59813           dispatch$$1.call('done');
59814           reveal('.intro-nav-wrap .chapter-navigation',
59815               t('intro.welcome.chapters', { next: t('intro.navigation.title') })
59816           );
59817       }
59818
59819
59820       chapter.enter = function() {
59821           welcome();
59822       };
59823
59824
59825       chapter.exit = function() {
59826           listener.off();
59827           select('.curtain-tooltip.intro-mouse')
59828               .selectAll('.counter')
59829               .remove();
59830       };
59831
59832
59833       chapter.restart = function() {
59834           chapter.exit();
59835           chapter.enter();
59836       };
59837
59838
59839       return utilRebind(chapter, dispatch$$1, 'on');
59840   }
59841
59842
59843
59844   function clickListener() {
59845       var dispatch$$1 = dispatch('click');
59846       var minTime = 120;
59847       var tooltip = select(null);
59848       var down = {};
59849
59850       // `down` keeps track of which buttons/keys are down.
59851       // Setting a property in `down` happens immediately.
59852       // Unsetting a property in `down` is delayed because
59853       //   on Windows a contextmenu event happens after keyup/mouseup
59854
59855       function keydown() {
59856           if (event.keyCode === 93)  {   // context menu
59857               event.preventDefault();
59858               event.stopPropagation();
59859               down.menu = event.timeStamp;
59860               tooltip.classed('rightclick', true);
59861           }
59862       }
59863
59864
59865       function keyup() {
59866           if (event.keyCode === 93)  {   // context menu
59867               event.preventDefault();
59868               event.stopPropagation();
59869               var endTime = event.timeStamp;
59870               var startTime = down.menu || endTime;
59871               var delay = (endTime - startTime < minTime) ? minTime : 0;
59872
59873               window.setTimeout(function() {
59874                   tooltip.classed('rightclick', false);
59875                   down.menu = undefined;  // delayed, for Windows
59876               }, delay);
59877
59878               dispatch$$1.call('click', this, 'right');
59879           }
59880       }
59881
59882
59883       function mousedown() {
59884           var button = event.button;
59885           if (button === 0 && !event.ctrlKey) {
59886               tooltip.classed('leftclick', true);
59887           } else if (button === 2) {
59888               tooltip.classed('rightclick', true);
59889           }
59890           down[button] = event.timeStamp;
59891       }
59892
59893
59894       function mouseup() {
59895           var button = event.button;
59896           var endTime = event.timeStamp;
59897           var startTime = down[button] || endTime;
59898           var delay = (endTime - startTime < minTime) ? minTime : 0;
59899
59900           if (button === 0 && !event.ctrlKey) {
59901               window.setTimeout(function() {
59902                   tooltip.classed('leftclick', false);
59903                   down[button] = undefined;  // delayed, for Windows
59904               }, delay);
59905
59906               dispatch$$1.call('click', this, 'left');
59907
59908           } else if (button === 2) {
59909               window.setTimeout(function() {
59910                   tooltip.classed('rightclick', false);
59911                   down[button] = undefined;  // delayed, for Windows
59912               }, delay);
59913
59914               dispatch$$1.call('click', this, 'right');
59915
59916           } else {
59917               window.setTimeout(function() {
59918                   down[button] = undefined;  // delayed, for Windows
59919               }, delay);
59920           }
59921       }
59922
59923
59924       function contextmenu() {
59925           event.preventDefault();
59926           event.stopPropagation();
59927           if (!down[2] && !down.menu) {
59928               tooltip.classed('rightclick', true);
59929               window.setTimeout(function() {
59930                   tooltip.classed('rightclick', false);
59931               }, minTime);
59932               dispatch$$1.call('click', this, 'right');
59933           }
59934       }
59935
59936
59937       var behavior = function(selection$$1) {
59938           tooltip = selection$$1;
59939           down = {};
59940
59941           select(window)
59942               .on('keydown.intro', keydown)
59943               .on('keyup.intro', keyup)
59944               .on('mousedown.intro', mousedown)
59945               .on('mouseup.intro', mouseup)
59946               .on('contextmenu.intro', contextmenu);
59947       };
59948
59949
59950       behavior.off = function() {
59951           select(window)
59952               .on('keydown.intro', null)
59953               .on('keyup.intro', null)
59954               .on('mousedown.intro', null)
59955               .on('mouseup.intro', null)
59956               .on('contextmenu.intro', null);
59957
59958           tooltip
59959               .classed('leftclick', false)
59960               .classed('rightclick', false);
59961       };
59962
59963       return utilRebind(behavior, dispatch$$1, 'on');
59964   }
59965
59966   function uiIntroNavigation(context, reveal) {
59967       var dispatch$$1 = dispatch('done');
59968       var timeouts = [];
59969       var hallId = 'n2061';
59970       var townHall = [-85.63591, 41.94285];
59971       var springStreetId = 'w397';
59972       var springStreetEndId = 'n1834';
59973       var springStreet = [-85.63582, 41.94255];
59974       var onewayField = context.presets().field('oneway');
59975       var maxspeedField = context.presets().field('maxspeed');
59976
59977
59978       var chapter = {
59979           title: 'intro.navigation.title'
59980       };
59981
59982
59983       function timeout(f, t$$1) {
59984           timeouts.push(window.setTimeout(f, t$$1));
59985       }
59986
59987
59988       function eventCancel() {
59989           event.stopPropagation();
59990           event.preventDefault();
59991       }
59992
59993
59994       function isTownHallSelected() {
59995           var ids = context.selectedIDs();
59996           return ids.length === 1 && ids[0] === hallId;
59997       }
59998
59999
60000       function dragMap() {
60001           context.enter(modeBrowse(context));
60002           context.history().reset('initial');
60003
60004           var msec = transitionTime(townHall, context.map().center());
60005           if (msec) { reveal(null, null, { duration: 0 }); }
60006           context.map().zoom(19).centerEase(townHall, msec);
60007
60008           timeout(function() {
60009               var centerStart = context.map().center();
60010
60011               reveal('#surface', t('intro.navigation.drag'));
60012               context.map().on('drawn.intro', function() {
60013                   reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
60014               });
60015
60016               context.map().on('move.intro', function() {
60017                   var centerNow = context.map().center();
60018                   if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
60019                       context.map().on('move.intro', null);
60020                       timeout(function() { continueTo(zoomMap); }, 3000);
60021                   }
60022               });
60023
60024           }, msec + 100);
60025
60026           function continueTo(nextStep) {
60027               context.map().on('move.intro drawn.intro', null);
60028               nextStep();
60029           }
60030       }
60031
60032
60033       function zoomMap() {
60034           var zoomStart = context.map().zoom();
60035
60036           reveal('#surface',
60037               t('intro.navigation.zoom', {
60038                   plus: icon('#iD-icon-plus', 'pre-text'),
60039                   minus: icon('#iD-icon-minus', 'pre-text')
60040               })
60041           );
60042
60043           context.map().on('drawn.intro', function() {
60044               reveal('#surface',
60045                   t('intro.navigation.zoom', {
60046                       plus: icon('#iD-icon-plus', 'pre-text'),
60047                       minus: icon('#iD-icon-minus', 'pre-text')
60048                   }), { duration: 0 }
60049               );
60050           });
60051
60052           context.map().on('move.intro', function() {
60053               if (context.map().zoom() !== zoomStart) {
60054                   context.map().on('move.intro', null);
60055                   timeout(function() { continueTo(features); }, 3000);
60056               }
60057           });
60058
60059           function continueTo(nextStep) {
60060               context.map().on('move.intro drawn.intro', null);
60061               nextStep();
60062           }
60063       }
60064
60065
60066       function features() {
60067           var onClick = function() { continueTo(pointsLinesAreas); };
60068
60069           reveal('#surface', t('intro.navigation.features'),
60070               { buttonText: t('intro.ok'), buttonCallback: onClick }
60071           );
60072
60073           context.map().on('drawn.intro', function() {
60074               reveal('#surface', t('intro.navigation.features'),
60075                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
60076               );
60077           });
60078
60079           function continueTo(nextStep) {
60080               context.map().on('drawn.intro', null);
60081               nextStep();
60082           }
60083       }
60084
60085       function pointsLinesAreas() {
60086           var onClick = function() { continueTo(nodesWays); };
60087
60088           reveal('#surface', t('intro.navigation.points_lines_areas'),
60089               { buttonText: t('intro.ok'), buttonCallback: onClick }
60090           );
60091
60092           context.map().on('drawn.intro', function() {
60093               reveal('#surface', t('intro.navigation.points_lines_areas'),
60094                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
60095               );
60096           });
60097
60098           function continueTo(nextStep) {
60099               context.map().on('drawn.intro', null);
60100               nextStep();
60101           }
60102       }
60103
60104       function nodesWays() {
60105           var onClick = function() { continueTo(clickTownHall); };
60106
60107           reveal('#surface', t('intro.navigation.nodes_ways'),
60108               { buttonText: t('intro.ok'), buttonCallback: onClick }
60109           );
60110
60111           context.map().on('drawn.intro', function() {
60112               reveal('#surface', t('intro.navigation.nodes_ways'),
60113                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
60114               );
60115           });
60116
60117           function continueTo(nextStep) {
60118               context.map().on('drawn.intro', null);
60119               nextStep();
60120           }
60121       }
60122
60123       function clickTownHall() {
60124           context.enter(modeBrowse(context));
60125           context.history().reset('initial');
60126
60127           reveal(null, null, { duration: 0 });
60128           context.map().zoomEase(19, 500);
60129
60130           timeout(function() {
60131               var entity = context.hasEntity(hallId);
60132               if (!entity) return;
60133               context.map().centerEase(entity.loc, 500);
60134
60135               timeout(function() {
60136                   var entity = context.hasEntity(hallId);
60137                   if (!entity) return;
60138                   var box = pointBox(entity.loc, context);
60139                   reveal(box, t('intro.navigation.click_townhall'));
60140
60141                   context.map().on('move.intro drawn.intro', function() {
60142                       var entity = context.hasEntity(hallId);
60143                       if (!entity) return;
60144                       var box = pointBox(entity.loc, context);
60145                       reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
60146                   });
60147
60148                   context.on('enter.intro', function() {
60149                       if (isTownHallSelected()) continueTo(selectedTownHall);
60150                   });
60151
60152               }, 550);  // after centerEase
60153
60154           }, 550); // after zoomEase
60155
60156           context.history().on('change.intro', function() {
60157               if (!context.hasEntity(hallId)) {
60158                   continueTo(clickTownHall);
60159               }
60160           });
60161
60162           function continueTo(nextStep) {
60163               context.on('enter.intro', null);
60164               context.map().on('move.intro drawn.intro', null);
60165               context.history().on('change.intro', null);
60166               nextStep();
60167           }
60168       }
60169
60170
60171       function selectedTownHall() {
60172           if (!isTownHallSelected()) return clickTownHall();
60173
60174           var entity = context.hasEntity(hallId);
60175           if (!entity) return clickTownHall();
60176
60177           var box = pointBox(entity.loc, context);
60178           var onClick = function() { continueTo(editorTownHall); };
60179
60180           reveal(box, t('intro.navigation.selected_townhall'),
60181               { buttonText: t('intro.ok'), buttonCallback: onClick }
60182           );
60183
60184           context.map().on('move.intro drawn.intro', function() {
60185               var entity = context.hasEntity(hallId);
60186               if (!entity) return;
60187               var box = pointBox(entity.loc, context);
60188               reveal(box, t('intro.navigation.selected_townhall'),
60189                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
60190               );
60191           });
60192
60193           context.history().on('change.intro', function() {
60194               if (!context.hasEntity(hallId)) {
60195                   continueTo(clickTownHall);
60196               }
60197           });
60198
60199           function continueTo(nextStep) {
60200               context.map().on('move.intro drawn.intro', null);
60201               context.history().on('change.intro', null);
60202               nextStep();
60203           }
60204       }
60205
60206
60207       function editorTownHall() {
60208           if (!isTownHallSelected()) return clickTownHall();
60209
60210           // disallow scrolling
60211           select('.inspector-wrap').on('wheel.intro', eventCancel);
60212
60213           var onClick = function() { continueTo(presetTownHall); };
60214
60215           reveal('.entity-editor-pane',
60216               t('intro.navigation.editor_townhall'),
60217               { buttonText: t('intro.ok'), buttonCallback: onClick }
60218           );
60219
60220           context.on('exit.intro', function() {
60221               continueTo(clickTownHall);
60222           });
60223
60224           context.history().on('change.intro', function() {
60225               if (!context.hasEntity(hallId)) {
60226                   continueTo(clickTownHall);
60227               }
60228           });
60229
60230           function continueTo(nextStep) {
60231               context.on('exit.intro', null);
60232               context.history().on('change.intro', null);
60233               select('.inspector-wrap').on('wheel.intro', null);
60234               nextStep();
60235           }
60236       }
60237
60238
60239       function presetTownHall() {
60240           if (!isTownHallSelected()) return clickTownHall();
60241
60242           // reset pane, in case user happened to change it..
60243           select('.inspector-wrap .panewrap').style('right', '0%');
60244           // disallow scrolling
60245           select('.inspector-wrap').on('wheel.intro', eventCancel);
60246
60247           // preset match, in case the user happened to change it.
60248           var entity = context.entity(context.selectedIDs()[0]);
60249           var preset = context.presets().match(entity, context.graph());
60250
60251           var onClick = function() { continueTo(fieldsTownHall); };
60252
60253           context.on('exit.intro', function() {
60254               continueTo(clickTownHall);
60255           });
60256
60257           context.history().on('change.intro', function() {
60258               if (!context.hasEntity(hallId)) {
60259                   continueTo(clickTownHall);
60260               }
60261           });
60262
60263           reveal('.inspector-body .preset-list-item.inspector-inner',
60264               t('intro.navigation.preset_townhall', { preset: preset.name() }),
60265               { buttonText: t('intro.ok'), buttonCallback: onClick }
60266           );
60267
60268           function continueTo(nextStep) {
60269               context.on('exit.intro', null);
60270               context.history().on('change.intro', null);
60271               select('.inspector-wrap').on('wheel.intro', null);
60272               nextStep();
60273           }
60274       }
60275
60276
60277       function fieldsTownHall() {
60278           if (!isTownHallSelected()) return clickTownHall();
60279
60280           // reset pane, in case user happened to change it..
60281           select('.inspector-wrap .panewrap').style('right', '0%');
60282           // disallow scrolling
60283           select('.inspector-wrap').on('wheel.intro', eventCancel);
60284
60285           var onClick = function() { continueTo(closeTownHall); };
60286
60287           reveal('.inspector-body .preset-editor',
60288               t('intro.navigation.fields_townhall'),
60289               { buttonText: t('intro.ok'), buttonCallback: onClick }
60290           );
60291
60292           context.on('exit.intro', function() {
60293               continueTo(clickTownHall);
60294           });
60295
60296           context.history().on('change.intro', function() {
60297               if (!context.hasEntity(hallId)) {
60298                   continueTo(clickTownHall);
60299               }
60300           });
60301
60302           function continueTo(nextStep) {
60303               context.on('exit.intro', null);
60304               context.history().on('change.intro', null);
60305               select('.inspector-wrap').on('wheel.intro', null);
60306               nextStep();
60307           }
60308       }
60309
60310
60311       function closeTownHall() {
60312           if (!isTownHallSelected()) return clickTownHall();
60313
60314           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60315           var href = select(selector$$1).attr('href') || '#iD-icon-close';
60316
60317           reveal('.entity-editor-pane',
60318               t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
60319           );
60320
60321           context.on('exit.intro', function() {
60322               continueTo(searchStreet);
60323           });
60324
60325           context.history().on('change.intro', function() {
60326               // update the close icon in the tooltip if the user edits something.
60327               var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60328               var href = select(selector$$1).attr('href') || '#iD-icon-close';
60329
60330               reveal('.entity-editor-pane',
60331                   t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
60332                   { duration: 0 }
60333               );
60334           });
60335
60336           function continueTo(nextStep) {
60337               context.on('exit.intro', null);
60338               context.history().on('change.intro', null);
60339               nextStep();
60340           }
60341       }
60342
60343
60344       function searchStreet() {
60345           context.enter(modeBrowse(context));
60346           context.history().reset('initial');  // ensure spring street exists
60347
60348           var msec = transitionTime(springStreet, context.map().center());
60349           if (msec) { reveal(null, null, { duration: 0 }); }
60350           context.map().zoom(19).centerEase(springStreet, msec);  // ..and user can see it
60351
60352           timeout(function() {
60353               reveal('.search-header input',
60354                   t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
60355               );
60356
60357               select('.search-header input')
60358                   .on('keyup.intro', checkSearchResult);
60359           }, msec + 100);
60360       }
60361
60362
60363       function checkSearchResult() {
60364           var first = select('.feature-list-item:nth-child(0n+2)');  // skip "No Results" item
60365           var firstName = first.select('.entity-name');
60366           var name = t('intro.graph.name.spring-street');
60367
60368           if (!firstName.empty() && firstName.text() === name) {
60369               reveal(first.node(),
60370                   t('intro.navigation.choose_street', { name: name }),
60371                   { duration: 300 }
60372               );
60373
60374               context.on('exit.intro', function() {
60375                   continueTo(selectedStreet);
60376               });
60377
60378               select('.search-header input')
60379                   .on('keydown.intro', eventCancel, true)
60380                   .on('keyup.intro', null);
60381           }
60382
60383           function continueTo(nextStep) {
60384               context.on('exit.intro', null);
60385               select('.search-header input')
60386                   .on('keydown.intro', null)
60387                   .on('keyup.intro', null);
60388               nextStep();
60389           }
60390       }
60391
60392
60393       function selectedStreet() {
60394           if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
60395               return searchStreet();
60396           }
60397
60398           var onClick = function() { continueTo(editorStreet); };
60399           var entity = context.entity(springStreetEndId);
60400           var box = pointBox(entity.loc, context);
60401           box.height = 500;
60402
60403           reveal(box,
60404               t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
60405               { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
60406           );
60407
60408           timeout(function() {
60409               context.map().on('move.intro drawn.intro', function() {
60410                   var entity = context.hasEntity(springStreetEndId);
60411                   if (!entity) return;
60412                   var box = pointBox(entity.loc, context);
60413                   box.height = 500;
60414                   reveal(box,
60415                       t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
60416                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
60417                   );
60418               });
60419           }, 600);  // after reveal.
60420
60421           context.on('enter.intro', function(mode) {
60422               if (!context.hasEntity(springStreetId)) {
60423                   return continueTo(searchStreet);
60424               }
60425               var ids = context.selectedIDs();
60426               if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
60427                   // keep Spring Street selected..
60428                   context.enter(modeSelect(context, [springStreetId]));
60429               }
60430           });
60431
60432           context.history().on('change.intro', function() {
60433               if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
60434                   timeout(function() {
60435                       continueTo(searchStreet);
60436                   }, 300);  // after any transition (e.g. if user deleted intersection)
60437               }
60438           });
60439
60440           function continueTo(nextStep) {
60441               context.map().on('move.intro drawn.intro', null);
60442               context.on('enter.intro', null);
60443               context.history().on('change.intro', null);
60444               nextStep();
60445           }
60446       }
60447
60448
60449       function editorStreet() {
60450           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60451           var href = select(selector$$1).attr('href') || '#iD-icon-close';
60452
60453           reveal('.entity-editor-pane',
60454               t('intro.navigation.editor_street', {
60455                   button: icon(href, 'pre-text'),
60456                   field1: onewayField.label(),
60457                   field2: maxspeedField.label()
60458               })
60459           );
60460
60461           context.on('exit.intro', function() {
60462               continueTo(play);
60463           });
60464
60465           context.history().on('change.intro', function() {
60466               // update the close icon in the tooltip if the user edits something.
60467               var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60468               var href = select(selector$$1).attr('href') || '#iD-icon-close';
60469
60470               reveal('.entity-editor-pane',
60471                   t('intro.navigation.editor_street', {
60472                       button: icon(href, 'pre-text'),
60473                       field1: onewayField.label().toLowerCase(),
60474                       field2: maxspeedField.label().toLowerCase()
60475                   }), { duration: 0 }
60476               );
60477           });
60478
60479           function continueTo(nextStep) {
60480               context.on('exit.intro', null);
60481               context.history().on('change.intro', null);
60482               nextStep();
60483           }
60484       }
60485
60486
60487       function play() {
60488           dispatch$$1.call('done');
60489           reveal('#id-container',
60490               t('intro.navigation.play', { next: t('intro.points.title') }), {
60491                   tooltipBox: '.intro-nav-wrap .chapter-point',
60492                   buttonText: t('intro.ok'),
60493                   buttonCallback: function() { reveal('#id-container'); }
60494               }
60495           );
60496       }
60497
60498
60499       chapter.enter = function() {
60500           dragMap();
60501       };
60502
60503
60504       chapter.exit = function() {
60505           timeouts.forEach(window.clearTimeout);
60506           context.on('enter.intro exit.intro', null);
60507           context.map().on('move.intro drawn.intro', null);
60508           context.history().on('change.intro', null);
60509           select('.inspector-wrap').on('wheel.intro', null);
60510           select('.search-header input').on('keydown.intro keyup.intro', null);
60511       };
60512
60513
60514       chapter.restart = function() {
60515           chapter.exit();
60516           chapter.enter();
60517       };
60518
60519
60520       return utilRebind(chapter, dispatch$$1, 'on');
60521   }
60522
60523   function uiIntroPoint(context, reveal) {
60524       var dispatch$$1 = dispatch('done');
60525       var timeouts = [];
60526       var intersection = [-85.63279, 41.94394];
60527       var building = [-85.632422, 41.944045];
60528       var cafePreset = context.presets().item('amenity/cafe');
60529       var _pointID = null;
60530
60531
60532       var chapter = {
60533           title: 'intro.points.title'
60534       };
60535
60536
60537       function timeout(f, t$$1) {
60538           timeouts.push(window.setTimeout(f, t$$1));
60539       }
60540
60541
60542       function revealEditMenu(loc, text, options) {
60543           var rect = context.surfaceRect();
60544           var point$$1 = context.curtainProjection(loc);
60545           var pad = 40;
60546           var width = 250 + (2 * pad);
60547           var height = 250;
60548           var startX = rect.left + point$$1[0];
60549           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
60550           var box = {
60551               left: left,
60552               top: point$$1[1] + rect.top - 60,
60553               width: width,
60554               height: height
60555           };
60556           reveal(box, text, options);
60557       }
60558
60559
60560       function eventCancel() {
60561           event.stopPropagation();
60562           event.preventDefault();
60563       }
60564
60565
60566       function addPoint() {
60567           context.enter(modeBrowse(context));
60568           context.history().reset('initial');
60569
60570           var msec = transitionTime(intersection, context.map().center());
60571           if (msec) { reveal(null, null, { duration: 0 }); }
60572           context.map().zoom(19).centerEase(intersection, msec);
60573
60574           timeout(function() {
60575               var tooltip = reveal('button.add-point',
60576                   t('intro.points.add_point', { button: icon('#iD-icon-point', 'pre-text') }));
60577
60578               _pointID = null;
60579
60580               tooltip.selectAll('.tooltip-inner')
60581                   .insert('svg', 'span')
60582                   .attr('class', 'tooltip-illustration')
60583                   .append('use')
60584                   .attr('xlink:href', '#iD-graphic-points');
60585
60586               context.on('enter.intro', function(mode) {
60587                   if (mode.id !== 'add-point') return;
60588                   continueTo(placePoint);
60589               });
60590           }, msec + 100);
60591
60592           function continueTo(nextStep) {
60593               context.on('enter.intro', null);
60594               nextStep();
60595           }
60596       }
60597
60598
60599       function placePoint() {
60600           if (context.mode().id !== 'add-point') {
60601               return chapter.restart();
60602           }
60603
60604           var pointBox$$1 = pad$1(building, 150, context);
60605           reveal(pointBox$$1, t('intro.points.place_point'));
60606
60607           context.map().on('move.intro drawn.intro', function() {
60608               pointBox$$1 = pad$1(building, 150, context);
60609               reveal(pointBox$$1, t('intro.points.place_point'), { duration: 0 });
60610           });
60611
60612           context.on('enter.intro', function(mode) {
60613               if (mode.id !== 'select') return chapter.restart();
60614               _pointID = context.mode().selectedIDs()[0];
60615               continueTo(searchPreset);
60616           });
60617
60618           function continueTo(nextStep) {
60619               context.map().on('move.intro drawn.intro', null);
60620               context.on('enter.intro', null);
60621               nextStep();
60622           }
60623       }
60624
60625
60626       function searchPreset() {
60627           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
60628               return addPoint();
60629           }
60630
60631           // disallow scrolling
60632           select('.inspector-wrap').on('wheel.intro', eventCancel);
60633
60634           select('.preset-search-input')
60635               .on('keydown.intro', null)
60636               .on('keyup.intro', checkPresetSearch);
60637
60638           reveal('.preset-search-input',
60639               t('intro.points.search_cafe', { preset: cafePreset.name() })
60640           );
60641
60642           context.on('enter.intro', function(mode) {
60643               if (!_pointID || !context.hasEntity(_pointID)) {
60644                   return continueTo(addPoint);
60645               }
60646
60647               var ids = context.selectedIDs();
60648               if (mode.id !== 'select' || !ids.length || ids[0] !== _pointID) {
60649                   // keep the user's point selected..
60650                   context.enter(modeSelect(context, [_pointID]));
60651
60652                   // disallow scrolling
60653                   select('.inspector-wrap').on('wheel.intro', eventCancel);
60654
60655                   select('.preset-search-input')
60656                       .on('keydown.intro', null)
60657                       .on('keyup.intro', checkPresetSearch);
60658
60659                   reveal('.preset-search-input',
60660                       t('intro.points.search_cafe', { preset: cafePreset.name() })
60661                   );
60662
60663                   context.history().on('change.intro', null);
60664               }
60665           });
60666
60667
60668           function checkPresetSearch() {
60669               var first = select('.preset-list-item:first-child');
60670
60671               if (first.classed('preset-amenity-cafe')) {
60672                   select('.preset-search-input')
60673                       .on('keydown.intro', eventCancel, true)
60674                       .on('keyup.intro', null);
60675
60676                   reveal(first.select('.preset-list-button').node(),
60677                       t('intro.points.choose_cafe', { preset: cafePreset.name() }),
60678                       { duration: 300 }
60679                   );
60680
60681                   context.history().on('change.intro', function() {
60682                       continueTo(aboutFeatureEditor);
60683                   });
60684               }
60685           }
60686
60687           function continueTo(nextStep) {
60688               context.on('enter.intro', null);
60689               context.history().on('change.intro', null);
60690               select('.inspector-wrap').on('wheel.intro', null);
60691               select('.preset-search-input').on('keydown.intro keyup.intro', null);
60692               nextStep();
60693           }
60694       }
60695
60696
60697       function aboutFeatureEditor() {
60698           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
60699               return addPoint();
60700           }
60701
60702           timeout(function() {
60703               reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
60704                   tooltipClass: 'intro-points-describe',
60705                   buttonText: t('intro.ok'),
60706                   buttonCallback: function() { continueTo(addName); }
60707               });
60708           }, 400);
60709
60710           context.on('exit.intro', function() {
60711               // if user leaves select mode here, just continue with the tutorial.
60712               continueTo(reselectPoint);
60713           });
60714
60715           function continueTo(nextStep) {
60716               context.on('exit.intro', null);
60717               nextStep();
60718           }
60719       }
60720
60721
60722       function addName() {
60723           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
60724               return addPoint();
60725           }
60726
60727           // reset pane, in case user happened to change it..
60728           select('.inspector-wrap .panewrap').style('right', '0%');
60729
60730           timeout(function() {
60731               // It's possible for the user to add a name in a previous step..
60732               // If so, don't tell them to add the name in this step.
60733               // Give them an OK button instead.
60734               var entity = context.entity(_pointID);
60735               if (entity.tags.name) {
60736                   var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
60737                       tooltipClass: 'intro-points-describe',
60738                       buttonText: t('intro.ok'),
60739                       buttonCallback: function() { continueTo(addCloseEditor); }
60740                   });
60741                   tooltip.select('.instruction').style('display', 'none');
60742
60743               } else {
60744                   reveal('.entity-editor-pane', t('intro.points.add_name'),
60745                       { tooltipClass: 'intro-points-describe' }
60746                   );
60747               }
60748           }, 400);
60749
60750           context.history().on('change.intro', function() {
60751               continueTo(addCloseEditor);
60752           });
60753
60754           context.on('exit.intro', function() {
60755               // if user leaves select mode here, just continue with the tutorial.
60756               continueTo(reselectPoint);
60757           });
60758
60759           function continueTo(nextStep) {
60760               context.on('exit.intro', null);
60761               context.history().on('change.intro', null);
60762               nextStep();
60763           }
60764       }
60765
60766
60767       function addCloseEditor() {
60768           // reset pane, in case user happened to change it..
60769           select('.inspector-wrap .panewrap').style('right', '0%');
60770
60771           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60772           var href = select(selector$$1).attr('href') || '#iD-icon-close';
60773
60774           context.on('exit.intro', function() {
60775               continueTo(reselectPoint);
60776           });
60777
60778           reveal('.entity-editor-pane',
60779               t('intro.points.add_close', { button: icon(href, 'pre-text') })
60780           );
60781
60782           function continueTo(nextStep) {
60783               context.on('exit.intro', null);
60784               nextStep();
60785           }
60786       }
60787
60788
60789       function reselectPoint() {
60790           if (!_pointID) return chapter.restart();
60791           var entity = context.hasEntity(_pointID);
60792           if (!entity) return chapter.restart();
60793
60794           // make sure it's still a cafe, in case user somehow changed it..
60795           var oldPreset = context.presets().match(entity, context.graph());
60796           context.replace(actionChangePreset(_pointID, oldPreset, cafePreset));
60797
60798           context.enter(modeBrowse(context));
60799
60800           var msec = transitionTime(entity.loc, context.map().center());
60801           if (msec) { reveal(null, null, { duration: 0 }); }
60802           context.map().centerEase(entity.loc, msec);
60803
60804           timeout(function() {
60805               var box = pointBox(entity.loc, context);
60806               reveal(box, t('intro.points.reselect'), { duration: 600 });
60807
60808               timeout(function() {
60809                   context.map().on('move.intro drawn.intro', function() {
60810                       var entity = context.hasEntity(_pointID);
60811                       if (!entity) return chapter.restart();
60812                       var box = pointBox(entity.loc, context);
60813                       reveal(box, t('intro.points.reselect'), { duration: 0 });
60814                   });
60815               }, 600); // after reveal..
60816
60817               context.on('enter.intro', function(mode) {
60818                   if (mode.id !== 'select') return;
60819                   continueTo(updatePoint);
60820               });
60821
60822           }, msec + 100);
60823
60824           function continueTo(nextStep) {
60825               context.map().on('move.intro drawn.intro', null);
60826               context.on('enter.intro', null);
60827               nextStep();
60828           }
60829       }
60830
60831
60832       function updatePoint() {
60833           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
60834               return continueTo(reselectPoint);
60835           }
60836
60837           // reset pane, in case user happened to untag the point..
60838           select('.inspector-wrap .panewrap').style('right', '0%');
60839
60840           context.on('exit.intro', function() {
60841               continueTo(reselectPoint);
60842           });
60843
60844           context.history().on('change.intro', function() {
60845               continueTo(updateCloseEditor);
60846           });
60847
60848           timeout(function() {
60849               reveal('.entity-editor-pane', t('intro.points.update'),
60850                   { tooltipClass: 'intro-points-describe' }
60851               );
60852           }, 400);
60853
60854           function continueTo(nextStep) {
60855               context.on('exit.intro', null);
60856               context.history().on('change.intro', null);
60857               nextStep();
60858           }
60859       }
60860
60861
60862       function updateCloseEditor() {
60863           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
60864               return continueTo(reselectPoint);
60865           }
60866
60867           // reset pane, in case user happened to change it..
60868           select('.inspector-wrap .panewrap').style('right', '0%');
60869
60870           context.on('exit.intro', function() {
60871               continueTo(rightClickPoint);
60872           });
60873
60874           timeout(function() {
60875               reveal('.entity-editor-pane',
60876                   t('intro.points.update_close', { button: icon('#iD-icon-apply', 'pre-text') })
60877               );
60878           }, 500);
60879
60880           function continueTo(nextStep) {
60881               context.on('exit.intro', null);
60882               nextStep();
60883           }
60884       }
60885
60886
60887       function rightClickPoint() {
60888           if (!_pointID) return chapter.restart();
60889           var entity = context.hasEntity(_pointID);
60890           if (!entity) return chapter.restart();
60891
60892           context.enter(modeBrowse(context));
60893
60894           var box = pointBox(entity.loc, context);
60895           reveal(box, t('intro.points.rightclick'), { duration: 600 });
60896
60897           timeout(function() {
60898               context.map().on('move.intro drawn.intro', function() {
60899                   var entity = context.hasEntity(_pointID);
60900                   if (!entity) return chapter.restart();
60901                   var box = pointBox(entity.loc, context);
60902                   reveal(box, t('intro.points.rightclick'), { duration: 0 });
60903               });
60904           }, 600); // after reveal
60905
60906           context.on('enter.intro', function(mode) {
60907               if (mode.id !== 'select') return;
60908               var ids = context.selectedIDs();
60909               if (ids.length !== 1 || ids[0] !== _pointID) return;
60910
60911               timeout(function() {
60912                   var node = selectMenuItem('delete').node();
60913                   if (!node) return;
60914                   continueTo(enterDelete);
60915               }, 300);  // after menu visible
60916           });
60917
60918           function continueTo(nextStep) {
60919               context.on('enter.intro', null);
60920               context.map().on('move.intro drawn.intro', null);
60921               nextStep();
60922           }
60923       }
60924
60925
60926       function enterDelete() {
60927           if (!_pointID) return chapter.restart();
60928           var entity = context.hasEntity(_pointID);
60929           if (!entity) return chapter.restart();
60930
60931           var node = selectMenuItem('delete').node();
60932           if (!node) { return continueTo(rightClickPoint); }
60933
60934           revealEditMenu(entity.loc,
60935               t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') })
60936           );
60937
60938           timeout(function() {
60939               context.map().on('move.intro drawn.intro', function() {
60940                   revealEditMenu(entity.loc,
60941                       t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') }),
60942                       { duration: 0}
60943                   );
60944               });
60945           }, 300); // after menu visible
60946
60947           context.on('exit.intro', function() {
60948               if (!_pointID) return chapter.restart();
60949               var entity = context.hasEntity(_pointID);
60950               if (entity) return continueTo(rightClickPoint);  // point still exists
60951           });
60952
60953           context.history().on('change.intro', function(changed) {
60954               if (changed.deleted().length) {
60955                   continueTo(undo);
60956               }
60957           });
60958
60959           function continueTo(nextStep) {
60960               context.map().on('move.intro drawn.intro', null);
60961               context.history().on('change.intro', null);
60962               context.on('exit.intro', null);
60963               nextStep();
60964           }
60965       }
60966
60967
60968       function undo() {
60969           context.history().on('change.intro', function() {
60970               continueTo(play);
60971           });
60972
60973           var iconName = '#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
60974           reveal('#bar button.undo-button',
60975               t('intro.points.undo', { button: icon(iconName, 'pre-text') })
60976           );
60977
60978           function continueTo(nextStep) {
60979               context.history().on('change.intro', null);
60980               nextStep();
60981           }
60982       }
60983
60984
60985       function play() {
60986           dispatch$$1.call('done');
60987           reveal('#id-container',
60988               t('intro.points.play', { next: t('intro.areas.title') }), {
60989                   tooltipBox: '.intro-nav-wrap .chapter-area',
60990                   buttonText: t('intro.ok'),
60991                   buttonCallback: function() { reveal('#id-container'); }
60992               }
60993           );
60994       }
60995
60996
60997       chapter.enter = function() {
60998           addPoint();
60999       };
61000
61001
61002       chapter.exit = function() {
61003           timeouts.forEach(window.clearTimeout);
61004           context.on('enter.intro exit.intro', null);
61005           context.map().on('move.intro drawn.intro', null);
61006           context.history().on('change.intro', null);
61007           select('.inspector-wrap').on('wheel.intro', eventCancel);
61008           select('.preset-search-input').on('keydown.intro keyup.intro', null);
61009       };
61010
61011
61012       chapter.restart = function() {
61013           chapter.exit();
61014           chapter.enter();
61015       };
61016
61017
61018       return utilRebind(chapter, dispatch$$1, 'on');
61019   }
61020
61021   function uiIntroArea(context, reveal) {
61022       var dispatch$$1 = dispatch('done');
61023       var playground = [-85.63552, 41.94159];
61024       var playgroundPreset = context.presets().item('leisure/playground');
61025       var descriptionField = context.presets().field('description');
61026       var timeouts = [];
61027       var _areaID;
61028
61029
61030       var chapter = {
61031           title: 'intro.areas.title'
61032       };
61033
61034
61035       function timeout(f, t$$1) {
61036           timeouts.push(window.setTimeout(f, t$$1));
61037       }
61038
61039
61040       function eventCancel() {
61041           event.stopPropagation();
61042           event.preventDefault();
61043       }
61044
61045
61046       function revealPlayground(center, text, options) {
61047           var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
61048           var box = pad$1(center, padding, context);
61049           reveal(box, text, options);
61050       }
61051
61052
61053       function addArea() {
61054           context.enter(modeBrowse(context));
61055           context.history().reset('initial');
61056           _areaID = null;
61057
61058           var msec = transitionTime(playground, context.map().center());
61059           if (msec) { reveal(null, null, { duration: 0 }); }
61060           context.map().zoom(19).centerEase(playground, msec);
61061
61062           timeout(function() {
61063               var tooltip = reveal('button.add-area',
61064                   t('intro.areas.add_playground', { button: icon('#iD-icon-area', 'pre-text') }));
61065
61066               tooltip.selectAll('.tooltip-inner')
61067                   .insert('svg', 'span')
61068                   .attr('class', 'tooltip-illustration')
61069                   .append('use')
61070                   .attr('xlink:href', '#iD-graphic-areas');
61071
61072               context.on('enter.intro', function(mode) {
61073                   if (mode.id !== 'add-area') return;
61074                   continueTo(startPlayground);
61075               });
61076           }, msec + 100);
61077
61078           function continueTo(nextStep) {
61079               context.on('enter.intro', null);
61080               nextStep();
61081           }
61082       }
61083
61084
61085       function startPlayground() {
61086           if (context.mode().id !== 'add-area') {
61087               return chapter.restart();
61088           }
61089
61090           _areaID = null;
61091           context.map().zoomEase(19.5, 500);
61092
61093           timeout(function() {
61094               revealPlayground(playground,
61095                   t('intro.areas.start_playground'), { duration: 250 }
61096               );
61097
61098               timeout(function() {
61099                   context.map().on('move.intro drawn.intro', function() {
61100                       revealPlayground(playground,
61101                           t('intro.areas.start_playground'), { duration: 0 }
61102                       );
61103                   });
61104                   context.on('enter.intro', function(mode) {
61105                       if (mode.id !== 'draw-area') return chapter.restart();
61106                       continueTo(continuePlayground);
61107                   });
61108               }, 250);  // after reveal
61109
61110           }, 550);  // after easing
61111
61112           function continueTo(nextStep) {
61113               context.map().on('move.intro drawn.intro', null);
61114               context.on('enter.intro', null);
61115               nextStep();
61116           }
61117       }
61118
61119
61120       function continuePlayground() {
61121           if (context.mode().id !== 'draw-area') {
61122               return chapter.restart();
61123           }
61124
61125           _areaID = null;
61126           revealPlayground(playground,
61127               t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
61128               { duration: 250 }
61129           );
61130
61131           timeout(function() {
61132               context.map().on('move.intro drawn.intro', function() {
61133                   revealPlayground(playground,
61134                       t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
61135                       { duration: 0 }
61136                   );
61137               });
61138           }, 250);  // after reveal
61139
61140           context.on('enter.intro', function(mode) {
61141               if (mode.id === 'draw-area') {
61142                   var entity = context.hasEntity(context.selectedIDs()[0]);
61143                   if (entity && entity.nodes.length >= 6) {
61144                       return continueTo(finishPlayground);
61145                   } else {
61146                       return;
61147                   }
61148               } else if (mode.id === 'select') {
61149                   _areaID = context.selectedIDs()[0];
61150                   return continueTo(searchPresets);
61151               } else {
61152                   return chapter.restart();
61153               }
61154           });
61155
61156           function continueTo(nextStep) {
61157               context.map().on('move.intro drawn.intro', null);
61158               context.on('enter.intro', null);
61159               nextStep();
61160           }
61161       }
61162
61163
61164       function finishPlayground() {
61165           if (context.mode().id !== 'draw-area') {
61166               return chapter.restart();
61167           }
61168
61169           _areaID = null;
61170           revealPlayground(playground,
61171               t('intro.areas.finish_playground'), { duration: 250 }
61172           );
61173
61174           timeout(function() {
61175               context.map().on('move.intro drawn.intro', function() {
61176                   revealPlayground(playground,
61177                       t('intro.areas.finish_playground'), { duration: 0 }
61178                   );
61179               });
61180           }, 250);  // after reveal
61181
61182           context.on('enter.intro', function(mode) {
61183               if (mode.id === 'draw-area') {
61184                   return;
61185               } else if (mode.id === 'select') {
61186                   _areaID = context.selectedIDs()[0];
61187                   return continueTo(searchPresets);
61188               } else {
61189                   return chapter.restart();
61190               }
61191           });
61192
61193           function continueTo(nextStep) {
61194               context.map().on('move.intro drawn.intro', null);
61195               context.on('enter.intro', null);
61196               nextStep();
61197           }
61198       }
61199
61200
61201       function searchPresets() {
61202           if (!_areaID || !context.hasEntity(_areaID)) {
61203               return addArea();
61204           }
61205           var ids = context.selectedIDs();
61206           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
61207               context.enter(modeSelect(context, [_areaID]));
61208           }
61209
61210           // disallow scrolling
61211           select('.inspector-wrap').on('wheel.intro', eventCancel);
61212
61213           timeout(function() {
61214               // reset pane, in case user somehow happened to change it..
61215               select('.inspector-wrap .panewrap').style('right', '-100%');
61216
61217               select('.preset-search-input')
61218                   .on('keydown.intro', null)
61219                   .on('keyup.intro', checkPresetSearch);
61220
61221               reveal('.preset-search-input',
61222                   t('intro.areas.search_playground', { preset: playgroundPreset.name() })
61223               );
61224           }, 400);  // after preset list pane visible..
61225
61226           context.on('enter.intro', function(mode) {
61227               if (!_areaID || !context.hasEntity(_areaID)) {
61228                   return continueTo(addArea);
61229               }
61230
61231               var ids = context.selectedIDs();
61232               if (mode.id !== 'select' || !ids.length || ids[0] !== _areaID) {
61233                   // keep the user's area selected..
61234                   context.enter(modeSelect(context, [_areaID]));
61235
61236                   // reset pane, in case user somehow happened to change it..
61237                   select('.inspector-wrap .panewrap').style('right', '-100%');
61238                   // disallow scrolling
61239                   select('.inspector-wrap').on('wheel.intro', eventCancel);
61240
61241                   select('.preset-search-input')
61242                       .on('keydown.intro', null)
61243                       .on('keyup.intro', checkPresetSearch);
61244
61245                   reveal('.preset-search-input',
61246                       t('intro.areas.search_playground', { preset: playgroundPreset.name() })
61247                   );
61248
61249                   context.history().on('change.intro', null);
61250               }
61251           });
61252
61253           function checkPresetSearch() {
61254               var first = select('.preset-list-item:first-child');
61255
61256               if (first.classed('preset-leisure-playground')) {
61257                   reveal(first.select('.preset-list-button').node(),
61258                       t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
61259                       { duration: 300 }
61260                   );
61261
61262                   select('.preset-search-input')
61263                       .on('keydown.intro', eventCancel, true)
61264                       .on('keyup.intro', null);
61265
61266                   context.history().on('change.intro', function() {
61267                       continueTo(clickAddField);
61268                   });
61269               }
61270           }
61271
61272           function continueTo(nextStep) {
61273               select('.inspector-wrap').on('wheel.intro', null);
61274               context.on('enter.intro', null);
61275               context.history().on('change.intro', null);
61276               select('.preset-search-input').on('keydown.intro keyup.intro', null);
61277               nextStep();
61278           }
61279       }
61280
61281
61282       function clickAddField() {
61283           if (!_areaID || !context.hasEntity(_areaID)) {
61284               return addArea();
61285           }
61286           var ids = context.selectedIDs();
61287           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
61288               return searchPresets();
61289           }
61290
61291           if (!select('.form-field-description').empty()) {
61292               return continueTo(describePlayground);
61293           }
61294
61295           // disallow scrolling
61296           select('.inspector-wrap').on('wheel.intro', eventCancel);
61297
61298           timeout(function() {
61299               // reset pane, in case user somehow happened to change it..
61300               select('.inspector-wrap .panewrap').style('right', '0%');
61301
61302               // It's possible for the user to add a description in a previous step..
61303               // If they did this already, just continue to next step.
61304               var entity = context.entity(_areaID);
61305               if (entity.tags.description) {
61306                   return continueTo(play);
61307               }
61308
61309               // scroll "Add field" into view
61310               var box = select('.more-fields').node().getBoundingClientRect();
61311               if (box.top > 300) {
61312                   var pane = select('.entity-editor-pane .inspector-body');
61313                   var start = pane.node().scrollTop;
61314                   var end = start + (box.top - 300);
61315
61316                   pane
61317                       .transition()
61318                       .duration(250)
61319                       .tween('scroll.inspector', function() {
61320                           var node = this;
61321                           var i = interpolateNumber(start, end);
61322                           return function(t$$1) {
61323                               node.scrollTop = i(t$$1);
61324                           };
61325                       });
61326               }
61327
61328               timeout(function() {
61329                   reveal('.more-fields .combobox-input',
61330                       t('intro.areas.add_field'),
61331                       { duration: 300 }
61332                   );
61333
61334                   select('.more-fields .combobox-input')
61335                       .on('click.intro', function() {
61336                           continueTo(chooseDescriptionField);
61337                       });
61338               }, 300);  // after "Add Field" visible
61339
61340           }, 400);  // after editor pane visible
61341
61342           context.on('exit.intro', function() {
61343               return continueTo(searchPresets);
61344           });
61345
61346           function continueTo(nextStep) {
61347               select('.inspector-wrap').on('wheel.intro', null);
61348               select('.more-fields .combobox-input').on('click.intro', null);
61349               context.on('exit.intro', null);
61350               nextStep();
61351           }
61352       }
61353
61354
61355       function chooseDescriptionField() {
61356           if (!_areaID || !context.hasEntity(_areaID)) {
61357               return addArea();
61358           }
61359           var ids = context.selectedIDs();
61360           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
61361               return searchPresets();
61362           }
61363
61364           if (!select('.form-field-description').empty()) {
61365               return continueTo(describePlayground);
61366           }
61367
61368           // Make sure combobox is ready..
61369           if (select('div.combobox').empty()) {
61370               return continueTo(clickAddField);
61371           }
61372           // Watch for the combobox to go away..
61373           var watcher;
61374           watcher = window.setInterval(function() {
61375               if (select('div.combobox').empty()) {
61376                   window.clearInterval(watcher);
61377                   timeout(function() {
61378                       if (select('.form-field-description').empty()) {
61379                           continueTo(retryChooseDescription);
61380                       } else {
61381                           continueTo(describePlayground);
61382                       }
61383                   }, 300);  // after description field added.
61384               }
61385           }, 300);
61386
61387           reveal('div.combobox',
61388               t('intro.areas.choose_field', { field: descriptionField.label() }),
61389               { duration: 300 }
61390           );
61391
61392           context.on('exit.intro', function() {
61393               return continueTo(searchPresets);
61394           });
61395
61396           function continueTo(nextStep) {
61397               if (watcher) window.clearInterval(watcher);
61398               context.on('exit.intro', null);
61399               nextStep();
61400           }
61401       }
61402
61403
61404       function describePlayground() {
61405           if (!_areaID || !context.hasEntity(_areaID)) {
61406               return addArea();
61407           }
61408           var ids = context.selectedIDs();
61409           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
61410               return searchPresets();
61411           }
61412
61413           // reset pane, in case user happened to change it..
61414           select('.inspector-wrap .panewrap').style('right', '0%');
61415
61416           if (select('.form-field-description').empty()) {
61417               return continueTo(retryChooseDescription);
61418           }
61419
61420           context.on('exit.intro', function() {
61421               continueTo(play);
61422           });
61423
61424           reveal('.entity-editor-pane',
61425               t('intro.areas.describe_playground', { button: icon('#iD-icon-apply', 'pre-text') }),
61426               { duration: 300 }
61427           );
61428
61429           function continueTo(nextStep) {
61430               context.on('exit.intro', null);
61431               nextStep();
61432           }
61433       }
61434
61435
61436       function retryChooseDescription() {
61437           if (!_areaID || !context.hasEntity(_areaID)) {
61438               return addArea();
61439           }
61440           var ids = context.selectedIDs();
61441           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
61442               return searchPresets();
61443           }
61444
61445           // reset pane, in case user happened to change it..
61446           select('.inspector-wrap .panewrap').style('right', '0%');
61447
61448           reveal('.entity-editor-pane',
61449               t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
61450               buttonText: t('intro.ok'),
61451               buttonCallback: function() { continueTo(clickAddField); }
61452           });
61453
61454           context.on('exit.intro', function() {
61455               return continueTo(searchPresets);
61456           });
61457
61458           function continueTo(nextStep) {
61459               context.on('exit.intro', null);
61460               nextStep();
61461           }
61462       }
61463
61464
61465       function play() {
61466           dispatch$$1.call('done');
61467           reveal('#id-container',
61468               t('intro.areas.play', { next: t('intro.lines.title') }), {
61469                   tooltipBox: '.intro-nav-wrap .chapter-line',
61470                   buttonText: t('intro.ok'),
61471                   buttonCallback: function() { reveal('#id-container'); }
61472               }
61473           );
61474       }
61475
61476
61477       chapter.enter = function() {
61478           addArea();
61479       };
61480
61481
61482       chapter.exit = function() {
61483           timeouts.forEach(window.clearTimeout);
61484           context.on('enter.intro exit.intro', null);
61485           context.map().on('move.intro drawn.intro', null);
61486           context.history().on('change.intro', null);
61487           select('.inspector-wrap').on('wheel.intro', null);
61488           select('.preset-search-input').on('keydown.intro keyup.intro', null);
61489           select('.more-fields .combobox-input').on('click.intro', null);
61490       };
61491
61492
61493       chapter.restart = function() {
61494           chapter.exit();
61495           chapter.enter();
61496       };
61497
61498
61499       return utilRebind(chapter, dispatch$$1, 'on');
61500   }
61501
61502   function uiIntroLine(context, reveal) {
61503       var dispatch$$1 = dispatch('done');
61504       var timeouts = [];
61505       var _tulipRoadID = null;
61506       var flowerRoadID = 'w646';
61507       var tulipRoadStart = [-85.6297754121684, 41.95805253325314];
61508       var tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204];
61509       var tulipRoadIntersection = [-85.62974496187628, 41.95742515554585];
61510       var roadCategory = context.presets().item('category-road');
61511       var residentialPreset = context.presets().item('highway/residential');
61512       var woodRoadID = 'w525';
61513       var woodRoadEndID = 'n2862';
61514       var woodRoadAddNode = [-85.62390110349587, 41.95397111462291];
61515       var woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487];
61516       var woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872];
61517       var washingtonStreetID = 'w522';
61518       var twelfthAvenueID = 'w1';
61519       var eleventhAvenueEndID = 'n3550';
61520       var twelfthAvenueEndID = 'n5';
61521       var _washingtonSegmentID = null;
61522       var eleventhAvenueEnd = context.entity(eleventhAvenueEndID).loc;
61523       var twelfthAvenueEnd = context.entity(twelfthAvenueEndID).loc;
61524       var deleteLinesLoc = [-85.6219395542764, 41.95228033922477];
61525       var twelfthAvenue = [-85.62219310052491, 41.952505413152956];
61526
61527
61528       var chapter = {
61529           title: 'intro.lines.title'
61530       };
61531
61532
61533       function timeout(f, t$$1) {
61534           timeouts.push(window.setTimeout(f, t$$1));
61535       }
61536
61537
61538       function eventCancel() {
61539           event.stopPropagation();
61540           event.preventDefault();
61541       }
61542
61543
61544       function revealEditMenu(loc, text, options) {
61545           var rect = context.surfaceRect();
61546           var point$$1 = context.curtainProjection(loc);
61547           var pad = 40;
61548           var width = 250 + (2 * pad);
61549           var height = 350;
61550           var startX = rect.left + point$$1[0];
61551           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
61552           var box = {
61553               left: left,
61554               top: point$$1[1] + rect.top - 60,
61555               width: width,
61556               height: height
61557           };
61558           reveal(box, text, options);
61559       }
61560
61561
61562       function addLine() {
61563           context.enter(modeBrowse(context));
61564           context.history().reset('initial');
61565
61566           var msec = transitionTime(tulipRoadStart, context.map().center());
61567           if (msec) { reveal(null, null, { duration: 0 }); }
61568           context.map().zoom(18.5).centerEase(tulipRoadStart, msec);
61569
61570           timeout(function() {
61571               var tooltip = reveal('button.add-line',
61572                   t('intro.lines.add_line', { button: icon('#iD-icon-line', 'pre-text') }));
61573
61574               tooltip.selectAll('.tooltip-inner')
61575                   .insert('svg', 'span')
61576                   .attr('class', 'tooltip-illustration')
61577                   .append('use')
61578                   .attr('xlink:href', '#iD-graphic-lines');
61579
61580               context.on('enter.intro', function(mode) {
61581                   if (mode.id !== 'add-line') return;
61582                   continueTo(startLine);
61583               });
61584           }, msec + 100);
61585
61586           function continueTo(nextStep) {
61587               context.on('enter.intro', null);
61588               nextStep();
61589           }
61590       }
61591
61592
61593       function startLine() {
61594           if (context.mode().id !== 'add-line') return chapter.restart();
61595
61596           _tulipRoadID = null;
61597
61598           var padding = 70 * Math.pow(2, context.map().zoom() - 18);
61599           var box = pad$1(tulipRoadStart, padding, context);
61600           box.height = box.height + 100;
61601           reveal(box, t('intro.lines.start_line'));
61602
61603           context.map().on('move.intro drawn.intro', function() {
61604               padding = 70 * Math.pow(2, context.map().zoom() - 18);
61605               box = pad$1(tulipRoadStart, padding, context);
61606               box.height = box.height + 100;
61607               reveal(box, t('intro.lines.start_line'), { duration: 0 });
61608           });
61609
61610           context.on('enter.intro', function(mode) {
61611               if (mode.id !== 'draw-line') return chapter.restart();
61612               continueTo(drawLine);
61613           });
61614
61615           function continueTo(nextStep) {
61616               context.map().on('move.intro drawn.intro', null);
61617               context.on('enter.intro', null);
61618               nextStep();
61619           }
61620       }
61621
61622
61623       function drawLine() {
61624           if (context.mode().id !== 'draw-line') return chapter.restart();
61625
61626           _tulipRoadID = context.mode().selectedIDs()[0];
61627           context.map().centerEase(tulipRoadMidpoint, 500);
61628
61629           timeout(function() {
61630               var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
61631               var box = pad$1(tulipRoadMidpoint, padding, context);
61632               box.height = box.height * 2;
61633               reveal(box,
61634                   t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
61635               );
61636
61637               context.map().on('move.intro drawn.intro', function() {
61638                   padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
61639                   box = pad$1(tulipRoadMidpoint, padding, context);
61640                   box.height = box.height * 2;
61641                   reveal(box,
61642                       t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
61643                       { duration: 0 }
61644                   );
61645               });
61646           }, 550);  // after easing..
61647
61648           context.history().on('change.intro', function() {
61649               if (isLineConnected()) {
61650                   continueTo(continueLine);
61651               }
61652           });
61653
61654           context.on('enter.intro', function(mode) {
61655               if (mode.id === 'draw-line') {
61656                   return;
61657               } else if (mode.id === 'select') {
61658                   continueTo(retryIntersect);
61659                   return;
61660               } else {
61661                   return chapter.restart();
61662               }
61663           });
61664
61665           function continueTo(nextStep) {
61666               context.map().on('move.intro drawn.intro', null);
61667               context.history().on('change.intro', null);
61668               context.on('enter.intro', null);
61669               nextStep();
61670           }
61671       }
61672
61673
61674       function isLineConnected() {
61675           var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
61676           if (!entity) return false;
61677
61678           var drawNodes = context.graph().childNodes(entity);
61679           return some(drawNodes, function(node) {
61680               return some(context.graph().parentWays(node), function(parent) {
61681                   return parent.id === flowerRoadID;
61682               });
61683           });
61684       }
61685
61686
61687       function retryIntersect() {
61688           select(window).on('mousedown.intro', eventCancel, true);
61689
61690           var box = pad$1(tulipRoadIntersection, 80, context);
61691           reveal(box,
61692               t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
61693           );
61694
61695           timeout(chapter.restart, 3000);
61696       }
61697
61698
61699       function continueLine() {
61700           if (context.mode().id !== 'draw-line') return chapter.restart();
61701           var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
61702           if (!entity) return chapter.restart();
61703
61704           context.map().centerEase(tulipRoadIntersection, 500);
61705
61706           reveal('#surface', t('intro.lines.continue_line'));
61707
61708           context.on('enter.intro', function(mode) {
61709               if (mode.id === 'draw-line')
61710                   return;
61711               else if (mode.id === 'select')
61712                   return continueTo(chooseCategoryRoad);
61713               else
61714                   return chapter.restart();
61715           });
61716
61717           function continueTo(nextStep) {
61718               context.on('enter.intro', null);
61719               nextStep();
61720           }
61721       }
61722
61723
61724       function chooseCategoryRoad() {
61725           if (context.mode().id !== 'select') return chapter.restart();
61726
61727           context.on('exit.intro', function() {
61728               return chapter.restart();
61729           });
61730
61731           var button = select('.preset-category-road .preset-list-button');
61732           if (button.empty()) return chapter.restart();
61733
61734           // disallow scrolling
61735           select('.inspector-wrap').on('wheel.intro', eventCancel);
61736
61737           timeout(function() {
61738               // reset pane, in case user somehow happened to change it..
61739               select('.inspector-wrap .panewrap').style('right', '-100%');
61740
61741               reveal(button.node(),
61742                   t('intro.lines.choose_category_road', { category: roadCategory.name() })
61743               );
61744
61745               button.on('click.intro', function() {
61746                   continueTo(choosePresetResidential);
61747               });
61748
61749           }, 400);  // after editor pane visible
61750
61751           function continueTo(nextStep) {
61752               select('.inspector-wrap').on('wheel.intro', null);
61753               select('.preset-list-button').on('click.intro', null);
61754               context.on('exit.intro', null);
61755               nextStep();
61756           }
61757       }
61758
61759
61760       function choosePresetResidential() {
61761           if (context.mode().id !== 'select') return chapter.restart();
61762
61763           context.on('exit.intro', function() {
61764               return chapter.restart();
61765           });
61766
61767           var subgrid = select('.preset-category-road .subgrid');
61768           if (subgrid.empty()) return chapter.restart();
61769
61770           subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
61771               .on('click.intro', function() {
61772                   continueTo(retryPresetResidential);
61773               });
61774
61775           subgrid.selectAll('.preset-highway-residential .preset-list-button')
61776               .on('click.intro', function() {
61777                   continueTo(nameRoad);
61778               });
61779
61780           timeout(function() {
61781               reveal(subgrid.node(),
61782                   t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
61783                   { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
61784               );
61785           }, 300);
61786
61787           function continueTo(nextStep) {
61788               select('.preset-list-button').on('click.intro', null);
61789               context.on('exit.intro', null);
61790               nextStep();
61791           }
61792       }
61793
61794
61795       // selected wrong road type
61796       function retryPresetResidential() {
61797           if (context.mode().id !== 'select') return chapter.restart();
61798
61799           context.on('exit.intro', function() {
61800               return chapter.restart();
61801           });
61802
61803           // disallow scrolling
61804           select('.inspector-wrap').on('wheel.intro', eventCancel);
61805
61806           timeout(function() {
61807               var button = select('.entity-editor-pane .preset-list-button');
61808
61809               reveal(button.node(),
61810                   t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
61811               );
61812
61813               button.on('click.intro', function() {
61814                   continueTo(chooseCategoryRoad);
61815               });
61816
61817           }, 500);
61818
61819           function continueTo(nextStep) {
61820               select('.inspector-wrap').on('wheel.intro', null);
61821               select('.preset-list-button').on('click.intro', null);
61822               context.on('exit.intro', null);
61823               nextStep();
61824           }
61825       }
61826
61827
61828       function nameRoad() {
61829           context.on('exit.intro', function() {
61830               continueTo(didNameRoad);
61831           });
61832
61833           timeout(function() {
61834               reveal('.entity-editor-pane',
61835                   t('intro.lines.name_road', { button: icon('#iD-icon-apply', 'pre-text') }),
61836                   { tooltipClass: 'intro-lines-name_road' }
61837               );
61838           }, 500);
61839
61840           function continueTo(nextStep) {
61841               context.on('exit.intro', null);
61842               nextStep();
61843           }
61844       }
61845
61846
61847       function didNameRoad() {
61848           context.history().checkpoint('doneAddLine');
61849
61850           timeout(function() {
61851               reveal('#surface', t('intro.lines.did_name_road'), {
61852                   buttonText: t('intro.ok'),
61853                   buttonCallback: function() { continueTo(updateLine); }
61854               });
61855           }, 500);
61856
61857           function continueTo(nextStep) {
61858               nextStep();
61859           }
61860       }
61861
61862
61863       function updateLine() {
61864           context.history().reset('doneAddLine');
61865           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
61866               return chapter.restart();
61867           }
61868
61869           var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
61870           if (msec) { reveal(null, null, { duration: 0 }); }
61871           context.map().zoom(19).centerEase(woodRoadDragMidpoint, msec);
61872
61873           timeout(function() {
61874               var padding = 250 * Math.pow(2, context.map().zoom() - 19);
61875               var box = pad$1(woodRoadDragMidpoint, padding, context);
61876               var advance = function() { continueTo(addNode); };
61877
61878               reveal(box, t('intro.lines.update_line'),
61879                   { buttonText: t('intro.ok'), buttonCallback: advance }
61880               );
61881
61882               context.map().on('move.intro drawn.intro', function() {
61883                   var padding = 250 * Math.pow(2, context.map().zoom() - 19);
61884                   var box = pad$1(woodRoadDragMidpoint, padding, context);
61885                   reveal(box, t('intro.lines.update_line'),
61886                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
61887                   );
61888               });
61889           }, msec + 100);
61890
61891           function continueTo(nextStep) {
61892               context.map().on('move.intro drawn.intro', null);
61893               nextStep();
61894           }
61895       }
61896
61897
61898       function addNode() {
61899           context.history().reset('doneAddLine');
61900           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
61901               return chapter.restart();
61902           }
61903
61904           var padding = 40 * Math.pow(2, context.map().zoom() - 19);
61905           var box = pad$1(woodRoadAddNode, padding, context);
61906           reveal(box, t('intro.lines.add_node'));
61907
61908           context.map().on('move.intro drawn.intro', function() {
61909               var padding = 40 * Math.pow(2, context.map().zoom() - 19);
61910               var box = pad$1(woodRoadAddNode, padding, context);
61911               reveal(box, t('intro.lines.add_node'), { duration: 0 });
61912           });
61913
61914           context.history().on('change.intro', function(changed) {
61915               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
61916                   return continueTo(updateLine);
61917               }
61918               if (changed.created().length === 1) {
61919                   timeout(function() { continueTo(startDragEndpoint); }, 500);
61920               }
61921           });
61922
61923           context.on('enter.intro', function(mode) {
61924               if (mode.id !== 'select') {
61925                   continueTo(updateLine);
61926               }
61927           });
61928
61929           function continueTo(nextStep) {
61930               context.map().on('move.intro drawn.intro', null);
61931               context.history().on('change.intro', null);
61932               context.on('enter.intro', null);
61933               nextStep();
61934           }
61935       }
61936
61937
61938       function startDragEndpoint() {
61939           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
61940               return continueTo(updateLine);
61941           }
61942           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61943           var box = pad$1(woodRoadDragEndpoint, padding, context);
61944           reveal(box, t('intro.lines.start_drag_endpoint'));
61945
61946           context.map().on('move.intro drawn.intro', function() {
61947               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
61948                   return continueTo(updateLine);
61949               }
61950               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61951               var box = pad$1(woodRoadDragEndpoint, padding, context);
61952               reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
61953
61954               var entity = context.entity(woodRoadEndID);
61955               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
61956                   continueTo(finishDragEndpoint);
61957               }
61958           });
61959
61960           function continueTo(nextStep) {
61961               context.map().on('move.intro drawn.intro', null);
61962               nextStep();
61963           }
61964       }
61965
61966
61967       function finishDragEndpoint() {
61968           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
61969               return continueTo(updateLine);
61970           }
61971
61972           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61973           var box = pad$1(woodRoadDragEndpoint, padding, context);
61974           reveal(box, t('intro.lines.finish_drag_endpoint'));
61975
61976           context.map().on('move.intro drawn.intro', function() {
61977               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
61978                   return continueTo(updateLine);
61979               }
61980               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61981               var box = pad$1(woodRoadDragEndpoint, padding, context);
61982               reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
61983
61984               var entity = context.entity(woodRoadEndID);
61985               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
61986                   continueTo(startDragEndpoint);
61987               }
61988           });
61989
61990           context.on('enter.intro', function() {
61991               continueTo(startDragMidpoint);
61992           });
61993
61994           function continueTo(nextStep) {
61995               context.map().on('move.intro drawn.intro', null);
61996               context.on('enter.intro', null);
61997               nextStep();
61998           }
61999       }
62000
62001
62002       function startDragMidpoint() {
62003           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
62004               return continueTo(updateLine);
62005           }
62006           if (context.selectedIDs().indexOf(woodRoadID) === -1) {
62007               context.enter(modeSelect(context, [woodRoadID]));
62008           }
62009
62010           var padding = 80 * Math.pow(2, context.map().zoom() - 19);
62011           var box = pad$1(woodRoadDragMidpoint, padding, context);
62012           reveal(box, t('intro.lines.start_drag_midpoint'));
62013
62014           context.map().on('move.intro drawn.intro', function() {
62015               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
62016                   return continueTo(updateLine);
62017               }
62018               var padding = 80 * Math.pow(2, context.map().zoom() - 19);
62019               var box = pad$1(woodRoadDragMidpoint, padding, context);
62020               reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
62021           });
62022
62023           context.history().on('change.intro', function(changed) {
62024               if (changed.created().length === 1) {
62025                   continueTo(continueDragMidpoint);
62026               }
62027           });
62028
62029           context.on('enter.intro', function(mode) {
62030               if (mode.id !== 'select') {
62031                   // keep Wood Road selected so midpoint triangles are drawn..
62032                   context.enter(modeSelect(context, [woodRoadID]));
62033               }
62034           });
62035
62036           function continueTo(nextStep) {
62037               context.map().on('move.intro drawn.intro', null);
62038               context.history().on('change.intro', null);
62039               context.on('enter.intro', null);
62040               nextStep();
62041           }
62042       }
62043
62044
62045       function continueDragMidpoint() {
62046           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
62047               return continueTo(updateLine);
62048           }
62049
62050           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
62051           var box = pad$1(woodRoadDragEndpoint, padding, context);
62052           box.height += 400;
62053
62054           var advance = function() {
62055               context.history().checkpoint('doneUpdateLine');
62056               continueTo(deleteLines);
62057           };
62058
62059           reveal(box, t('intro.lines.continue_drag_midpoint'),
62060               { buttonText: t('intro.ok'), buttonCallback: advance }
62061           );
62062
62063           context.map().on('move.intro drawn.intro', function() {
62064               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
62065                   return continueTo(updateLine);
62066               }
62067               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
62068               var box = pad$1(woodRoadDragEndpoint, padding, context);
62069               box.height += 400;
62070               reveal(box, t('intro.lines.continue_drag_midpoint'),
62071                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
62072               );
62073           });
62074
62075           function continueTo(nextStep) {
62076               context.map().on('move.intro drawn.intro', null);
62077               nextStep();
62078           }
62079       }
62080
62081
62082       function deleteLines() {
62083           context.history().reset('doneUpdateLine');
62084           context.enter(modeBrowse(context));
62085
62086           if (!context.hasEntity(washingtonStreetID) ||
62087               !context.hasEntity(twelfthAvenueID) ||
62088               !context.hasEntity(eleventhAvenueEndID)) {
62089               return chapter.restart();
62090           }
62091
62092           var msec = transitionTime(deleteLinesLoc, context.map().center());
62093           if (msec) { reveal(null, null, { duration: 0 }); }
62094           context.map().zoom(18).centerEase(deleteLinesLoc, msec);
62095
62096           timeout(function() {
62097               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62098               var box = pad$1(deleteLinesLoc, padding, context);
62099               box.top -= 200;
62100               box.height += 400;
62101               var advance = function() { continueTo(rightClickIntersection); };
62102
62103               reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
62104                   { buttonText: t('intro.ok'), buttonCallback: advance }
62105               );
62106
62107               context.map().on('move.intro drawn.intro', function() {
62108                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62109                   var box = pad$1(deleteLinesLoc, padding, context);
62110                   box.top -= 200;
62111                   box.height += 400;
62112                   reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
62113                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
62114                   );
62115               });
62116
62117               context.history().on('change.intro', function() {
62118                   timeout(function() {
62119                       continueTo(deleteLines);
62120                   }, 500);  // after any transition (e.g. if user deleted intersection)
62121               });
62122
62123           }, msec + 100);
62124
62125           function continueTo(nextStep) {
62126               context.map().on('move.intro drawn.intro', null);
62127               context.history().on('change.intro', null);
62128               nextStep();
62129           }
62130       }
62131
62132
62133       function rightClickIntersection() {
62134           context.history().reset('doneUpdateLine');
62135           context.enter(modeBrowse(context));
62136
62137           context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
62138
62139           timeout(function() {
62140               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
62141               var box = pad$1(eleventhAvenueEnd, padding, context);
62142               reveal(box, t('intro.lines.rightclick_intersection',
62143                   { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
62144               );
62145
62146               context.map().on('move.intro drawn.intro', function() {
62147                   var padding = 60 * Math.pow(2, context.map().zoom() - 18);
62148                   var box = pad$1(eleventhAvenueEnd, padding, context);
62149                   reveal(box, t('intro.lines.rightclick_intersection',
62150                       { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
62151                       { duration: 0 }
62152                   );
62153               });
62154
62155               context.on('enter.intro', function(mode) {
62156                   if (mode.id !== 'select') return;
62157                   var ids = context.selectedIDs();
62158                   if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID) return;
62159
62160                   timeout(function() {
62161                       var node = selectMenuItem('split').node();
62162                       if (!node) return;
62163                       continueTo(splitIntersection);
62164                   }, 300);  // after menu visible
62165               });
62166
62167               context.history().on('change.intro', function() {
62168                   timeout(function() {
62169                       continueTo(deleteLines);
62170                   }, 300);  // after any transition (e.g. if user deleted intersection)
62171               });
62172
62173           }, 600);
62174
62175           function continueTo(nextStep) {
62176               context.map().on('move.intro drawn.intro', null);
62177               context.on('enter.intro', null);
62178               context.history().on('change.intro', null);
62179               nextStep();
62180           }
62181       }
62182
62183
62184       function splitIntersection() {
62185           if (!context.hasEntity(washingtonStreetID) ||
62186               !context.hasEntity(twelfthAvenueID) ||
62187               !context.hasEntity(eleventhAvenueEndID)) {
62188               return continueTo(deleteLines);
62189           }
62190
62191           var node = selectMenuItem('split').node();
62192           if (!node) { return continueTo(rightClickIntersection); }
62193
62194           var wasChanged = false;
62195           var menuCoords = context.map().mouseCoordinates();
62196           _washingtonSegmentID = null;
62197
62198           revealEditMenu(menuCoords, t('intro.lines.split_intersection',
62199               { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
62200           );
62201
62202           context.map().on('move.intro drawn.intro', function() {
62203               var node = selectMenuItem('split').node();
62204               if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
62205
62206               revealEditMenu(menuCoords, t('intro.lines.split_intersection',
62207                   { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
62208                   { duration: 0 }
62209               );
62210           });
62211
62212           context.history().on('change.intro', function(changed) {
62213               wasChanged = true;
62214               timeout(function() {
62215                   if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
62216                       _washingtonSegmentID = changed.created()[0].id;
62217                       continueTo(didSplit);
62218                   } else {
62219                       _washingtonSegmentID = null;
62220                       continueTo(retrySplit);
62221                   }
62222               }, 300);  // after any transition (e.g. if user deleted intersection)
62223           });
62224
62225           function continueTo(nextStep) {
62226               context.map().on('move.intro drawn.intro', null);
62227               context.history().on('change.intro', null);
62228               nextStep();
62229           }
62230       }
62231
62232
62233       function retrySplit() {
62234           context.enter(modeBrowse(context));
62235           context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
62236           var advance = function() { continueTo(rightClickIntersection); };
62237
62238           var padding = 60 * Math.pow(2, context.map().zoom() - 18);
62239           var box = pad$1(eleventhAvenueEnd, padding, context);
62240           reveal(box, t('intro.lines.retry_split'),
62241               { buttonText: t('intro.ok'), buttonCallback: advance }
62242           );
62243
62244           context.map().on('move.intro drawn.intro', function() {
62245               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
62246               var box = pad$1(eleventhAvenueEnd, padding, context);
62247               reveal(box, t('intro.lines.retry_split'),
62248                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
62249               );
62250           });
62251
62252           function continueTo(nextStep) {
62253               context.map().on('move.intro drawn.intro', null);
62254               nextStep();
62255           }
62256       }
62257
62258
62259       function didSplit() {
62260           if (!_washingtonSegmentID ||
62261               !context.hasEntity(_washingtonSegmentID) ||
62262               !context.hasEntity(washingtonStreetID) ||
62263               !context.hasEntity(twelfthAvenueID) ||
62264               !context.hasEntity(eleventhAvenueEndID)) {
62265               return continueTo(rightClickIntersection);
62266           }
62267
62268           var ids = context.selectedIDs();
62269           var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
62270           var street = t('intro.graph.name.washington-street');
62271
62272           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62273           var box = pad$1(twelfthAvenue, padding, context);
62274           box.width = box.width / 2;
62275           reveal(box, t(string, { street1: street, street2: street }),
62276               { duration: 500 }
62277           );
62278
62279           timeout(function() {
62280               context.map().zoom(18).centerEase(twelfthAvenue, 500);
62281
62282               context.map().on('move.intro drawn.intro', function() {
62283                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62284                   var box = pad$1(twelfthAvenue, padding, context);
62285                   box.width = box.width / 2;
62286                   reveal(box, t(string, { street1: street, street2: street }),
62287                       { duration: 0 }
62288                   );
62289               });
62290           }, 600);  // after initial reveal and curtain cut
62291
62292           context.on('enter.intro', function() {
62293               var ids = context.selectedIDs();
62294               if (ids.length === 1 && ids[0] === _washingtonSegmentID) {
62295                   continueTo(multiSelect);
62296               }
62297           });
62298
62299           context.history().on('change.intro', function() {
62300               if (!_washingtonSegmentID ||
62301                   !context.hasEntity(_washingtonSegmentID) ||
62302                   !context.hasEntity(washingtonStreetID) ||
62303                   !context.hasEntity(twelfthAvenueID) ||
62304                   !context.hasEntity(eleventhAvenueEndID)) {
62305                   return continueTo(rightClickIntersection);
62306               }
62307           });
62308
62309           function continueTo(nextStep) {
62310               context.map().on('move.intro drawn.intro', null);
62311               context.on('enter.intro', null);
62312               context.history().on('change.intro', null);
62313               nextStep();
62314           }
62315       }
62316
62317
62318       function multiSelect() {
62319           if (!_washingtonSegmentID ||
62320               !context.hasEntity(_washingtonSegmentID) ||
62321               !context.hasEntity(washingtonStreetID) ||
62322               !context.hasEntity(twelfthAvenueID) ||
62323               !context.hasEntity(eleventhAvenueEndID)) {
62324               return continueTo(rightClickIntersection);
62325           }
62326
62327           var ids = context.selectedIDs();
62328           var hasWashington = ids.indexOf(_washingtonSegmentID) !== -1;
62329           var hasTwelfth = ids.indexOf(twelfthAvenueID) !== -1;
62330
62331           if (hasWashington && hasTwelfth) {
62332               return continueTo(multiRightClick);
62333           } else if (!hasWashington && !hasTwelfth) {
62334               return continueTo(didSplit);
62335           }
62336
62337           context.map().zoom(18).centerEase(twelfthAvenue, 500);
62338
62339           timeout(function() {
62340               var selected, other, padding, box;
62341               if (hasWashington) {
62342                   selected = t('intro.graph.name.washington-street');
62343                   other = t('intro.graph.name.12th-avenue');
62344                   padding = 60 * Math.pow(2, context.map().zoom() - 18);
62345                   box = pad$1(twelfthAvenueEnd, padding, context);
62346                   box.width *= 3;
62347               } else {
62348                   selected = t('intro.graph.name.12th-avenue');
62349                   other = t('intro.graph.name.washington-street');
62350                   padding = 200 * Math.pow(2, context.map().zoom() - 18);
62351                   box = pad$1(twelfthAvenue, padding, context);
62352                   box.width /= 2;
62353               }
62354
62355               reveal(box,
62356                   t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
62357               );
62358
62359               context.map().on('move.intro drawn.intro', function() {
62360                   if (hasWashington) {
62361                       selected = t('intro.graph.name.washington-street');
62362                       other = t('intro.graph.name.12th-avenue');
62363                       padding = 60 * Math.pow(2, context.map().zoom() - 18);
62364                       box = pad$1(twelfthAvenueEnd, padding, context);
62365                       box.width *= 3;
62366                   } else {
62367                       selected = t('intro.graph.name.12th-avenue');
62368                       other = t('intro.graph.name.washington-street');
62369                       padding = 200 * Math.pow(2, context.map().zoom() - 18);
62370                       box = pad$1(twelfthAvenue, padding, context);
62371                       box.width /= 2;
62372                   }
62373
62374                   reveal(box,
62375                       t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
62376                       { duration: 0 }
62377                   );
62378               });
62379
62380               context.on('enter.intro', function() {
62381                   continueTo(multiSelect);
62382               });
62383
62384               context.history().on('change.intro', function() {
62385                   if (!_washingtonSegmentID ||
62386                       !context.hasEntity(_washingtonSegmentID) ||
62387                       !context.hasEntity(washingtonStreetID) ||
62388                       !context.hasEntity(twelfthAvenueID) ||
62389                       !context.hasEntity(eleventhAvenueEndID)) {
62390                       return continueTo(rightClickIntersection);
62391                   }
62392               });
62393           }, 600);
62394
62395           function continueTo(nextStep) {
62396               context.map().on('move.intro drawn.intro', null);
62397               context.on('enter.intro', null);
62398               context.history().on('change.intro', null);
62399               nextStep();
62400           }
62401       }
62402
62403
62404       function multiRightClick() {
62405           if (!_washingtonSegmentID ||
62406               !context.hasEntity(_washingtonSegmentID) ||
62407               !context.hasEntity(washingtonStreetID) ||
62408               !context.hasEntity(twelfthAvenueID) ||
62409               !context.hasEntity(eleventhAvenueEndID)) {
62410               return continueTo(rightClickIntersection);
62411           }
62412
62413           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62414           var box = pad$1(twelfthAvenue, padding, context);
62415           reveal(box, t('intro.lines.multi_rightclick'));
62416
62417           context.map().on('move.intro drawn.intro', function() {
62418               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62419               var box = pad$1(twelfthAvenue, padding, context);
62420               reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
62421           });
62422
62423           select(window).on('click.intro contextmenu.intro', function() {
62424               timeout(function() {
62425                   var ids = context.selectedIDs();
62426                   if (ids.length === 2 &&
62427                       ids.indexOf(twelfthAvenueID) !== -1 &&
62428                       ids.indexOf(_washingtonSegmentID) !== -1) {
62429                           var node = selectMenuItem('delete').node();
62430                           if (!node) return;
62431                           continueTo(multiDelete);
62432                   } else if (ids.length === 1 &&
62433                       ids.indexOf(_washingtonSegmentID) !== -1) {
62434                       return continueTo(multiSelect);
62435                   } else {
62436                       return continueTo(didSplit);
62437                   }
62438               }, 300);  // after edit menu visible
62439           }, true);
62440
62441           context.history().on('change.intro', function() {
62442               if (!_washingtonSegmentID ||
62443                   !context.hasEntity(_washingtonSegmentID) ||
62444                   !context.hasEntity(washingtonStreetID) ||
62445                   !context.hasEntity(twelfthAvenueID) ||
62446                   !context.hasEntity(eleventhAvenueEndID)) {
62447                   return continueTo(rightClickIntersection);
62448               }
62449           });
62450
62451           function continueTo(nextStep) {
62452               context.map().on('move.intro drawn.intro', null);
62453               select(window).on('click.intro contextmenu.intro', null, true);
62454               context.history().on('change.intro', null);
62455               nextStep();
62456           }
62457       }
62458
62459
62460       function multiDelete() {
62461           if (!_washingtonSegmentID ||
62462               !context.hasEntity(_washingtonSegmentID) ||
62463               !context.hasEntity(washingtonStreetID) ||
62464               !context.hasEntity(twelfthAvenueID) ||
62465               !context.hasEntity(eleventhAvenueEndID)) {
62466               return continueTo(rightClickIntersection);
62467           }
62468
62469           var node = selectMenuItem('delete').node();
62470           if (!node) return continueTo(multiRightClick);
62471
62472           var menuCoords = context.map().mouseCoordinates();
62473           revealEditMenu(menuCoords,
62474               t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') })
62475           );
62476
62477           context.map().on('move.intro drawn.intro', function() {
62478               revealEditMenu(menuCoords,
62479                   t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') }),
62480                   { duration: 0 }
62481               );
62482           });
62483
62484           context.on('exit.intro', function() {
62485               if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
62486                   return continueTo(multiSelect);  // left select mode but roads still exist
62487               }
62488           });
62489
62490           context.history().on('change.intro', function() {
62491               if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
62492                   continueTo(retryDelete);         // changed something but roads still exist
62493               } else {
62494                   continueTo(play);
62495               }
62496           });
62497
62498           function continueTo(nextStep) {
62499               context.map().on('move.intro drawn.intro', null);
62500               context.on('exit.intro', null);
62501               context.history().on('change.intro', null);
62502               nextStep();
62503           }
62504       }
62505
62506
62507       function retryDelete() {
62508           context.enter(modeBrowse(context));
62509
62510           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62511           var box = pad$1(twelfthAvenue, padding, context);
62512           reveal(box, t('intro.lines.retry_delete'), {
62513               buttonText: t('intro.ok'),
62514               buttonCallback: function() { continueTo(multiSelect); }
62515           });
62516
62517           function continueTo(nextStep) {
62518               nextStep();
62519           }
62520       }
62521
62522
62523       function play() {
62524           dispatch$$1.call('done');
62525           reveal('#id-container',
62526               t('intro.lines.play', { next: t('intro.buildings.title') }), {
62527                   tooltipBox: '.intro-nav-wrap .chapter-building',
62528                   buttonText: t('intro.ok'),
62529                   buttonCallback: function() { reveal('#id-container'); }
62530               }
62531           );
62532      }
62533
62534
62535       chapter.enter = function() {
62536           addLine();
62537       };
62538
62539
62540       chapter.exit = function() {
62541           timeouts.forEach(window.clearTimeout);
62542           select(window).on('mousedown.intro', null, true);
62543           context.on('enter.intro exit.intro', null);
62544           context.map().on('move.intro drawn.intro', null);
62545           context.history().on('change.intro', null);
62546           select('.inspector-wrap').on('wheel.intro', null);
62547           select('.preset-list-button').on('click.intro', null);
62548       };
62549
62550
62551       chapter.restart = function() {
62552           chapter.exit();
62553           chapter.enter();
62554       };
62555
62556
62557       return utilRebind(chapter, dispatch$$1, 'on');
62558   }
62559
62560   function uiIntroBuilding(context, reveal) {
62561       var dispatch$$1 = dispatch('done');
62562       var house = [-85.62815, 41.95638];
62563       var tank = [-85.62732, 41.95347];
62564       var buildingCatetory = context.presets().item('category-building');
62565       var housePreset = context.presets().item('building/house');
62566       var tankPreset = context.presets().item('man_made/storage_tank');
62567       var timeouts = [];
62568       var _houseID = null;
62569       var _tankID = null;
62570
62571
62572       var chapter = {
62573           title: 'intro.buildings.title'
62574       };
62575
62576
62577       function timeout(f, t$$1) {
62578           timeouts.push(window.setTimeout(f, t$$1));
62579       }
62580
62581
62582       function eventCancel() {
62583           event.stopPropagation();
62584           event.preventDefault();
62585       }
62586
62587
62588       function revealHouse(center, text, options) {
62589           var padding = 160 * Math.pow(2, context.map().zoom() - 20);
62590           var box = pad$1(center, padding, context);
62591           reveal(box, text, options);
62592       }
62593
62594
62595       function revealTank(center, text, options) {
62596           var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
62597           var box = pad$1(center, padding, context);
62598           reveal(box, text, options);
62599       }
62600
62601
62602       function revealEditMenu(loc, text, options) {
62603           var rect = context.surfaceRect();
62604           var point$$1 = context.curtainProjection(loc);
62605           var pad = 40;
62606           var width = 250 + (2 * pad);
62607           var height = 350;
62608           var startX = rect.left + point$$1[0];
62609           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
62610           var box = {
62611               left: left,
62612               top: point$$1[1] + rect.top - 60,
62613               width: width,
62614               height: height
62615           };
62616           reveal(box, text, options);
62617       }
62618
62619
62620       function addHouse() {
62621           context.enter(modeBrowse(context));
62622           context.history().reset('initial');
62623           _houseID = null;
62624
62625           var msec = transitionTime(house, context.map().center());
62626           if (msec) { reveal(null, null, { duration: 0 }); }
62627           context.map().zoom(19).centerEase(house, msec);
62628
62629           timeout(function() {
62630               var tooltip = reveal('button.add-area',
62631                   t('intro.buildings.add_building', { button: icon('#iD-icon-area', 'pre-text') }));
62632
62633               tooltip.selectAll('.tooltip-inner')
62634                   .insert('svg', 'span')
62635                   .attr('class', 'tooltip-illustration')
62636                   .append('use')
62637                   .attr('xlink:href', '#iD-graphic-buildings');
62638
62639               context.on('enter.intro', function(mode) {
62640                   if (mode.id !== 'add-area') return;
62641                   continueTo(startHouse);
62642               });
62643           }, msec + 100);
62644
62645           function continueTo(nextStep) {
62646               context.on('enter.intro', null);
62647               nextStep();
62648           }
62649       }
62650
62651
62652       function startHouse() {
62653           if (context.mode().id !== 'add-area') {
62654               return continueTo(addHouse);
62655           }
62656
62657           _houseID = null;
62658           context.map().zoomEase(20, 500);
62659
62660           timeout(function() {
62661               revealHouse(house, t('intro.buildings.start_building'));
62662
62663               context.map().on('move.intro drawn.intro', function() {
62664                   revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
62665               });
62666
62667               context.on('enter.intro', function(mode) {
62668                   if (mode.id !== 'draw-area') return chapter.restart();
62669                   continueTo(continueHouse);
62670               });
62671
62672           }, 550);  // after easing
62673
62674           function continueTo(nextStep) {
62675               context.map().on('move.intro drawn.intro', null);
62676               context.on('enter.intro', null);
62677               nextStep();
62678           }
62679       }
62680
62681
62682       function continueHouse() {
62683           if (context.mode().id !== 'draw-area') {
62684               return continueTo(addHouse);
62685           }
62686
62687           _houseID = null;
62688
62689           revealHouse(house, t('intro.buildings.continue_building'));
62690
62691           context.map().on('move.intro drawn.intro', function() {
62692               revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
62693           });
62694
62695           context.on('enter.intro', function(mode) {
62696               if (mode.id === 'draw-area') {
62697                   return;
62698               } else if (mode.id === 'select') {
62699                   var graph = context.graph();
62700                   var way = context.entity(context.selectedIDs()[0]);
62701                   var nodes = graph.childNodes(way);
62702                   var points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
62703
62704                   if (isMostlySquare(points)) {
62705                       _houseID = way.id;
62706                       return continueTo(chooseCategoryBuilding);
62707                   } else {
62708                       return continueTo(retryHouse);
62709                   }
62710
62711               } else {
62712                   return chapter.restart();
62713               }
62714           });
62715
62716           function continueTo(nextStep) {
62717               context.map().on('move.intro drawn.intro', null);
62718               context.on('enter.intro', null);
62719               nextStep();
62720           }
62721       }
62722
62723
62724       function retryHouse() {
62725           var onClick = function() { continueTo(addHouse); };
62726
62727           revealHouse(house, t('intro.buildings.retry_building'),
62728               { buttonText: t('intro.ok'), buttonCallback: onClick }
62729           );
62730
62731           context.map().on('move.intro drawn.intro', function() {
62732               revealHouse(house, t('intro.buildings.retry_building'),
62733                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
62734               );
62735           });
62736
62737           function continueTo(nextStep) {
62738               context.map().on('move.intro drawn.intro', null);
62739               nextStep();
62740           }
62741       }
62742
62743
62744       function chooseCategoryBuilding() {
62745           if (!_houseID || !context.hasEntity(_houseID)) {
62746               return addHouse();
62747           }
62748           var ids = context.selectedIDs();
62749           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
62750               context.enter(modeSelect(context, [_houseID]));
62751           }
62752
62753           // disallow scrolling
62754           select('.inspector-wrap').on('wheel.intro', eventCancel);
62755
62756           timeout(function() {
62757               // reset pane, in case user somehow happened to change it..
62758               select('.inspector-wrap .panewrap').style('right', '-100%');
62759
62760               var button = select('.preset-category-building .preset-list-button');
62761
62762               reveal(button.node(),
62763                   t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
62764               );
62765
62766               button.on('click.intro', function() {
62767                   button.on('click.intro', null);
62768                   continueTo(choosePresetHouse);
62769               });
62770
62771           }, 400);  // after preset list pane visible..
62772
62773
62774           context.on('enter.intro', function(mode) {
62775               if (!_houseID || !context.hasEntity(_houseID)) {
62776                   return continueTo(addHouse);
62777               }
62778               var ids = context.selectedIDs();
62779               if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
62780                   return continueTo(chooseCategoryBuilding);
62781               }
62782           });
62783
62784           function continueTo(nextStep) {
62785               select('.inspector-wrap').on('wheel.intro', null);
62786               select('.preset-list-button').on('click.intro', null);
62787               context.on('enter.intro', null);
62788               nextStep();
62789           }
62790       }
62791
62792
62793       function choosePresetHouse() {
62794           if (!_houseID || !context.hasEntity(_houseID)) {
62795               return addHouse();
62796           }
62797           var ids = context.selectedIDs();
62798           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
62799               context.enter(modeSelect(context, [_houseID]));
62800           }
62801
62802           // disallow scrolling
62803           select('.inspector-wrap').on('wheel.intro', eventCancel);
62804
62805           timeout(function() {
62806               // reset pane, in case user somehow happened to change it..
62807               select('.inspector-wrap .panewrap').style('right', '-100%');
62808
62809               var button = select('.preset-building-house .preset-list-button');
62810
62811               reveal(button.node(),
62812                   t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
62813                   { duration: 300 }
62814               );
62815
62816               button.on('click.intro', function() {
62817                   button.on('click.intro', null);
62818                   continueTo(closeEditorHouse);
62819               });
62820
62821           }, 400);  // after preset list pane visible..
62822
62823           context.on('enter.intro', function(mode) {
62824               if (!_houseID || !context.hasEntity(_houseID)) {
62825                   return continueTo(addHouse);
62826               }
62827               var ids = context.selectedIDs();
62828               if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
62829                   return continueTo(chooseCategoryBuilding);
62830               }
62831           });
62832
62833           function continueTo(nextStep) {
62834               select('.inspector-wrap').on('wheel.intro', null);
62835               select('.preset-list-button').on('click.intro', null);
62836               context.on('enter.intro', null);
62837               nextStep();
62838           }
62839       }
62840
62841
62842       function closeEditorHouse() {
62843           if (!_houseID || !context.hasEntity(_houseID)) {
62844               return addHouse();
62845           }
62846           var ids = context.selectedIDs();
62847           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
62848               context.enter(modeSelect(context, [_houseID]));
62849           }
62850
62851           context.history().checkpoint('hasHouse');
62852
62853           context.on('exit.intro', function() {
62854               continueTo(rightClickHouse);
62855           });
62856
62857           timeout(function() {
62858               reveal('.entity-editor-pane',
62859                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
62860               );
62861           }, 500);
62862
62863           function continueTo(nextStep) {
62864               context.on('exit.intro', null);
62865               nextStep();
62866           }
62867       }
62868
62869
62870       function rightClickHouse() {
62871           if (!_houseID) return chapter.restart();
62872
62873           context.enter(modeBrowse(context));
62874           context.history().reset('hasHouse');
62875           context.map().centerEase(house, 500);
62876
62877           timeout(function() {
62878               if (context.map().zoom() < 20) {
62879                   context.map().zoomEase(20, 500);
62880               }
62881           }, 520);
62882
62883           context.on('enter.intro', function(mode) {
62884               if (mode.id !== 'select') return;
62885               var ids = context.selectedIDs();
62886               if (ids.length !== 1 || ids[0] !== _houseID) return;
62887
62888               timeout(function() {
62889                   var node = selectMenuItem('orthogonalize').node();
62890                   if (!node) return;
62891                   continueTo(clickSquare);
62892               }, 300);  // after menu visible
62893           });
62894
62895           context.map().on('move.intro drawn.intro', function() {
62896               revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
62897           });
62898
62899           context.history().on('change.intro', function() {
62900               continueTo(rightClickHouse);
62901           });
62902
62903           function continueTo(nextStep) {
62904               context.on('enter.intro', null);
62905               context.map().on('move.intro drawn.intro', null);
62906               context.history().on('change.intro', null);
62907               nextStep();
62908           }
62909       }
62910
62911
62912       function clickSquare() {
62913           if (!_houseID) return chapter.restart();
62914           var entity = context.hasEntity(_houseID);
62915           if (!entity) return continueTo(rightClickHouse);
62916
62917           var node = selectMenuItem('orthogonalize').node();
62918           if (!node) { return continueTo(rightClickHouse); }
62919
62920           var wasChanged = false;
62921           var menuCoords = context.map().mouseCoordinates();
62922
62923           revealEditMenu(menuCoords,
62924               t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') })
62925           );
62926
62927           context.on('enter.intro', function(mode) {
62928               if (mode.id === 'browse') {
62929                   continueTo(rightClickHouse);
62930               } else if (mode.id === 'move' || mode.id === 'rotate') {
62931                   continueTo(retryClickSquare);
62932               }
62933           });
62934
62935           context.map().on('move.intro drawn.intro', function() {
62936               var node = selectMenuItem('orthogonalize').node();
62937               if (!wasChanged && !node) { return continueTo(rightClickHouse); }
62938
62939               revealEditMenu(menuCoords,
62940                   t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') }),
62941                   { duration: 0 }
62942               );
62943           });
62944
62945           context.history().on('change.intro', function() {
62946               wasChanged = true;
62947               context.history().on('change.intro', null);
62948
62949               // Something changed.  Wait for transition to complete and check undo annotation.
62950               timeout(function() {
62951                   if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
62952                       continueTo(doneSquare);
62953                   } else {
62954                       continueTo(retryClickSquare);
62955                   }
62956               }, 500);  // after transitioned actions
62957           });
62958
62959           function continueTo(nextStep) {
62960               context.on('enter.intro', null);
62961               context.map().on('move.intro drawn.intro', null);
62962               context.history().on('change.intro', null);
62963               nextStep();
62964           }
62965       }
62966
62967
62968       function retryClickSquare() {
62969           context.enter(modeBrowse(context));
62970
62971           revealHouse(house, t('intro.buildings.retry_square'), {
62972               buttonText: t('intro.ok'),
62973               buttonCallback: function() { continueTo(rightClickHouse); }
62974           });
62975
62976           function continueTo(nextStep) {
62977               nextStep();
62978           }
62979       }
62980
62981
62982       function doneSquare() {
62983           context.history().checkpoint('doneSquare');
62984
62985           revealHouse(house, t('intro.buildings.done_square'), {
62986               buttonText: t('intro.ok'),
62987               buttonCallback: function() { continueTo(addTank); }
62988           });
62989
62990           function continueTo(nextStep) {
62991               nextStep();
62992           }
62993       }
62994
62995
62996       function addTank() {
62997           context.enter(modeBrowse(context));
62998           context.history().reset('doneSquare');
62999           _tankID = null;
63000
63001           var msec = transitionTime(tank, context.map().center());
63002           if (msec) { reveal(null, null, { duration: 0 }); }
63003           context.map().zoom(19.5).centerEase(tank, msec);
63004
63005           timeout(function() {
63006               reveal('button.add-area',
63007                   t('intro.buildings.add_tank', { button: icon('#iD-icon-area', 'pre-text') })
63008               );
63009
63010               context.on('enter.intro', function(mode) {
63011                   if (mode.id !== 'add-area') return;
63012                   continueTo(startTank);
63013               });
63014           }, msec + 100);
63015
63016           function continueTo(nextStep) {
63017               context.on('enter.intro', null);
63018               nextStep();
63019           }
63020       }
63021
63022
63023       function startTank() {
63024           if (context.mode().id !== 'add-area') {
63025               return continueTo(addTank);
63026           }
63027
63028           _tankID = null;
63029
63030           timeout(function() {
63031               revealTank(tank, t('intro.buildings.start_tank'));
63032
63033               context.map().on('move.intro drawn.intro', function() {
63034                   revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
63035               });
63036
63037               context.on('enter.intro', function(mode) {
63038                   if (mode.id !== 'draw-area') return chapter.restart();
63039                   continueTo(continueTank);
63040               });
63041
63042           }, 550);  // after easing
63043
63044           function continueTo(nextStep) {
63045               context.map().on('move.intro drawn.intro', null);
63046               context.on('enter.intro', null);
63047               nextStep();
63048           }
63049       }
63050
63051
63052       function continueTank() {
63053           if (context.mode().id !== 'draw-area') {
63054               return continueTo(addTank);
63055           }
63056
63057           _tankID = null;
63058
63059           revealTank(tank, t('intro.buildings.continue_tank'));
63060
63061           context.map().on('move.intro drawn.intro', function() {
63062               revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
63063           });
63064
63065           context.on('enter.intro', function(mode) {
63066               if (mode.id === 'draw-area') {
63067                   return;
63068               } else if (mode.id === 'select') {
63069                   _tankID = context.selectedIDs()[0];
63070                   return continueTo(searchPresetTank);
63071               } else {
63072                   return continueTo(addTank);
63073               }
63074           });
63075
63076           function continueTo(nextStep) {
63077               context.map().on('move.intro drawn.intro', null);
63078               context.on('enter.intro', null);
63079               nextStep();
63080           }
63081       }
63082
63083
63084       function searchPresetTank() {
63085           if (!_tankID || !context.hasEntity(_tankID)) {
63086               return addTank();
63087           }
63088           var ids = context.selectedIDs();
63089           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
63090               context.enter(modeSelect(context, [_tankID]));
63091           }
63092
63093           // disallow scrolling
63094           select('.inspector-wrap').on('wheel.intro', eventCancel);
63095
63096           timeout(function() {
63097               // reset pane, in case user somehow happened to change it..
63098               select('.inspector-wrap .panewrap').style('right', '-100%');
63099
63100               select('.preset-search-input')
63101                   .on('keydown.intro', null)
63102                   .on('keyup.intro', checkPresetSearch);
63103
63104               reveal('.preset-search-input',
63105                   t('intro.buildings.search_tank', { preset: tankPreset.name() })
63106               );
63107           }, 400);  // after preset list pane visible..
63108
63109           context.on('enter.intro', function(mode) {
63110               if (!_tankID || !context.hasEntity(_tankID)) {
63111                   return continueTo(addTank);
63112               }
63113
63114               var ids = context.selectedIDs();
63115               if (mode.id !== 'select' || !ids.length || ids[0] !== _tankID) {
63116                   // keep the user's area selected..
63117                   context.enter(modeSelect(context, [_tankID]));
63118
63119                   // reset pane, in case user somehow happened to change it..
63120                   select('.inspector-wrap .panewrap').style('right', '-100%');
63121                   // disallow scrolling
63122                   select('.inspector-wrap').on('wheel.intro', eventCancel);
63123
63124                   select('.preset-search-input')
63125                       .on('keydown.intro', null)
63126                       .on('keyup.intro', checkPresetSearch);
63127
63128                   reveal('.preset-search-input',
63129                       t('intro.buildings.search_tank', { preset: tankPreset.name() })
63130                   );
63131
63132                   context.history().on('change.intro', null);
63133               }
63134           });
63135
63136           function checkPresetSearch() {
63137               var first = select('.preset-list-item:first-child');
63138
63139               if (first.classed('preset-man_made-storage_tank')) {
63140                   reveal(first.select('.preset-list-button').node(),
63141                       t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
63142                       { duration: 300 }
63143                   );
63144
63145                   select('.preset-search-input')
63146                       .on('keydown.intro', eventCancel, true)
63147                       .on('keyup.intro', null);
63148
63149                   context.history().on('change.intro', function() {
63150                       continueTo(closeEditorTank);
63151                   });
63152               }
63153           }
63154
63155           function continueTo(nextStep) {
63156               select('.inspector-wrap').on('wheel.intro', null);
63157               context.on('enter.intro', null);
63158               context.history().on('change.intro', null);
63159               select('.preset-search-input').on('keydown.intro keyup.intro', null);
63160               nextStep();
63161           }
63162       }
63163
63164
63165       function closeEditorTank() {
63166           if (!_tankID || !context.hasEntity(_tankID)) {
63167               return addTank();
63168           }
63169           var ids = context.selectedIDs();
63170           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
63171               context.enter(modeSelect(context, [_tankID]));
63172           }
63173
63174           context.history().checkpoint('hasTank');
63175
63176           context.on('exit.intro', function() {
63177               continueTo(rightClickTank);
63178           });
63179
63180           timeout(function() {
63181               reveal('.entity-editor-pane',
63182                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
63183               );
63184           }, 500);
63185
63186           function continueTo(nextStep) {
63187               context.on('exit.intro', null);
63188               nextStep();
63189           }
63190       }
63191
63192
63193       function rightClickTank() {
63194           if (!_tankID) return continueTo(addTank);
63195
63196           context.enter(modeBrowse(context));
63197           context.history().reset('hasTank');
63198           context.map().centerEase(tank, 500);
63199
63200           timeout(function() {
63201               context.on('enter.intro', function(mode) {
63202                   if (mode.id !== 'select') return;
63203                   var ids = context.selectedIDs();
63204                   if (ids.length !== 1 || ids[0] !== _tankID) return;
63205
63206                   timeout(function() {
63207                       var node = selectMenuItem('circularize').node();
63208                       if (!node) return;
63209                       continueTo(clickCircle);
63210                   }, 300);  // after menu visible
63211               });
63212
63213               revealTank(tank, t('intro.buildings.rightclick_tank'));
63214
63215               context.map().on('move.intro drawn.intro', function() {
63216                   revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
63217               });
63218
63219               context.history().on('change.intro', function() {
63220                   continueTo(rightClickTank);
63221               });
63222
63223           }, 600);
63224
63225           function continueTo(nextStep) {
63226               context.on('enter.intro', null);
63227               context.map().on('move.intro drawn.intro', null);
63228               context.history().on('change.intro', null);
63229               nextStep();
63230           }
63231       }
63232
63233
63234       function clickCircle() {
63235           if (!_tankID) return chapter.restart();
63236           var entity = context.hasEntity(_tankID);
63237           if (!entity) return continueTo(rightClickTank);
63238
63239           var node = selectMenuItem('circularize').node();
63240           if (!node) { return continueTo(rightClickTank); }
63241
63242           var wasChanged = false;
63243           var menuCoords = context.map().mouseCoordinates();
63244
63245           revealEditMenu(menuCoords,
63246               t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') })
63247           );
63248
63249           context.on('enter.intro', function(mode) {
63250               if (mode.id === 'browse') {
63251                   continueTo(rightClickTank);
63252               } else if (mode.id === 'move' || mode.id === 'rotate') {
63253                   continueTo(retryClickCircle);
63254               }
63255           });
63256
63257           context.map().on('move.intro drawn.intro', function() {
63258               var node = selectMenuItem('circularize').node();
63259               if (!wasChanged && !node) { return continueTo(rightClickTank); }
63260
63261               revealEditMenu(menuCoords,
63262                   t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') }),
63263                   { duration: 0 }
63264               );
63265           });
63266
63267           context.history().on('change.intro', function() {
63268               wasChanged = true;
63269               context.history().on('change.intro', null);
63270
63271               // Something changed.  Wait for transition to complete and check undo annotation.
63272               timeout(function() {
63273                   if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
63274                       continueTo(play);
63275                   } else {
63276                       continueTo(retryClickCircle);
63277                   }
63278               }, 500);  // after transitioned actions
63279           });
63280
63281           function continueTo(nextStep) {
63282               context.on('enter.intro', null);
63283               context.map().on('move.intro drawn.intro', null);
63284               context.history().on('change.intro', null);
63285               nextStep();
63286           }
63287       }
63288
63289
63290       function retryClickCircle() {
63291           context.enter(modeBrowse(context));
63292
63293           revealTank(tank, t('intro.buildings.retry_circle'), {
63294               buttonText: t('intro.ok'),
63295               buttonCallback: function() { continueTo(rightClickTank); }
63296           });
63297
63298           function continueTo(nextStep) {
63299               nextStep();
63300           }
63301       }
63302
63303
63304       function play() {
63305           dispatch$$1.call('done');
63306           reveal('#id-container',
63307               t('intro.buildings.play', { next: t('intro.startediting.title') }), {
63308                   tooltipBox: '.intro-nav-wrap .chapter-startEditing',
63309                   buttonText: t('intro.ok'),
63310                   buttonCallback: function() { reveal('#id-container'); }
63311               }
63312           );
63313       }
63314
63315
63316       chapter.enter = function() {
63317           addHouse();
63318       };
63319
63320
63321       chapter.exit = function() {
63322           timeouts.forEach(window.clearTimeout);
63323           context.on('enter.intro exit.intro', null);
63324           context.map().on('move.intro drawn.intro', null);
63325           context.history().on('change.intro', null);
63326           select('.inspector-wrap').on('wheel.intro', null);
63327           select('.preset-search-input').on('keydown.intro keyup.intro', null);
63328           select('.more-fields .combobox-input').on('click.intro', null);
63329       };
63330
63331
63332       chapter.restart = function() {
63333           chapter.exit();
63334           chapter.enter();
63335       };
63336
63337
63338       return utilRebind(chapter, dispatch$$1, 'on');
63339   }
63340
63341   function uiModal(selection$$1, blocking) {
63342       var keybinding = utilKeybinding('modal');
63343       var previous = selection$$1.select('div.modal');
63344       var animate = previous.empty();
63345
63346       previous.transition()
63347           .duration(200)
63348           .style('opacity', 0)
63349           .remove();
63350
63351       var shaded = selection$$1
63352           .append('div')
63353           .attr('class', 'shaded')
63354           .style('opacity', 0);
63355
63356       shaded.close = function() {
63357           shaded
63358               .transition()
63359               .duration(200)
63360               .style('opacity',0)
63361               .remove();
63362
63363           modal
63364               .transition()
63365               .duration(200)
63366               .style('top','0px');
63367
63368           select(document)
63369               .call(keybinding.unbind);
63370       };
63371
63372
63373       var modal = shaded
63374           .append('div')
63375           .attr('class', 'modal fillL col6');
63376
63377       if (!blocking) {
63378           shaded.on('click.remove-modal', function() {
63379               if (event.target === this) {
63380                   shaded.close();
63381               }
63382           });
63383
63384           modal.append('button')
63385               .attr('class', 'close')
63386               .on('click', shaded.close)
63387               .call(svgIcon('#iD-icon-close'));
63388
63389           keybinding
63390               .on('⌫', shaded.close)
63391               .on('⎋', shaded.close);
63392
63393           select(document)
63394               .call(keybinding);
63395       }
63396
63397       modal
63398           .append('div')
63399           .attr('class', 'content');
63400
63401       if (animate) {
63402           shaded.transition().style('opacity', 1);
63403       } else {
63404           shaded.style('opacity', 1);
63405       }
63406
63407
63408       return shaded;
63409   }
63410
63411   function uiIntroStartEditing(context, reveal) {
63412       var dispatch$$1 = dispatch('done', 'startEditing');
63413       var modalSelection = select(null);
63414
63415
63416       var chapter = {
63417           title: 'intro.startediting.title'
63418       };
63419
63420       function showHelp() {
63421           reveal('.map-control.help-control',
63422               t('intro.startediting.help', { button: icon('#iD-icon-help', 'pre-text'), key: t('help.key') }), {
63423                   buttonText: t('intro.ok'),
63424                   buttonCallback: function() { shortcuts(); }
63425               }
63426           );
63427       }
63428
63429       function shortcuts() {
63430           reveal('.map-control.help-control',
63431               t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
63432                   buttonText: t('intro.ok'),
63433                   buttonCallback: function() { showSave(); }
63434               }
63435           );
63436       }
63437
63438       function showSave() {
63439           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
63440           reveal('#bar button.save',
63441               t('intro.startediting.save'), {
63442                   buttonText: t('intro.ok'),
63443                   buttonCallback: function() { showStart(); }
63444               }
63445           );
63446       }
63447
63448       function showStart() {
63449           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
63450
63451           modalSelection = uiModal(context.container());
63452
63453           modalSelection.select('.modal')
63454               .attr('class', 'modal-splash modal col6');
63455
63456           modalSelection.selectAll('.close').remove();
63457
63458           var startbutton = modalSelection.select('.content')
63459               .attr('class', 'fillL')
63460               .append('button')
63461                   .attr('class', 'modal-section huge-modal-button')
63462                   .on('click', function() {
63463                       modalSelection.remove();
63464                   });
63465
63466               startbutton
63467                   .append('svg')
63468                   .attr('class', 'illustration')
63469                   .append('use')
63470                   .attr('xlink:href', '#iD-logo-walkthrough');
63471
63472               startbutton
63473                   .append('h2')
63474                   .text(t('intro.startediting.start'));
63475
63476           dispatch$$1.call('startEditing');
63477       }
63478
63479
63480       chapter.enter = function() {
63481           showHelp();
63482       };
63483
63484
63485       chapter.exit = function() {
63486           modalSelection.remove();
63487           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
63488       };
63489
63490
63491       return utilRebind(chapter, dispatch$$1, 'on');
63492   }
63493
63494   var chapterUi = {
63495       welcome: uiIntroWelcome,
63496       navigation: uiIntroNavigation,
63497       point: uiIntroPoint,
63498       area: uiIntroArea,
63499       line: uiIntroLine,
63500       building: uiIntroBuilding,
63501       startEditing: uiIntroStartEditing
63502   };
63503
63504   var chapterFlow = [
63505       'welcome',
63506       'navigation',
63507       'point',
63508       'area',
63509       'line',
63510       'building',
63511       'startEditing'
63512   ];
63513
63514
63515   function uiIntro(context) {
63516       var INTRO_IMAGERY = 'EsriWorldImageryClarity';
63517       var introGraph = {};
63518       var _currChapter;
63519
63520       // create entities for intro graph and localize names
63521       for (var id in dataIntroGraph) {
63522           introGraph[id] = osmEntity$$1(localize(dataIntroGraph[id]));
63523       }
63524
63525
63526       function intro(selection$$1) {
63527           context.enter(modeBrowse(context));
63528
63529           // Save current map state
63530           var osm = context.connection();
63531           var history = context.history().toJSON();
63532           var hash = window.location.hash;
63533           var center = context.map().center();
63534           var zoom = context.map().zoom();
63535           var background = context.background().baseLayerSource();
63536           var overlays = context.background().overlayLayerSources();
63537           var opacity = d3_selectAll('#map .layer-background').style('opacity');
63538           var caches = osm && osm.caches();
63539           var baseEntities = context.history().graph().base().entities;
63540           var countryCode = services.geocoder.countryCode;
63541
63542           // Block saving
63543           context.inIntro(true);
63544
63545           // Load semi-real data used in intro
63546           if (osm) { osm.toggle(false).reset(); }
63547           context.history().reset();
63548           context.history().merge(values$1(coreGraph$$1().load(introGraph).entities));
63549           context.history().checkpoint('initial');
63550
63551           // Setup imagery
63552           var imagery = context.background().findSource(INTRO_IMAGERY);
63553           if (imagery) {
63554               context.background().baseLayerSource(imagery);
63555           } else {
63556               context.background().bing();
63557           }
63558           overlays.forEach(function(d) {
63559               context.background().toggleOverlayLayer(d);
63560           });
63561
63562           // Setup data layers (only OSM)
63563           var layers = context.layers();
63564           layers.all().forEach(function(item) {
63565               item.layer.enabled(item.id === 'osm');
63566           });
63567
63568           // Mock geocoder
63569           services.geocoder.countryCode = function(location, callback) {
63570               callback(null, t('intro.graph.countrycode'));
63571           };
63572
63573           // Disable the sidebar resizing button
63574           d3_selectAll('button.sidebar-toggle').classed('disabled', true);
63575
63576           d3_selectAll('#map .layer-background').style('opacity', 1);
63577
63578           var curtain = uiCurtain();
63579           selection$$1.call(curtain);
63580
63581           // Store that the user started the walkthrough..
63582           context.storage('walkthrough_started', 'yes');
63583
63584           // Restore previous walkthrough progress..
63585           var storedProgress = context.storage('walkthrough_progress') || '';
63586           var progress = storedProgress.split(';').filter(Boolean);
63587
63588           var chapters = chapterFlow.map(function(chapter, i) {
63589               var s = chapterUi[chapter](context, curtain.reveal)
63590                   .on('done', function() {
63591                       context.presets().init();  // clear away "recent" presets
63592
63593                       buttons.filter(function(d) {
63594                           return d.title === s.title;
63595                       }).classed('finished', true);
63596
63597                       if (i < chapterFlow.length - 1) {
63598                           var next = chapterFlow[i + 1];
63599                           select('button.chapter-' + next)
63600                               .classed('next', true);
63601                       }
63602
63603                       // Store walkthrough progress..
63604                       progress.push(chapter);
63605                       context.storage('walkthrough_progress', uniq(progress).join(';'));
63606                   });
63607               return s;
63608           });
63609
63610           chapters[chapters.length - 1].on('startEditing', function() {
63611               // Store walkthrough progress..
63612               progress.push('startEditing');
63613               context.storage('walkthrough_progress', uniq(progress).join(';'));
63614
63615               // Store if walkthrough is completed..
63616               var incomplete = difference(chapterFlow, progress);
63617               if (!incomplete.length) {
63618                   context.storage('walkthrough_completed', 'yes');
63619               }
63620
63621               curtain.remove();
63622               navwrap.remove();
63623               d3_selectAll('#map .layer-background').style('opacity', opacity);
63624               d3_selectAll('button.sidebar-toggle').classed('disabled', false);
63625               if (osm) { osm.toggle(true).reset().caches(caches); }
63626               context.history().reset().merge(values$1(baseEntities));
63627               context.background().baseLayerSource(background);
63628               overlays.forEach(function(d) { context.background().toggleOverlayLayer(d); });
63629               if (history) { context.history().fromJSON(history, false); }
63630               context.map().centerZoom(center, zoom);
63631               window.location.replace(hash);
63632               services.geocoder.countryCode = countryCode;
63633               context.inIntro(false);
63634           });
63635
63636           var navwrap = selection$$1
63637               .append('div')
63638               .attr('class', 'intro-nav-wrap fillD');
63639
63640           navwrap
63641               .append('svg')
63642               .attr('class', 'intro-nav-wrap-logo')
63643               .append('use')
63644               .attr('xlink:href', '#iD-logo-walkthrough');
63645
63646           var buttonwrap = navwrap
63647               .append('div')
63648               .attr('class', 'joined')
63649               .selectAll('button.chapter');
63650
63651           var buttons = buttonwrap
63652               .data(chapters)
63653               .enter()
63654               .append('button')
63655               .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
63656               .on('click', enterChapter);
63657
63658           buttons
63659               .append('span')
63660               .text(function(d) { return t(d.title); });
63661
63662           buttons
63663               .append('span')
63664               .attr('class', 'status')
63665               .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
63666
63667           enterChapter(chapters[0]);
63668
63669
63670           function enterChapter(newChapter) {
63671               if (_currChapter) { _currChapter.exit(); }
63672               context.enter(modeBrowse(context));
63673
63674               _currChapter = newChapter;
63675               _currChapter.enter();
63676
63677               buttons
63678                   .classed('next', false)
63679                   .classed('active', function(d) {
63680                       return d.title === _currChapter.title;
63681                   });
63682           }
63683       }
63684
63685
63686       return intro;
63687   }
63688
63689   function uiConfirm(selection) {
63690       var modalSelection = uiModal(selection);
63691
63692       modalSelection.select('.modal')
63693           .classed('modal-alert', true);
63694
63695       var section = modalSelection.select('.content');
63696
63697       section.append('div')
63698           .attr('class', 'modal-section header');
63699
63700       section.append('div')
63701           .attr('class', 'modal-section message-text');
63702
63703       var buttons = section.append('div')
63704           .attr('class', 'modal-section buttons cf');
63705
63706
63707       modalSelection.okButton = function() {
63708           buttons
63709               .append('button')
63710               .attr('class', 'button ok-button action')
63711               .on('click.confirm', function() {
63712                   modalSelection.remove();
63713               })
63714               .text(t('confirm.okay'))
63715               .node()
63716               .focus();
63717
63718           return modalSelection;
63719       };
63720
63721
63722       return modalSelection;
63723   }
63724
63725   function uiSettingsCustomData(context) {
63726       var dispatch$$1 = dispatch('change');
63727
63728       function render(selection$$1) {
63729           var dataLayer = context.layers().layer('data');
63730           var _origSettings = {
63731               fileList: (dataLayer && dataLayer.fileList()) || null,
63732               url: context.storage('settings-custom-data-url')
63733           };
63734           var _currSettings = cloneDeep(_origSettings);
63735
63736           // var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
63737           var modal = uiConfirm(selection$$1).okButton();
63738
63739           modal
63740               .classed('settings-modal settings-custom-data', true);
63741
63742           modal.select('.modal-section.header')
63743               .append('h3')
63744               .text(t('settings.custom_data.header'));
63745
63746
63747           var textSection = modal.select('.modal-section.message-text');
63748
63749           textSection
63750               .append('pre')
63751               .attr('class', 'instructions-file')
63752               .text(t('settings.custom_data.file.instructions'));
63753
63754           textSection
63755               .append('input')
63756               .attr('class', 'field-file')
63757               .attr('type', 'file')
63758               .property('files', _currSettings.fileList)  // works for all except IE11
63759               .on('change', function() {
63760                   var files = event.target.files;
63761                   if (files && files.length) {
63762                       _currSettings.url = '';
63763                       textSection.select('.field-url').property('value', '');
63764                       _currSettings.fileList = files;
63765                   } else {
63766                       _currSettings.fileList = null;
63767                   }
63768               });
63769
63770           textSection
63771               .append('h4')
63772               .text(t('settings.custom_data.or'));
63773
63774           textSection
63775               .append('pre')
63776               .attr('class', 'instructions-url')
63777               .text(t('settings.custom_data.url.instructions'));
63778
63779           textSection
63780               .append('textarea')
63781               .attr('class', 'field-url')
63782               .attr('placeholder', t('settings.custom_data.url.placeholder'))
63783               .call(utilNoAuto)
63784               .property('value', _currSettings.url);
63785
63786
63787           // insert a cancel button
63788           var buttonSection = modal.select('.modal-section.buttons');
63789
63790           buttonSection
63791               .insert('button', '.ok-button')
63792               .attr('class', 'button cancel-button secondary-action')
63793               .text(t('confirm.cancel'));
63794
63795
63796           buttonSection.select('.cancel-button')
63797               .on('click.cancel', clickCancel);
63798
63799           buttonSection.select('.ok-button')
63800               .attr('disabled', isSaveDisabled)
63801               .on('click.save', clickSave);
63802
63803
63804           function isSaveDisabled() {
63805               return null;
63806           }
63807
63808
63809           // restore the original url
63810           function clickCancel() {
63811               textSection.select('.field-url').property('value', _origSettings.url);
63812               context.storage('settings-custom-data-url', _origSettings.url);
63813               this.blur();
63814               modal.close();
63815           }
63816
63817           // accept the current url
63818           function clickSave() {
63819               _currSettings.url = textSection.select('.field-url').property('value').trim();
63820
63821               // one or the other but not both
63822               if (_currSettings.url) { _currSettings.fileList = null; }
63823               if (_currSettings.fileList) { _currSettings.url = ''; }
63824
63825               context.storage('settings-custom-data-url', _currSettings.url);
63826               this.blur();
63827               modal.close();
63828               dispatch$$1.call('change', this, _currSettings);
63829           }
63830       }
63831
63832       return utilRebind(render, dispatch$$1, 'on');
63833   }
63834
63835   function uiTooltipHtml(text, key, heading) {
63836       var s = '';
63837
63838       if (heading) {
63839           s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
63840       }
63841       if (text) {
63842           s += '<div class="tooltip-text"><span>' + text + '</span></div>';
63843       }
63844       if (key) {
63845           s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
63846               '<span class="keyhint">' + key + '</span></div>';
63847       }
63848
63849       return s;
63850   }
63851
63852   function uiMapData(context) {
63853       var key = t('map_data.key');
63854       var features = context.features().keys();
63855       var layers = context.layers();
63856       var fills = ['wireframe', 'partial', 'full'];
63857
63858       var settingsCustomData = uiSettingsCustomData(context)
63859           .on('change', customChanged);
63860
63861       var _fillSelected = context.storage('area-fill') || 'partial';
63862       var _shown = false;
63863       var _dataLayerContainer = select(null);
63864       var _fillList = select(null);
63865       var _featureList = select(null);
63866
63867
63868       function showsFeature(d) {
63869           return context.features().enabled(d);
63870       }
63871
63872
63873       function autoHiddenFeature(d) {
63874           return context.features().autoHidden(d);
63875       }
63876
63877
63878       function clickFeature(d) {
63879           context.features().toggle(d);
63880           update();
63881       }
63882
63883
63884       function showsFill(d) {
63885           return _fillSelected === d;
63886       }
63887
63888
63889       function setFill(d) {
63890           fills.forEach(function(opt) {
63891               context.surface().classed('fill-' + opt, Boolean(opt === d));
63892           });
63893
63894           _fillSelected = d;
63895           context.storage('area-fill', d);
63896           if (d !== 'wireframe') {
63897               context.storage('area-fill-toggle', d);
63898           }
63899           update();
63900       }
63901
63902
63903       function showsLayer(which) {
63904           var layer = layers.layer(which);
63905           if (layer) {
63906               return layer.enabled();
63907           }
63908           return false;
63909       }
63910
63911
63912       function setLayer(which, enabled) {
63913           var layer = layers.layer(which);
63914           if (layer) {
63915               layer.enabled(enabled);
63916
63917               if (!enabled && (which === 'osm' || which === 'notes')) {
63918                   context.enter(modeBrowse(context));
63919               }
63920
63921               update();
63922           }
63923       }
63924
63925
63926       function toggleLayer(which) {
63927           setLayer(which, !showsLayer(which));
63928       }
63929
63930
63931       function drawPhotoItems(selection$$1) {
63932           var photoKeys = ['streetside', 'mapillary-images', 'mapillary-signs', 'openstreetcam-images'];
63933           var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
63934           var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
63935
63936           function layerSupported(d) {
63937               return d.layer && d.layer.supported();
63938           }
63939           function layerEnabled(d) {
63940               return layerSupported(d) && d.layer.enabled();
63941           }
63942
63943           var ul = selection$$1
63944               .selectAll('.layer-list-photos')
63945               .data([0]);
63946
63947           ul = ul.enter()
63948               .append('ul')
63949               .attr('class', 'layer-list layer-list-photos')
63950               .merge(ul);
63951
63952           var li = ul.selectAll('.list-item-photos')
63953               .data(data);
63954
63955           li.exit()
63956               .remove();
63957
63958           var liEnter = li.enter()
63959               .append('li')
63960               .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
63961
63962           var labelEnter = liEnter
63963               .append('label')
63964               .each(function(d) {
63965                   select(this)
63966                       .call(tooltip()
63967                           .title(t(d.id.replace('-', '_') + '.tooltip'))
63968                           .placement('top')
63969                       );
63970               });
63971
63972           labelEnter
63973               .append('input')
63974               .attr('type', 'checkbox')
63975               .on('change', function(d) { toggleLayer(d.id); });
63976
63977           labelEnter
63978               .append('span')
63979               .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
63980
63981
63982           // Update
63983           li
63984               .merge(liEnter)
63985               .classed('active', layerEnabled)
63986               .selectAll('input')
63987               .property('checked', layerEnabled);
63988       }
63989
63990
63991       function drawOsmItems(selection$$1) {
63992           var osmKeys = ['osm', 'notes'];
63993           var osmLayers = layers.all().filter(function(obj) { return osmKeys.indexOf(obj.id) !== -1; });
63994
63995           var ul = selection$$1
63996               .selectAll('.layer-list-osm')
63997               .data([0]);
63998
63999           ul = ul.enter()
64000               .append('ul')
64001               .attr('class', 'layer-list layer-list-osm')
64002               .merge(ul);
64003
64004           var li = ul.selectAll('.list-item')
64005               .data(osmLayers);
64006
64007           li.exit()
64008               .remove();
64009
64010           var liEnter = li.enter()
64011               .append('li')
64012               .attr('class', function(d) { return 'list-item list-item-' + d.id; });
64013
64014           var labelEnter = liEnter
64015               .append('label')
64016               .each(function(d) {
64017                   select(this)
64018                       .call(tooltip()
64019                           .title(t('map_data.layers.' + d.id + '.tooltip'))
64020                           .placement('bottom')
64021                       );
64022               });
64023
64024           labelEnter
64025               .append('input')
64026               .attr('type', 'checkbox')
64027               .on('change', function(d) { toggleLayer(d.id); });
64028
64029           labelEnter
64030               .append('span')
64031               .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
64032
64033
64034           // Update
64035           li
64036               .merge(liEnter)
64037               .classed('active', function (d) { return d.layer.enabled(); })
64038               .selectAll('input')
64039               .property('checked', function (d) { return d.layer.enabled(); });
64040       }
64041
64042
64043       // Beta feature - sample vector layers to support Detroit Mapping Challenge
64044       // https://github.com/osmus/detroit-mapping-challenge
64045       function drawVectorItems(selection$$1) {
64046           var dataLayer = layers.layer('data');
64047           var vtData = [
64048               {
64049                   name: 'Detroit Neighborhoods/Parks',
64050                   src: 'neighborhoods-parks',
64051                   tooltip: 'Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.',
64052                   template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmur6x34562qp9iv1u3ksf-54hev,jonahadkins.cjksmqxdx33jj2wp90xd9x2md-4e5y2/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
64053               }, {
64054                   name: 'Detroit Composite POIs',
64055                   src: 'composite-poi',
64056                   tooltip: 'Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.',
64057                   template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmm6a02sli31myxhsr7zf3-2sw8h/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
64058               }, {
64059                   name: 'Detroit All-The-Places POIs',
64060                   src: 'alltheplaces-poi',
64061                   tooltip: 'Public domain business location data created by web scrapers.',
64062                   template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmswgk340g2vo06p1w9w0j-8fjjc/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
64063               }
64064           ];
64065
64066           // Only show this if the map is around Detroit..
64067           var detroit = geoExtent$$1([-83.5, 42.1], [-82.8, 42.5]);
64068           var showVectorItems = (context.map().zoom() > 9 && detroit.contains(context.map().center()));
64069
64070           var container = selection$$1.selectAll('.vectortile-container')
64071               .data(showVectorItems ? [0] : []);
64072
64073           container.exit()
64074               .remove();
64075
64076           var containerEnter = container.enter()
64077               .append('div')
64078               .attr('class', 'vectortile-container');
64079
64080           containerEnter
64081               .append('h4')
64082               .attr('class', 'vectortile-header')
64083               .text('Detroit Vector Tiles (Beta)');
64084
64085           containerEnter
64086               .append('ul')
64087               .attr('class', 'layer-list layer-list-vectortile');
64088
64089           containerEnter
64090               .append('div')
64091               .attr('class', 'vectortile-footer')
64092               .append('a')
64093               .attr('target', '_blank')
64094               .attr('tabindex', -1)
64095               .call(svgIcon('#iD-icon-out-link', 'inline'))
64096               .attr('href', 'https://github.com/osmus/detroit-mapping-challenge')
64097               .append('span')
64098               .text('About these layers');
64099
64100           container = container
64101               .merge(containerEnter);
64102
64103
64104           var ul = container.selectAll('.layer-list-vectortile');
64105
64106           var li = ul.selectAll('.list-item')
64107               .data(vtData);
64108
64109           li.exit()
64110               .remove();
64111
64112           var liEnter = li.enter()
64113               .append('li')
64114               .attr('class', function(d) { return 'list-item list-item-' + d.src; });
64115
64116           var labelEnter = liEnter
64117               .append('label')
64118               .each(function(d) {
64119                   select(this).call(
64120                       tooltip().title(d.tooltip).placement('top')
64121                   );
64122               });
64123
64124           labelEnter
64125               .append('input')
64126               .attr('type', 'radio')
64127               .attr('name', 'vectortile')
64128               .on('change', selectVTLayer);
64129
64130           labelEnter
64131               .append('span')
64132               .text(function(d) { return d.name; });
64133
64134           // Update
64135           li
64136               .merge(liEnter)
64137               .classed('active', isVTLayerSelected)
64138               .selectAll('input')
64139               .property('checked', isVTLayerSelected);
64140
64141
64142           function isVTLayerSelected(d) {
64143               return dataLayer && dataLayer.template() === d.template;
64144           }
64145
64146           function selectVTLayer(d) {
64147               context.storage('settings-custom-data-url', d.template);
64148               if (dataLayer) {
64149                   dataLayer.template(d.template, d.src);
64150                   dataLayer.enabled(true);
64151               }
64152           }
64153       }
64154
64155
64156       function drawCustomDataItems(selection$$1) {
64157           var dataLayer = layers.layer('data');
64158           var hasData = dataLayer && dataLayer.hasData();
64159           var showsData = hasData && dataLayer.enabled();
64160
64161           var ul = selection$$1
64162               .selectAll('.layer-list-data')
64163               .data(dataLayer ? [0] : []);
64164
64165           // Exit
64166           ul.exit()
64167               .remove();
64168
64169           // Enter
64170           var ulEnter = ul.enter()
64171               .append('ul')
64172               .attr('class', 'layer-list layer-list-data');
64173
64174           var liEnter = ulEnter
64175               .append('li')
64176               .attr('class', 'list-item-data');
64177
64178           liEnter
64179               .append('button')
64180               .call(tooltip()
64181                   .title(t('settings.custom_data.tooltip'))
64182                   .placement((textDirection === 'rtl') ? 'right' : 'left')
64183               )
64184               .on('click', editCustom)
64185               .call(svgIcon('#iD-icon-more'));
64186
64187           liEnter
64188               .append('button')
64189               .call(tooltip()
64190                   .title(t('map_data.layers.custom.zoom'))
64191                   .placement((textDirection === 'rtl') ? 'right' : 'left')
64192               )
64193               .on('click', function() {
64194                   event.preventDefault();
64195                   event.stopPropagation();
64196                   dataLayer.fitZoom();
64197               })
64198               .call(svgIcon('#iD-icon-search'));
64199
64200           var labelEnter = liEnter
64201               .append('label')
64202               .call(tooltip()
64203                   .title(t('map_data.layers.custom.tooltip'))
64204                   .placement('top')
64205               );
64206
64207           labelEnter
64208               .append('input')
64209               .attr('type', 'checkbox')
64210               .on('change', function() { toggleLayer('data'); });
64211
64212           labelEnter
64213               .append('span')
64214               .text(t('map_data.layers.custom.title'));
64215
64216           // Update
64217           ul = ul
64218               .merge(ulEnter);
64219
64220           ul.selectAll('.list-item-data')
64221               .classed('active', showsData)
64222               .selectAll('label')
64223               .classed('deemphasize', !hasData)
64224               .selectAll('input')
64225               .property('disabled', !hasData)
64226               .property('checked', showsData);
64227       }
64228
64229
64230       function editCustom() {
64231           event.preventDefault();
64232           context.container()
64233               .call(settingsCustomData);
64234       }
64235
64236
64237       function customChanged(d) {
64238           var dataLayer = layers.layer('data');
64239
64240           if (d && d.url) {
64241               dataLayer.url(d.url);
64242           } else if (d && d.fileList) {
64243               dataLayer.fileList(d.fileList);
64244           }
64245       }
64246
64247
64248       function drawListItems(selection$$1, data, type, name, change, active) {
64249           var items = selection$$1.selectAll('li')
64250               .data(data);
64251
64252           // Exit
64253           items.exit()
64254               .remove();
64255
64256           // Enter
64257           var enter = items.enter()
64258               .append('li')
64259               .attr('class', 'layer')
64260               .call(tooltip()
64261                   .html(true)
64262                   .title(function(d) {
64263                       var tip = t(name + '.' + d + '.tooltip'),
64264                           key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
64265
64266                       if (name === 'feature' && autoHiddenFeature(d)) {
64267                           var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
64268                           tip += '<div>' + msg + '</div>';
64269                       }
64270                       return uiTooltipHtml(tip, key);
64271                   })
64272                   .placement('top')
64273               );
64274
64275           var label = enter
64276               .append('label');
64277
64278           label
64279               .append('input')
64280               .attr('type', type)
64281               .attr('name', name)
64282               .on('change', change);
64283
64284           label
64285               .append('span')
64286               .text(function(d) { return t(name + '.' + d + '.description'); });
64287
64288           // Update
64289           items = items
64290               .merge(enter);
64291
64292           items
64293               .classed('active', active)
64294               .selectAll('input')
64295               .property('checked', active)
64296               .property('indeterminate', function(d) {
64297                   return (name === 'feature' && autoHiddenFeature(d));
64298               });
64299       }
64300
64301
64302       function renderDataLayers(selection$$1) {
64303           var container = selection$$1.selectAll('data-layer-container')
64304               .data([0]);
64305
64306           _dataLayerContainer = container.enter()
64307               .append('div')
64308               .attr('class', 'data-layer-container')
64309               .merge(container);
64310       }
64311
64312
64313       function renderFillList(selection$$1) {
64314           var container = selection$$1.selectAll('layer-fill-list')
64315               .data([0]);
64316
64317           _fillList = container.enter()
64318               .append('ul')
64319               .attr('class', 'layer-list layer-fill-list')
64320               .merge(container);
64321       }
64322
64323
64324       function renderFeatureList(selection$$1) {
64325           var container = selection$$1.selectAll('layer-feature-list')
64326               .data([0]);
64327
64328           _featureList = container.enter()
64329               .append('ul')
64330               .attr('class', 'layer-list layer-feature-list')
64331               .merge(container);
64332       }
64333
64334
64335       function update() {
64336           _dataLayerContainer
64337               .call(drawOsmItems)
64338               .call(drawPhotoItems)
64339               .call(drawCustomDataItems)
64340               .call(drawVectorItems);      // Beta - Detroit mapping challenge
64341
64342           _fillList
64343               .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
64344
64345           _featureList
64346               .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
64347       }
64348
64349
64350       function toggleWireframe() {
64351           if (event) {
64352               event.preventDefault();
64353               event.stopPropagation();
64354           }
64355
64356           if (_fillSelected === 'wireframe') {
64357               _fillSelected = context.storage('area-fill-toggle') || 'partial';
64358           } else {
64359               _fillSelected = 'wireframe';
64360           }
64361
64362           setFill(_fillSelected);
64363           context.map().pan([0,0]);  // trigger a redraw
64364       }
64365
64366
64367       function mapData(selection$$1) {
64368
64369           function hidePane() {
64370               setVisible(false);
64371           }
64372
64373           function togglePane() {
64374               if (event) event.preventDefault();
64375               paneTooltip.hide(button);
64376               setVisible(!button.classed('active'));
64377           }
64378
64379           function setVisible(show) {
64380               if (show !== _shown) {
64381                   button.classed('active', show);
64382                   _shown = show;
64383
64384                   if (show) {
64385                       uiBackground.hidePane();
64386                       uiHelp.hidePane();
64387                       update();
64388
64389                       pane
64390                           .style('display', 'block')
64391                           .style('right', '-300px')
64392                           .transition()
64393                           .duration(200)
64394                           .style('right', '0px');
64395
64396                   } else {
64397                       pane
64398                           .style('display', 'block')
64399                           .style('right', '0px')
64400                           .transition()
64401                           .duration(200)
64402                           .style('right', '-300px')
64403                           .on('end', function() {
64404                               select(this).style('display', 'none');
64405                           });
64406                   }
64407               }
64408           }
64409
64410
64411           var pane = selection$$1
64412               .append('div')
64413               .attr('class', 'fillL map-pane hide');
64414
64415           var paneTooltip = tooltip()
64416               .placement((textDirection === 'rtl') ? 'right' : 'left')
64417               .html(true)
64418               .title(uiTooltipHtml(t('map_data.description'), key));
64419
64420           var button = selection$$1
64421               .append('button')
64422               .attr('tabindex', -1)
64423               .on('click', togglePane)
64424               .call(svgIcon('#iD-icon-data', 'light'))
64425               .call(paneTooltip);
64426
64427
64428           var heading = pane
64429               .append('div')
64430               .attr('class', 'pane-heading');
64431
64432           heading
64433               .append('h2')
64434               .text(t('map_data.title'));
64435
64436           heading
64437               .append('button')
64438               .on('click', function() { uiMapData.hidePane(); })
64439               .call(svgIcon('#iD-icon-close'));
64440
64441
64442           var content = pane
64443               .append('div')
64444               .attr('class', 'pane-content');
64445
64446           // data layers
64447           content
64448               .append('div')
64449               .attr('class', 'map-data-data-layers')
64450               .call(uiDisclosure(context, 'data_layers', true)
64451                   .title(t('map_data.data_layers'))
64452                   .content(renderDataLayers)
64453               );
64454
64455           // area fills
64456           content
64457               .append('div')
64458               .attr('class', 'map-data-area-fills')
64459               .call(uiDisclosure(context, 'fill_area', false)
64460                   .title(t('map_data.fill_area'))
64461                   .content(renderFillList)
64462               );
64463
64464           // feature filters
64465           content
64466               .append('div')
64467               .attr('class', 'map-data-feature-filters')
64468               .call(uiDisclosure(context, 'map_features', false)
64469                   .title(t('map_data.map_features'))
64470                   .content(renderFeatureList)
64471               );
64472
64473
64474           // add listeners
64475           context.features()
64476               .on('change.map_data-update', update);
64477
64478           update();
64479           setFill(_fillSelected);
64480
64481           context.keybinding()
64482               .on(key, togglePane)
64483               .on(t('area_fill.wireframe.key'), toggleWireframe);
64484
64485           uiMapData.hidePane = hidePane;
64486           uiMapData.togglePane = togglePane;
64487           uiMapData.setVisible = setVisible;
64488       }
64489
64490       return mapData;
64491   }
64492
64493   function uiShortcuts(context) {
64494       var detected = utilDetect();
64495       var _activeTab = 0;
64496       var _modalSelection;
64497       var _selection = select(null);
64498
64499
64500       context.keybinding()
64501           .on(t('shortcuts.toggle.key'), function () {
64502               if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
64503                   if (_modalSelection) {
64504                       _modalSelection.close();
64505                       _modalSelection = null;
64506                   }
64507               } else {
64508                   _modalSelection = uiModal(_selection);
64509                   shortcutsModal(_modalSelection);
64510               }
64511           });
64512
64513
64514       function shortcutsModal(_modalSelection) {
64515           _modalSelection.select('.modal')
64516               .classed('modal-shortcuts', true);
64517
64518           var shortcutsModal = _modalSelection.select('.content');
64519
64520           shortcutsModal
64521               .append('div')
64522               .attr('class', 'modal-section')
64523               .append('h3')
64524               .text(t('shortcuts.title'));
64525
64526           shortcutsModal
64527               .call(render);
64528       }
64529
64530
64531       function render(selection$$1) {
64532           var wrapper = selection$$1
64533               .selectAll('.wrapper')
64534               .data([0]);
64535
64536           var wrapperEnter = wrapper
64537               .enter()
64538               .append('div')
64539               .attr('class', 'wrapper modal-section');
64540
64541           var tabsBar = wrapperEnter
64542               .append('div')
64543               .attr('class', 'tabs-bar');
64544
64545           var shortcutsList = wrapperEnter
64546               .append('div')
64547               .attr('class', 'shortcuts-list');
64548
64549           wrapper = wrapper.merge(wrapperEnter);
64550
64551           var tabs = tabsBar
64552               .selectAll('.tab')
64553               .data(dataShortcuts);
64554
64555           var tabsEnter = tabs
64556               .enter()
64557               .append('div')
64558               .attr('class', 'tab')
64559               .on('click', function (d, i) {
64560                   _activeTab = i;
64561                   render(selection$$1);
64562               });
64563
64564           tabsEnter
64565               .append('span')
64566               .text(function (d) { return t(d.text); });
64567
64568           tabs = tabs
64569               .merge(tabsEnter);
64570
64571           // Update
64572           wrapper.selectAll('.tab')
64573               .classed('active', function (d, i) {
64574                   return i === _activeTab;
64575               });
64576
64577
64578           var shortcuts = shortcutsList
64579               .selectAll('.shortcut-tab')
64580               .data(dataShortcuts);
64581
64582           var shortcutsEnter = shortcuts
64583               .enter()
64584               .append('div')
64585               .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
64586
64587           var columnsEnter = shortcutsEnter
64588               .selectAll('.shortcut-column')
64589               .data(function (d) { return d.columns; })
64590               .enter()
64591               .append('table')
64592               .attr('class', 'shortcut-column');
64593
64594           var rowsEnter = columnsEnter
64595               .selectAll('.shortcut-row')
64596               .data(function (d) { return d.rows; })
64597               .enter()
64598               .append('tr')
64599               .attr('class', 'shortcut-row');
64600
64601
64602           var sectionRows = rowsEnter
64603               .filter(function (d) { return !d.shortcuts; });
64604
64605           sectionRows
64606               .append('td');
64607
64608           sectionRows
64609               .append('td')
64610               .attr('class', 'shortcut-section')
64611               .append('h3')
64612               .text(function (d) { return t(d.text); });
64613
64614
64615           var shortcutRows = rowsEnter
64616               .filter(function (d) { return d.shortcuts; });
64617
64618           var shortcutKeys = shortcutRows
64619               .append('td')
64620               .attr('class', 'shortcut-keys');
64621
64622           var modifierKeys = shortcutKeys
64623               .filter(function (d) { return d.modifiers; });
64624
64625           modifierKeys
64626               .selectAll('kbd.modifier')
64627               .data(function (d) {
64628                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
64629                       return ['⌘'];
64630                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
64631                       return [];
64632                   } else {
64633                       return d.modifiers;
64634                   }
64635               })
64636               .enter()
64637               .each(function () {
64638                   var selection$$1 = select(this);
64639
64640                   selection$$1
64641                       .append('kbd')
64642                       .attr('class', 'modifier')
64643                       .text(function (d) { return uiCmd.display(d); });
64644
64645                   selection$$1
64646                       .append('span')
64647                       .text('+');
64648               });
64649
64650
64651           shortcutKeys
64652               .selectAll('kbd.shortcut')
64653               .data(function (d) {
64654                   var arr = d.shortcuts;
64655                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
64656                       arr = ['Y'];
64657                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
64658                       arr = ['F11'];
64659                   }
64660
64661                   return arr.map(function(s) {
64662                       return {
64663                           shortcut: s,
64664                           separator: d.separator
64665                       };
64666                   });
64667               })
64668               .enter()
64669               .each(function (d, i, nodes) {
64670                   var selection$$1 = select(this);
64671                   var click = d.shortcut.toLowerCase().match(/(.*).click/);
64672
64673                   if (click && click[1]) {
64674                       selection$$1
64675                           .call(svgIcon('#iD-walkthrough-mouse', 'mouseclick', click[1]));
64676                   } else {
64677                       selection$$1
64678                           .append('kbd')
64679                           .attr('class', 'shortcut')
64680                           .text(function (d) {
64681                               var key = d.shortcut;
64682                               return key.indexOf('.') !== -1 ? uiCmd.display(t(key)) : uiCmd.display(key);
64683                           });
64684                   }
64685
64686                   if (i < nodes.length - 1) {
64687                       selection$$1
64688                           .append('span')
64689                           .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
64690                   }
64691               });
64692
64693
64694           shortcutKeys
64695               .filter(function(d) { return d.gesture; })
64696               .each(function () {
64697                   var selection$$1 = select(this);
64698
64699                   selection$$1
64700                       .append('span')
64701                       .text('+');
64702
64703                   selection$$1
64704                       .append('span')
64705                       .attr('class', 'gesture')
64706                       .text(function (d) { return t(d.gesture); });
64707               });
64708
64709
64710           shortcutRows
64711               .append('td')
64712               .attr('class', 'shortcut-desc')
64713               .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
64714
64715
64716           shortcuts = shortcuts
64717               .merge(shortcutsEnter);
64718
64719           // Update
64720           wrapper.selectAll('.shortcut-tab')
64721               .style('display', function (d, i) {
64722                   return i === _activeTab ? 'flex' : 'none';
64723               });
64724       }
64725
64726
64727       return function(selection$$1, show) {
64728           _selection = selection$$1;
64729           if (show) {
64730               _modalSelection = uiModal(selection$$1);
64731               shortcutsModal(_modalSelection);
64732           }
64733       };
64734   }
64735
64736   function uiHelp(context) {
64737       var key = t('help.key');
64738
64739       var docKeys = [
64740           ['help', [
64741               'welcome',
64742               'open_data_h',
64743               'open_data',
64744               'before_start_h',
64745               'before_start',
64746               'open_source_h',
64747               'open_source',
64748               'open_source_help'
64749           ]],
64750           ['overview', [
64751               'navigation_h',
64752               'navigation_drag',
64753               'navigation_zoom',
64754               'features_h',
64755               'features',
64756               'nodes_ways'
64757           ]],
64758           ['editing', [
64759               'select_h',
64760               'select_left_click',
64761               'select_right_click',
64762               'multiselect_h',
64763               'multiselect_shift_click',
64764               'multiselect_lasso',
64765               'undo_redo_h',
64766               'undo_redo',
64767               'save_h',
64768               'save',
64769               'save_validation',
64770               'upload_h',
64771               'upload',
64772               'backups_h',
64773               'backups',
64774               'keyboard_h',
64775               'keyboard'
64776           ]],
64777           ['feature_editor', [
64778               'intro',
64779               'definitions',
64780               'type_h',
64781               'type',
64782               'type_picker',
64783               'fields_h',
64784               'fields_all_fields',
64785               'fields_example',
64786               'fields_add_field',
64787               'tags_h',
64788               'tags_all_tags',
64789               'tags_resources'
64790           ]],
64791           ['points', [
64792               'intro',
64793               'add_point_h',
64794               'add_point',
64795               'add_point_finish',
64796               'move_point_h',
64797               'move_point',
64798               'delete_point_h',
64799               'delete_point',
64800               'delete_point_command'
64801           ]],
64802           ['lines', [
64803               'intro',
64804               'add_line_h',
64805               'add_line',
64806               'add_line_draw',
64807               'add_line_finish',
64808               'modify_line_h',
64809               'modify_line_dragnode',
64810               'modify_line_addnode',
64811               'connect_line_h',
64812               'connect_line',
64813               'connect_line_display',
64814               'connect_line_drag',
64815               'connect_line_tag',
64816               'disconnect_line_h',
64817               'disconnect_line_command',
64818               'move_line_h',
64819               'move_line_command',
64820               'move_line_connected',
64821               'delete_line_h',
64822               'delete_line',
64823               'delete_line_command'
64824           ]],
64825           ['areas', [
64826               'intro',
64827               'point_or_area_h',
64828               'point_or_area',
64829               'add_area_h',
64830               'add_area_command',
64831               'add_area_draw',
64832               'add_area_finish',
64833               'square_area_h',
64834               'square_area_command',
64835               'modify_area_h',
64836               'modify_area_dragnode',
64837               'modify_area_addnode',
64838               'delete_area_h',
64839               'delete_area',
64840               'delete_area_command'
64841           ]],
64842           ['relations', [
64843               'intro',
64844               'edit_relation_h',
64845               'edit_relation',
64846               'edit_relation_add',
64847               'edit_relation_delete',
64848               'maintain_relation_h',
64849               'maintain_relation',
64850               'relation_types_h',
64851               'multipolygon_h',
64852               'multipolygon',
64853               'multipolygon_create',
64854               'multipolygon_merge',
64855               'turn_restriction_h',
64856               'turn_restriction',
64857               'turn_restriction_field',
64858               'turn_restriction_editing',
64859               'route_h',
64860               'route',
64861               'route_add',
64862               'boundary_h',
64863               'boundary',
64864               'boundary_add'
64865           ]],
64866           ['notes', [
64867               'intro',
64868               'add_note_h',
64869               'add_note',
64870               'move_note',
64871               'update_note_h',
64872               'update_note',
64873               'save_note_h',
64874               'save_note'
64875           ]],
64876
64877           ['imagery', [
64878               'intro',
64879               'sources_h',
64880               'choosing',
64881               'sources',
64882               'offsets_h',
64883               'offset',
64884               'offset_change'
64885           ]],
64886           ['streetlevel', [
64887               'intro',
64888               'using_h',
64889               'using',
64890               'photos',
64891               'viewer'
64892           ]],
64893           ['gps', [
64894               'intro',
64895               'survey',
64896               'using_h',
64897               'using',
64898               'tracing',
64899               'upload'
64900           ]]
64901       ];
64902
64903       var headings = {
64904           'help.help.open_data_h': 3,
64905           'help.help.before_start_h': 3,
64906           'help.help.open_source_h': 3,
64907           'help.overview.navigation_h': 3,
64908           'help.overview.features_h': 3,
64909           'help.editing.select_h': 3,
64910           'help.editing.multiselect_h': 3,
64911           'help.editing.undo_redo_h': 3,
64912           'help.editing.save_h': 3,
64913           'help.editing.upload_h': 3,
64914           'help.editing.backups_h': 3,
64915           'help.editing.keyboard_h': 3,
64916           'help.feature_editor.type_h': 3,
64917           'help.feature_editor.fields_h': 3,
64918           'help.feature_editor.tags_h': 3,
64919           'help.points.add_point_h': 3,
64920           'help.points.move_point_h': 3,
64921           'help.points.delete_point_h': 3,
64922           'help.lines.add_line_h': 3,
64923           'help.lines.modify_line_h': 3,
64924           'help.lines.connect_line_h': 3,
64925           'help.lines.disconnect_line_h': 3,
64926           'help.lines.move_line_h': 3,
64927           'help.lines.delete_line_h': 3,
64928           'help.areas.point_or_area_h': 3,
64929           'help.areas.add_area_h': 3,
64930           'help.areas.square_area_h': 3,
64931           'help.areas.modify_area_h': 3,
64932           'help.areas.delete_area_h': 3,
64933           'help.relations.edit_relation_h': 3,
64934           'help.relations.maintain_relation_h': 3,
64935           'help.relations.relation_types_h': 2,
64936           'help.relations.multipolygon_h': 3,
64937           'help.relations.turn_restriction_h': 3,
64938           'help.relations.route_h': 3,
64939           'help.relations.boundary_h': 3,
64940           'help.notes.add_note_h': 3,
64941           'help.notes.update_note_h': 3,
64942           'help.notes.save_note_h': 3,
64943           'help.imagery.sources_h': 3,
64944           'help.imagery.offsets_h': 3,
64945           'help.streetlevel.using_h': 3,
64946           'help.gps.using_h': 3,
64947       };
64948
64949       var replacements = {
64950           point: icon('#iD-icon-point', 'pre-text'),
64951           line: icon('#iD-icon-line', 'pre-text'),
64952           area: icon('#iD-icon-area', 'pre-text'),
64953           note: icon('#iD-icon-note', 'pre-text add-note'),
64954           plus: icon('#iD-icon-plus', 'pre-text'),
64955           minus: icon('#iD-icon-minus', 'pre-text'),
64956           orthogonalize: icon('#iD-operation-orthogonalize', 'pre-text'),
64957           disconnect: icon('#iD-operation-disconnect', 'pre-text'),
64958           layers: icon('#iD-icon-layers', 'pre-text'),
64959           data: icon('#iD-icon-data', 'pre-text'),
64960           inspect: icon('#iD-icon-inspect', 'pre-text'),
64961           move: icon('#iD-operation-move', 'pre-text'),
64962           merge: icon('#iD-operation-merge', 'pre-text'),
64963           delete: icon('#iD-operation-delete', 'pre-text'),
64964           close: icon('#iD-icon-close', 'pre-text'),
64965           undo: icon(textDirection === 'rtl' ? '#iD-icon-redo' : '#iD-icon-undo', 'pre-text'),
64966           redo: icon(textDirection === 'rtl' ? '#iD-icon-undo' : '#iD-icon-redo', 'pre-text'),
64967           save: icon('#iD-icon-save', 'pre-text'),
64968           leftclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'left'),
64969           rightclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'right'),
64970           shift: uiCmd.display('⇧'),
64971           alt: uiCmd.display('⌥'),
64972           return: uiCmd.display('↵'),
64973           version: context.version
64974       };
64975
64976       // For each section, squash all the texts into a single markdown document
64977       var docs = docKeys.map(function(key) {
64978           var helpkey = 'help.' + key[0];
64979           var text = key[1].reduce(function(all, part) {
64980               var subkey = helpkey + '.' + part;
64981               var depth = headings[subkey];                              // is this subkey a heading?
64982               var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
64983               return all + hhh + t(subkey, replacements) + '\n\n';
64984           }, '');
64985
64986           return {
64987               title: t(helpkey + '.title'),
64988               html: marked(text.trim())
64989           };
64990       });
64991
64992
64993       function help(selection$$1) {
64994
64995           function hidePane() {
64996               setVisible(false);
64997           }
64998
64999
65000           function togglePane() {
65001               if (event) event.preventDefault();
65002               tooltipBehavior.hide(button);
65003               setVisible(!button.classed('active'));
65004           }
65005
65006
65007           function setVisible(show) {
65008               if (show !== shown) {
65009                   button.classed('active', show);
65010                   shown = show;
65011
65012                   if (show) {
65013                       uiBackground.hidePane();
65014                       uiMapData.hidePane();
65015
65016                       pane.style('display', 'block')
65017                           .style('right', '-500px')
65018                           .transition()
65019                           .duration(200)
65020                           .style('right', '0px');
65021
65022                   } else {
65023                       pane.style('right', '0px')
65024                           .transition()
65025                           .duration(200)
65026                           .style('right', '-500px')
65027                           .on('end', function() {
65028                               select(this).style('display', 'none');
65029                           });
65030                   }
65031               }
65032           }
65033
65034
65035           function clickHelp(d, i) {
65036               var rtl = (textDirection === 'rtl');
65037               content.property('scrollTop', 0);
65038               doctitle.html(d.title);
65039
65040               body.html(d.html);
65041               body.selectAll('a')
65042                   .attr('target', '_blank');
65043               menuItems.classed('selected', function(m) {
65044                   return m.title === d.title;
65045               });
65046
65047               nav.html('');
65048               if (rtl) {
65049                   nav.call(drawNext).call(drawPrevious);
65050               } else {
65051                   nav.call(drawPrevious).call(drawNext);
65052               }
65053
65054
65055               function drawNext(selection$$1) {
65056                   if (i < docs.length - 1) {
65057                       var nextLink = selection$$1
65058                           .append('a')
65059                           .attr('class', 'next')
65060                           .on('click', function() {
65061                               clickHelp(docs[i + 1], i + 1);
65062                           });
65063
65064                       nextLink
65065                           .append('span')
65066                           .text(docs[i + 1].title)
65067                           .call(svgIcon((rtl ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
65068                   }
65069               }
65070
65071
65072               function drawPrevious(selection$$1) {
65073                   if (i > 0) {
65074                       var prevLink = selection$$1
65075                           .append('a')
65076                           .attr('class', 'previous')
65077                           .on('click', function() {
65078                               clickHelp(docs[i - 1], i - 1);
65079                           });
65080
65081                       prevLink
65082                           .call(svgIcon((rtl ? '#iD-icon-forward' : '#iD-icon-backward'), 'inline'))
65083                           .append('span')
65084                           .text(docs[i - 1].title);
65085                   }
65086               }
65087           }
65088
65089
65090           function clickWalkthrough() {
65091               if (context.inIntro()) return;
65092               context.container().call(uiIntro(context));
65093               setVisible(false);
65094           }
65095
65096
65097           function clickShortcuts() {
65098               context.container().call(uiShortcuts(context), true);
65099           }
65100
65101
65102           var pane = selection$$1.append('div')
65103               .attr('class', 'help-wrap map-pane fillL hide');
65104
65105           var tooltipBehavior = tooltip()
65106               .placement((textDirection === 'rtl') ? 'right' : 'left')
65107               .html(true)
65108               .title(uiTooltipHtml(t('help.title'), key));
65109
65110           var button = selection$$1.append('button')
65111               .attr('tabindex', -1)
65112               .on('click', togglePane)
65113               .call(svgIcon('#iD-icon-help', 'light'))
65114               .call(tooltipBehavior);
65115
65116           var shown = false;
65117
65118
65119           var heading = pane
65120               .append('div')
65121               .attr('class', 'pane-heading');
65122
65123           var doctitle = heading
65124               .append('h2')
65125               .text(t('help.title'));
65126
65127           heading
65128               .append('button')
65129               .on('click', function() { uiHelp.hidePane(); })
65130               .call(svgIcon('#iD-icon-close'));
65131
65132
65133           var content = pane
65134               .append('div')
65135               .attr('class', 'pane-content');
65136
65137           var toc = content
65138               .append('ul')
65139               .attr('class', 'toc');
65140
65141           var menuItems = toc.selectAll('li')
65142               .data(docs)
65143               .enter()
65144               .append('li')
65145               .append('a')
65146               .html(function(d) { return d.title; })
65147               .on('click', clickHelp);
65148
65149           var shortcuts = toc
65150               .append('li')
65151               .attr('class', 'shortcuts')
65152               .call(tooltip()
65153                   .html(true)
65154                   .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
65155                   .placement('top')
65156               )
65157               .append('a')
65158               .on('click', clickShortcuts);
65159
65160           shortcuts
65161               .append('div')
65162               .text(t('shortcuts.title'));
65163
65164           var walkthrough = toc
65165               .append('li')
65166               .attr('class', 'walkthrough')
65167               .append('a')
65168               .on('click', clickWalkthrough);
65169
65170           walkthrough
65171               .append('svg')
65172               .attr('class', 'logo logo-walkthrough')
65173               .append('use')
65174               .attr('xlink:href', '#iD-logo-walkthrough');
65175
65176           walkthrough
65177               .append('div')
65178               .text(t('splash.walkthrough'));
65179
65180
65181           var helpContent = content
65182               .append('div')
65183               .attr('class', 'left-content');
65184
65185           var body = helpContent
65186               .append('div')
65187               .attr('class', 'body');
65188
65189           var nav = helpContent
65190               .append('div')
65191               .attr('class', 'nav');
65192
65193           clickHelp(docs[0], 0);
65194
65195           context.keybinding()
65196               .on(key, togglePane);
65197
65198           uiHelp.hidePane = hidePane;
65199           uiHelp.togglePane = togglePane;
65200           uiHelp.setVisible = setVisible;
65201       }
65202
65203       return help;
65204   }
65205
65206   function localeDateString(s) {
65207       if (!s) return null;
65208       var detected = utilDetect();
65209       var options = { day: 'numeric', month: 'short', year: 'numeric' };
65210       var d = new Date(s);
65211       if (isNaN(d.getTime())) return null;
65212       return d.toLocaleDateString(detected.locale, options);
65213   }
65214
65215   function vintageRange(vintage) {
65216       var s;
65217       if (vintage.start || vintage.end) {
65218           s = (vintage.start || '?');
65219           if (vintage.start !== vintage.end) {
65220               s += ' - ' + (vintage.end || '?');
65221           }
65222       }
65223       return s;
65224   }
65225
65226
65227   function rendererBackgroundSource(data) {
65228       var source = clone(data);
65229       var offset = [0, 0];
65230       var name = source.name;
65231       var description = source.description;
65232       var best = !!source.best;
65233       var template = source.template;
65234
65235       source.tileSize = data.tileSize || 256;
65236       source.zoomExtent = data.zoomExtent || [0, 22];
65237       source.overzoom = data.overzoom !== false;
65238
65239       source.offset = function(_) {
65240           if (!arguments.length) return offset;
65241           offset = _;
65242           return source;
65243       };
65244
65245
65246       source.nudge = function(_, zoomlevel) {
65247           offset[0] += _[0] / Math.pow(2, zoomlevel);
65248           offset[1] += _[1] / Math.pow(2, zoomlevel);
65249           return source;
65250       };
65251
65252
65253       source.name = function() {
65254           var id_safe = source.id.replace('.', '<TX_DOT>');
65255           return t('imagery.' + id_safe + '.name', { default: name });
65256       };
65257
65258
65259       source.description = function() {
65260           var id_safe = source.id.replace('.', '<TX_DOT>');
65261           return t('imagery.' + id_safe + '.description', { default: description });
65262       };
65263
65264
65265       source.best = function() {
65266           return best;
65267       };
65268
65269
65270       source.area = function() {
65271           if (!data.polygon) return Number.MAX_VALUE;  // worldwide
65272           var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
65273           return isNaN(area) ? 0 : area;
65274       };
65275
65276
65277       source.imageryUsed = function() {
65278           return name || source.id;
65279       };
65280
65281
65282       source.template = function(_) {
65283           if (!arguments.length) return template;
65284           if (source.id === 'custom') template = _;
65285           return source;
65286       };
65287
65288
65289       source.url = function(coord) {
65290           if (this.type === 'wms') {
65291               var tileToProjectedCoords = (function(x, y, z) {
65292                   //polyfill for IE11, PhantomJS
65293                   var sinh = Math.sinh || function(x) {
65294                       var y = Math.exp(x);
65295                       return (y - 1 / y) / 2;
65296                   };
65297
65298                   var zoomSize = Math.pow(2, z);
65299                   var lon = x / zoomSize * Math.PI * 2 - Math.PI;
65300                   var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
65301
65302                   switch (this.projection) {
65303                       case 'EPSG:4326':
65304                           return {
65305                               x: lon * 180 / Math.PI,
65306                               y: lat * 180 / Math.PI
65307                           };
65308                       default: // EPSG:3857 and synonyms
65309                           var mercCoords = mercatorRaw(lon, lat);
65310                           return {
65311                               x: 20037508.34 / Math.PI * mercCoords[0],
65312                               y: 20037508.34 / Math.PI * mercCoords[1]
65313                           };
65314                   }
65315               }).bind(this);
65316
65317               var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
65318               var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
65319               return template
65320                   .replace('{width}', this.tileSize)
65321                   .replace('{height}', this.tileSize)
65322                   .replace('{proj}', this.projection)
65323                   .replace('{bbox}', minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y);
65324           }
65325           return template
65326               .replace('{x}', coord[0])
65327               .replace('{y}', coord[1])
65328               // TMS-flipped y coordinate
65329               .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
65330               .replace(/\{z(oom)?\}/, coord[2])
65331               .replace(/\{switch:([^}]+)\}/, function(s, r) {
65332                   var subdomains = r.split(',');
65333                   return subdomains[(coord[0] + coord[1]) % subdomains.length];
65334               })
65335               .replace('{u}', function() {
65336                   var u = '';
65337                   for (var zoom = coord[2]; zoom > 0; zoom--) {
65338                       var b = 0;
65339                       var mask = 1 << (zoom - 1);
65340                       if ((coord[0] & mask) !== 0) b++;
65341                       if ((coord[1] & mask) !== 0) b += 2;
65342                       u += b.toString();
65343                   }
65344                   return u;
65345               });
65346       };
65347
65348
65349       source.validZoom = function(z) {
65350           return source.zoomExtent[0] <= z &&
65351               (source.overzoom || source.zoomExtent[1] > z);
65352       };
65353
65354
65355       source.isLocatorOverlay = function() {
65356           return source.id === 'mapbox_locator_overlay';
65357       };
65358
65359
65360       /* hides a source from the list, but leaves it available for use */
65361       source.isHidden = function() {
65362           return source.id === 'DigitalGlobe-Premium-vintage' ||
65363               source.id === 'DigitalGlobe-Standard-vintage';
65364       };
65365
65366
65367       source.copyrightNotices = function() {};
65368
65369
65370       source.getMetadata = function(center, tileCoord, callback) {
65371           var vintage = {
65372               start: localeDateString(source.startDate),
65373               end: localeDateString(source.endDate)
65374           };
65375           vintage.range = vintageRange(vintage);
65376
65377           var metadata = { vintage: vintage };
65378           callback(null, metadata);
65379       };
65380
65381
65382       return source;
65383   }
65384
65385
65386   rendererBackgroundSource.Bing = function(data, dispatch) {
65387       // http://msdn.microsoft.com/en-us/library/ff701716.aspx
65388       // http://msdn.microsoft.com/en-us/library/ff701701.aspx
65389
65390       data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
65391
65392       var bing = rendererBackgroundSource(data);
65393       var key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU'; // Same as P2 and JOSM
65394       var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
65395               key;
65396       var cache = {};
65397       var inflight = {};
65398       var providers = [];
65399
65400       d3_json(url, function(err, json$$1) {
65401           providers = json$$1.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
65402               return {
65403                   attribution: provider.attribution,
65404                   areas: provider.coverageAreas.map(function(area) {
65405                       return {
65406                           zoom: [area.zoomMin, area.zoomMax],
65407                           extent: geoExtent$$1([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
65408                       };
65409                   })
65410               };
65411           });
65412           dispatch.call('change');
65413       });
65414
65415
65416       bing.copyrightNotices = function(zoom, extent) {
65417           zoom = Math.min(zoom, 21);
65418           return providers.filter(function(provider) {
65419               return some(provider.areas, function(area) {
65420                   return extent.intersects(area.extent) &&
65421                       area.zoom[0] <= zoom &&
65422                       area.zoom[1] >= zoom;
65423               });
65424           }).map(function(provider) {
65425               return provider.attribution;
65426           }).join(', ');
65427       };
65428
65429
65430       bing.getMetadata = function(center, tileCoord, callback) {
65431           var tileId = tileCoord.slice(0, 3).join('/');
65432           var zoom = Math.min(tileCoord[2], 21);
65433           var centerPoint = center[1] + ',' + center[0];  // lat,lng
65434           var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
65435                   '?zl=' + zoom + '&key=' + key;
65436
65437           if (inflight[tileId]) return;
65438
65439           if (!cache[tileId]) {
65440               cache[tileId] = {};
65441           }
65442           if (cache[tileId] && cache[tileId].metadata) {
65443               return callback(null, cache[tileId].metadata);
65444           }
65445
65446           inflight[tileId] = true;
65447           d3_json(url, function(error, result) {
65448               delete inflight[tileId];
65449
65450               var err;
65451               if (error) {
65452                   err = error;
65453               } else if (!result && 'Unknown Error') {
65454                   err = result.errorDetails;
65455               }
65456               if (err) {
65457                   return callback(err);
65458               } else {
65459                   var vintage = {
65460                       start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
65461                       end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
65462                   };
65463                   vintage.range = vintageRange(vintage);
65464
65465                   var metadata = { vintage: vintage };
65466                   cache[tileId].metadata = metadata;
65467                   return callback(null, metadata);
65468               }
65469           });
65470       };
65471
65472
65473       bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
65474
65475
65476       return bing;
65477   };
65478
65479
65480
65481   rendererBackgroundSource.Esri = function(data) {
65482       // in addition to using the tilemap at zoom level 20, overzoom real tiles - #4327 (deprecated technique, but it works)
65483       if (data.template.match(/blankTile/) === null) {
65484           data.template = data.template + '?blankTile=false';
65485       }
65486
65487       var esri = rendererBackgroundSource(data);
65488       var cache = {};
65489       var inflight = {};
65490       var _prevCenter;
65491
65492       // use a tilemap service to set maximum zoom for esri tiles dynamically
65493       // https://developers.arcgis.com/documentation/tiled-elevation-service/
65494       esri.fetchTilemap = function(center) {
65495           // skip if we have already fetched a tilemap within 5km
65496           if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5000) return;
65497           _prevCenter = center;
65498
65499           // tiles are available globally to zoom level 19, afterward they may or may not be present
65500           var z = 20;
65501
65502           // first generate a random url using the template
65503           var dummyUrl = esri.url([1,2,3]);
65504
65505           // calculate url z/y/x from the lat/long of the center of the map
65506           var x = (Math.floor((center[0] + 180) / 360 * Math.pow(2, z)));
65507           var y = (Math.floor((1 - Math.log(Math.tan(center[1] * Math.PI / 180) + 1 / Math.cos(center[1] * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, z)));
65508
65509           // fetch an 8x8 grid to leverage cache
65510           var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, 'tilemap') + '/' + z + '/' + y + '/' + x + '/8/8';
65511
65512           // make the request and introspect the response from the tilemap server
65513           d3_json(tilemapUrl, function (err, tilemap) {
65514               if (err || !tilemap) return;
65515
65516               var hasTiles = true;
65517               for (var i = 0; i < tilemap.data.length; i++) {
65518                   // 0 means an individual tile in the grid doesn't exist
65519                   if (!tilemap.data[i]) {
65520                       hasTiles = false;
65521                       break;
65522                   }
65523               }
65524
65525               // if any tiles are missing at level 20 we restrict maxZoom to 19
65526               esri.zoomExtent[1] = (hasTiles ? 22 : 19);
65527           });
65528       };
65529
65530       esri.getMetadata = function(center, tileCoord, callback) {
65531           var tileId = tileCoord.slice(0, 3).join('/');
65532           var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
65533           var centerPoint = center[0] + ',' + center[1];  // long, lat (as it should be)
65534           var unknown = t('info_panels.background.unknown');
65535           var metadataLayer;
65536           var vintage = {};
65537           var metadata = {};
65538
65539           if (inflight[tileId]) return;
65540
65541           switch (true) {
65542               case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
65543                   metadataLayer = 4;
65544                   break;
65545               case zoom >= 19:
65546                   metadataLayer = 3;
65547                   break;
65548               case zoom >= 17:
65549                   metadataLayer = 2;
65550                   break;
65551               case zoom >= 13:
65552                   metadataLayer = 0;
65553                   break;
65554               default:
65555                   metadataLayer = 99;
65556           }
65557
65558           var url;
65559           // build up query using the layer appropriate to the current zoom
65560           if (esri.id === 'EsriWorldImagery') {
65561               url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
65562           } else if (esri.id === 'EsriWorldImageryClarity') {
65563               url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
65564           }
65565
65566           url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json';
65567
65568           if (!cache[tileId]) {
65569               cache[tileId] = {};
65570           }
65571           if (cache[tileId] && cache[tileId].metadata) {
65572               return callback(null, cache[tileId].metadata);
65573           }
65574
65575           // accurate metadata is only available >= 13
65576           if (metadataLayer === 99) {
65577               vintage = {
65578                   start: null,
65579                   end: null,
65580                   range: null
65581               };
65582               metadata = {
65583                   vintage: null,
65584                   source: unknown,
65585                   description: unknown,
65586                   resolution: unknown,
65587                   accuracy: unknown
65588               };
65589
65590               callback(null, metadata);
65591
65592           } else {
65593               inflight[tileId] = true;
65594               d3_json(url, function(error, result) {
65595                   delete inflight[tileId];
65596
65597                   var err;
65598                   if (error) {
65599                       err = error;
65600                   } else if (!result) {
65601                       err = 'Unknown Error';
65602                   } else if (result.features && result.features.length < 1) {
65603                       err = 'No Results';
65604                   } else if (result.error && result.error.message) {
65605                       err = result.error.message;
65606                   }
65607
65608                   if (err) {
65609                       return callback(err);
65610                   } else {
65611                       // pass through the discrete capture date from metadata
65612                       var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
65613                       vintage = {
65614                           start: captureDate,
65615                           end: captureDate,
65616                           range: captureDate
65617                       };
65618                       metadata = {
65619                           vintage: vintage,
65620                           source: clean(result.features[0].attributes.NICE_NAME),
65621                           description: clean(result.features[0].attributes.NICE_DESC),
65622                           resolution: clean(result.features[0].attributes.SRC_RES),
65623                           accuracy: clean(result.features[0].attributes.SRC_ACC)
65624                       };
65625
65626                       // append units - meters
65627                       if (isFinite(metadata.resolution)) {
65628                           metadata.resolution += ' m';
65629                       }
65630                       if (isFinite(metadata.accuracy)) {
65631                           metadata.accuracy += ' m';
65632                       }
65633
65634                       cache[tileId].metadata = metadata;
65635                       return callback(null, metadata);
65636                   }
65637               });
65638           }
65639
65640
65641           function clean(val) {
65642               return String(val).trim() || unknown;
65643           }
65644       };
65645
65646       return esri;
65647   };
65648
65649
65650   rendererBackgroundSource.None = function() {
65651       var source = rendererBackgroundSource({ id: 'none', template: '' });
65652
65653
65654       source.name = function() {
65655           return t('background.none');
65656       };
65657
65658
65659       source.imageryUsed = function() {
65660           return 'None';
65661       };
65662
65663
65664       source.area = function() {
65665           return -1;  // sources in background pane are sorted by area
65666       };
65667
65668
65669       return source;
65670   };
65671
65672
65673   rendererBackgroundSource.Custom = function(template) {
65674       var source = rendererBackgroundSource({ id: 'custom', template: template });
65675
65676
65677       source.name = function() {
65678           return t('background.custom');
65679       };
65680
65681
65682       source.imageryUsed = function() {
65683           return 'Custom (' + source.template() + ')';
65684       };
65685
65686
65687       source.area = function() {
65688           return -2;  // sources in background pane are sorted by area
65689       };
65690
65691
65692       return source;
65693   };
65694
65695   function rendererTileLayer(context) {
65696       var transformProp = utilPrefixCSSProperty('Transform');
65697       var tiler = utilTiler();
65698
65699       var _tileSize = 256;
65700       var _projection;
65701       var _cache = {};
65702       var _tileOrigin;
65703       var _zoom;
65704       var _source;
65705
65706
65707       function tileSizeAtZoom(d, z) {
65708           var EPSILON = 0.002;    // close seams
65709           return ((_tileSize * Math.pow(2, z - d[2])) / _tileSize) + EPSILON;
65710       }
65711
65712
65713       function atZoom(t$$1, distance) {
65714           var power = Math.pow(2, distance);
65715           return [
65716               Math.floor(t$$1[0] * power),
65717               Math.floor(t$$1[1] * power),
65718               t$$1[2] + distance
65719           ];
65720       }
65721
65722
65723       function lookUp(d) {
65724           for (var up = -1; up > -d[2]; up--) {
65725               var tile = atZoom(d, up);
65726               if (_cache[_source.url(tile)] !== false) {
65727                   return tile;
65728               }
65729           }
65730       }
65731
65732
65733       function uniqueBy(a, n) {
65734           var o = [];
65735           var seen = {};
65736           for (var i = 0; i < a.length; i++) {
65737               if (seen[a[i][n]] === undefined) {
65738                   o.push(a[i]);
65739                   seen[a[i][n]] = true;
65740               }
65741           }
65742           return o;
65743       }
65744
65745
65746       function addSource(d) {
65747           d.push(_source.url(d));
65748           return d;
65749       }
65750
65751
65752       // Update tiles based on current state of `projection`.
65753       function background(selection$$1) {
65754           _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
65755
65756           var pixelOffset;
65757           if (_source) {
65758               pixelOffset = [
65759                   _source.offset()[0] * Math.pow(2, _zoom),
65760                   _source.offset()[1] * Math.pow(2, _zoom)
65761               ];
65762           } else {
65763               pixelOffset = [0, 0];
65764           }
65765
65766           var translate = [
65767               _projection.translate()[0] + pixelOffset[0],
65768               _projection.translate()[1] + pixelOffset[1]
65769           ];
65770
65771           tiler
65772               .scale(_projection.scale() * 2 * Math.PI)
65773               .translate(translate);
65774
65775           _tileOrigin = [
65776               _projection.scale() * Math.PI - translate[0],
65777               _projection.scale() * Math.PI - translate[1]
65778           ];
65779
65780           render(selection$$1);
65781       }
65782
65783
65784       // Derive the tiles onscreen, remove those offscreen and position them.
65785       // Important that this part not depend on `_projection` because it's
65786       // rentered when tiles load/error (see #644).
65787       function render(selection$$1) {
65788           if (!_source) return;
65789           var requests = [];
65790           var showDebug = context.getDebug('tile') && !_source.overlay;
65791
65792           if (_source.validZoom(_zoom)) {
65793               tiler.skipNullIsland(!!_source.overlay);
65794
65795               tiler().forEach(function(d) {
65796                   addSource(d);
65797                   if (d[3] === '') return;
65798                   if (typeof d[3] !== 'string') return; // Workaround for #2295
65799                   requests.push(d);
65800                   if (_cache[d[3]] === false && lookUp(d)) {
65801                       requests.push(addSource(lookUp(d)));
65802                   }
65803               });
65804
65805               requests = uniqueBy(requests, 3).filter(function(r) {
65806                   // don't re-request tiles which have failed in the past
65807                   return _cache[r[3]] !== false;
65808               });
65809           }
65810
65811           function load(d) {
65812               _cache[d[3]] = true;
65813               select(this)
65814                   .on('error', null)
65815                   .on('load', null)
65816                   .classed('tile-loaded', true);
65817               render(selection$$1);
65818           }
65819
65820           function error(d) {
65821               _cache[d[3]] = false;
65822               select(this)
65823                   .on('error', null)
65824                   .on('load', null)
65825                   .remove();
65826               render(selection$$1);
65827           }
65828
65829           function imageTransform(d) {
65830               var ts = _tileSize * Math.pow(2, _zoom - d[2]);
65831               var scale = tileSizeAtZoom(d, _zoom);
65832               return 'translate(' +
65833                   ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
65834                   ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
65835                   'scale(' + scale + ',' + scale + ')';
65836           }
65837
65838           function tileCenter(d) {
65839               var ts = _tileSize * Math.pow(2, _zoom - d[2]);
65840               return [
65841                   ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
65842                   ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
65843               ];
65844           }
65845
65846           function debugTransform(d) {
65847               var coord = tileCenter(d);
65848               return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
65849           }
65850
65851
65852           // Pick a representative tile near the center of the viewport
65853           // (This is useful for sampling the imagery vintage)
65854           var dims = tiler.size();
65855           var mapCenter = [dims[0] / 2, dims[1] / 2];
65856           var minDist = Math.max(dims[0], dims[1]);
65857           var nearCenter;
65858
65859           requests.forEach(function(d) {
65860               var c = tileCenter(d);
65861               var dist = geoVecLength(c, mapCenter);
65862               if (dist < minDist) {
65863                   minDist = dist;
65864                   nearCenter = d;
65865               }
65866           });
65867
65868
65869           var image = selection$$1.selectAll('img')
65870               .data(requests, function(d) { return d[3]; });
65871
65872           image.exit()
65873               .style(transformProp, imageTransform)
65874               .classed('tile-removing', true)
65875               .classed('tile-center', false)
65876               .each(function() {
65877                   var tile = select(this);
65878                   window.setTimeout(function() {
65879                       if (tile.classed('tile-removing')) {
65880                           tile.remove();
65881                       }
65882                   }, 300);
65883               });
65884
65885           image.enter()
65886             .append('img')
65887               .attr('class', 'tile')
65888               .attr('src', function(d) { return d[3]; })
65889               .on('error', error)
65890               .on('load', load)
65891             .merge(image)
65892               .style(transformProp, imageTransform)
65893               .classed('tile-debug', showDebug)
65894               .classed('tile-removing', false)
65895               .classed('tile-center', function(d) { return d === nearCenter; });
65896
65897
65898
65899           var debug = selection$$1.selectAll('.tile-label-debug')
65900               .data(showDebug ? requests : [], function(d) { return d[3]; });
65901
65902           debug.exit()
65903               .remove();
65904
65905           if (showDebug) {
65906               var debugEnter = debug.enter()
65907                   .append('div')
65908                   .attr('class', 'tile-label-debug');
65909
65910               debugEnter
65911                   .append('div')
65912                   .attr('class', 'tile-label-debug-coord');
65913
65914               debugEnter
65915                   .append('div')
65916                   .attr('class', 'tile-label-debug-vintage');
65917
65918               debug = debug.merge(debugEnter);
65919
65920               debug
65921                   .style(transformProp, debugTransform);
65922
65923               debug
65924                   .selectAll('.tile-label-debug-coord')
65925                   .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
65926
65927               debug
65928                   .selectAll('.tile-label-debug-vintage')
65929                   .each(function(d) {
65930                       var span = select(this);
65931                       var center = context.projection.invert(tileCenter(d));
65932                       _source.getMetadata(center, d, function(err, result) {
65933                           span.text((result && result.vintage && result.vintage.range) ||
65934                               t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
65935                           );
65936                       });
65937                   });
65938           }
65939
65940       }
65941
65942
65943       background.projection = function(_) {
65944           if (!arguments.length) return _projection;
65945           _projection = _;
65946           return background;
65947       };
65948
65949
65950       background.dimensions = function(_) {
65951           if (!arguments.length) return tiler.size();
65952           tiler.size(_);
65953           return background;
65954       };
65955
65956
65957       background.source = function(_) {
65958           if (!arguments.length) return _source;
65959           _source = _;
65960           _tileSize = _source.tileSize;
65961           _cache = {};
65962           tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
65963           return background;
65964       };
65965
65966
65967       return background;
65968   }
65969
65970   function rendererBackground(context) {
65971       var dispatch$$1 = dispatch('change');
65972       var detected = utilDetect();
65973       var baseLayer = rendererTileLayer(context).projection(context.projection);
65974       var _overlayLayers = [];
65975       var _backgroundSources = [];
65976       var _brightness = 1;
65977       var _contrast = 1;
65978       var _saturation = 1;
65979       var _sharpness = 1;
65980
65981
65982       function background(selection$$1) {
65983           // If we are displaying an Esri basemap at high zoom,
65984           // check its tilemap to see how high the zoom can go
65985           if (context.map().zoom() > 18) {
65986               var basemap = baseLayer.source();
65987               if (basemap && /^EsriWorldImagery/.test(basemap.id)) {
65988                   var center = context.map().center();
65989                   basemap.fetchTilemap(center);
65990               }
65991           }
65992
65993           var baseFilter = '';
65994           if (detected.cssfilters) {
65995               if (_brightness !== 1) {
65996                   baseFilter += 'brightness(' + _brightness + ')';
65997               }
65998               if (_contrast !== 1) {
65999                   baseFilter += 'contrast(' + _contrast + ')';
66000               }
66001               if (_saturation !== 1) {
66002                   baseFilter += 'saturate(' + _saturation + ')';
66003               }
66004               if (_sharpness < 1) {  // gaussian blur
66005                   var blur = interpolateNumber(0.5, 5)(1 - _sharpness);
66006                   baseFilter += 'blur(' + blur + 'px)';
66007               }
66008           }
66009
66010           var base = selection$$1.selectAll('.layer-background')
66011               .data([0]);
66012
66013           base = base.enter()
66014               .insert('div', '.layer-data')
66015               .attr('class', 'layer layer-background')
66016               .merge(base);
66017
66018           if (detected.cssfilters) {
66019               base.style('filter', baseFilter || null);
66020           } else {
66021               base.style('opacity', _brightness);
66022           }
66023
66024
66025           var imagery = base.selectAll('.layer-imagery')
66026               .data([0]);
66027
66028           imagery.enter()
66029               .append('div')
66030               .attr('class', 'layer layer-imagery')
66031               .merge(imagery)
66032               .call(baseLayer);
66033
66034
66035           var maskFilter = '';
66036           var mixBlendMode = '';
66037           if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
66038               mixBlendMode = 'overlay';
66039               maskFilter = 'saturate(0) blur(3px) invert(1)';
66040
66041               var contrast = _sharpness - 1;
66042               maskFilter += ' contrast(' + contrast + ')';
66043
66044               var brightness = interpolateNumber(1, 0.85)(_sharpness - 1);
66045               maskFilter += ' brightness(' + brightness + ')';
66046           }
66047
66048           var mask = base.selectAll('.layer-unsharp-mask')
66049               .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
66050
66051           mask.exit()
66052               .remove();
66053
66054           mask.enter()
66055               .append('div')
66056               .attr('class', 'layer layer-mask layer-unsharp-mask')
66057               .merge(mask)
66058               .call(baseLayer)
66059               .style('filter', maskFilter || null)
66060               .style('mix-blend-mode', mixBlendMode || null);
66061
66062
66063           var overlays = selection$$1.selectAll('.layer-overlay')
66064               .data(_overlayLayers, function(d) { return d.source().name(); });
66065
66066           overlays.exit()
66067               .remove();
66068
66069           overlays.enter()
66070               .insert('div', '.layer-data')
66071               .attr('class', 'layer layer-overlay')
66072               .merge(overlays)
66073               .each(function(layer) { select(this).call(layer); });
66074       }
66075
66076
66077       background.updateImagery = function() {
66078           if (context.inIntro()) return;
66079
66080           var b = background.baseLayerSource();
66081           var o = _overlayLayers
66082               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
66083               .map(function (d) { return d.source().id; })
66084               .join(',');
66085
66086           var meters = geoOffsetToMeters(b.offset());
66087           var epsilon = 0.01;
66088           var x = +meters[0].toFixed(2);
66089           var y = +meters[1].toFixed(2);
66090           var q = utilStringQs(window.location.hash.substring(1));
66091
66092           var id = b.id;
66093           if (id === 'custom') {
66094               id = 'custom:' + b.template();
66095           }
66096
66097           if (id) {
66098               q.background = id;
66099           } else {
66100               delete q.background;
66101           }
66102
66103           if (o) {
66104               q.overlays = o;
66105           } else {
66106               delete q.overlays;
66107           }
66108
66109           if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
66110               q.offset = x + ',' + y;
66111           } else {
66112               delete q.offset;
66113           }
66114
66115           if (!window.mocha) {
66116               window.location.replace('#' + utilQsString(q, true));
66117           }
66118
66119           var imageryUsed = [b.imageryUsed()];
66120
66121           _overlayLayers
66122               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
66123               .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
66124
66125           var data$$1 = context.layers().layer('data');
66126           if (data$$1 && data$$1.enabled() && data$$1.hasData()) {
66127               imageryUsed.push(data$$1.getSrc());
66128           }
66129
66130           var streetside = context.layers().layer('streetside');
66131           if (streetside && streetside.enabled()) {
66132               imageryUsed.push('Bing Streetside');
66133           }
66134
66135           var mapillary_images = context.layers().layer('mapillary-images');
66136           if (mapillary_images && mapillary_images.enabled()) {
66137               imageryUsed.push('Mapillary Images');
66138           }
66139
66140           var mapillary_signs = context.layers().layer('mapillary-signs');
66141           if (mapillary_signs && mapillary_signs.enabled()) {
66142               imageryUsed.push('Mapillary Signs');
66143           }
66144
66145           var openstreetcam_images = context.layers().layer('openstreetcam-images');
66146           if (openstreetcam_images && openstreetcam_images.enabled()) {
66147               imageryUsed.push('OpenStreetCam Images');
66148           }
66149
66150           context.history().imageryUsed(imageryUsed);
66151       };
66152
66153
66154       background.sources = function(extent) {
66155           if (!data.imagery || !data.imagery.query) return [];   // called before init()?
66156
66157           var matchIDs = {};
66158           var matchImagery = data.imagery.query.bbox(extent.rectangle(), true) || [];
66159           matchImagery.forEach(function(d) { matchIDs[d.id] = true; });
66160
66161           return _backgroundSources.filter(function(source) {
66162               return matchIDs[source.id] || !source.polygon;   // no polygon = worldwide
66163           });
66164       };
66165
66166
66167       background.dimensions = function(d) {
66168           if (!d) return;
66169           baseLayer.dimensions(d);
66170
66171           _overlayLayers.forEach(function(layer) {
66172               layer.dimensions(d);
66173           });
66174       };
66175
66176
66177       background.baseLayerSource = function(d) {
66178           if (!arguments.length) return baseLayer.source();
66179
66180           // test source against OSM imagery blacklists..
66181           var osm = context.connection();
66182           if (!osm) return background;
66183
66184           var blacklists = context.connection().imageryBlacklists();
66185           var template = d.template();
66186           var fail = false;
66187           var tested = 0;
66188           var regex;
66189
66190           for (var i = 0; i < blacklists.length; i++) {
66191               try {
66192                   regex = new RegExp(blacklists[i]);
66193                   fail = regex.test(template);
66194                   tested++;
66195                   if (fail) break;
66196               } catch (e) {
66197                   /* noop */
66198               }
66199           }
66200
66201           // ensure at least one test was run.
66202           if (!tested) {
66203               regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
66204               fail = regex.test(template);
66205           }
66206
66207           baseLayer.source(!fail ? d : background.findSource('none'));
66208           dispatch$$1.call('change');
66209           background.updateImagery();
66210           return background;
66211       };
66212
66213
66214       background.findSource = function(id) {
66215           return find$1(_backgroundSources, function(d) {
66216               return d.id && d.id === id;
66217           });
66218       };
66219
66220
66221       background.bing = function() {
66222           background.baseLayerSource(background.findSource('Bing'));
66223       };
66224
66225
66226       background.showsLayer = function(d) {
66227           return d.id === baseLayer.source().id ||
66228               _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
66229       };
66230
66231
66232       background.overlayLayerSources = function() {
66233           return _overlayLayers.map(function (l) { return l.source(); });
66234       };
66235
66236
66237       background.toggleOverlayLayer = function(d) {
66238           var layer;
66239           for (var i = 0; i < _overlayLayers.length; i++) {
66240               layer = _overlayLayers[i];
66241               if (layer.source() === d) {
66242                   _overlayLayers.splice(i, 1);
66243                   dispatch$$1.call('change');
66244                   background.updateImagery();
66245                   return;
66246               }
66247           }
66248
66249           layer = rendererTileLayer(context)
66250               .source(d)
66251               .projection(context.projection)
66252               .dimensions(baseLayer.dimensions()
66253           );
66254
66255           _overlayLayers.push(layer);
66256           dispatch$$1.call('change');
66257           background.updateImagery();
66258       };
66259
66260
66261       background.nudge = function(d, zoom) {
66262           baseLayer.source().nudge(d, zoom);
66263           dispatch$$1.call('change');
66264           background.updateImagery();
66265           return background;
66266       };
66267
66268
66269       background.offset = function(d) {
66270           if (!arguments.length) return baseLayer.source().offset();
66271           baseLayer.source().offset(d);
66272           dispatch$$1.call('change');
66273           background.updateImagery();
66274           return background;
66275       };
66276
66277
66278       background.brightness = function(d) {
66279           if (!arguments.length) return _brightness;
66280           _brightness = d;
66281           if (context.mode()) dispatch$$1.call('change');
66282           return background;
66283       };
66284
66285
66286       background.contrast = function(d) {
66287           if (!arguments.length) return _contrast;
66288           _contrast = d;
66289           if (context.mode()) dispatch$$1.call('change');
66290           return background;
66291       };
66292
66293
66294       background.saturation = function(d) {
66295           if (!arguments.length) return _saturation;
66296           _saturation = d;
66297           if (context.mode()) dispatch$$1.call('change');
66298           return background;
66299       };
66300
66301
66302       background.sharpness = function(d) {
66303           if (!arguments.length) return _sharpness;
66304           _sharpness = d;
66305           if (context.mode()) dispatch$$1.call('change');
66306           return background;
66307       };
66308
66309
66310       background.init = function() {
66311           function parseMap(qmap) {
66312               if (!qmap) return false;
66313               var args = qmap.split('/').map(Number);
66314               if (args.length < 3 || args.some(isNaN)) return false;
66315               return geoExtent$$1([args[2], args[1]]);
66316           }
66317
66318           var q = utilStringQs(window.location.hash.substring(1));
66319           var requested = q.background || q.layer;
66320           var extent = parseMap(q.map);
66321           var first;
66322           var best;
66323
66324
66325           data.imagery = data.imagery || [];
66326           data.imagery.features = {};
66327
66328           // build efficient index and querying for data.imagery
66329           var features = data.imagery.map(function(source) {
66330               if (!source.polygon) return null;
66331
66332               // Add an extra array nest to each element in `source.polygon`
66333               // so the rings are not treated as a bunch of holes:
66334               // what we have: [ [[outer],[hole],[hole]] ]
66335               // what we want: [ [[outer]],[[outer]],[[outer]] ]
66336               var rings = source.polygon.map(function(ring) { return [ring]; });
66337
66338               var feature = {
66339                   type: 'Feature',
66340                   properties: { id: source.id },
66341                   geometry: { type: 'MultiPolygon', coordinates: rings }
66342               };
66343
66344               data.imagery.features[source.id] = feature;
66345               return feature;
66346
66347           }).filter(Boolean);
66348
66349           data.imagery.query = whichPolygon_1({
66350               type: 'FeatureCollection',
66351               features: features
66352           });
66353
66354
66355           // Add all the available imagery sources
66356           _backgroundSources = data.imagery.map(function(source) {
66357               if (source.type === 'bing') {
66358                   return rendererBackgroundSource.Bing(source, dispatch$$1);
66359               } else if (/^EsriWorldImagery/.test(source.id)) {
66360                   return rendererBackgroundSource.Esri(source);
66361               } else {
66362                   return rendererBackgroundSource(source);
66363               }
66364           });
66365
66366           first = _backgroundSources.length && _backgroundSources[0];
66367
66368           // Add 'None'
66369           _backgroundSources.unshift(rendererBackgroundSource.None());
66370
66371           // Add 'Custom'
66372           var template = context.storage('background-custom-template') || '';
66373           var custom = rendererBackgroundSource.Custom(template);
66374           _backgroundSources.unshift(custom);
66375
66376
66377           // Decide which background layer to display
66378           if (!requested && extent) {
66379               best = find$1(this.sources(extent), function(s) { return s.best(); });
66380           }
66381           if (requested && requested.indexOf('custom:') === 0) {
66382               template = requested.replace(/^custom:/, '');
66383               background.baseLayerSource(custom.template(template));
66384               context.storage('background-custom-template', template);
66385           } else {
66386               background.baseLayerSource(
66387                   background.findSource(requested) ||
66388                   best ||
66389                   background.findSource(context.storage('background-last-used')) ||
66390                   background.findSource('Bing') ||
66391                   first ||
66392                   background.findSource('none')
66393               );
66394           }
66395
66396           var locator = find$1(_backgroundSources, function(d) {
66397               return d.overlay && d.default;
66398           });
66399
66400           if (locator) {
66401               background.toggleOverlayLayer(locator);
66402           }
66403
66404           var overlays = (q.overlays || '').split(',');
66405           overlays.forEach(function(overlay) {
66406               overlay = background.findSource(overlay);
66407               if (overlay) {
66408                   background.toggleOverlayLayer(overlay);
66409               }
66410           });
66411
66412           if (q.gpx) {
66413               var gpx = context.layers().layer('data');
66414               if (gpx) {
66415                   gpx.url(q.gpx, '.gpx');
66416               }
66417           }
66418
66419           if (q.offset) {
66420               var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
66421                   return !isNaN(n) && n;
66422               });
66423
66424               if (offset.length === 2) {
66425                   background.offset(geoMetersToOffset(offset));
66426               }
66427           }
66428       };
66429
66430
66431       return utilRebind(background, dispatch$$1, 'on');
66432   }
66433
66434   function rendererFeatures(context) {
66435       var traffic_roads = {
66436           'motorway': true,
66437           'motorway_link': true,
66438           'trunk': true,
66439           'trunk_link': true,
66440           'primary': true,
66441           'primary_link': true,
66442           'secondary': true,
66443           'secondary_link': true,
66444           'tertiary': true,
66445           'tertiary_link': true,
66446           'residential': true,
66447           'unclassified': true,
66448           'living_street': true
66449       };
66450
66451       var service_roads = {
66452           'service': true,
66453           'road': true,
66454           'track': true
66455       };
66456
66457       var paths = {
66458           'path': true,
66459           'footway': true,
66460           'cycleway': true,
66461           'bridleway': true,
66462           'steps': true,
66463           'pedestrian': true,
66464           'corridor': true
66465       };
66466
66467       var past_futures = {
66468           'proposed': true,
66469           'construction': true,
66470           'abandoned': true,
66471           'dismantled': true,
66472           'disused': true,
66473           'razed': true,
66474           'demolished': true,
66475           'obliterated': true
66476       };
66477
66478       var dispatch$$1 = dispatch('change', 'redraw'),
66479           _cullFactor = 1,
66480           _cache = {},
66481           _features = {},
66482           _stats = {},
66483           _keys = [],
66484           _hidden = [];
66485
66486
66487       function update() {
66488           if (!window.mocha) {
66489               var q = utilStringQs(window.location.hash.substring(1));
66490               var disabled = features.disabled();
66491               if (disabled.length) {
66492                   q.disable_features = disabled.join(',');
66493               } else {
66494                   delete q.disable_features;
66495               }
66496               window.location.replace('#' + utilQsString(q, true));
66497               context.storage('disabled-features', disabled.join(','));
66498           }
66499           _hidden = features.hidden();
66500           dispatch$$1.call('change');
66501           dispatch$$1.call('redraw');
66502       }
66503
66504
66505       function defineFeature(k, filter, max) {
66506           var isEnabled = true;
66507
66508           _keys.push(k);
66509           _features[k] = {
66510               filter: filter,
66511               enabled: isEnabled,   // whether the user wants it enabled..
66512               count: 0,
66513               currentMax: (max || Infinity),
66514               defaultMax: (max || Infinity),
66515               enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
66516               disable: function() { this.enabled = false; this.currentMax = 0; },
66517               hidden: function() { return !context.editable() || this.count > this.currentMax * _cullFactor; },
66518               autoHidden: function() { return this.hidden() && this.currentMax > 0; }
66519           };
66520       }
66521
66522
66523       defineFeature('points', function isPoint(entity, resolver, geometry) {
66524           return geometry === 'point';
66525       }, 200);
66526
66527       defineFeature('traffic_roads', function isTrafficRoad(entity) {
66528           return traffic_roads[entity.tags.highway];
66529       });
66530
66531       defineFeature('service_roads', function isServiceRoad(entity) {
66532           return service_roads[entity.tags.highway];
66533       });
66534
66535       defineFeature('paths', function isPath(entity) {
66536           return paths[entity.tags.highway];
66537       });
66538
66539       defineFeature('buildings', function isBuilding(entity) {
66540           return (
66541               !!entity.tags['building:part'] ||
66542               (!!entity.tags.building && entity.tags.building !== 'no') ||
66543               entity.tags.parking === 'multi-storey' ||
66544               entity.tags.parking === 'sheds' ||
66545               entity.tags.parking === 'carports' ||
66546               entity.tags.parking === 'garage_boxes'
66547           );
66548       }, 250);
66549
66550       defineFeature('landuse', function isLanduse(entity, resolver, geometry) {
66551           return geometry === 'area' &&
66552               !_features.buildings.filter(entity) &&
66553               !_features.water.filter(entity);
66554       });
66555
66556       defineFeature('boundaries', function isBoundary(entity) {
66557           return (
66558               !!entity.tags.boundary
66559           ) && !(
66560               traffic_roads[entity.tags.highway] ||
66561               service_roads[entity.tags.highway] ||
66562               paths[entity.tags.highway]
66563           );
66564       });
66565
66566       defineFeature('water', function isWater(entity) {
66567           return (
66568               !!entity.tags.waterway ||
66569               entity.tags.natural === 'water' ||
66570               entity.tags.natural === 'coastline' ||
66571               entity.tags.natural === 'bay' ||
66572               entity.tags.landuse === 'pond' ||
66573               entity.tags.landuse === 'basin' ||
66574               entity.tags.landuse === 'reservoir' ||
66575               entity.tags.landuse === 'salt_pond'
66576           );
66577       });
66578
66579       defineFeature('rail', function isRail(entity) {
66580           return (
66581               !!entity.tags.railway ||
66582               entity.tags.landuse === 'railway'
66583           ) && !(
66584               traffic_roads[entity.tags.highway] ||
66585               service_roads[entity.tags.highway] ||
66586               paths[entity.tags.highway]
66587           );
66588       });
66589
66590       defineFeature('power', function isPower(entity) {
66591           return !!entity.tags.power;
66592       });
66593
66594       // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
66595       defineFeature('past_future', function isPastFuture(entity) {
66596           if (
66597               traffic_roads[entity.tags.highway] ||
66598               service_roads[entity.tags.highway] ||
66599               paths[entity.tags.highway]
66600           ) { return false; }
66601
66602           var strings = Object.keys(entity.tags);
66603
66604           for (var i = 0; i < strings.length; i++) {
66605               var s = strings[i];
66606               if (past_futures[s] || past_futures[entity.tags[s]]) { return true; }
66607           }
66608           return false;
66609       });
66610
66611       // Lines or areas that don't match another feature filter.
66612       // IMPORTANT: The 'others' feature must be the last one defined,
66613       //   so that code in getMatches can skip this test if `hasMatch = true`
66614       defineFeature('others', function isOther(entity, resolver, geometry) {
66615           return (geometry === 'line' || geometry === 'area');
66616       });
66617
66618
66619       function features() {}
66620
66621
66622       features.features = function() {
66623           return _features;
66624       };
66625
66626
66627       features.keys = function() {
66628           return _keys;
66629       };
66630
66631
66632       features.enabled = function(k) {
66633           if (!arguments.length) {
66634               return _keys.filter(function(k) { return _features[k].enabled; });
66635           }
66636           return _features[k] && _features[k].enabled;
66637       };
66638
66639
66640       features.disabled = function(k) {
66641           if (!arguments.length) {
66642               return _keys.filter(function(k) { return !_features[k].enabled; });
66643           }
66644           return _features[k] && !_features[k].enabled;
66645       };
66646
66647
66648       features.hidden = function(k) {
66649           if (!arguments.length) {
66650               return _keys.filter(function(k) { return _features[k].hidden(); });
66651           }
66652           return _features[k] && _features[k].hidden();
66653       };
66654
66655
66656       features.autoHidden = function(k) {
66657           if (!arguments.length) {
66658               return _keys.filter(function(k) { return _features[k].autoHidden(); });
66659           }
66660           return _features[k] && _features[k].autoHidden();
66661       };
66662
66663
66664       features.enable = function(k) {
66665           if (_features[k] && !_features[k].enabled) {
66666               _features[k].enable();
66667               update();
66668           }
66669       };
66670
66671
66672       features.disable = function(k) {
66673           if (_features[k] && _features[k].enabled) {
66674               _features[k].disable();
66675               update();
66676           }
66677       };
66678
66679
66680       features.toggle = function(k) {
66681           if (_features[k]) {
66682               (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
66683               update();
66684           }
66685       };
66686
66687
66688       features.resetStats = function() {
66689           for (var i = 0; i < _keys.length; i++) {
66690               _features[_keys[i]].count = 0;
66691           }
66692           dispatch$$1.call('change');
66693       };
66694
66695
66696       features.gatherStats = function(d, resolver, dimensions) {
66697           var needsRedraw = false,
66698               type = groupBy(d, function(ent) { return ent.type; }),
66699               entities = [].concat(type.relation || [], type.way || [], type.node || []),
66700               currHidden, geometry, matches, i, j;
66701
66702           for (i = 0; i < _keys.length; i++) {
66703               _features[_keys[i]].count = 0;
66704           }
66705
66706           // adjust the threshold for point/building culling based on viewport size..
66707           // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
66708           _cullFactor = dimensions[0] * dimensions[1] / 1000000;
66709
66710           for (i = 0; i < entities.length; i++) {
66711               geometry = entities[i].geometry(resolver);
66712               if (!(geometry === 'vertex' || geometry === 'relation')) {
66713                   matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
66714                   for (j = 0; j < matches.length; j++) {
66715                       _features[matches[j]].count++;
66716                   }
66717               }
66718           }
66719
66720           currHidden = features.hidden();
66721           if (currHidden !== _hidden) {
66722               _hidden = currHidden;
66723               needsRedraw = true;
66724               dispatch$$1.call('change');
66725           }
66726
66727           return needsRedraw;
66728       };
66729
66730
66731       features.stats = function() {
66732           for (var i = 0; i < _keys.length; i++) {
66733               _stats[_keys[i]] = _features[_keys[i]].count;
66734           }
66735
66736           return _stats;
66737       };
66738
66739
66740       features.clear = function(d) {
66741           for (var i = 0; i < d.length; i++) {
66742               features.clearEntity(d[i]);
66743           }
66744       };
66745
66746
66747       features.clearEntity = function(entity) {
66748           delete _cache[osmEntity$$1.key(entity)];
66749       };
66750
66751
66752       features.reset = function() {
66753           _cache = {};
66754       };
66755
66756
66757       features.getMatches = function(entity, resolver, geometry) {
66758           if (geometry === 'vertex' || geometry === 'relation') return {};
66759
66760           var ent = osmEntity$$1.key(entity);
66761           if (!_cache[ent]) {
66762               _cache[ent] = {};
66763           }
66764
66765           if (!_cache[ent].matches) {
66766               var matches = {},
66767                   hasMatch = false;
66768
66769               for (var i = 0; i < _keys.length; i++) {
66770                   if (_keys[i] === 'others') {
66771                       if (hasMatch) continue;
66772
66773                       // Multipolygon members:
66774                       // If an entity...
66775                       //   1. is a way that hasn't matched other 'interesting' feature rules,
66776                       //   2. and it belongs to a single parent multipolygon relation
66777                       // ...then match whatever feature rules the parent multipolygon has matched.
66778                       // see #2548, #2887
66779                       //
66780                       // IMPORTANT:
66781                       // For this to work, getMatches must be called on relations before ways.
66782                       //
66783                       if (entity.type === 'way') {
66784                           var parents = features.getParents(entity, resolver, geometry);
66785                           if (parents.length === 1 && parents[0].isMultipolygon()) {
66786                               var pkey = osmEntity$$1.key(parents[0]);
66787                               if (_cache[pkey] && _cache[pkey].matches) {
66788                                   matches = clone(_cache[pkey].matches);
66789                                   continue;
66790                               }
66791                           }
66792                       }
66793                   }
66794
66795                   if (_features[_keys[i]].filter(entity, resolver, geometry)) {
66796                       matches[_keys[i]] = hasMatch = true;
66797                   }
66798               }
66799               _cache[ent].matches = matches;
66800           }
66801
66802           return _cache[ent].matches;
66803       };
66804
66805
66806       features.getParents = function(entity, resolver, geometry) {
66807           if (geometry === 'point') return [];
66808
66809           var ent = osmEntity$$1.key(entity);
66810           if (!_cache[ent]) {
66811               _cache[ent] = {};
66812           }
66813
66814           if (!_cache[ent].parents) {
66815               var parents = [];
66816               if (geometry === 'vertex') {
66817                   parents = resolver.parentWays(entity);
66818               } else {   // 'line', 'area', 'relation'
66819                   parents = resolver.parentRelations(entity);
66820               }
66821               _cache[ent].parents = parents;
66822           }
66823           return _cache[ent].parents;
66824       };
66825
66826
66827       features.isHiddenFeature = function(entity, resolver, geometry) {
66828           if (!_hidden.length) return false;
66829           if (!entity.version) return false;
66830
66831           var matches = features.getMatches(entity, resolver, geometry);
66832
66833           for (var i = 0; i < _hidden.length; i++) {
66834               if (matches[_hidden[i]]) return true;
66835           }
66836           return false;
66837       };
66838
66839
66840       features.isHiddenChild = function(entity, resolver, geometry) {
66841           if (!_hidden.length) return false;
66842           if (!entity.version || geometry === 'point') return false;
66843
66844           var parents = features.getParents(entity, resolver, geometry);
66845           if (!parents.length) return false;
66846
66847           for (var i = 0; i < parents.length; i++) {
66848               if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
66849                   return false;
66850               }
66851           }
66852           return true;
66853       };
66854
66855
66856       features.hasHiddenConnections = function(entity, resolver) {
66857           if (!_hidden.length) return false;
66858           var childNodes, connections;
66859
66860           if (entity.type === 'midpoint') {
66861               childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
66862               connections = [];
66863           } else {
66864               childNodes = entity.nodes ? resolver.childNodes(entity) : [];
66865               connections = features.getParents(entity, resolver, entity.geometry(resolver));
66866           }
66867
66868           // gather ways connected to child nodes..
66869           connections = reduce(childNodes, function(result, e) {
66870               return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
66871           }, connections);
66872
66873           return connections.length ? some(connections, function(e) {
66874               return features.isHidden(e, resolver, e.geometry(resolver));
66875           }) : false;
66876       };
66877
66878
66879       features.isHidden = function(entity, resolver, geometry) {
66880           if (!_hidden.length) return false;
66881           if (!entity.version) return false;
66882
66883           var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
66884           return fn(entity, resolver, geometry);
66885       };
66886
66887
66888       features.filter = function(d, resolver) {
66889           if (!_hidden.length) return d;
66890
66891           var result = [];
66892           for (var i = 0; i < d.length; i++) {
66893               var entity = d[i];
66894               if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
66895                   result.push(entity);
66896               }
66897           }
66898           return result;
66899       };
66900
66901
66902       features.init = function() {
66903           var storage = context.storage('disabled-features');
66904           if (storage) {
66905               var storageDisabled = storage.replace(/;/g, ',').split(',');
66906               storageDisabled.forEach(features.disable);
66907           }
66908
66909           var q = utilStringQs(window.location.hash.substring(1));
66910           if (q.disable_features) {
66911               var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
66912               hashDisabled.forEach(features.disable);
66913           }
66914       };
66915
66916       return utilRebind(features, dispatch$$1, 'on');
66917   }
66918
66919   function utilBindOnce(target, type, listener, capture) {
66920       var typeOnce = type + '.once';
66921       function one() {
66922           target.on(typeOnce, null);
66923           listener.apply(this, arguments);
66924       }
66925       target.on(typeOnce, one, capture);
66926       return this;
66927   }
66928
66929   // constants
66930   var TAU$1 = 2 * Math.PI;
66931   var TILESIZE = 256;
66932   var kMin = geoZoomToScale(2, TILESIZE);
66933   var kMax = geoZoomToScale(24, TILESIZE);
66934
66935
66936   function rendererMap(context) {
66937       var dispatch$$1 = dispatch('move', 'drawn');
66938       var projection = context.projection;
66939       var curtainProjection = context.curtainProjection;
66940       var drawLayers = svgLayers(projection, context);
66941       var drawPoints = svgPoints$$1(projection, context);
66942       var drawVertices = svgVertices$$1(projection, context);
66943       var drawLines = svgLines$$1(projection, context);
66944       var drawAreas = svgAreas$$1(projection, context);
66945       var drawMidpoints = svgMidpoints$$1(projection, context);
66946       var drawLabels = svgLabels(projection, context);
66947
66948       var _selection = select(null);
66949       var supersurface = select(null);
66950       var wrapper = select(null);
66951       var surface = select(null);
66952
66953       var dimensions = [1, 1];
66954       var _dblClickEnabled = true;
66955       var _redrawEnabled = true;
66956       var _gestureTransformStart;
66957       var _transformStart = projection.transform();
66958       var _transformLast;
66959       var _transformed = false;
66960       var minzoom = 0;
66961       var mouse$$1;
66962       var mousemove;
66963
66964       var zoom$$1 = d3_zoom()
66965           .scaleExtent([kMin, kMax])
66966           .interpolate(interpolate)
66967           .filter(zoomEventFilter)
66968           .on('zoom', zoomPan);
66969
66970       var scheduleRedraw = throttle(redraw, 750);
66971       // var isRedrawScheduled = false;
66972       // var pendingRedrawCall;
66973       // function scheduleRedraw() {
66974       //     // Only schedule the redraw if one has not already been set.
66975       //     if (isRedrawScheduled) return;
66976       //     isRedrawScheduled = true;
66977       //     var that = this;
66978       //     var args = arguments;
66979       //     pendingRedrawCall = window.requestIdleCallback(function () {
66980       //         // Reset the boolean so future redraws can be set.
66981       //         isRedrawScheduled = false;
66982       //         redraw.apply(that, args);
66983       //     }, { timeout: 1400 });
66984       // }
66985
66986       function cancelPendingRedraw() {
66987           scheduleRedraw.cancel();
66988           // isRedrawScheduled = false;
66989           // window.cancelIdleCallback(pendingRedrawCall);
66990       }
66991
66992
66993       function map(selection$$1) {
66994           _selection = selection$$1;
66995
66996           context
66997               .on('change.map', immediateRedraw);
66998
66999           var osm = context.connection();
67000           if (osm) {
67001               osm.on('change.map', immediateRedraw);
67002           }
67003
67004           context.history()
67005               .on('change.map', immediateRedraw)
67006               .on('undone.map redone.map', function(stack) {
67007                   var mode = context.mode().id;
67008                   if (mode !== 'browse' && mode !== 'select') return;
67009
67010                   var followSelected = false;
67011                   if (Array.isArray(stack.selectedIDs)) {
67012                       followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
67013                       context.enter(
67014                           modeSelect(context, stack.selectedIDs).follow(followSelected)
67015                       );
67016                   }
67017                   if (!followSelected && stack.transform) {
67018                       map.transformEase(stack.transform);
67019                   }
67020               });
67021
67022           context.background()
67023               .on('change.map', immediateRedraw);
67024
67025           context.features()
67026               .on('redraw.map', immediateRedraw);
67027
67028           drawLayers
67029               .on('change.map', function() {
67030                   context.background().updateImagery();
67031                   immediateRedraw();
67032               });
67033
67034           selection$$1
67035               .on('dblclick.map', dblClick)
67036               .call(zoom$$1)
67037               .call(zoom$$1.transform, projection.transform());
67038
67039           supersurface = selection$$1.append('div')
67040               .attr('id', 'supersurface')
67041               .call(utilSetTransform, 0, 0);
67042
67043           // Need a wrapper div because Opera can't cope with an absolutely positioned
67044           // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
67045           wrapper = supersurface
67046               .append('div')
67047               .attr('class', 'layer layer-data');
67048
67049           map.surface = surface = wrapper
67050               .call(drawLayers)
67051               .selectAll('.surface')
67052               .attr('id', 'surface');
67053
67054           surface
67055               .call(drawLabels.observe)
67056               .on('gesturestart.surface', function() {
67057                   _gestureTransformStart = projection.transform();
67058               })
67059               .on('gesturechange.surface', gestureChange)
67060               .on('mousedown.zoom', function() {
67061                   if (event.button === 2) {
67062                       event.stopPropagation();
67063                   }
67064               }, true)
67065               .on('mouseup.zoom', function() {
67066                   if (resetTransform()) {
67067                       immediateRedraw();
67068                   }
67069               })
67070               .on('mousemove.map', function() {
67071                   mousemove = event;
67072               })
67073               .on('mouseover.vertices', function() {
67074                   if (map.editable() && !_transformed) {
67075                       var hover = event.target.__data__;
67076                       surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
67077                       dispatch$$1.call('drawn', this, { full: false });
67078                   }
67079               })
67080               .on('mouseout.vertices', function() {
67081                   if (map.editable() && !_transformed) {
67082                       var hover = event.relatedTarget && event.relatedTarget.__data__;
67083                       surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
67084                       dispatch$$1.call('drawn', this, { full: false });
67085                   }
67086               });
67087
67088           supersurface
67089               .call(context.background());
67090
67091           context.on('enter.map',  function() {
67092               if (map.editable() && !_transformed) {
67093                   // redraw immediately any objects affected by a change in selectedIDs.
67094                   var graph = context.graph();
67095                   var selectedAndParents = {};
67096                   context.selectedIDs().forEach(function(id) {
67097                       var entity = graph.hasEntity(id);
67098                       if (entity) {
67099                           selectedAndParents[entity.id] = entity;
67100                           if (entity.type === 'node') {
67101                               graph.parentWays(entity).forEach(function(parent) {
67102                                   selectedAndParents[parent.id] = parent;
67103                               });
67104                           }
67105                       }
67106                   });
67107                   var data = values$1(selectedAndParents);
67108                   var filter = function(d) { return d.id in selectedAndParents; };
67109
67110                   data = context.features().filter(data, graph);
67111
67112                   surface
67113                       .call(drawVertices.drawSelected, graph, map.extent())
67114                       .call(drawLines, graph, data, filter)
67115                       .call(drawAreas, graph, data, filter)
67116                       .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
67117
67118                   dispatch$$1.call('drawn', this, { full: false });
67119
67120                   // redraw everything else later
67121                   scheduleRedraw();
67122               }
67123           });
67124
67125           map.dimensions(utilGetDimensions(selection$$1));
67126       }
67127
67128
67129       function zoomEventFilter() {
67130           // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
67131           // Intercept `mousedown` and check if there is an orphaned zoom gesture.
67132           // This can happen if a previous `mousedown` occurred without a `mouseup`.
67133           // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
67134           // so that d3-zoom won't stop propagation of new `mousedown` events.
67135           if (event.type === 'mousedown') {
67136               var hasOrphan = false;
67137               var listeners = window.__on;
67138               for (var i = 0; i < listeners.length; i++) {
67139                   var listener = listeners[i];
67140                   if (listener.name === 'zoom' && listener.type === 'mouseup') {
67141                       hasOrphan = true;
67142                       break;
67143                   }
67144               }
67145               if (hasOrphan) {
67146                   var event$$1 = window.CustomEvent;
67147                   if (event$$1) {
67148                       event$$1 = new event$$1('mouseup');
67149                   } else {
67150                       event$$1 = window.document.createEvent('Event');
67151                       event$$1.initEvent('mouseup', false, false);
67152                   }
67153                   // Event needs to be dispatched with an event.view property.
67154                   event$$1.view = window;
67155                   window.dispatchEvent(event$$1);
67156               }
67157           }
67158
67159           return event.button !== 2;   // ignore right clicks
67160       }
67161
67162
67163       function pxCenter() {
67164           return [dimensions[0] / 2, dimensions[1] / 2];
67165       }
67166
67167
67168       function drawVector(difference, extent) {
67169           var mode = context.mode();
67170           var graph = context.graph();
67171           var features = context.features();
67172           var all = context.intersects(map.extent());
67173           var fullRedraw = false;
67174           var data;
67175           var filter;
67176
67177           if (difference) {
67178               var complete = difference.complete(map.extent());
67179               data = compact(values$1(complete));
67180               filter = function(d) { return d.id in complete; };
67181               features.clear(data);
67182
67183           } else {
67184               // force a full redraw if gatherStats detects that a feature
67185               // should be auto-hidden (e.g. points or buildings)..
67186               if (features.gatherStats(all, graph, dimensions)) {
67187                   extent = undefined;
67188               }
67189
67190               if (extent) {
67191                   data = context.intersects(map.extent().intersection(extent));
67192                   var set$$1 = set$2(map$3(data, 'id'));
67193                   filter = function(d) { return set$$1.has(d.id); };
67194
67195               } else {
67196                   data = all;
67197                   fullRedraw = true;
67198                   filter = utilFunctor(true);
67199               }
67200           }
67201
67202           data = features.filter(data, graph);
67203
67204           if (mode && mode.id === 'select') {
67205               // update selected vertices - the user might have just double-clicked a way,
67206               // creating a new vertex, triggering a partial redraw without a mode change
67207               surface.call(drawVertices.drawSelected, graph, map.extent());
67208           }
67209
67210           surface
67211               .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
67212               .call(drawLines, graph, data, filter)
67213               .call(drawAreas, graph, data, filter)
67214               .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
67215               .call(drawLabels, graph, data, filter, dimensions, fullRedraw)
67216               .call(drawPoints, graph, data, filter);
67217
67218           dispatch$$1.call('drawn', this, {full: true});
67219       }
67220
67221
67222       function editOff() {
67223           context.features().resetStats();
67224           surface.selectAll('.layer-osm *').remove();
67225           surface.selectAll('.layer-touch *').remove();
67226
67227           var mode = context.mode();
67228           if (mode && mode.id !== 'save' && mode.id !== 'select-note' && mode.id !== 'select-data') {
67229               context.enter(modeBrowse(context));
67230           }
67231
67232           dispatch$$1.call('drawn', this, {full: true});
67233       }
67234
67235
67236       function dblClick() {
67237           if (!_dblClickEnabled) {
67238               event.preventDefault();
67239               event.stopImmediatePropagation();
67240           }
67241       }
67242
67243
67244       function gestureChange() {
67245           // Remap Safari gesture events to wheel events - #5492
67246           // We want these disabled most places, but enabled for zoom/unzoom on map surface
67247           // https://developer.mozilla.org/en-US/docs/Web/API/GestureEvent
67248           var e = event;
67249           e.preventDefault();
67250
67251           var props = {
67252               deltaMode: 0,    // dummy values to ignore in zoomPan
67253               deltaY: 1,       // dummy values to ignore in zoomPan
67254               clientX: e.clientX,
67255               clientY: e.clientY,
67256               screenX: e.screenX,
67257               screenY: e.screenY,
67258               x: e.x,
67259               y: e.y
67260           };
67261
67262           var e2 = new WheelEvent('wheel', props);
67263           e2._scale = e.scale;         // preserve the original scale
67264           e2._rotation = e.rotation;   // preserve the original rotation
67265
67266           _selection.node().dispatchEvent(e2);
67267       }
67268
67269
67270       function zoomPan(manualEvent) {
67271           var event$$1 = (manualEvent || event);
67272           var source = event$$1.sourceEvent;
67273           var eventTransform = event$$1.transform;
67274           var x = eventTransform.x;
67275           var y = eventTransform.y;
67276           var k = eventTransform.k;
67277
67278           if (_transformStart.x === x &&
67279               _transformStart.y === y &&
67280               _transformStart.k === k) {
67281               return;  // no change
67282           }
67283
67284           // Special handling of 'wheel' events:
67285           // They might be triggered by the user scrolling the mouse wheel,
67286           // or 2-finger pinch/zoom gestures, the transform may need adjustment.
67287           if (source && source.type === 'wheel') {
67288               var detected = utilDetect();
67289               var dX = source.deltaX;
67290               var dY = source.deltaY;
67291               var x2 = x;
67292               var y2 = y;
67293               var k2 = k;
67294               var t0, p0, p1;
67295
67296               // Normalize mousewheel scroll speed (Firefox) - #3029
67297               // If wheel delta is provided in LINE units, recalculate it in PIXEL units
67298               // We are essentially redoing the calculations that occur here:
67299               //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
67300               // See this for more info:
67301               //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
67302               if (source.deltaMode === 1 /* LINE */) {
67303                   // Convert from lines to pixels, more if the user is scrolling fast.
67304                   // (I made up the exp function to roughly match Firefox to what Chrome does)
67305                   var lines = Math.abs(source.deltaY);
67306                   var sign = (source.deltaY > 0) ? 1 : -1;
67307                   dY = sign * clamp(
67308                       Math.exp((lines - 1) * 0.75) * 4.000244140625,
67309                       4.000244140625,    // min
67310                       350.000244140625   // max
67311                   );
67312
67313                   // On Firefox/Windows we just always get +/- the scroll line amount (default 3)
67314                   // There doesn't seem to be any scroll accelleration.
67315                   // This multiplier increases the speed a little bit - #5512
67316                   if (detected.os === 'win') {
67317                       dY *= 5;
67318                   }
67319
67320                   // recalculate x2,y2,k2
67321                   t0 = _transformed ? _transformLast : _transformStart;
67322                   p0 = mouse$$1(source);
67323                   p1 = t0.invert(p0);
67324                   k2 = t0.k * Math.pow(2, -dY / 500);
67325                   x2 = p0[0] - p1[0] * k2;
67326                   y2 = p0[1] - p1[1] * k2;
67327
67328               // 2 finger map pinch zooming (Safari) - #5492
67329               // These are fake `wheel` events we made from Safari `gesturechange` events..
67330               } else if (source._scale) {
67331                   // recalculate x2,y2,k2
67332                   t0 = _gestureTransformStart;
67333                   p0 = mouse$$1(source);
67334                   p1 = t0.invert(p0);
67335                   k2 = t0.k * source._scale;
67336                   x2 = p0[0] - p1[0] * k2;
67337                   y2 = p0[1] - p1[1] * k2;
67338
67339               // 2 finger map pinch zooming (all browsers except Safari) - #5492
67340               // Pinch zooming via the `wheel` event will always have:
67341               // - `ctrlKey = true`
67342               // - `deltaY` is not round integer pixels (ignore `deltaX`)
67343               } else if (source.ctrlKey && !isInteger(dY)) {
67344                   dY *= 6;   // slightly scale up whatever the browser gave us
67345
67346                   // recalculate x2,y2,k2
67347                   t0 = _transformed ? _transformLast : _transformStart;
67348                   p0 = mouse$$1(source);
67349                   p1 = t0.invert(p0);
67350                   k2 = t0.k * Math.pow(2, -dY / 500);
67351                   x2 = p0[0] - p1[0] * k2;
67352                   y2 = p0[1] - p1[1] * k2;
67353
67354               // Trackpad scroll zooming with shift or alt/option key down
67355               } else if ((source.altKey || source.shiftKey) && isInteger(dY)) {
67356
67357                   // recalculate x2,y2,k2
67358                   t0 = _transformed ? _transformLast : _transformStart;
67359                   p0 = mouse$$1(source);
67360                   p1 = t0.invert(p0);
67361                   k2 = t0.k * Math.pow(2, -dY / 500);
67362                   x2 = p0[0] - p1[0] * k2;
67363                   y2 = p0[1] - p1[1] * k2;
67364
67365               // 2 finger map panning (Mac only, all browsers) - #5492, #5512
67366               // Panning via the `wheel` event will always have:
67367               // - `ctrlKey = false`
67368               // - `deltaX`,`deltaY` are round integer pixels
67369               } else if (detected.os === 'mac' && !source.ctrlKey && isInteger(dX) && isInteger(dY)) {
67370                   // Firefox will set `mozInputSource = 1` if the event was generated
67371                   // by an actual mouse wheel.  If we detect this, don't pan..
67372                   if (source.mozInputSource === undefined || source.mozInputSource !== 1) {
67373                       p1 = projection.translate();
67374                       x2 = p1[0] - dX;
67375                       y2 = p1[1] - dY;
67376                       k2 = projection.scale();
67377                   }
67378               }
67379
67380               // something changed - replace the event transform
67381               if (x2 !== x || y2 !== y || k2 !== k) {
67382                   x = x2;
67383                   y = y2;
67384                   k = k2;
67385                   eventTransform = identity$7.translate(x2, y2).scale(k2);
67386                   _selection.node().__zoom = eventTransform;
67387               }
67388
67389           }
67390
67391           if (geoScaleToZoom(k, TILESIZE) < minzoom) {
67392               surface.interrupt();
67393               uiFlash().text(t('cannot_zoom'))();
67394               setZoom(context.minEditableZoom(), true);
67395               scheduleRedraw();
67396               dispatch$$1.call('move', this, map);
67397               return;
67398           }
67399
67400           projection.transform(eventTransform);
67401
67402           var scale = k / _transformStart.k;
67403           var tX = (x / scale - _transformStart.x) * scale;
67404           var tY = (y / scale - _transformStart.y) * scale;
67405
67406           if (context.inIntro()) {
67407               curtainProjection.transform({
67408                   x: x - tX,
67409                   y: y - tY,
67410                   k: k
67411               });
67412           }
67413
67414           if (source) mousemove = event$$1;
67415           _transformed = true;
67416           _transformLast = eventTransform;
67417           utilSetTransform(supersurface, tX, tY, scale);
67418           scheduleRedraw();
67419
67420           dispatch$$1.call('move', this, map);
67421
67422
67423           function clamp(num, min, max) {
67424               return Math.max(min, Math.min(num, max));
67425           }
67426
67427           function isInteger(val) {
67428               return typeof val === 'number' && isFinite(val) && Math.floor(val) === val;
67429           }
67430       }
67431
67432
67433       function resetTransform() {
67434           if (!_transformed) return false;
67435
67436           // deprecation warning - Radial Menu to be removed in iD v3
67437           surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
67438           utilSetTransform(supersurface, 0, 0);
67439           _transformed = false;
67440           if (context.inIntro()) {
67441               curtainProjection.transform(projection.transform());
67442           }
67443           return true;
67444       }
67445
67446
67447       function redraw(difference, extent) {
67448           if (surface.empty() || !_redrawEnabled) return;
67449
67450           // If we are in the middle of a zoom/pan, we can't do differenced redraws.
67451           // It would result in artifacts where differenced entities are redrawn with
67452           // one transform and unchanged entities with another.
67453           if (resetTransform()) {
67454               difference = extent = undefined;
67455           }
67456
67457           var zoom$$1 = map.zoom();
67458           var z = String(~~zoom$$1);
67459
67460           if (surface.attr('data-zoom') !== z) {
67461               surface.attr('data-zoom', z);
67462           }
67463
67464           // class surface as `lowzoom` around z17-z18.5 (based on latitude)
67465           var lat = map.center()[1];
67466           var lowzoom = linear$2()
67467               .domain([-60, 0, 60])
67468               .range([17, 18.5, 17])
67469               .clamp(true);
67470
67471           surface
67472               .classed('low-zoom', zoom$$1 <= lowzoom(lat));
67473
67474
67475           if (!difference) {
67476               supersurface.call(context.background());
67477           }
67478
67479           wrapper
67480               .call(drawLayers);
67481
67482           // OSM
67483           if (map.editable()) {
67484               context.loadTiles(projection);
67485               drawVector(difference, extent);
67486           } else {
67487               editOff();
67488           }
67489
67490           _transformStart = projection.transform();
67491
67492           return map;
67493       }
67494
67495
67496
67497       var immediateRedraw = function(difference, extent) {
67498           if (!difference && !extent) cancelPendingRedraw();
67499           redraw(difference, extent);
67500       };
67501
67502
67503       map.mouse = function() {
67504           var event$$1 = mousemove || event;
67505           if (event$$1) {
67506               var s;
67507               while ((s = event$$1.sourceEvent)) { event$$1 = s; }
67508               return mouse$$1(event$$1);
67509           }
67510           return null;
67511       };
67512
67513
67514       // returns Lng/Lat
67515       map.mouseCoordinates = function() {
67516           var coord = map.mouse() || pxCenter();
67517           return projection.invert(coord);
67518       };
67519
67520
67521       map.dblclickEnable = function(_) {
67522           if (!arguments.length) return _dblClickEnabled;
67523           _dblClickEnabled = _;
67524           return map;
67525       };
67526
67527
67528       map.redrawEnable = function(_) {
67529           if (!arguments.length) return _redrawEnabled;
67530           _redrawEnabled = _;
67531           return map;
67532       };
67533
67534
67535       map.isTransformed = function() {
67536           return _transformed;
67537       };
67538
67539
67540       function setTransform(t2, duration, force) {
67541           var t$$1 = projection.transform();
67542           if (!force && t2.k === t$$1.k && t2.x === t$$1.x && t2.y === t$$1.y) {
67543               return false;
67544           }
67545
67546           if (duration) {
67547               _selection
67548                   .transition()
67549                   .duration(duration)
67550                   .on('start', function() { map.startEase(); })
67551                   .call(zoom$$1.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
67552           } else {
67553               projection.transform(t2);
67554               _transformStart = t2;
67555               _selection.call(zoom$$1.transform, _transformStart);
67556           }
67557       }
67558
67559
67560       function setZoom(z2, force, duration) {
67561           if (z2 === map.zoom() && !force) {
67562               return false;
67563           }
67564
67565           var k = projection.scale();
67566           var k2 = Math.max(kMin, Math.min(kMax, geoZoomToScale(z2, TILESIZE)));
67567           var center = pxCenter();
67568           var l = pointLocation(center);
67569
67570           projection.scale(k2);
67571
67572           var t$$1 = projection.translate();
67573           l = locationPoint(l);
67574
67575           t$$1[0] += center[0] - l[0];
67576           t$$1[1] += center[1] - l[1];
67577
67578           if (duration) {
67579               projection.scale(k);  // reset scale
67580               _selection
67581                   .transition()
67582                   .duration(duration)
67583                   .on('start', function() { map.startEase(); })
67584                   .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k2));
67585           } else {
67586               projection.translate(t$$1);
67587               _transformStart = projection.transform();
67588               _selection.call(zoom$$1.transform, _transformStart);
67589           }
67590
67591           return true;
67592
67593
67594           function locationPoint(l) {
67595               var translate = projection.translate();
67596               var scale = projection.scale() * TAU$1;
67597               return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
67598           }
67599
67600           function pointLocation(p) {
67601               var translate = projection.translate();
67602               var scale = projection.scale() * TAU$1;
67603               return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
67604           }
67605       }
67606
67607
67608       function setCenter(loc2, duration) {
67609           var c = map.center();
67610           if (loc2[0] === c[0] && loc2[1] === c[1]) {
67611               return false;
67612           }
67613
67614           var t$$1 = projection.translate();
67615           var k = projection.scale();
67616           var pxC = pxCenter();
67617           var ll = projection(loc2);
67618
67619           t$$1[0] = t$$1[0] - ll[0] + pxC[0];
67620           t$$1[1] = t$$1[1] - ll[1] + pxC[1];
67621
67622           if (duration) {
67623               _selection
67624                   .transition()
67625                   .duration(duration)
67626                   .on('start', function() { map.startEase(); })
67627                   .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
67628           } else {
67629               projection.translate(t$$1);
67630               _transformStart = projection.transform();
67631               _selection.call(zoom$$1.transform, _transformStart);
67632           }
67633
67634           return true;
67635       }
67636
67637
67638       map.pan = function(delta, duration) {
67639           var t$$1 = projection.translate();
67640           var k = projection.scale();
67641
67642           t$$1[0] += delta[0];
67643           t$$1[1] += delta[1];
67644
67645           if (duration) {
67646               _selection
67647                   .transition()
67648                   .duration(duration)
67649                   .on('start', function() { map.startEase(); })
67650                   .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
67651           } else {
67652               projection.translate(t$$1);
67653               _transformStart = projection.transform();
67654               _selection.call(zoom$$1.transform, _transformStart);
67655               dispatch$$1.call('move', this, map);
67656               immediateRedraw();
67657           }
67658
67659           return map;
67660       };
67661
67662
67663       map.dimensions = function(_) {
67664           if (!arguments.length) return dimensions;
67665           dimensions = _;
67666           drawLayers.dimensions(dimensions);
67667           context.background().dimensions(dimensions);
67668           projection.clipExtent([[0, 0], dimensions]);
67669           mouse$$1 = utilFastMouse(supersurface.node());
67670
67671           scheduleRedraw();
67672           return map;
67673       };
67674
67675
67676       function zoomIn(delta) {
67677           setZoom(~~map.zoom() + delta, true, 250);
67678       }
67679
67680       function zoomOut(delta) {
67681           setZoom(~~map.zoom() - delta, true, 250);
67682       }
67683
67684       map.zoomIn = function() { zoomIn(1); };
67685       map.zoomInFurther = function() { zoomIn(4); };
67686
67687       map.zoomOut = function() { zoomOut(1); };
67688       map.zoomOutFurther = function() { zoomOut(4); };
67689
67690
67691       map.center = function(loc2) {
67692           if (!arguments.length) {
67693               return projection.invert(pxCenter());
67694           }
67695
67696           if (setCenter(loc2)) {
67697               dispatch$$1.call('move', this, map);
67698           }
67699
67700           scheduleRedraw();
67701           return map;
67702       };
67703
67704
67705       map.zoom = function(z2) {
67706           if (!arguments.length) {
67707               return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
67708           }
67709
67710           if (z2 < minzoom) {
67711               surface.interrupt();
67712               uiFlash().text(t('cannot_zoom'))();
67713               z2 = context.minEditableZoom();
67714           }
67715
67716           if (setZoom(z2)) {
67717               dispatch$$1.call('move', this, map);
67718           }
67719
67720           scheduleRedraw();
67721           return map;
67722       };
67723
67724
67725       map.zoomTo = function(entity, zoomLimits) {
67726           var extent = entity.extent(context.graph());
67727           if (!isFinite(extent.area())) return;
67728
67729           var z2 = map.trimmedExtentZoom(extent);
67730           zoomLimits = zoomLimits || [context.minEditableZoom(), 19];
67731           map.centerZoom(extent.center(), Math.min(Math.max(z2, zoomLimits[0]), zoomLimits[1]));
67732       };
67733
67734
67735       map.centerZoom = function(loc2, z2) {
67736           var centered = setCenter(loc2);
67737           var zoomed   = setZoom(z2);
67738
67739           if (centered || zoomed) {
67740               dispatch$$1.call('move', this, map);
67741           }
67742
67743           scheduleRedraw();
67744           return map;
67745       };
67746
67747
67748       map.centerEase = function(loc2, duration) {
67749           duration = duration || 250;
67750           setCenter(loc2, duration);
67751           return map;
67752       };
67753
67754
67755       map.zoomEase = function(z2, duration) {
67756           duration = duration || 250;
67757           setZoom(z2, false, duration);
67758           return map;
67759       };
67760
67761
67762       map.transformEase = function(t2, duration) {
67763           duration = duration || 250;
67764           setTransform(t2, duration, false);
67765           return map;
67766       };
67767
67768
67769       map.startEase = function() {
67770           utilBindOnce(surface, 'mousedown.ease', function() {
67771               map.cancelEase();
67772           });
67773           return map;
67774       };
67775
67776
67777       map.cancelEase = function() {
67778           _selection.interrupt();
67779           return map;
67780       };
67781
67782
67783       map.extent = function(_) {
67784           if (!arguments.length) {
67785               return new geoExtent$$1(
67786                   projection.invert([0, dimensions[1]]),
67787                   projection.invert([dimensions[0], 0])
67788               );
67789           } else {
67790               var extent = geoExtent$$1(_);
67791               map.centerZoom(extent.center(), map.extentZoom(extent));
67792           }
67793       };
67794
67795
67796       map.trimmedExtent = function(_) {
67797           if (!arguments.length) {
67798               var headerY = 60;
67799               var footerY = 30;
67800               var pad = 10;
67801               return new geoExtent$$1(
67802                   projection.invert([pad, dimensions[1] - footerY - pad]),
67803                   projection.invert([dimensions[0] - pad, headerY + pad])
67804               );
67805           } else {
67806               var extent = geoExtent$$1(_);
67807               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
67808           }
67809       };
67810
67811
67812       function calcZoom(extent, dim) {
67813           var tl = projection([extent[0][0], extent[1][1]]);
67814           var br = projection([extent[1][0], extent[0][1]]);
67815
67816           // Calculate maximum zoom that fits extent
67817           var hFactor = (br[0] - tl[0]) / dim[0];
67818           var vFactor = (br[1] - tl[1]) / dim[1];
67819           var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
67820           var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
67821           var newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
67822
67823           return newZoom;
67824       }
67825
67826
67827       map.extentZoom = function(_) {
67828           return calcZoom(geoExtent$$1(_), dimensions);
67829       };
67830
67831
67832       map.trimmedExtentZoom = function(_) {
67833           var trimY = 120;
67834           var trimX = 40;
67835           var trimmed = [dimensions[0] - trimX, dimensions[1] - trimY];
67836           return calcZoom(geoExtent$$1(_), trimmed);
67837       };
67838
67839
67840       map.editable = function() {
67841           var osmLayer = surface.selectAll('.data-layer.osm');
67842           if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
67843
67844           return map.zoom() >= context.minEditableZoom();
67845       };
67846
67847
67848       map.notesEditable = function() {
67849           var noteLayer = surface.selectAll('.data-layer.notes');
67850           if (!noteLayer.empty() && noteLayer.classed('disabled')) return false;
67851
67852           return map.zoom() >= context.minEditableZoom();
67853       };
67854
67855
67856       map.minzoom = function(_) {
67857           if (!arguments.length) return minzoom;
67858           minzoom = _;
67859           return map;
67860       };
67861
67862
67863       map.layers = drawLayers;
67864
67865
67866       return utilRebind(map, dispatch$$1, 'on');
67867   }
67868
67869   function uiMapInMap(context) {
67870
67871       function map_in_map(selection$$1) {
67872           var backgroundLayer = rendererTileLayer(context);
67873           var overlayLayers = {};
67874           var projection$$1 = geoRawMercator();
67875           var dataLayer = svgData$$1(projection$$1, context).showLabels(false);
67876           var debugLayer = svgDebug$$1(projection$$1, context);
67877           var zoom$$1 = d3_zoom()
67878               .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
67879               .on('start', zoomStarted)
67880               .on('zoom', zoomed)
67881               .on('end', zoomEnded);
67882           var isTransformed = false;
67883           var isHidden = true;
67884           var skipEvents = false;
67885           var gesture = null;
67886           var zDiff = 6;    // by default, minimap renders at (main zoom - 6)
67887           var wrap = select(null);
67888           var tiles = select(null);
67889           var viewport = select(null);
67890           var tStart;    // transform at start of gesture
67891           var tCurr;     // transform at most recent event
67892           var timeoutId;
67893
67894
67895           function zoomStarted() {
67896               if (skipEvents) return;
67897               tStart = tCurr = projection$$1.transform();
67898               gesture = null;
67899           }
67900
67901
67902           function zoomed() {
67903               if (skipEvents) return;
67904
67905               var x = event.transform.x;
67906               var y = event.transform.y;
67907               var k = event.transform.k;
67908               var isZooming = (k !== tStart.k);
67909               var isPanning = (x !== tStart.x || y !== tStart.y);
67910
67911               if (!isZooming && !isPanning) {
67912                   return;  // no change
67913               }
67914
67915               // lock in either zooming or panning, don't allow both in minimap.
67916               if (!gesture) {
67917                   gesture = isZooming ? 'zoom' : 'pan';
67918               }
67919
67920               var tMini = projection$$1.transform();
67921               var tX, tY, scale;
67922
67923               if (gesture === 'zoom') {
67924                   var dMini = utilGetDimensions(wrap);
67925                   var cMini = geoVecScale(dMini, 0.5);
67926                   scale = k / tMini.k;
67927                   tX = (cMini[0] / scale - cMini[0]) * scale;
67928                   tY = (cMini[1] / scale - cMini[1]) * scale;
67929               } else {
67930                   k = tMini.k;
67931                   scale = 1;
67932                   tX = x - tMini.x;
67933                   tY = y - tMini.y;
67934               }
67935
67936               utilSetTransform(tiles, tX, tY, scale);
67937               utilSetTransform(viewport, 0, 0, scale);
67938               isTransformed = true;
67939               tCurr = identity$7.translate(x, y).scale(k);
67940
67941               var zMain = geoScaleToZoom(context.projection.scale());
67942               var zMini = geoScaleToZoom(k);
67943
67944               zDiff = zMain - zMini;
67945
67946               queueRedraw();
67947           }
67948
67949
67950           function zoomEnded() {
67951               if (skipEvents) return;
67952               if (gesture !== 'pan') return;
67953
67954               updateProjection();
67955               gesture = null;
67956               var dMini = utilGetDimensions(wrap);
67957               var cMini = geoVecScale(dMini, 0.5);
67958               context.map().center(projection$$1.invert(cMini));   // recenter main map..
67959           }
67960
67961
67962           function updateProjection() {
67963               var loc = context.map().center();
67964               var dMini = utilGetDimensions(wrap);
67965               var cMini = geoVecScale(dMini, 0.5);
67966               var tMain = context.projection.transform();
67967               var zMain = geoScaleToZoom(tMain.k);
67968               var zMini = Math.max(zMain - zDiff, 0.5);
67969               var kMini = geoZoomToScale(zMini);
67970
67971               projection$$1
67972                   .translate([tMain.x, tMain.y])
67973                   .scale(kMini);
67974
67975               var point$$1 = projection$$1(loc);
67976               var mouse$$1 = (gesture === 'pan') ? geoVecSubtract([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0];
67977               var xMini = cMini[0] - point$$1[0] + tMain.x + mouse$$1[0];
67978               var yMini = cMini[1] - point$$1[1] + tMain.y + mouse$$1[1];
67979
67980               projection$$1
67981                   .translate([xMini, yMini])
67982                   .clipExtent([[0, 0], dMini]);
67983
67984               tCurr = projection$$1.transform();
67985
67986               if (isTransformed) {
67987                   utilSetTransform(tiles, 0, 0);
67988                   utilSetTransform(viewport, 0, 0);
67989                   isTransformed = false;
67990               }
67991
67992               zoom$$1
67993                   .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
67994
67995               skipEvents = true;
67996               wrap.call(zoom$$1.transform, tCurr);
67997               skipEvents = false;
67998           }
67999
68000
68001           function redraw() {
68002               clearTimeout(timeoutId);
68003               if (isHidden) return;
68004
68005               updateProjection();
68006
68007               var dMini = utilGetDimensions(wrap);
68008               var zMini = geoScaleToZoom(projection$$1.scale());
68009
68010               // setup tile container
68011               tiles = wrap
68012                   .selectAll('.map-in-map-tiles')
68013                   .data([0]);
68014
68015               tiles = tiles.enter()
68016                   .append('div')
68017                   .attr('class', 'map-in-map-tiles')
68018                   .merge(tiles);
68019
68020               // redraw background
68021               backgroundLayer
68022                   .source(context.background().baseLayerSource())
68023                   .projection(projection$$1)
68024                   .dimensions(dMini);
68025
68026               var background = tiles
68027                   .selectAll('.map-in-map-background')
68028                   .data([0]);
68029
68030               background.enter()
68031                   .append('div')
68032                   .attr('class', 'map-in-map-background')
68033                   .merge(background)
68034                   .call(backgroundLayer);
68035
68036
68037               // redraw overlay
68038               var overlaySources = context.background().overlayLayerSources();
68039               var activeOverlayLayers = [];
68040               for (var i = 0; i < overlaySources.length; i++) {
68041                   if (overlaySources[i].validZoom(zMini)) {
68042                       if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
68043                       activeOverlayLayers.push(overlayLayers[i]
68044                           .source(overlaySources[i])
68045                           .projection(projection$$1)
68046                           .dimensions(dMini));
68047                   }
68048               }
68049
68050               var overlay = tiles
68051                   .selectAll('.map-in-map-overlay')
68052                   .data([0]);
68053
68054               overlay = overlay.enter()
68055                   .append('div')
68056                   .attr('class', 'map-in-map-overlay')
68057                   .merge(overlay);
68058
68059
68060               var overlays = overlay
68061                   .selectAll('div')
68062                   .data(activeOverlayLayers, function(d) { return d.source().name(); });
68063
68064               overlays.exit()
68065                   .remove();
68066
68067               overlays = overlays.enter()
68068                   .append('div')
68069                   .merge(overlays)
68070                   .each(function(layer) { select(this).call(layer); });
68071
68072
68073               var dataLayers = tiles
68074                   .selectAll('.map-in-map-data')
68075                   .data([0]);
68076
68077               dataLayers.exit()
68078                   .remove();
68079
68080               dataLayers = dataLayers.enter()
68081                   .append('svg')
68082                   .attr('class', 'map-in-map-data')
68083                   .merge(dataLayers)
68084                   .call(dataLayer)
68085                   .call(debugLayer);
68086
68087
68088               // redraw viewport bounding box
68089               if (gesture !== 'pan') {
68090                   var getPath = d3_geoPath(projection$$1);
68091                   var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
68092
68093                   viewport = wrap.selectAll('.map-in-map-viewport')
68094                       .data([0]);
68095
68096                   viewport = viewport.enter()
68097                       .append('svg')
68098                       .attr('class', 'map-in-map-viewport')
68099                       .merge(viewport);
68100
68101
68102                   var path = viewport.selectAll('.map-in-map-bbox')
68103                       .data([bbox]);
68104
68105                   path.enter()
68106                       .append('path')
68107                       .attr('class', 'map-in-map-bbox')
68108                       .merge(path)
68109                       .attr('d', getPath)
68110                       .classed('thick', function(d) { return getPath.area(d) < 30; });
68111               }
68112           }
68113
68114
68115           function queueRedraw() {
68116               clearTimeout(timeoutId);
68117               timeoutId = setTimeout(function() { redraw(); }, 750);
68118           }
68119
68120
68121           function toggle() {
68122               if (event) event.preventDefault();
68123
68124               isHidden = !isHidden;
68125
68126               select('.minimap-toggle-item')
68127                   .classed('active', !isHidden)
68128                   .select('input')
68129                   .property('checked', !isHidden);
68130
68131               if (isHidden) {
68132                   wrap
68133                       .style('display', 'block')
68134                       .style('opacity', '1')
68135                       .transition()
68136                       .duration(200)
68137                       .style('opacity', '0')
68138                       .on('end', function() {
68139                           selection$$1.selectAll('.map-in-map')
68140                               .style('display', 'none');
68141                       });
68142               } else {
68143                   wrap
68144                       .style('display', 'block')
68145                       .style('opacity', '0')
68146                       .transition()
68147                       .duration(200)
68148                       .style('opacity', '1')
68149                       .on('end', function() {
68150                           redraw();
68151                       });
68152               }
68153           }
68154
68155
68156           uiMapInMap.toggle = toggle;
68157
68158           wrap = selection$$1.selectAll('.map-in-map')
68159               .data([0]);
68160
68161           wrap = wrap.enter()
68162               .append('div')
68163               .attr('class', 'map-in-map')
68164               .style('display', (isHidden ? 'none' : 'block'))
68165               .call(zoom$$1)
68166               .on('dblclick.zoom', null)
68167               .merge(wrap);
68168
68169           context.map()
68170               .on('drawn.map-in-map', function(drawn) {
68171                   if (drawn.full === true) {
68172                       redraw();
68173                   }
68174               });
68175
68176           redraw();
68177
68178           context.keybinding()
68179               .on(t('background.minimap.key'), toggle);
68180       }
68181
68182       return map_in_map;
68183   }
68184
68185   function uiSettingsCustomBackground(context) {
68186       var dispatch$$1 = dispatch('change');
68187
68188       function render(selection) {
68189           var _origSettings = {
68190               template: context.storage('background-custom-template')
68191           };
68192           var _currSettings = cloneDeep(_origSettings);
68193           var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
68194           var modal = uiConfirm(selection).okButton();
68195
68196           modal
68197               .classed('settings-modal settings-custom-background', true);
68198
68199           modal.select('.modal-section.header')
68200               .append('h3')
68201               .text(t('settings.custom_background.header'));
68202
68203
68204           var textSection = modal.select('.modal-section.message-text');
68205
68206           textSection
68207               .append('pre')
68208               .attr('class', 'instructions-template')
68209               .text(t('settings.custom_background.instructions', { example: example }));
68210
68211           textSection
68212               .append('textarea')
68213               .attr('class', 'field-template')
68214               .attr('placeholder', t('settings.custom_background.template.placeholder'))
68215               .call(utilNoAuto)
68216               .property('value', _currSettings.template);
68217
68218
68219           // insert a cancel button
68220           var buttonSection = modal.select('.modal-section.buttons');
68221
68222           buttonSection
68223               .insert('button', '.ok-button')
68224               .attr('class', 'button cancel-button secondary-action')
68225               .text(t('confirm.cancel'));
68226
68227
68228           buttonSection.select('.cancel-button')
68229               .on('click.cancel', clickCancel);
68230
68231           buttonSection.select('.ok-button')
68232               .attr('disabled', isSaveDisabled)
68233               .on('click.save', clickSave);
68234
68235
68236           function isSaveDisabled() {
68237               return null;
68238           }
68239
68240
68241           // restore the original template
68242           function clickCancel() {
68243               textSection.select('.field-template').property('value', _origSettings.template);
68244               context.storage('background-custom-template', _origSettings.template);
68245               this.blur();
68246               modal.close();
68247           }
68248
68249           // accept the current template
68250           function clickSave() {
68251               _currSettings.template = textSection.select('.field-template').property('value');
68252               context.storage('background-custom-template', _currSettings.template);
68253               this.blur();
68254               modal.close();
68255               dispatch$$1.call('change', this, _currSettings);
68256           }
68257       }
68258
68259       return utilRebind(render, dispatch$$1, 'on');
68260   }
68261
68262   function uiBackground(context) {
68263       var key = t('background.key');
68264
68265       var _customSource = context.background().findSource('custom');
68266       var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
68267       var _shown = false;
68268
68269       var _backgroundList = select(null);
68270       var _overlayList = select(null);
68271       var _displayOptionsContainer = select(null);
68272       var _offsetContainer = select(null);
68273
68274       var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
68275       var backgroundOffset = uiBackgroundOffset(context);
68276
68277       var settingsCustomBackground = uiSettingsCustomBackground(context)
68278           .on('change', customChanged);
68279
68280
68281       function setTooltips(selection$$1) {
68282           selection$$1.each(function(d, i, nodes) {
68283               var item = select(this).select('label');
68284               var span = item.select('span');
68285               var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
68286               var description = d.description();
68287               var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
68288
68289               if (d === _previousBackground) {
68290                   item.call(tooltip()
68291                       .placement(placement)
68292                       .html(true)
68293                       .title(function() {
68294                           var tip = '<div>' + t('background.switch') + '</div>';
68295                           return uiTooltipHtml(tip, uiCmd('⌘' + key));
68296                       })
68297                   );
68298               } else if (description || isOverflowing) {
68299                   item.call(tooltip()
68300                       .placement(placement)
68301                       .title(description || d.name())
68302                   );
68303               } else {
68304                   item.call(tooltip().destroy);
68305               }
68306           });
68307       }
68308
68309
68310       function updateLayerSelections(selection$$1) {
68311           function active(d) {
68312               return context.background().showsLayer(d);
68313           }
68314
68315           selection$$1.selectAll('.layer')
68316               .classed('active', active)
68317               .classed('switch', function(d) { return d === _previousBackground; })
68318               .call(setTooltips)
68319               .selectAll('input')
68320               .property('checked', active);
68321       }
68322
68323
68324       function chooseBackground(d) {
68325           if (d.id === 'custom' && !d.template()) {
68326               return editCustom();
68327           }
68328
68329           event.preventDefault();
68330           _previousBackground = context.background().baseLayerSource();
68331           context.storage('background-last-used-toggle', _previousBackground.id);
68332           context.storage('background-last-used', d.id);
68333           context.background().baseLayerSource(d);
68334           _backgroundList.call(updateLayerSelections);
68335           document.activeElement.blur();
68336       }
68337
68338
68339       function customChanged(d) {
68340           if (d && d.template) {
68341               _customSource.template(d.template);
68342               chooseBackground(_customSource);
68343           } else {
68344               _customSource.template('');
68345               chooseBackground(context.background().findSource('none'));
68346           }
68347       }
68348
68349
68350       function editCustom() {
68351           event.preventDefault();
68352           context.container()
68353               .call(settingsCustomBackground);
68354       }
68355
68356
68357       function chooseOverlay(d) {
68358           event.preventDefault();
68359           context.background().toggleOverlayLayer(d);
68360           _overlayList.call(updateLayerSelections);
68361           document.activeElement.blur();
68362       }
68363
68364
68365       function drawListItems(layerList, type, change, filter) {
68366           var sources = context.background()
68367               .sources(context.map().extent())
68368               .filter(filter);
68369
68370           var layerLinks = layerList.selectAll('li.layer')
68371               .data(sources, function(d) { return d.name(); });
68372
68373           layerLinks.exit()
68374               .remove();
68375
68376           var enter = layerLinks.enter()
68377               .append('li')
68378               .attr('class', 'layer')
68379               .classed('layer-custom', function(d) { return d.id === 'custom'; })
68380               .classed('best', function(d) { return d.best(); });
68381
68382           enter.filter(function(d) { return d.id === 'custom'; })
68383               .append('button')
68384               .attr('class', 'layer-browse')
68385               .call(tooltip()
68386                   .title(t('settings.custom_background.tooltip'))
68387                   .placement((textDirection === 'rtl') ? 'right' : 'left')
68388               )
68389               .on('click', editCustom)
68390               .call(svgIcon('#iD-icon-more'));
68391
68392           enter.filter(function(d) { return d.best(); })
68393               .append('div')
68394               .attr('class', 'best')
68395               .call(tooltip()
68396                   .title(t('background.best_imagery'))
68397                   .placement((textDirection === 'rtl') ? 'right' : 'left')
68398               )
68399               .append('span')
68400               .html('&#9733;');
68401
68402           var label = enter
68403               .append('label');
68404
68405           label
68406               .append('input')
68407               .attr('type', type)
68408               .attr('name', 'layers')
68409               .on('change', change);
68410
68411           label
68412               .append('span')
68413               .text(function(d) { return d.name(); });
68414
68415
68416           layerList.selectAll('li.layer')
68417               .sort(sortSources)
68418               .style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
68419
68420           layerList
68421               .call(updateLayerSelections);
68422
68423
68424           function sortSources(a, b) {
68425               return a.best() && !b.best() ? -1
68426                   : b.best() && !a.best() ? 1
68427                   : d3_descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0;
68428           }
68429       }
68430
68431
68432       function renderBackgroundList(selection$$1) {
68433
68434           // the background list
68435           var container = selection$$1.selectAll('.layer-background-list')
68436               .data([0]);
68437
68438           _backgroundList = container.enter()
68439               .append('ul')
68440               .attr('class', 'layer-list layer-background-list')
68441               .attr('dir', 'auto')
68442               .merge(container);
68443
68444
68445           // add minimap toggle below list
68446           var minimapEnter = selection$$1.selectAll('.minimap-toggle-list')
68447               .data([0])
68448               .enter()
68449               .append('ul')
68450               .attr('class', 'layer-list minimap-toggle-list')
68451               .append('li')
68452               .attr('class', 'layer minimap-toggle-item');
68453
68454           var minimapLabelEnter = minimapEnter
68455               .append('label')
68456               .call(tooltip()
68457                   .html(true)
68458                   .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
68459                   .placement('top')
68460               );
68461
68462           minimapLabelEnter
68463               .append('input')
68464               .attr('type', 'checkbox')
68465               .on('change', function() {
68466                   event.preventDefault();
68467                   uiMapInMap.toggle();
68468               });
68469
68470           minimapLabelEnter
68471               .append('span')
68472               .text(t('background.minimap.description'));
68473
68474
68475           // "Info / Report a Problem" link
68476           selection$$1.selectAll('.imagery-faq')
68477               .data([0])
68478               .enter()
68479               .append('div')
68480               .attr('class', 'imagery-faq')
68481               .append('a')
68482               .attr('target', '_blank')
68483               .attr('tabindex', -1)
68484               .call(svgIcon('#iD-icon-out-link', 'inline'))
68485               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
68486               .append('span')
68487               .text(t('background.imagery_source_faq'));
68488       }
68489
68490
68491       function renderOverlayList(selection$$1) {
68492           var container = selection$$1.selectAll('.layer-overlay-list')
68493               .data([0]);
68494
68495           _overlayList = container.enter()
68496               .append('ul')
68497               .attr('class', 'layer-list layer-overlay-list')
68498               .attr('dir', 'auto')
68499               .merge(container);
68500       }
68501
68502
68503       function update() {
68504           _backgroundList
68505               .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
68506
68507           _overlayList
68508               .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
68509
68510           _displayOptionsContainer
68511               .call(backgroundDisplayOptions);
68512
68513           _offsetContainer
68514               .call(backgroundOffset);
68515       }
68516
68517
68518       function quickSwitch() {
68519           if (event) {
68520               event.stopImmediatePropagation();
68521               event.preventDefault();
68522           }
68523           if (_previousBackground) {
68524               chooseBackground(_previousBackground);
68525           }
68526       }
68527
68528
68529       function background(selection$$1) {
68530
68531           function hidePane() {
68532               setVisible(false);
68533           }
68534
68535           function togglePane() {
68536               if (event) event.preventDefault();
68537               paneTooltip.hide(button);
68538               setVisible(!button.classed('active'));
68539           }
68540
68541           function setVisible(show) {
68542               if (show !== _shown) {
68543                   button.classed('active', show);
68544                   _shown = show;
68545
68546                   if (show) {
68547                       uiMapData.hidePane();
68548                       uiHelp.hidePane();
68549                       update();
68550
68551                       pane
68552                           .style('display', 'block')
68553                           .style('right', '-300px')
68554                           .transition()
68555                           .duration(200)
68556                           .style('right', '0px');
68557
68558                   } else {
68559                       pane
68560                           .style('display', 'block')
68561                           .style('right', '0px')
68562                           .transition()
68563                           .duration(200)
68564                           .style('right', '-300px')
68565                           .on('end', function() {
68566                               select(this).style('display', 'none');
68567                           });
68568                   }
68569               }
68570           }
68571
68572
68573           var pane = selection$$1
68574               .append('div')
68575               .attr('class', 'fillL map-pane hide');
68576
68577           var paneTooltip = tooltip()
68578               .placement((textDirection === 'rtl') ? 'right' : 'left')
68579               .html(true)
68580               .title(uiTooltipHtml(t('background.description'), key));
68581
68582           var button = selection$$1
68583               .append('button')
68584               .attr('tabindex', -1)
68585               .on('click', togglePane)
68586               .call(svgIcon('#iD-icon-layers', 'light'))
68587               .call(paneTooltip);
68588
68589
68590           var heading = pane
68591               .append('div')
68592               .attr('class', 'pane-heading');
68593
68594           heading
68595               .append('h2')
68596               .text(t('background.title'));
68597
68598           heading
68599               .append('button')
68600               .on('click', function() { uiBackground.hidePane(); })
68601               .call(svgIcon('#iD-icon-close'));
68602
68603
68604           var content = pane
68605               .append('div')
68606               .attr('class', 'pane-content');
68607
68608           // background list
68609           content
68610               .append('div')
68611               .attr('class', 'background-background-list-container')
68612               .call(uiDisclosure(context, 'background_list', true)
68613                   .title(t('background.backgrounds'))
68614                   .content(renderBackgroundList)
68615               );
68616
68617           // overlay list
68618           content
68619               .append('div')
68620               .attr('class', 'background-overlay-list-container')
68621               .call(uiDisclosure(context, 'overlay_list', true)
68622                   .title(t('background.overlays'))
68623                   .content(renderOverlayList)
68624               );
68625
68626           // display options
68627           _displayOptionsContainer = content
68628               .append('div')
68629               .attr('class', 'background-display-options');
68630
68631           // offset controls
68632           _offsetContainer = content
68633               .append('div')
68634               .attr('class', 'background-offset');
68635
68636
68637           // add listeners
68638           context.map()
68639               .on('move.background-update', debounce(utilCallWhenIdle(update), 1000));
68640
68641           context.background()
68642               .on('change.background-update', update);
68643
68644
68645           update();
68646
68647           context.keybinding()
68648               .on(key, togglePane)
68649               .on(uiCmd('⌘' + key), quickSwitch);
68650
68651           uiBackground.hidePane = hidePane;
68652           uiBackground.togglePane = togglePane;
68653           uiBackground.setVisible = setVisible;
68654       }
68655
68656       return background;
68657   }
68658
68659   function uiContributors(context) {
68660       var osm = context.connection(),
68661           debouncedUpdate = debounce(function() { update(); }, 1000),
68662           limit = 4,
68663           hidden = false,
68664           wrap = select(null);
68665
68666
68667       function update() {
68668           if (!osm) return;
68669
68670           var users = {},
68671               entities = context.intersects(context.map().extent());
68672
68673           entities.forEach(function(entity) {
68674               if (entity && entity.user) users[entity.user] = true;
68675           });
68676
68677           var u = Object.keys(users),
68678               subset = u.slice(0, u.length > limit ? limit - 1 : limit);
68679
68680           wrap.html('')
68681               .call(svgIcon('#iD-icon-nearby', 'pre-text light'));
68682
68683           var userList = select(document.createElement('span'));
68684
68685           userList.selectAll()
68686               .data(subset)
68687               .enter()
68688               .append('a')
68689               .attr('class', 'user-link')
68690               .attr('href', function(d) { return osm.userURL(d); })
68691               .attr('target', '_blank')
68692               .attr('tabindex', -1)
68693               .text(String);
68694
68695           if (u.length > limit) {
68696               var count = select(document.createElement('span'));
68697
68698               count.append('a')
68699                   .attr('target', '_blank')
68700                   .attr('tabindex', -1)
68701                   .attr('href', function() {
68702                       return osm.changesetsURL(context.map().center(), context.map().zoom());
68703                   })
68704                   .text(u.length - limit + 1);
68705
68706               wrap.append('span')
68707                   .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
68708
68709           } else {
68710               wrap.append('span')
68711                   .html(t('contributors.list', { users: userList.html() }));
68712           }
68713
68714           if (!u.length) {
68715               hidden = true;
68716               wrap
68717                   .transition()
68718                   .style('opacity', 0);
68719
68720           } else if (hidden) {
68721               wrap
68722                   .transition()
68723                   .style('opacity', 1);
68724           }
68725       }
68726
68727
68728       return function(selection$$1) {
68729           if (!osm) return;
68730           wrap = selection$$1;
68731           update();
68732
68733           osm.on('loaded.contributors', debouncedUpdate);
68734           context.map().on('move.contributors', debouncedUpdate);
68735       };
68736   }
68737
68738   function uiFeatureInfo(context) {
68739       function update(selection$$1) {
68740           var features = context.features(),
68741               stats = features.stats(),
68742               count = 0,
68743               hiddenList = compact(map$3(features.hidden(), function(k) {
68744                   if (stats[k]) {
68745                       count += stats[k];
68746                       return String(stats[k]) + ' ' + t('feature.' + k + '.description');
68747                   }
68748               }));
68749
68750           selection$$1.html('');
68751
68752           if (hiddenList.length) {
68753               var tooltipBehavior = tooltip()
68754                   .placement('top')
68755                   .html(true)
68756                   .title(function() {
68757                       return uiTooltipHtml(hiddenList.join('<br/>'));
68758                   });
68759
68760               var warning = selection$$1.append('a')
68761                   .attr('href', '#')
68762                   .attr('tabindex', -1)
68763                   .html(t('feature_info.hidden_warning', { count: count }))
68764                   .call(tooltipBehavior)
68765                   .on('click', function() {
68766                       tooltipBehavior.hide(warning);
68767                       // open map data panel?
68768                       event.preventDefault();
68769                   });
68770           }
68771
68772           selection$$1
68773               .classed('hide', !hiddenList.length);
68774       }
68775
68776
68777       return function(selection$$1) {
68778           update(selection$$1);
68779
68780           context.features().on('change.feature_info', function() {
68781               update(selection$$1);
68782           });
68783       };
68784   }
68785
68786   function uiFullScreen(context) {
68787       var element = context.container().node();
68788       // var button = d3_select(null);
68789
68790
68791       function getFullScreenFn() {
68792           if (element.requestFullscreen) {
68793               return element.requestFullscreen;
68794           } else if (element.msRequestFullscreen) {
68795               return element.msRequestFullscreen;
68796           } else if (element.mozRequestFullScreen) {
68797               return element.mozRequestFullScreen;
68798           } else if (element.webkitRequestFullscreen) {
68799               return element.webkitRequestFullscreen;
68800           }
68801       }
68802
68803
68804       function getExitFullScreenFn() {
68805           if (document.exitFullscreen) {
68806               return document.exitFullscreen;
68807           } else if (document.msExitFullscreen) {
68808               return document.msExitFullscreen;
68809           } else if (document.mozCancelFullScreen) {
68810               return document.mozCancelFullScreen;
68811           } else if (document.webkitExitFullscreen) {
68812               return document.webkitExitFullscreen;
68813           }
68814       }
68815
68816
68817       function isFullScreen() {
68818           return document.fullscreenElement ||
68819               document.mozFullScreenElement ||
68820               document.webkitFullscreenElement ||
68821               document.msFullscreenElement;
68822       }
68823
68824
68825       function isSupported() {
68826           return !!getFullScreenFn();
68827       }
68828
68829
68830       function fullScreen() {
68831           event.preventDefault();
68832           if (!isFullScreen()) {
68833               // button.classed('active', true);
68834               getFullScreenFn().apply(element);
68835           } else {
68836               // button.classed('active', false);
68837               getExitFullScreenFn().apply(document);
68838           }
68839       }
68840
68841
68842       return function() { // selection) {
68843           if (!isSupported()) return;
68844
68845           // button = selection.append('button')
68846           //     .attr('title', t('full_screen'))
68847           //     .attr('tabindex', -1)
68848           //     .on('click', fullScreen)
68849           //     .call(tooltip);
68850
68851           // button.append('span')
68852           //     .attr('class', 'icon full-screen');
68853
68854           var detected = utilDetect();
68855           var keys = (detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11']);
68856           context.keybinding().on(keys, fullScreen);
68857       };
68858   }
68859
68860   function uiLoading(context) {
68861       var _modalSelection = select(null);
68862       var _message = '';
68863       var _blocking = false;
68864
68865
68866       var loading = function(selection$$1) {
68867           _modalSelection = uiModal(selection$$1, _blocking);
68868
68869           var loadertext = _modalSelection.select('.content')
68870               .classed('loading-modal', true)
68871               .append('div')
68872               .attr('class', 'modal-section fillL');
68873
68874           loadertext
68875               .append('img')
68876               .attr('class', 'loader')
68877               .attr('src', context.imagePath('loader-white.gif'));
68878
68879           loadertext
68880               .append('h3')
68881               .text(_message);
68882
68883           _modalSelection.select('button.close')
68884               .attr('class', 'hide');
68885
68886           return loading;
68887       };
68888
68889
68890       loading.message = function(_) {
68891           if (!arguments.length) return _message;
68892           _message = _;
68893           return loading;
68894       };
68895
68896
68897       loading.blocking = function(_) {
68898           if (!arguments.length) return _blocking;
68899           _blocking = _;
68900           return loading;
68901       };
68902
68903
68904       loading.close = function() {
68905           _modalSelection.remove();
68906       };
68907
68908
68909       return loading;
68910   }
68911
68912   function uiGeolocate(context) {
68913       var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ },
68914           locating = uiLoading(context).message(t('geolocate.locating')).blocking(true),
68915           timeoutId;
68916
68917
68918       function click() {
68919           if (context.inIntro()) return;
68920           context.enter(modeBrowse(context));
68921           context.container().call(locating);
68922           navigator.geolocation.getCurrentPosition(success, error, geoOptions);
68923
68924           // This timeout ensures that we still call finish() even if
68925           // the user declines to share their location in Firefox
68926           timeoutId = setTimeout(finish, 10000 /* 10sec */ );
68927       }
68928
68929
68930       function success(position) {
68931           var map = context.map(),
68932               extent = geoExtent$$1([position.coords.longitude, position.coords.latitude])
68933                   .padByMeters(position.coords.accuracy);
68934
68935           map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent)));
68936           finish();
68937       }
68938
68939
68940       function error() {
68941           finish();
68942       }
68943
68944
68945       function finish() {
68946           locating.close();  // unblock ui
68947           if (timeoutId) { clearTimeout(timeoutId); }
68948           timeoutId = undefined;
68949       }
68950
68951
68952       return function(selection) {
68953           if (!navigator.geolocation) return;
68954
68955           selection
68956               .append('button')
68957               .attr('tabindex', -1)
68958               .attr('title', t('geolocate.title'))
68959               .on('click', click)
68960               .call(svgIcon('#iD-icon-geolocate', 'light'))
68961               .call(tooltip()
68962                   .placement((textDirection === 'rtl') ? 'right' : 'left'));
68963       };
68964   }
68965
68966   function uiPanelBackground(context) {
68967       var background = context.background();
68968       var currSourceName = null;
68969       var metadata = {};
68970       var metadataKeys = [
68971           'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
68972       ];
68973
68974       var debouncedRedraw = debounce(redraw, 250);
68975
68976       function redraw(selection$$1) {
68977           var source = background.baseLayerSource();
68978           var isDG = (source.id.match(/^DigitalGlobe/i) !== null);
68979
68980           if (currSourceName !== source.name()) {
68981               currSourceName = source.name();
68982               metadata = {};
68983           }
68984
68985           selection$$1.html('');
68986
68987           var list = selection$$1
68988               .append('ul')
68989               .attr('class', 'background-info');
68990
68991           list
68992               .append('li')
68993               .text(currSourceName);
68994
68995           metadataKeys.forEach(function(k) {
68996               // DigitalGlobe vintage is available in raster layers for now.
68997               if (isDG && k === 'vintage') return;
68998
68999               list
69000                   .append('li')
69001                   .attr('class', 'background-info-list-' + k)
69002                   .classed('hide', !metadata[k])
69003                   .text(t('info_panels.background.' + k) + ':')
69004                   .append('span')
69005                   .attr('class', 'background-info-span-' + k)
69006                   .text(metadata[k]);
69007           });
69008
69009           debouncedGetMetadata(selection$$1);
69010
69011           var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
69012
69013           selection$$1
69014               .append('a')
69015               .text(t('info_panels.background.' + toggleTiles))
69016               .attr('href', '#')
69017               .attr('class', 'button button-toggle-tiles')
69018               .on('click', function() {
69019                   event.preventDefault();
69020                   context.setDebug('tile', !context.getDebug('tile'));
69021                   selection$$1.call(redraw);
69022               });
69023
69024           if (isDG) {
69025               var key = source.id + '-vintage';
69026               var sourceVintage = context.background().findSource(key);
69027               var showsVintage = context.background().showsLayer(sourceVintage);
69028               var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
69029               selection$$1
69030                   .append('a')
69031                   .text(t('info_panels.background.' + toggleVintage))
69032                   .attr('href', '#')
69033                   .attr('class', 'button button-toggle-vintage')
69034                   .on('click', function() {
69035                       event.preventDefault();
69036                       context.background().toggleOverlayLayer(sourceVintage);
69037                       selection$$1.call(redraw);
69038                   });
69039           }
69040
69041           // disable if necessary
69042           ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
69043               if (source.id !== layerId) {
69044                   var key = layerId + '-vintage';
69045                   var sourceVintage = context.background().findSource(key);
69046                   if (context.background().showsLayer(sourceVintage)) {
69047                       context.background().toggleOverlayLayer(sourceVintage);
69048                   }
69049               }
69050           });
69051       }
69052
69053
69054       var debouncedGetMetadata = debounce(getMetadata, 250);
69055
69056       function getMetadata(selection$$1) {
69057           var tile = select('.layer-background img.tile-center');   // tile near viewport center
69058           if (tile.empty()) return;
69059
69060           var sourceName = currSourceName,
69061               d = tile.datum(),
69062               zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
69063               center = context.map().center();
69064
69065           // update zoom
69066           metadata.zoom = String(zoom);
69067           selection$$1.selectAll('.background-info-list-zoom')
69068               .classed('hide', false)
69069               .selectAll('.background-info-span-zoom')
69070               .text(metadata.zoom);
69071
69072           if (!d || !d.length >= 3) return;
69073
69074           background.baseLayerSource().getMetadata(center, d, function(err, result) {
69075               if (err || currSourceName !== sourceName) return;
69076
69077               // update vintage
69078               var vintage = result.vintage;
69079               metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
69080               selection$$1.selectAll('.background-info-list-vintage')
69081                   .classed('hide', false)
69082                   .selectAll('.background-info-span-vintage')
69083                   .text(metadata.vintage);
69084
69085               // update other metdata
69086               without(metadataKeys, 'zoom', 'vintage')
69087                   .forEach(function(k) {
69088                       var val = result[k];
69089                       metadata[k] = val;
69090                       selection$$1.selectAll('.background-info-list-' + k)
69091                           .classed('hide', !val)
69092                           .selectAll('.background-info-span-' + k)
69093                           .text(val);
69094                   });
69095           });
69096       }
69097
69098
69099       var panel = function(selection$$1) {
69100           selection$$1.call(redraw);
69101
69102           context.map()
69103               .on('drawn.info-background', function() {
69104                   selection$$1.call(debouncedRedraw);
69105               })
69106               .on('move.info-background', function() {
69107                   selection$$1.call(debouncedGetMetadata);
69108               });
69109
69110       };
69111
69112       panel.off = function() {
69113           context.map()
69114               .on('drawn.info-background', null)
69115               .on('move.info-background', null);
69116       };
69117
69118       panel.id = 'background';
69119       panel.title = t('info_panels.background.title');
69120       panel.key = t('info_panels.background.key');
69121
69122
69123       return panel;
69124   }
69125
69126   function uiPanelHistory(context) {
69127       var osm;
69128
69129       function displayTimestamp(timestamp) {
69130           if (!timestamp) return t('info_panels.history.unknown');
69131           var detected = utilDetect();
69132           var options = {
69133               day: 'numeric', month: 'short', year: 'numeric',
69134               hour: 'numeric', minute: 'numeric', second: 'numeric'
69135           };
69136           var d = new Date(timestamp);
69137           if (isNaN(d.getTime())) return t('info_panels.history.unknown');
69138           return d.toLocaleString(detected.locale, options);
69139       }
69140
69141
69142       function displayUser(selection, userName) {
69143           if (!userName) {
69144               selection
69145                   .append('span')
69146                   .text(t('info_panels.history.unknown'));
69147               return;
69148           }
69149
69150           selection
69151               .append('span')
69152               .attr('class', 'user-name')
69153               .text(userName);
69154
69155           var links = selection
69156               .append('div')
69157               .attr('class', 'links');
69158
69159           if (osm) {
69160               links
69161                   .append('a')
69162                   .attr('class', 'user-osm-link')
69163                   .attr('href', osm.userURL(userName))
69164                   .attr('target', '_blank')
69165                   .attr('tabindex', -1)
69166                   .text('OSM');
69167           }
69168
69169           links
69170               .append('a')
69171               .attr('class', 'user-hdyc-link')
69172               .attr('href', 'https://hdyc.neis-one.org/?' + userName)
69173               .attr('target', '_blank')
69174               .attr('tabindex', -1)
69175               .text('HDYC');
69176       }
69177
69178
69179       function displayChangeset(selection, changeset) {
69180           if (!changeset) {
69181               selection
69182                   .append('span')
69183                   .text(t('info_panels.history.unknown'));
69184               return;
69185           }
69186
69187           selection
69188               .append('span')
69189               .attr('class', 'changeset-id')
69190               .text(changeset);
69191
69192           var links = selection
69193               .append('div')
69194               .attr('class', 'links');
69195
69196           if (osm) {
69197               links
69198                   .append('a')
69199                   .attr('class', 'changeset-osm-link')
69200                   .attr('href', osm.changesetURL(changeset))
69201                   .attr('target', '_blank')
69202                   .attr('tabindex', -1)
69203                   .text('OSM');
69204           }
69205
69206           links
69207               .append('a')
69208               .attr('class', 'changeset-osmcha-link')
69209               .attr('href', 'https://osmcha.mapbox.com/changesets/' + changeset)
69210               .attr('target', '_blank')
69211               .attr('tabindex', -1)
69212               .text('OSMCha');
69213       }
69214
69215
69216       function redraw(selection) {
69217           var selectedNoteID = context.selectedNoteID();
69218           osm = context.connection();
69219
69220           var selected, note, entity;
69221           if (selectedNoteID && osm) {       // selected 1 note
69222               selected = [ t('note.note') + ' ' + selectedNoteID ];
69223               note = osm.getNote(selectedNoteID);
69224           } else {                           // selected 1..n entities
69225               selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
69226               if (selected.length) {
69227                   entity = context.entity(selected[0]);
69228               }
69229           }
69230
69231           var singular = selected.length === 1 ? selected[0] : null;
69232
69233           selection.html('');
69234
69235           selection
69236               .append('h4')
69237               .attr('class', 'history-heading')
69238               .text(singular || t('info_panels.history.selected', { n: selected.length }));
69239
69240           if (!singular) return;
69241
69242           if (entity) {
69243               selection.call(redrawEntity, entity);
69244           } else if (note) {
69245               selection.call(redrawNote, note);
69246           }
69247       }
69248
69249
69250       function redrawNote(selection, note) {
69251           if (!note || note.isNew()) {
69252               selection
69253                   .append('div')
69254                   .text(t('info_panels.history.note_no_history'));
69255               return;
69256           }
69257
69258           var list = selection
69259               .append('ul');
69260
69261           list
69262               .append('li')
69263               .text(t('info_panels.history.note_comments') + ':')
69264               .append('span')
69265               .text(note.comments.length);
69266
69267           if (note.comments.length) {
69268               list
69269                   .append('li')
69270                   .text(t('info_panels.history.note_created_date') + ':')
69271                   .append('span')
69272                   .text(displayTimestamp(note.comments[0].date));
69273
69274               list
69275                   .append('li')
69276                   .text(t('info_panels.history.note_created_user') + ':')
69277                   .call(displayUser, note.comments[0].user);
69278           }
69279
69280           if (osm) {
69281               selection
69282                   .append('a')
69283                   .attr('class', 'view-history-on-osm')
69284                   .attr('target', '_blank')
69285                   .attr('tabindex', -1)
69286                   .attr('href', osm.noteURL(note))
69287                   .call(svgIcon('#iD-icon-out-link', 'inline'))
69288                   .append('span')
69289                   .text(t('info_panels.history.note_link_text'));
69290           }
69291       }
69292
69293
69294       function redrawEntity(selection, entity) {
69295           if (!entity || entity.isNew()) {
69296               selection
69297                   .append('div')
69298                   .text(t('info_panels.history.no_history'));
69299               return;
69300           }
69301
69302           var list = selection
69303               .append('ul');
69304
69305           list
69306               .append('li')
69307               .text(t('info_panels.history.version') + ':')
69308               .append('span')
69309               .text(entity.version);
69310
69311           list
69312               .append('li')
69313               .text(t('info_panels.history.last_edit') + ':')
69314               .append('span')
69315               .text(displayTimestamp(entity.timestamp));
69316
69317           list
69318               .append('li')
69319               .text(t('info_panels.history.edited_by') + ':')
69320               .call(displayUser, entity.user);
69321
69322           list
69323               .append('li')
69324               .text(t('info_panels.history.changeset') + ':')
69325               .call(displayChangeset, entity.changeset);
69326
69327           if (osm) {
69328               selection
69329                   .append('a')
69330                   .attr('class', 'view-history-on-osm')
69331                   .attr('target', '_blank')
69332                   .attr('tabindex', -1)
69333                   .attr('href', osm.historyURL(entity))
69334                   .call(svgIcon('#iD-icon-out-link', 'inline'))
69335                   .append('span')
69336                   .text(t('info_panels.history.link_text'));
69337           }
69338       }
69339
69340
69341       var panel = function(selection) {
69342           selection.call(redraw);
69343
69344           context.map()
69345               .on('drawn.info-history', function() {
69346                   selection.call(redraw);
69347               });
69348
69349           context
69350               .on('enter.info-history', function() {
69351                   selection.call(redraw);
69352               });
69353       };
69354
69355       panel.off = function() {
69356           context.map().on('drawn.info-history', null);
69357           context.on('enter.info-history', null);
69358       };
69359
69360       panel.id = 'history';
69361       panel.title = t('info_panels.history.title');
69362       panel.key = t('info_panels.history.key');
69363
69364
69365       return panel;
69366   }
69367
69368   var OSM_PRECISION = 7;
69369   var locale$2 = utilDetect().locale;
69370
69371   /**
69372    * Returns a localized representation of the given length measurement.
69373    *
69374    * @param {Number} m area in meters
69375    * @param {Boolean} isImperial true for U.S. customary units; false for metric
69376    */
69377   function displayLength(m, isImperial) {
69378       var d = m * (isImperial ? 3.28084 : 1);
69379       var unit;
69380
69381       if (isImperial) {
69382           if (d >= 5280) {
69383               d /= 5280;
69384               unit = 'miles';
69385           } else {
69386               unit = 'feet';
69387           }
69388       } else {
69389           if (d >= 1000) {
69390               d /= 1000;
69391               unit = 'kilometers';
69392           } else {
69393               unit = 'meters';
69394           }
69395       }
69396
69397       return t('units.' + unit, {
69398           quantity: d.toLocaleString(locale$2, {
69399               maximumSignificantDigits: 4
69400           })
69401       });
69402   }
69403
69404   /**
69405    * Returns a localized representation of the given area measurement.
69406    *
69407    * @param {Number} m2 area in square meters
69408    * @param {Boolean} isImperial true for U.S. customary units; false for metric
69409    */
69410   function displayArea(m2, isImperial) {
69411       var d = m2 * (isImperial ? 10.7639111056 : 1);
69412       var d1, d2, area;
69413       var unit1 = '';
69414       var unit2 = '';
69415
69416       if (isImperial) {
69417           if (d >= 6969600) { // > 0.25mi² show mi²
69418               d1 = d / 27878400;
69419               unit1 = 'square_miles';
69420           } else {
69421               d1 = d;
69422               unit1 = 'square_feet';
69423           }
69424
69425           if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
69426               d2 = d / 43560;
69427               unit2 = 'acres';
69428           }
69429
69430       } else {
69431           if (d >= 250000) { // > 0.25km² show km²
69432               d1 = d / 1000000;
69433               unit1 = 'square_kilometers';
69434           } else {
69435               d1 = d;
69436               unit1 = 'square_meters';
69437           }
69438
69439           if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
69440               d2 = d / 10000;
69441               unit2 = 'hectares';
69442           }
69443       }
69444
69445       area = t('units.' + unit1, {
69446           quantity: d1.toLocaleString(locale$2, {
69447               maximumSignificantDigits: 4
69448           })
69449       });
69450
69451       if (d2) {
69452           return t('units.area_pair', {
69453               area1: area,
69454               area2: t('units.' + unit2, {
69455                   quantity: d2.toLocaleString(locale$2, {
69456                       maximumSignificantDigits: 2
69457                   })
69458               })
69459           });
69460       } else {
69461           return area;
69462       }
69463   }
69464
69465   function wrap(x, min, max) {
69466       var d = max - min;
69467       return ((x - min) % d + d) % d + min;
69468   }
69469
69470   function clamp(x, min, max) {
69471       return Math.max(min, Math.min(x, max));
69472   }
69473
69474   function displayCoordinate(deg, pos, neg) {
69475       var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
69476       var sec = (min - Math.floor(min)) * 60;
69477       var displayDegrees = t('units.arcdegrees', {
69478           quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
69479       });
69480       var displayCoordinate;
69481
69482       if (Math.floor(sec) > 0) {
69483           displayCoordinate = displayDegrees +
69484               t('units.arcminutes', {
69485                   quantity: Math.floor(min).toLocaleString(locale$2)
69486               }) +
69487               t('units.arcseconds', {
69488                   quantity: Math.round(sec).toLocaleString(locale$2)
69489               });
69490       } else if (Math.floor(min) > 0) {
69491           displayCoordinate = displayDegrees +
69492               t('units.arcminutes', {
69493                   quantity: Math.round(min).toLocaleString(locale$2)
69494               });
69495       } else {
69496           displayCoordinate = t('units.arcdegrees', {
69497               quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
69498           });
69499       }
69500
69501       if (deg === 0) {
69502           return displayCoordinate;
69503       } else {
69504           return t('units.coordinate', {
69505               coordinate: displayCoordinate,
69506               direction: t('units.' + (deg > 0 ? pos : neg))
69507           });
69508       }
69509   }
69510
69511   /**
69512    * Returns given coordinate pair in degree-minute-second format.
69513    *
69514    * @param {Array<Number>} coord longitude and latitude
69515    */
69516   function dmsCoordinatePair(coord) {
69517       return t('units.coordinate_pair', {
69518           latitude: displayCoordinate(clamp(coord[1], -90, 90), 'north', 'south'),
69519           longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
69520       });
69521   }
69522
69523   /**
69524    * Returns the given coordinate pair in decimal format.
69525    * note: unlocalized to avoid comma ambiguity - see #4765
69526    *
69527    * @param {Array<Number>} coord longitude and latitude
69528    */
69529   function decimalCoordinatePair(coord) {
69530       return t('units.coordinate_pair', {
69531           latitude: clamp(coord[1], -90, 90).toFixed(OSM_PRECISION),
69532           longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
69533       });
69534   }
69535
69536   function uiPanelLocation(context) {
69537       var currLocation = '';
69538
69539
69540       function redraw(selection) {
69541           selection.html('');
69542
69543           var list = selection
69544               .append('ul');
69545
69546           // Mouse coordinates
69547           var coord = context.map().mouseCoordinates();
69548           if (coord.some(isNaN)) {
69549               coord = context.map().center();
69550           }
69551
69552           list
69553               .append('li')
69554               .text(dmsCoordinatePair(coord))
69555               .append('li')
69556               .text(decimalCoordinatePair(coord));
69557
69558           // Location Info
69559           selection
69560               .append('div')
69561               .attr('class', 'location-info')
69562               .text(currLocation || ' ');
69563
69564           debouncedGetLocation(selection, coord);
69565       }
69566
69567
69568       var debouncedGetLocation = debounce(getLocation, 250);
69569       function getLocation(selection, coord) {
69570           if (!services.geocoder) {
69571               currLocation = t('info_panels.location.unknown_location');
69572               selection.selectAll('.location-info')
69573                   .text(currLocation);
69574           } else {
69575               services.geocoder.reverse(coord, function(err, result) {
69576                   currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
69577                   selection.selectAll('.location-info')
69578                       .text(currLocation);
69579               });
69580           }
69581       }
69582
69583
69584       var panel = function(selection) {
69585           selection.call(redraw);
69586
69587           context.surface()
69588               .on('mousemove.info-location', function() {
69589                   selection.call(redraw);
69590               });
69591       };
69592
69593       panel.off = function() {
69594           context.surface()
69595               .on('mousemove.info-location', null);
69596       };
69597
69598       panel.id = 'location';
69599       panel.title = t('info_panels.location.title');
69600       panel.key = t('info_panels.location.key');
69601
69602
69603       return panel;
69604   }
69605
69606   function uiPanelMeasurement(context) {
69607       var locale = utilDetect().locale,
69608           isImperial = (locale.toLowerCase() === 'en-us');
69609
69610
69611       function radiansToMeters(r) {
69612           // using WGS84 authalic radius (6371007.1809 m)
69613           return r * 6371007.1809;
69614       }
69615
69616       function steradiansToSqmeters(r) {
69617           // http://gis.stackexchange.com/a/124857/40446
69618           return r / (4 * Math.PI) * 510065621724000;
69619       }
69620
69621
69622       function toLineString(feature) {
69623           if (feature.type === 'LineString') return feature;
69624
69625           var result = { type: 'LineString', coordinates: [] };
69626           if (feature.type === 'Polygon') {
69627               result.coordinates = feature.coordinates[0];
69628           } else if (feature.type === 'MultiPolygon') {
69629               result.coordinates = feature.coordinates[0][0];
69630           }
69631
69632           return result;
69633       }
69634
69635
69636       function nodeCount(feature) {
69637         if (feature.type === 'LineString') return feature.coordinates.length;
69638         if (feature.type === 'Polygon') return feature.coordinates[0].length - 1;
69639       }
69640
69641
69642       function redraw(selection$$1) {
69643           var resolver = context.graph();
69644           var selectedNoteID = context.selectedNoteID();
69645           var osm = services.osm;
69646
69647           var selected, center, entity, note, geometry;
69648
69649           if (selectedNoteID && osm) {       // selected 1 note
69650               selected = [ t('note.note') + ' ' + selectedNoteID ];
69651               note = osm.getNote(selectedNoteID);
69652               center = note.loc;
69653               geometry = 'note';
69654
69655           } else {                           // selected 1..n entities
69656               var extent = geoExtent$$1();
69657               selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
69658               if (selected.length) {
69659                   for (var i = 0; i < selected.length; i++) {
69660                       entity = context.entity(selected[i]);
69661                       extent._extend(entity.extent(resolver));
69662                   }
69663                   center = extent.center();
69664                   geometry = entity.geometry(resolver);
69665               }
69666           }
69667
69668           var singular = selected.length === 1 ? selected[0] : null;
69669
69670           selection$$1.html('');
69671
69672           selection$$1
69673               .append('h4')
69674               .attr('class', 'measurement-heading')
69675               .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
69676
69677           if (!selected.length) return;
69678
69679
69680           var list = selection$$1
69681               .append('ul');
69682           var coordItem;
69683
69684           // multiple selected features, just display extent center..
69685           if (!singular) {
69686               coordItem = list
69687                   .append('li')
69688                   .text(t('info_panels.measurement.center') + ':');
69689               coordItem.append('span')
69690                   .text(dmsCoordinatePair(center));
69691               coordItem.append('span')
69692                   .text(decimalCoordinatePair(center));
69693               return;
69694           }
69695
69696           // single selected feature, display details..
69697           if (geometry === 'line' || geometry === 'area') {
69698               var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate());
69699               var feature = entity.asGeoJSON(resolver);
69700               var length = radiansToMeters(length$1(toLineString(feature)));
69701               var lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length'));
69702               var centroid = d3_geoCentroid(feature);
69703
69704               list
69705                   .append('li')
69706                   .text(t('info_panels.measurement.geometry') + ':')
69707                   .append('span')
69708                   .text(
69709                       closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
69710                   );
69711
69712               if (entity.type !== 'relation') {
69713                   list
69714                       .append('li')
69715                       .text(t('info_panels.measurement.node_count') + ':')
69716                       .append('span')
69717                       .text(nodeCount(feature).toLocaleString(locale));
69718               }
69719
69720               if (closed) {
69721                   var area = steradiansToSqmeters(entity.area(resolver));
69722                   list
69723                       .append('li')
69724                       .text(t('info_panels.measurement.area') + ':')
69725                       .append('span')
69726                       .text(displayArea(area, isImperial));
69727               }
69728
69729
69730               list
69731                   .append('li')
69732                   .text(lengthLabel + ':')
69733                   .append('span')
69734                   .text(displayLength(length, isImperial));
69735
69736               coordItem = list
69737                   .append('li')
69738                   .text(t('info_panels.measurement.centroid') + ':');
69739               coordItem.append('span')
69740                   .text(dmsCoordinatePair(centroid));
69741               coordItem.append('span')
69742                   .text(decimalCoordinatePair(centroid));
69743
69744               var toggle  = isImperial ? 'imperial' : 'metric';
69745
69746               selection$$1
69747                   .append('a')
69748                   .text(t('info_panels.measurement.' + toggle))
69749                   .attr('href', '#')
69750                   .attr('class', 'button button-toggle-units')
69751                   .on('click', function() {
69752                       event.preventDefault();
69753                       isImperial = !isImperial;
69754                       selection$$1.call(redraw);
69755                   });
69756
69757           } else {
69758               var centerLabel = t('info_panels.measurement.' +
69759                   (note || entity.type === 'node' ? 'location' : 'center'));
69760
69761               list
69762                   .append('li')
69763                   .text(t('info_panels.measurement.geometry') + ':')
69764                   .append('span')
69765                   .text(t('geometry.' + geometry));
69766
69767               coordItem = list
69768                   .append('li')
69769                   .text(centerLabel + ':');
69770               coordItem.append('span')
69771                   .text(dmsCoordinatePair(center));
69772               coordItem.append('span')
69773                   .text(decimalCoordinatePair(center));
69774           }
69775       }
69776
69777
69778       var panel = function(selection$$1) {
69779           selection$$1.call(redraw);
69780
69781           context.map()
69782               .on('drawn.info-measurement', function() {
69783                   selection$$1.call(redraw);
69784               });
69785
69786           context
69787               .on('enter.info-measurement', function() {
69788                   selection$$1.call(redraw);
69789               });
69790       };
69791
69792       panel.off = function() {
69793           context.map().on('drawn.info-measurement', null);
69794           context.on('enter.info-measurement', null);
69795       };
69796
69797       panel.id = 'measurement';
69798       panel.title = t('info_panels.measurement.title');
69799       panel.key = t('info_panels.measurement.key');
69800
69801
69802       return panel;
69803   }
69804
69805   var uiInfoPanels = {
69806       background: uiPanelBackground,
69807       history: uiPanelHistory,
69808       location: uiPanelLocation,
69809       measurement: uiPanelMeasurement,
69810   };
69811
69812   function uiInfo(context) {
69813       var ids = Object.keys(uiInfoPanels);
69814       var wasActive = ['measurement'];
69815       var panels = {};
69816       var active = {};
69817
69818       // create panels
69819       ids.forEach(function(k) {
69820           if (!panels[k]) {
69821               panels[k] = uiInfoPanels[k](context);
69822               active[k] = false;
69823           }
69824       });
69825
69826
69827       function info(selection$$1) {
69828
69829           function redraw() {
69830               var activeids = ids.filter(function(k) { return active[k]; }).sort();
69831
69832               var containers = infoPanels.selectAll('.panel-container')
69833                   .data(activeids, function(k) { return k; });
69834
69835               containers.exit()
69836                   .style('opacity', 1)
69837                   .transition()
69838                   .duration(200)
69839                   .style('opacity', 0)
69840                   .on('end', function(d) {
69841                       select(this)
69842                           .call(panels[d].off)
69843                           .remove();
69844                   });
69845
69846               var enter = containers.enter()
69847                   .append('div')
69848                   .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
69849
69850               enter
69851                   .style('opacity', 0)
69852                   .transition()
69853                   .duration(200)
69854                   .style('opacity', 1);
69855
69856               var title = enter
69857                   .append('div')
69858                   .attr('class', 'panel-title fillD2');
69859
69860               title
69861                   .append('h3')
69862                   .text(function(d) { return panels[d].title; });
69863
69864               title
69865                   .append('button')
69866                   .attr('class', 'close')
69867                   .on('click', function (d) { toggle(d); })
69868                   .call(svgIcon('#iD-icon-close'));
69869
69870               enter
69871                   .append('div')
69872                   .attr('class', function(d) { return 'panel-content panel-content-' + d; });
69873
69874
69875               // redraw the panels
69876               infoPanels.selectAll('.panel-content')
69877                   .each(function(d) {
69878                       select(this).call(panels[d]);
69879                   });
69880           }
69881
69882
69883           function toggle(which) {
69884               if (event) {
69885                   event.stopImmediatePropagation();
69886                   event.preventDefault();
69887               }
69888
69889               var activeids = ids.filter(function(k) { return active[k]; });
69890
69891               if (which) {  // toggle one
69892                   active[which] = !active[which];
69893                   if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
69894                       wasActive = [which];
69895                   }
69896               } else {      // toggle all
69897                   if (activeids.length) {
69898                       wasActive = activeids;
69899                       activeids.forEach(function(k) { active[k] = false; });
69900                   } else {
69901                       wasActive.forEach(function(k) { active[k] = true; });
69902                   }
69903               }
69904
69905               redraw();
69906           }
69907
69908
69909           var infoPanels = selection$$1.selectAll('.info-panels')
69910               .data([0]);
69911
69912           infoPanels = infoPanels.enter()
69913               .append('div')
69914               .attr('class', 'info-panels')
69915               .merge(infoPanels);
69916
69917           redraw();
69918
69919           context.keybinding()
69920               .on(uiCmd('⌘' + t('info_panels.key')), toggle);
69921
69922           ids.forEach(function(k) {
69923               var key = t('info_panels.' + k + '.key', { default: null });
69924               if (!key) return;
69925               context.keybinding()
69926                   .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
69927           });
69928       }
69929
69930       return info;
69931   }
69932
69933   function uiModes(context) {
69934       var modes = [
69935           modeAddPoint$$1(context),
69936           modeAddLine$$1(context),
69937           modeAddArea$$1(context),
69938           modeAddNote$$1(context)
69939       ];
69940
69941
69942       function editable() {
69943           var mode = context.mode();
69944           return context.editable() && mode && mode.id !== 'save';
69945       }
69946
69947       function notesEnabled() {
69948           var noteLayer = context.layers().layer('notes');
69949           return noteLayer && noteLayer.enabled();
69950       }
69951
69952       function notesEditable() {
69953           var mode = context.mode();
69954           return context.map().notesEditable() && mode && mode.id !== 'save';
69955       }
69956
69957
69958       return function(selection$$1) {
69959           context
69960               .on('enter.editor', function(entered) {
69961                   selection$$1.selectAll('button.add-button')
69962                       .classed('active', function(mode) { return entered.button === mode.button; });
69963                   context.container()
69964                       .classed('mode-' + entered.id, true);
69965               });
69966
69967           context
69968               .on('exit.editor', function(exited) {
69969                   context.container()
69970                       .classed('mode-' + exited.id, false);
69971               });
69972
69973           modes.forEach(function(mode) {
69974               context.keybinding().on(mode.key, function() {
69975                   if (mode.id === 'add-note' && !(notesEnabled() && notesEditable())) return;
69976                   if (mode.id !== 'add-note' && !editable()) return;
69977
69978                   if (mode.id === context.mode().id) {
69979                       context.enter(modeBrowse(context));
69980                   } else {
69981                       context.enter(mode);
69982                   }
69983               });
69984           });
69985
69986
69987           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
69988
69989           context.map()
69990               .on('move.modes', debouncedUpdate)
69991               .on('drawn.modes', debouncedUpdate);
69992
69993           context
69994               .on('enter.modes', update);
69995
69996           update();
69997
69998
69999           function update() {
70000               var showNotes = notesEnabled();
70001               var data = showNotes ? modes : modes.slice(0, 3);
70002
70003               var buttons = selection$$1.selectAll('button.add-button')
70004                   .data(data, function(d) { return d.id; });
70005
70006               // exit
70007               buttons.exit()
70008                   .remove();
70009
70010               // enter
70011               var buttonsEnter = buttons.enter()
70012                   .append('button')
70013                   .attr('tabindex', -1)
70014                   .attr('class', function(d) { return d.id + ' add-button'; })
70015                   .on('click.mode-buttons', function(mode) {
70016                       // When drawing, ignore accidental clicks on mode buttons - #4042
70017                       var currMode = context.mode().id;
70018                       if (currMode.match(/^draw/) !== null) return;
70019
70020                       if (mode.id === currMode) {
70021                           context.enter(modeBrowse(context));
70022                       } else {
70023                           context.enter(mode);
70024                       }
70025                   })
70026                   .call(tooltip()
70027                       .placement('bottom')
70028                       .html(true)
70029                       .title(function(mode) {
70030                           return uiTooltipHtml(mode.description, mode.key);
70031                       })
70032                   );
70033
70034               buttonsEnter
70035                   .each(function(d) {
70036                       select(this)
70037                           .call(svgIcon('#iD-icon-' + d.button));
70038                   });
70039
70040               buttonsEnter
70041                   .append('span')
70042                   .attr('class', 'label')
70043                   .text(function(mode) { return mode.title; });
70044
70045               // if we are adding/removing the buttons, check if toolbar has overflowed
70046               if (buttons.enter().size() || buttons.exit().size()) {
70047                   context.ui().checkOverflow('#bar', true);
70048               }
70049
70050               // update
70051               buttons = buttons
70052                   .merge(buttonsEnter)
70053                   .property('disabled', function(d) {
70054                       return d.id === 'add-note' ? !notesEditable() : !editable();
70055                   });
70056           }
70057       };
70058   }
70059
70060   function uiNotice(context) {
70061
70062       return function(selection$$1) {
70063           var div = selection$$1
70064               .append('div')
70065               .attr('class', 'notice');
70066
70067           var button = div
70068               .append('button')
70069               .attr('class', 'zoom-to notice fillD')
70070               .on('click', function() {
70071                   context.map().zoomEase(context.minEditableZoom());
70072               })
70073               .on('wheel', function() {   // let wheel events pass through #4482
70074                   var e2 = new WheelEvent(event.type, event);
70075                   context.surface().node().dispatchEvent(e2);
70076               });
70077
70078           button
70079               .call(svgIcon('#iD-icon-plus', 'pre-text'))
70080               .append('span')
70081               .attr('class', 'label')
70082               .text(t('zoom_in_edit'));
70083
70084
70085           function disableTooHigh() {
70086               var canEdit = context.map().zoom() >= context.minEditableZoom();
70087               div.style('display', canEdit ? 'none' : 'block');
70088           }
70089
70090           context.map()
70091               .on('move.notice', debounce(disableTooHigh, 500));
70092
70093           disableTooHigh();
70094       };
70095   }
70096
70097   function uiPhotoviewer(context) {
70098
70099       var dispatch$$1 = dispatch('resize');
70100
70101       function photoviewer(selection$$1) {
70102           selection$$1
70103               .append('button')
70104               .attr('class', 'thumb-hide')
70105               .on('click', function () {
70106                   if (services.streetside) { services.streetside.hideViewer(); }
70107                   if (services.mapillary) { services.mapillary.hideViewer(); }
70108                   if (services.openstreetcam) { services.openstreetcam.hideViewer(); }
70109               })
70110               .append('div')
70111               .call(svgIcon('#iD-icon-close'));
70112
70113           selection$$1
70114               .append('button')
70115               .attr('class', 'resize-handle-xy')
70116               .on(
70117                   'mousedown',
70118                   buildResizeListener(selection$$1, 'resize', dispatch$$1, { resizeOnX: true, resizeOnY: true })
70119               );
70120
70121           selection$$1
70122               .append('button')
70123               .attr('class', 'resize-handle-x')
70124               .on(
70125                   'mousedown',
70126                   buildResizeListener(selection$$1, 'resize', dispatch$$1, { resizeOnX: true })
70127               );
70128
70129           selection$$1
70130               .append('button')
70131               .attr('class', 'resize-handle-y')
70132               .on(
70133                   'mousedown',
70134                   buildResizeListener(selection$$1, 'resize', dispatch$$1, { resizeOnY: true })
70135               );
70136
70137
70138           function buildResizeListener(target, eventName, dispatch$$1, options) {
70139               var resizeOnX = !!options.resizeOnX;
70140               var resizeOnY = !!options.resizeOnY;
70141               var minHeight = options.minHeight || 240;
70142               var minWidth = options.minWidth || 320;
70143               var startX;
70144               var startY;
70145               var startWidth;
70146               var startHeight;
70147
70148               function startResize() {
70149                   var mapSize = context.map().dimensions();
70150
70151                   if (resizeOnX) {
70152                       var maxWidth = mapSize[0];
70153                       var newWidth = clamp((startWidth + event.clientX - startX), minWidth, maxWidth);
70154                       target.style('width', newWidth + 'px');
70155                   }
70156
70157                   if (resizeOnY) {
70158                       var maxHeight = mapSize[1] - 90;  // preserve space at top/bottom of map
70159                       var newHeight = clamp((startHeight + startY - event.clientY), minHeight, maxHeight);
70160                       target.style('height', newHeight + 'px');
70161                   }
70162
70163                   dispatch$$1.call(eventName, target, utilGetDimensions(target, true));
70164               }
70165
70166               function clamp(num, min, max) {
70167                   return Math.max(min, Math.min(num, max));
70168               }
70169
70170               function stopResize() {
70171                   select(window)
70172                       .on('.' + eventName, null);
70173               }
70174
70175               return function initResize() {
70176                   startX = event.clientX;
70177                   startY = event.clientY;
70178                   startWidth = target.node().getBoundingClientRect().width;
70179                   startHeight = target.node().getBoundingClientRect().height;
70180
70181                   select(window)
70182                       .on('mousemove.' + eventName, startResize, false)
70183                       .on('mouseup.' + eventName, stopResize, false);
70184               };
70185           }
70186       }
70187
70188       photoviewer.onMapResize = function() {
70189           var photoviewer = select('#photoviewer');
70190           var content = select('#content');
70191           var mapDimensions = utilGetDimensions(content, true);
70192           // shrink photo viewer if it is too big
70193           // (-90 preserves space at top and bottom of map used by menus)
70194           var photoDimensions = utilGetDimensions(photoviewer, true);
70195           if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > (mapDimensions[1] - 90)) {
70196               var setPhotoDimensions = [
70197                   Math.min(photoDimensions[0], mapDimensions[0]),
70198                   Math.min(photoDimensions[1], mapDimensions[1] - 90),
70199               ];
70200
70201               photoviewer
70202                   .style('width', setPhotoDimensions[0] + 'px')
70203                   .style('height', setPhotoDimensions[1] + 'px');
70204
70205               dispatch$$1.call('resize', photoviewer, setPhotoDimensions);
70206           }
70207       };
70208
70209       return utilRebind(photoviewer, dispatch$$1, 'on');
70210   }
70211
70212   function uiRestore(context) {
70213
70214       return function(selection) {
70215           if (!context.history().lock() || !context.history().restorableChanges())
70216               return;
70217
70218           var modalSelection = uiModal(selection, true);
70219
70220           modalSelection.select('.modal')
70221               .attr('class', 'modal fillL col6');
70222
70223           var introModal = modalSelection.select('.content');
70224
70225           introModal
70226               .attr('class','cf');
70227
70228           introModal
70229               .append('div')
70230               .attr('class', 'modal-section')
70231               .append('h3')
70232               .text(t('restore.heading'));
70233
70234           introModal
70235               .append('div')
70236               .attr('class','modal-section')
70237               .append('p')
70238               .text(t('restore.description'));
70239
70240           var buttonWrap = introModal
70241               .append('div')
70242               .attr('class', 'modal-actions cf');
70243
70244           var restore = buttonWrap
70245               .append('button')
70246               .attr('class', 'restore col6')
70247               .on('click', function() {
70248                   context.history().restore();
70249                   modalSelection.remove();
70250               });
70251
70252           restore
70253               .append('svg')
70254               .attr('class', 'logo logo-restore')
70255               .append('use')
70256               .attr('xlink:href', '#iD-logo-restore');
70257
70258           restore
70259               .append('div')
70260               .text(t('restore.restore'));
70261
70262           var reset = buttonWrap
70263               .append('button')
70264               .attr('class', 'reset col6')
70265               .on('click', function() {
70266                   context.history().clearSaved();
70267                   modalSelection.remove();
70268               });
70269
70270           reset
70271               .append('svg')
70272               .attr('class', 'logo logo-reset')
70273               .append('use')
70274               .attr('xlink:href', '#iD-logo-reset');
70275
70276           reset
70277               .append('div')
70278               .text(t('restore.reset'));
70279
70280           restore.node().focus();
70281       };
70282   }
70283
70284   function uiSave(context) {
70285       var history = context.history();
70286       var key = uiCmd('⌘S');
70287
70288
70289       function saving() {
70290           var mode = context.mode();
70291           return mode && mode.id === 'save';
70292       }
70293
70294
70295       function save() {
70296           event.preventDefault();
70297           if (!context.inIntro() && !saving() && history.hasChanges()) {
70298               context.enter(modeSave$$1(context));
70299           }
70300       }
70301
70302
70303       function getBackground(numChanges) {
70304           var step;
70305           if (numChanges === 0) {
70306               return null;
70307           } else if (numChanges <= 50) {
70308               step = numChanges / 50;
70309               return interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
70310           } else {
70311               step = Math.min((numChanges - 50) / 50, 1.0);
70312               return interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
70313           }
70314       }
70315
70316
70317       return function(selection$$1) {
70318           var numChanges = 0;
70319
70320           function updateCount() {
70321               var _ = history.difference().summary().length;
70322               if (_ === numChanges) return;
70323               numChanges = _;
70324
70325               tooltipBehavior
70326                   .title(uiTooltipHtml(
70327                       t(numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
70328                   );
70329
70330               var background = getBackground(numChanges);
70331
70332               button
70333                   .classed('disabled', numChanges === 0)
70334                   .classed('has-count', numChanges > 0)
70335                   .style('background', background);
70336
70337               button.select('span.count')
70338                   .text(numChanges);
70339           }
70340
70341
70342           var tooltipBehavior = tooltip()
70343               .placement('bottom')
70344               .html(true)
70345               .title(uiTooltipHtml(t('save.no_changes'), key));
70346
70347           var button = selection$$1
70348               .append('button')
70349               .attr('class', 'save disabled')
70350               .attr('tabindex', -1)
70351               .on('click', save)
70352               .call(tooltipBehavior);
70353
70354           button
70355               .call(svgIcon('#iD-icon-save'));
70356
70357           button
70358               .append('span')
70359               .attr('class', 'label')
70360               .text(t('save.title'));
70361
70362           button
70363               .append('span')
70364               .attr('class', 'count')
70365               .text('0');
70366
70367           updateCount();
70368
70369
70370           context.keybinding()
70371               .on(key, save, true);
70372
70373           context.history()
70374               .on('change.save', updateCount);
70375
70376           context
70377               .on('enter.save', function() {
70378                   button.property('disabled', saving());
70379                   if (saving()) button.call(tooltipBehavior.hide);
70380               });
70381       };
70382   }
70383
70384   function uiScale(context) {
70385       var projection = context.projection,
70386           isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
70387           maxLength = 180,
70388           tickHeight = 8;
70389
70390
70391       function scaleDefs(loc1, loc2) {
70392           var lat = (loc2[1] + loc1[1]) / 2,
70393               conversion = (isImperial ? 3.28084 : 1),
70394               dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
70395               scale = { dist: 0, px: 0, text: '' },
70396               buckets, i, val, dLon;
70397
70398           if (isImperial) {
70399               buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
70400           } else {
70401               buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
70402           }
70403
70404           // determine a user-friendly endpoint for the scale
70405           for (i = 0; i < buckets.length; i++) {
70406               val = buckets[i];
70407               if (dist >= val) {
70408                   scale.dist = Math.floor(dist / val) * val;
70409                   break;
70410               } else {
70411                   scale.dist = +dist.toFixed(2);
70412               }
70413           }
70414
70415           dLon = geoMetersToLon(scale.dist / conversion, lat);
70416           scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
70417
70418           scale.text = displayLength(scale.dist / conversion, isImperial);
70419
70420           return scale;
70421       }
70422
70423
70424       function update(selection) {
70425           // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
70426           var dims = context.map().dimensions(),
70427               loc1 = projection.invert([0, dims[1]]),
70428               loc2 = projection.invert([maxLength, dims[1]]),
70429               scale = scaleDefs(loc1, loc2);
70430
70431           selection.select('#scale-path')
70432               .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
70433
70434           selection.select('#scale-textgroup')
70435               .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
70436
70437           selection.select('#scale-text')
70438               .text(scale.text);
70439       }
70440
70441
70442       return function(selection) {
70443           function switchUnits() {
70444               isImperial = !isImperial;
70445               selection.call(update);
70446           }
70447
70448           var scalegroup = selection.append('svg')
70449               .attr('id', 'scale')
70450               .on('click', switchUnits)
70451               .append('g')
70452               .attr('transform', 'translate(10,11)');
70453
70454           scalegroup
70455               .append('path')
70456               .attr('id', 'scale-path');
70457
70458           scalegroup
70459               .append('g')
70460               .attr('id', 'scale-textgroup')
70461               .append('text')
70462               .attr('id', 'scale-text');
70463
70464           selection.call(update);
70465
70466           context.map().on('move.scale', function() {
70467               update(selection);
70468           });
70469       };
70470   }
70471
70472   function uiSidebar$$1(context) {
70473       var inspector = uiInspector(context);
70474       var dataEditor = uiDataEditor$$1(context);
70475       var noteEditor = uiNoteEditor$$1(context);
70476       var _current;
70477       var _wasData = false;
70478       var _wasNote = false;
70479
70480
70481       function sidebar(selection$$1) {
70482           var container = select('#id-container');
70483           var minWidth = 280;
70484           var sidebarWidth;
70485           var containerWidth;
70486           var dragOffset;
70487
70488           var resizer = selection$$1
70489               .append('div')
70490               .attr('id', 'sidebar-resizer');
70491
70492           // Set the initial width constraints
70493           selection$$1
70494               .style('min-width', minWidth + 'px')
70495               .style('max-width', '400px')
70496               .style('width', '33.3333%');
70497
70498           resizer.call(d3_drag()
70499               .container(container.node())
70500               .on('start', function() {
70501                   // offset from edge of sidebar-resizer
70502                   dragOffset = event.sourceEvent.offsetX - 1;
70503
70504                   sidebarWidth = selection$$1.node().getBoundingClientRect().width;
70505                   containerWidth = container.node().getBoundingClientRect().width;
70506                   var widthPct = (sidebarWidth / containerWidth) * 100;
70507                   selection$$1
70508                       .style('width', widthPct + '%')    // lock in current width
70509                       .style('max-width', '85%');        // but allow larger widths
70510
70511                   resizer.classed('dragging', true);
70512               })
70513               .on('drag', function() {
70514                   var isRTL = (textDirection === 'rtl');
70515                   var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
70516
70517                   var x = event.x - dragOffset;
70518                   sidebarWidth = isRTL ? containerWidth - x : x;
70519
70520                   var isCollapsed = selection$$1.classed('collapsed');
70521                   var shouldCollapse = sidebarWidth < minWidth;
70522
70523                   selection$$1.classed('collapsed', shouldCollapse);
70524
70525                   if (shouldCollapse) {
70526                       if (!isCollapsed) {
70527                           selection$$1
70528                               .style(xMarginProperty, '-400px')
70529                               .style('width', '400px');
70530
70531                           context.ui().onResize([sidebarWidth - event.dx, 0]);
70532                       }
70533
70534                   } else {
70535                       var widthPct = (sidebarWidth / containerWidth) * 100;
70536                       selection$$1
70537                           .style(xMarginProperty, null)
70538                           .style('width', widthPct + '%');
70539
70540                       if (isCollapsed) {
70541                           context.ui().onResize([-sidebarWidth, 0]);
70542                       } else {
70543                           context.ui().onResize([-event.dx, 0]);
70544                       }
70545                   }
70546               })
70547               .on('end', function() {
70548                   resizer.classed('dragging', false);
70549               })
70550           );
70551
70552           var featureListWrap = selection$$1
70553               .append('div')
70554               .attr('class', 'feature-list-pane')
70555               .call(uiFeatureList(context));
70556
70557           var inspectorWrap = selection$$1
70558               .append('div')
70559               .attr('class', 'inspector-hidden inspector-wrap fr');
70560
70561
70562           function hover(datum) {
70563               if (datum && datum.__featurehash__) {   // hovering on data
70564                   _wasData = true;
70565                   sidebar
70566                       .show(dataEditor.datum(datum));
70567
70568                   selection$$1.selectAll('.sidebar-component')
70569                       .classed('inspector-hover', true);
70570
70571               } else if (datum instanceof osmNote) {
70572                   if (context.mode().id === 'drag-note') return;
70573                   _wasNote = true;
70574
70575                   sidebar
70576                       .show(noteEditor.note(datum));
70577
70578                   selection$$1.selectAll('.sidebar-component')
70579                       .classed('inspector-hover', true);
70580
70581               } else if (!_current && (datum instanceof osmEntity$$1)) {
70582                   featureListWrap
70583                       .classed('inspector-hidden', true);
70584
70585                   inspectorWrap
70586                       .classed('inspector-hidden', false)
70587                       .classed('inspector-hover', true);
70588
70589                   if (inspector.entityID() !== datum.id || inspector.state() !== 'hover') {
70590                       inspector
70591                           .state('hover')
70592                           .entityID(datum.id);
70593
70594                       inspectorWrap
70595                           .call(inspector);
70596                   }
70597
70598               } else if (!_current) {
70599                   featureListWrap
70600                       .classed('inspector-hidden', false);
70601                   inspectorWrap
70602                       .classed('inspector-hidden', true);
70603                   inspector
70604                       .state('hide');
70605
70606               } else if (_wasData || _wasNote) {
70607                   _wasNote = false;
70608                   _wasData = false;
70609                   d3_selectAll('.note').classed('hover', false);
70610                   sidebar.hide();
70611               }
70612           }
70613
70614
70615           sidebar.hover = throttle(hover, 200);
70616
70617
70618           sidebar.intersects = function(extent) {
70619               var rect = selection$$1.node().getBoundingClientRect();
70620               return extent.intersects([
70621                   context.projection.invert([0, rect.height]),
70622                   context.projection.invert([rect.width, 0])
70623               ]);
70624           };
70625
70626
70627           sidebar.select = function(id, newFeature) {
70628               if (!_current && id) {
70629                   // uncollapse the sidebar
70630                   if (selection$$1.classed('collapsed')) {
70631                       var entity = context.entity(id);
70632                       var extent = entity.extent(context.graph());
70633                       sidebar.expand(sidebar.intersects(extent));
70634                   }
70635
70636                   featureListWrap
70637                       .classed('inspector-hidden', true);
70638
70639                   inspectorWrap
70640                       .classed('inspector-hidden', false)
70641                       .classed('inspector-hover', false);
70642
70643                   if (inspector.entityID() !== id || inspector.state() !== 'select') {
70644                       inspector
70645                           .state('select')
70646                           .entityID(id)
70647                           .newFeature(newFeature);
70648
70649                       inspectorWrap
70650                           .call(inspector);
70651                   }
70652
70653               } else if (!_current) {
70654                   featureListWrap
70655                       .classed('inspector-hidden', false);
70656                   inspectorWrap
70657                       .classed('inspector-hidden', true);
70658                   inspector
70659                       .state('hide');
70660               }
70661           };
70662
70663
70664           sidebar.show = function(component, element) {
70665               featureListWrap
70666                   .classed('inspector-hidden', true);
70667               inspectorWrap
70668                   .classed('inspector-hidden', true);
70669
70670               if (_current) _current.remove();
70671               _current = selection$$1
70672                   .append('div')
70673                   .attr('class', 'sidebar-component')
70674                   .call(component, element);
70675           };
70676
70677
70678           sidebar.hide = function() {
70679               featureListWrap
70680                   .classed('inspector-hidden', false);
70681               inspectorWrap
70682                   .classed('inspector-hidden', true);
70683
70684               if (_current) _current.remove();
70685               _current = null;
70686           };
70687
70688
70689           sidebar.expand = function(moveMap) {
70690               if (selection$$1.classed('collapsed')) {
70691                   sidebar.toggle(moveMap);
70692               }
70693           };
70694
70695
70696           sidebar.collapse = function(moveMap) {
70697               if (!selection$$1.classed('collapsed')) {
70698                   sidebar.toggle(moveMap);
70699               }
70700           };
70701
70702
70703           sidebar.toggle = function(moveMap) {
70704               var e = event;
70705               if (e && e.sourceEvent) {
70706                   e.sourceEvent.preventDefault();
70707               } else if (e) {
70708                   e.preventDefault();
70709               }
70710
70711               // Don't allow sidebar to toggle when the user is in the walkthrough.
70712               if (context.inIntro()) return;
70713
70714               var isCollapsed = selection$$1.classed('collapsed');
70715               var isCollapsing = !isCollapsed;
70716               var xMarginProperty = textDirection === 'rtl' ? 'margin-right' : 'margin-left';
70717
70718               sidebarWidth = selection$$1.node().getBoundingClientRect().width;
70719
70720               // switch from % to px
70721               selection$$1.style('width', sidebarWidth + 'px');
70722
70723               var startMargin, endMargin, lastMargin;
70724               if (isCollapsing) {
70725                   startMargin = lastMargin = 0;
70726                   endMargin = -sidebarWidth;
70727               } else {
70728                   startMargin = lastMargin = -sidebarWidth;
70729                   endMargin = 0;
70730               }
70731
70732               selection$$1.transition()
70733                   .style(xMarginProperty, endMargin + 'px')
70734                   .tween('panner', function() {
70735                       var i = interpolateNumber(startMargin, endMargin);
70736                       return function(t$$1) {
70737                           var dx = lastMargin - Math.round(i(t$$1));
70738                           lastMargin = lastMargin - dx;
70739                           context.ui().onResize(moveMap ? undefined : [dx, 0]);
70740                       };
70741                   })
70742                   .on('end', function() {
70743                       selection$$1.classed('collapsed', isCollapsing);
70744
70745                       // switch back from px to %
70746                       if (!isCollapsing) {
70747                           var containerWidth = container.node().getBoundingClientRect().width;
70748                           var widthPct = (sidebarWidth / containerWidth) * 100;
70749                           selection$$1
70750                               .style(xMarginProperty, null)
70751                               .style('width', widthPct + '%');
70752                       }
70753                   });
70754           };
70755
70756           // toggle the sidebar collapse when double-clicking the resizer
70757           resizer.on('dblclick', sidebar.toggle);
70758       }
70759
70760
70761       sidebar.hover = function() {};
70762       sidebar.hover.cancel = function() {};
70763       sidebar.intersects = function() {};
70764       sidebar.select = function() {};
70765       sidebar.show = function() {};
70766       sidebar.hide = function() {};
70767       sidebar.expand = function() {};
70768       sidebar.collapse = function() {};
70769       sidebar.toggle = function() {};
70770
70771       return sidebar;
70772   }
70773
70774   function uiSpinner(context) {
70775       var osm = context.connection();
70776
70777
70778       return function(selection) {
70779           var img = selection
70780               .append('img')
70781               .attr('src', context.imagePath('loader-black.gif'))
70782               .style('opacity', 0);
70783
70784           if (osm) {
70785               osm
70786                   .on('loading.spinner', function() {
70787                       img.transition()
70788                           .style('opacity', 1);
70789                   })
70790                   .on('loaded.spinner', function() {
70791                       img.transition()
70792                           .style('opacity', 0);
70793                   });
70794           }
70795       };
70796   }
70797
70798   function uiSplash(context) {
70799
70800       return function(selection) {
70801           if (context.storage('sawSplash'))
70802                return;
70803
70804           context.storage('sawSplash', true);
70805
70806           var modalSelection = uiModal(selection);
70807
70808           modalSelection.select('.modal')
70809               .attr('class', 'modal-splash modal col6');
70810
70811           var introModal = modalSelection.select('.content')
70812               .append('div')
70813               .attr('class', 'fillL');
70814
70815           introModal
70816               .append('div')
70817               .attr('class','modal-section cf')
70818               .append('h3').text(t('splash.welcome'));
70819
70820           introModal
70821               .append('div')
70822               .attr('class','modal-section')
70823               .append('p')
70824               .html(t('splash.text', {
70825                   version: context.version,
70826                   website: '<a href="http://ideditor.com/">ideditor.com</a>',
70827                   github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
70828               }));
70829
70830           var buttonWrap = introModal
70831               .append('div')
70832               .attr('class', 'modal-actions cf');
70833
70834           var walkthrough = buttonWrap
70835               .append('button')
70836               .attr('class', 'walkthrough col6')
70837               .on('click', function() {
70838                   context.container().call(uiIntro(context));
70839                   modalSelection.close();
70840               });
70841
70842           walkthrough
70843               .append('svg')
70844               .attr('class', 'logo logo-walkthrough')
70845               .append('use')
70846               .attr('xlink:href', '#iD-logo-walkthrough');
70847
70848           walkthrough
70849               .append('div')
70850               .text(t('splash.walkthrough'));
70851
70852           var startEditing = buttonWrap
70853               .append('button')
70854               .attr('class', 'start-editing col6')
70855               .on('click', modalSelection.close);
70856
70857           startEditing
70858               .append('svg')
70859               .attr('class', 'logo logo-features')
70860               .append('use')
70861               .attr('xlink:href', '#iD-logo-features');
70862
70863           startEditing
70864               .append('div')
70865               .text(t('splash.start'));
70866
70867
70868           modalSelection.select('button.close')
70869               .attr('class','hide');
70870
70871       };
70872   }
70873
70874   function uiStatus(context) {
70875       var osm = context.connection();
70876
70877
70878       return function(selection$$1) {
70879           if (!osm) return;
70880
70881           function update() {
70882               osm.status(function(err, apiStatus) {
70883                   selection$$1.html('');
70884
70885                   if (err) {
70886                       if (apiStatus === 'connectionSwitched') {
70887                           // if the connection was just switched, we can't rely on
70888                           // the status (we're getting the status of the previous api)
70889                           return;
70890
70891                       } else if (apiStatus === 'rateLimited') {
70892                           selection$$1
70893                               .text(t('status.rateLimit'))
70894                               .append('a')
70895                               .attr('class', 'api-status-login')
70896                               .attr('target', '_blank')
70897                               .call(svgIcon('#iD-icon-out-link', 'inline'))
70898                               .append('span')
70899                               .text(t('login'))
70900                               .on('click.login', function() {
70901                                   event.preventDefault();
70902                                   osm.authenticate();
70903                               });
70904                       } else {
70905                           // eslint-disable-next-line no-warning-comments
70906                           // TODO: nice messages for different error types
70907                           selection$$1.text(t('status.error'));
70908                       }
70909
70910                   } else if (apiStatus === 'readonly') {
70911                       selection$$1.text(t('status.readonly'));
70912                   } else if (apiStatus === 'offline') {
70913                       selection$$1.text(t('status.offline'));
70914                   }
70915
70916                   selection$$1.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
70917               });
70918           }
70919
70920           osm.on('change', function() { update(selection$$1); });
70921
70922           window.setInterval(update, 90000);
70923           update(selection$$1);
70924       };
70925   }
70926
70927   function uiUndoRedo(context) {
70928       var commands = [{
70929           id: 'undo',
70930           cmd: uiCmd('⌘Z'),
70931           action: function() { if (editable()) context.undo(); },
70932           annotation: function() { return context.history().undoAnnotation(); }
70933       }, {
70934           id: 'redo',
70935           cmd: uiCmd('⌘⇧Z'),
70936           action: function() { if (editable()) context.redo(); },
70937           annotation: function() { return context.history().redoAnnotation(); }
70938       }];
70939
70940
70941       function editable() {
70942           var mode = context.mode();
70943           return context.editable() && mode && mode.id !== 'save';
70944       }
70945
70946
70947       return function(selection$$1) {
70948           var tooltipBehavior = tooltip()
70949               .placement('bottom')
70950               .html(true)
70951               .title(function (d) {
70952                   return uiTooltipHtml(d.annotation() ?
70953                       t(d.id + '.tooltip', {action: d.annotation()}) :
70954                       t(d.id + '.nothing'), d.cmd);
70955               });
70956
70957           var buttons = selection$$1.selectAll('button')
70958               .data(commands)
70959               .enter()
70960               .append('button')
70961               .attr('class', function(d) { return 'disabled ' + d.id + '-button'; })
70962               .on('click', function(d) { return d.action(); })
70963               .call(tooltipBehavior);
70964
70965           buttons.each(function(d) {
70966               var iconName = d.id;
70967               if (textDirection === 'rtl') {
70968                   if (iconName === 'undo') {
70969                       iconName = 'redo';
70970                   } else if (iconName === 'redo') {
70971                       iconName = 'undo';
70972                   }
70973               }
70974               select(this)
70975                   .call(svgIcon('#iD-icon-' + iconName));
70976           });
70977
70978           context.keybinding()
70979               .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
70980               .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
70981
70982
70983           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
70984
70985           context.map()
70986               .on('move.undo_redo', debouncedUpdate)
70987               .on('drawn.undo_redo', debouncedUpdate);
70988
70989           context.history()
70990               .on('change.undo_redo', update);
70991
70992           context
70993               .on('enter.undo_redo', update);
70994
70995
70996           function update() {
70997               buttons
70998                   .property('disabled', !editable())
70999                   .classed('disabled', function(d) { return !d.annotation(); })
71000                   .each(function() {
71001                       var selection$$1 = select(this);
71002                       if (selection$$1.property('tooltipVisible')) {
71003                           selection$$1.call(tooltipBehavior.show);
71004                       }
71005                   });
71006           }
71007       };
71008   }
71009
71010   // these are module variables so they are preserved through a ui.restart()
71011   var sawVersion = null;
71012   var isNewVersion = false;
71013   var isNewUser = false;
71014
71015
71016   function uiVersion(context) {
71017
71018       var currVersion = context.version;
71019       var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
71020
71021       if (sawVersion === null && matchedVersion !== null) {
71022           isNewVersion = (context.storage('sawVersion') !== currVersion);
71023           isNewUser = !context.storage('sawSplash');
71024           context.storage('sawVersion', currVersion);
71025           sawVersion = currVersion;
71026       }
71027
71028       return function(selection) {
71029           selection
71030               .append('a')
71031               .attr('target', '_blank')
71032               .attr('tabindex', -1)
71033               .attr('href', 'https://github.com/openstreetmap/iD')
71034               .text(currVersion);
71035
71036           // only show new version indicator to users that have used iD before
71037           if (isNewVersion && !isNewUser) {
71038               selection
71039                   .append('div')
71040                   .attr('class', 'badge')
71041                   .append('a')
71042                   .attr('target', '_blank')
71043                   .attr('tabindex', -1)
71044                   .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
71045                   .call(svgIcon('#maki-gift-11'))
71046                   .call(tooltip()
71047                       .title(t('version.whats_new', { version: currVersion }))
71048                       .placement('top')
71049                   );
71050           }
71051       };
71052   }
71053
71054   function uiZoom(context) {
71055       var zooms = [{
71056           id: 'zoom-in',
71057           icon: 'plus',
71058           title: t('zoom.in'),
71059           action: context.zoomIn,
71060           key: '+'
71061       }, {
71062           id: 'zoom-out',
71063           icon: 'minus',
71064           title: t('zoom.out'),
71065           action: context.zoomOut,
71066           key: '-'
71067       }];
71068
71069
71070       function zoomIn() {
71071           event.preventDefault();
71072           context.zoomIn();
71073       }
71074
71075
71076       function zoomOut() {
71077           event.preventDefault();
71078           context.zoomOut();
71079       }
71080
71081
71082       function zoomInFurther() {
71083           event.preventDefault();
71084           context.zoomInFurther();
71085       }
71086
71087
71088       function zoomOutFurther() {
71089           event.preventDefault();
71090           context.zoomOutFurther();
71091       }
71092
71093
71094       return function(selection$$1) {
71095           var button = selection$$1.selectAll('button')
71096               .data(zooms)
71097               .enter()
71098               .append('button')
71099               .attr('tabindex', -1)
71100               .attr('class', function(d) { return d.id; })
71101               .on('click.editor', function(d) { d.action(); })
71102               .call(tooltip()
71103                   .placement((textDirection === 'rtl') ? 'right' : 'left')
71104                   .html(true)
71105                   .title(function(d) {
71106                       return uiTooltipHtml(d.title, d.key);
71107                   })
71108               );
71109
71110           button.each(function(d) {
71111               select(this)
71112                   .call(svgIcon('#iD-icon-' + d.icon, 'light'));
71113           });
71114
71115           ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
71116               context.keybinding().on([key], zoomIn);
71117               context.keybinding().on([uiCmd('⌘' + key)], zoomInFurther);
71118           });
71119
71120           ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
71121               context.keybinding().on([key], zoomOut);
71122               context.keybinding().on([uiCmd('⌘' + key)], zoomOutFurther);
71123           });
71124       };
71125   }
71126
71127   function uiInit(context) {
71128       var _initCounter = 0;
71129       var _initCallback;
71130       var _needWidth = {};
71131
71132
71133       function render(container) {
71134           container
71135               .attr('dir', textDirection);
71136
71137           var map = context.map();
71138
71139           container
71140               .append('svg')
71141               .attr('id', 'defs')
71142               .call(svgDefs(context));
71143
71144           container
71145               .append('div')
71146               .attr('id', 'sidebar')
71147               .call(ui.sidebar);
71148
71149           var content = container
71150               .append('div')
71151               .attr('id', 'content')
71152               .attr('class', 'active');
71153
71154           // Top toolbar
71155           var bar = content
71156               .append('div')
71157               .attr('id', 'bar')
71158               .attr('class', 'fillD');
71159
71160           content
71161               .append('div')
71162               .attr('id', 'map')
71163               .attr('dir', 'ltr')
71164               .call(map);
71165
71166           // Leading area button group (Sidebar toggle)
71167           var leadingArea = bar
71168               .append('div')
71169               .attr('class', 'tool-group leading-area');
71170
71171           var sidebarButton = leadingArea
71172               .append('div')
71173               .append('button')
71174               .attr('class', 'sidebar-toggle')
71175               .attr('tabindex', -1)
71176               .on('click', ui.sidebar.toggle)
71177               .call(tooltip()
71178                   .placement('bottom')
71179                   .html(true)
71180                   .title(uiTooltipHtml(t('sidebar.tooltip'), t('sidebar.key')))
71181               );
71182
71183           var iconSuffix = textDirection === 'rtl' ? 'right' : 'left';
71184           sidebarButton
71185               .call(svgIcon('#iD-icon-sidebar-' + iconSuffix));
71186
71187           leadingArea
71188               .append('div')
71189               .attr('class', 'full-screen bar-group')
71190               .call(uiFullScreen(context));
71191
71192
71193           // Center area button group (Point/Line/Area/Note mode buttons)
71194           bar
71195               .append('div')
71196               .attr('class', 'tool-group center-area')
71197               .append('div')
71198               .attr('class', 'modes joined')
71199               .call(uiModes(context), bar);
71200
71201
71202           // Trailing area button group (Undo/Redo save buttons)
71203           var trailingArea = bar
71204               .append('div')
71205               .attr('class', 'tool-group trailing-area');
71206
71207           trailingArea
71208               .append('div')
71209               .attr('class', 'joined')
71210               .call(uiUndoRedo(context));
71211
71212           trailingArea
71213               .append('div')
71214               .attr('class', 'save-wrap')
71215               .call(uiSave(context));
71216
71217
71218           // For now, just put spinner at the end of the #bar
71219           bar
71220               .append('div')
71221               .attr('class', 'spinner')
71222               .call(uiSpinner(context));
71223
71224
71225           // Map controls (appended to #bar, but absolutely positioned)
71226           var controls = bar
71227               .append('div')
71228               .attr('class', 'map-controls');
71229
71230           controls
71231               .append('div')
71232               .attr('class', 'map-control zoombuttons')
71233               .call(uiZoom(context));
71234
71235           controls
71236               .append('div')
71237               .attr('class', 'map-control geolocate-control')
71238               .call(uiGeolocate(context));
71239
71240           controls
71241               .append('div')
71242               .attr('class', 'map-control background-control')
71243               .call(uiBackground(context));
71244
71245           controls
71246               .append('div')
71247               .attr('class', 'map-control map-data-control')
71248               .call(uiMapData(context));
71249
71250           controls
71251               .append('div')
71252               .attr('class', 'map-control help-control')
71253               .call(uiHelp(context));
71254
71255
71256           // Add attribution and footer
71257           var about = content
71258               .append('div')
71259               .attr('id', 'about');
71260
71261           about
71262               .append('div')
71263               .attr('id', 'attrib')
71264               .attr('dir', 'ltr')
71265               .call(uiAttribution(context));
71266
71267           about
71268               .append('div')
71269               .attr('class', 'api-status')
71270               .call(uiStatus(context));
71271
71272
71273           var footer = about
71274               .append('div')
71275               .attr('id', 'footer')
71276               .attr('class', 'fillD');
71277
71278           footer
71279               .append('div')
71280               .attr('id', 'flash-wrap')
71281               .attr('class', 'footer-hide');
71282
71283           var footerWrap = footer
71284               .append('div')
71285               .attr('id', 'footer-wrap')
71286               .attr('class', 'footer-show');
71287
71288           footerWrap
71289               .append('div')
71290               .attr('id', 'scale-block')
71291               .call(uiScale(context));
71292
71293           var aboutList = footerWrap
71294               .append('div')
71295               .attr('id', 'info-block')
71296               .append('ul')
71297               .attr('id', 'about-list');
71298
71299           if (!context.embed()) {
71300               aboutList
71301                   .call(uiAccount(context));
71302           }
71303
71304           aboutList
71305               .append('li')
71306               .attr('class', 'version')
71307               .call(uiVersion(context));
71308
71309           var issueLinks = aboutList
71310               .append('li');
71311
71312           issueLinks
71313               .append('a')
71314               .attr('target', '_blank')
71315               .attr('tabindex', -1)
71316               .attr('href', 'https://github.com/openstreetmap/iD/issues')
71317               .call(svgIcon('#iD-icon-bug', 'light'))
71318               .call(tooltip().title(t('report_a_bug')).placement('top'));
71319
71320           issueLinks
71321               .append('a')
71322               .attr('target', '_blank')
71323               .attr('tabindex', -1)
71324               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
71325               .call(svgIcon('#iD-icon-translate', 'light'))
71326               .call(tooltip().title(t('help_translate')).placement('top'));
71327
71328           aboutList
71329               .append('li')
71330               .attr('class', 'feature-warning')
71331               .attr('tabindex', -1)
71332               .call(uiFeatureInfo(context));
71333
71334           aboutList
71335               .append('li')
71336               .attr('class', 'user-list')
71337               .attr('tabindex', -1)
71338               .call(uiContributors(context));
71339
71340
71341           // Setup map dimensions and move map to initial center/zoom.
71342           // This should happen after #content and toolbars exist.
71343           ui.onResize();
71344
71345           var hash = behaviorHash(context);
71346           hash();
71347           if (!hash.hadHash) {
71348               map.centerZoom([0, 0], 2);
71349           }
71350
71351
71352           // Add absolutely-positioned elements that sit on top of the map
71353           // This should happen after the map is ready (center/zoom)
71354           content
71355               .call(uiMapInMap(context))
71356               .call(uiInfo(context))
71357               .call(uiNotice(context));
71358
71359           content
71360               .append('div')
71361               .attr('id', 'photoviewer')
71362               .classed('al', true)       // 'al'=left,  'ar'=right
71363               .classed('hide', true)
71364               .call(ui.photoviewer);
71365
71366
71367           // Bind events
71368           window.onbeforeunload = function() {
71369               return context.save();
71370           };
71371           window.onunload = function() {
71372               context.history().unlock();
71373           };
71374
71375           select(window)
71376               .on('gesturestart.editor', eventCancel)
71377               .on('gesturechange.editor', eventCancel)
71378               .on('gestureend.editor', eventCancel)
71379               .on('resize.editor', ui.onResize);
71380
71381
71382           var panPixels = 80;
71383           context.keybinding()
71384               .on('⌫', function() { event.preventDefault(); })
71385               .on(t('sidebar.key'), ui.sidebar.toggle)
71386               .on('←', pan([panPixels, 0]))
71387               .on('↑', pan([0, panPixels]))
71388               .on('→', pan([-panPixels, 0]))
71389               .on('↓', pan([0, -panPixels]))
71390               .on(['⇧←', uiCmd('⌘←')], pan([map.dimensions()[0], 0]))
71391               .on(['⇧↑', uiCmd('⌘↑')], pan([0, map.dimensions()[1]]))
71392               .on(['⇧→', uiCmd('⌘→')], pan([-map.dimensions()[0], 0]))
71393               .on(['⇧↓', uiCmd('⌘↓')], pan([0, -map.dimensions()[1]]));
71394
71395           context.enter(modeBrowse(context));
71396
71397           if (!_initCounter++) {
71398               if (!hash.startWalkthrough) {
71399                   context.container()
71400                       .call(uiSplash(context))
71401                       .call(uiRestore(context));
71402               }
71403
71404               context.container()
71405                   .call(uiShortcuts(context));
71406           }
71407
71408           var osm = context.connection();
71409           var auth = uiLoading(context).message(t('loading_auth')).blocking(true);
71410
71411           if (osm && auth) {
71412               osm
71413                   .on('authLoading.ui', function() {
71414                       context.container()
71415                           .call(auth);
71416                   })
71417                   .on('authDone.ui', function() {
71418                       auth.close();
71419                   });
71420           }
71421
71422           _initCounter++;
71423
71424           if (hash.startWalkthrough) {
71425               hash.startWalkthrough = false;
71426               context.container().call(uiIntro(context));
71427           }
71428
71429
71430           function pan(d) {
71431               return function() {
71432                   event.preventDefault();
71433                   context.pan(d, 100);
71434               };
71435           }
71436
71437           function eventCancel() {
71438               event.preventDefault();
71439           }
71440       }
71441
71442
71443       function ui(node, callback) {
71444           _initCallback = callback;
71445           var container = select(node);
71446           context.container(container);
71447           context.loadLocale(function(err) {
71448               if (!err) {
71449                   render(container);
71450               }
71451               if (callback) {
71452                   callback(err);
71453               }
71454           });
71455       }
71456
71457
71458       ui.restart = function(arg) {
71459           context.keybinding().clear();
71460           context.locale(arg);
71461           context.loadLocale(function(err) {
71462               if (!err) {
71463                   context.container().selectAll('*').remove();
71464                   render(context.container());
71465                   if (_initCallback) _initCallback();
71466               }
71467           });
71468       };
71469
71470
71471       ui.sidebar = uiSidebar$$1(context);
71472
71473       ui.photoviewer = uiPhotoviewer(context);
71474
71475       ui.onResize = function(withPan) {
71476           var map = context.map();
71477
71478           // Recalc dimensions of map and sidebar.. (`true` = force recalc)
71479           // This will call `getBoundingClientRect` and trigger reflow,
71480           //  but the values will be cached for later use.
71481           var mapDimensions = utilGetDimensions(select('#content'), true);
71482           utilGetDimensions(select('#sidebar'), true);
71483
71484           if (withPan !== undefined) {
71485               map.redrawEnable(false);
71486               map.pan(withPan);
71487               map.redrawEnable(true);
71488           }
71489           map.dimensions(mapDimensions);
71490
71491           ui.photoviewer.onMapResize();
71492
71493           // check if header or footer have overflowed
71494           ui.checkOverflow('#bar');
71495           ui.checkOverflow('#footer');
71496
71497           // Use outdated code so it works on Explorer
71498           var resizeWindowEvent = document.createEvent('Event');
71499
71500           resizeWindowEvent.initEvent('resizeWindow', true, true);
71501
71502           document.dispatchEvent(resizeWindowEvent);
71503       };
71504
71505
71506       // Call checkOverflow when resizing or whenever the contents change.
71507       ui.checkOverflow = function(selector$$1, reset) {
71508           if (reset) {
71509               delete _needWidth[selector$$1];
71510           }
71511
71512           var element = select(selector$$1);
71513           var scrollWidth = element.property('scrollWidth');
71514           var clientWidth = element.property('clientWidth');
71515           var needed = _needWidth[selector$$1] || scrollWidth;
71516
71517           if (scrollWidth > clientWidth) {    // overflow happening
71518               element.classed('narrow', true);
71519               if (!_needWidth[selector$$1]) {
71520                   _needWidth[selector$$1] = scrollWidth;
71521               }
71522
71523           } else if (scrollWidth >= needed) {
71524               element.classed('narrow', false);
71525           }
71526       };
71527
71528
71529       return ui;
71530   }
71531
71532   function d3combobox() {
71533       var dispatch$$1 = dispatch('accept');
71534       var _container = select(document.body);
71535       var _data = [];
71536       var _suggestions = [];
71537       var _minItems = 2;
71538       var _caseSensitive = false;
71539
71540       var _fetcher = function(val, cb) {
71541           cb(_data.filter(function(d) {
71542               return d.value
71543                   .toString()
71544                   .toLowerCase()
71545                   .indexOf(val.toLowerCase()) !== -1;
71546           }));
71547       };
71548
71549       var combobox = function(input, attachTo) {
71550           var idx = -1;
71551           var wrapper = _container
71552               .selectAll('div.combobox')
71553               .filter(function(d) { return d === input.node(); });
71554           var shown = !wrapper.empty();
71555           var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
71556
71557           input
71558               .classed('combobox-input', true)
71559               .on('focus.typeahead', focus)
71560               .on('blur.typeahead', blur)
71561               .on('keydown.typeahead', keydown)
71562               .on('keyup.typeahead', keyup)
71563               .on('input.typeahead', change)
71564               .each(function() {
71565                   var parent = this.parentNode;
71566                   var sibling = this.nextSibling;
71567
71568                   var caret = select(parent).selectAll('.combobox-caret')
71569                       .filter(function(d) { return d === input.node(); })
71570                       .data([input.node()]);
71571
71572                   caret = caret.enter()
71573                       .insert('div', function() { return sibling; })
71574                       .attr('class', 'combobox-caret')
71575                       .merge(caret);
71576
71577                   caret
71578                       .on('mousedown', function () {
71579                           // prevent the form element from blurring. it blurs
71580                           // on mousedown
71581                           event.stopPropagation();
71582                           event.preventDefault();
71583                           if (!shown) {
71584                               input.node().focus();
71585                               fetch('', render);
71586                           } else {
71587                               hide();
71588                           }
71589                       });
71590               });
71591
71592           function focus() {
71593               fetch(value(), render);
71594           }
71595
71596           function blur() {
71597               window.setTimeout(hide, 150);
71598           }
71599
71600           function show() {
71601               if (!shown) {
71602                   wrapper = _container
71603                       .insert('div', ':first-child')
71604                       .datum(input.node())
71605                       .attr('class', 'combobox')
71606                       .style('position', 'absolute')
71607                       .style('display', 'block')
71608                       .style('left', '0px')
71609                       .on('mousedown', function () {
71610                           // prevent moving focus out of the text field
71611                           event.preventDefault();
71612                       });
71613
71614                   select('body')
71615                       .on('scroll.combobox', render, true);
71616
71617                   shown = true;
71618               }
71619           }
71620
71621           function hide() {
71622               if (shown) {
71623                   idx = -1;
71624                   wrapper.remove();
71625
71626                   select('body')
71627                       .on('scroll.combobox', null);
71628
71629                   shown = false;
71630               }
71631           }
71632
71633           function keydown() {
71634              switch (event.keyCode) {
71635                  // backspace, delete
71636                  case 8:
71637                  case 46:
71638                      input.on('input.typeahead', function() {
71639                          idx = -1;
71640                          render();
71641                          var start = input.property('selectionStart');
71642                          input.node().setSelectionRange(start, start);
71643                          input.on('input.typeahead', change);
71644                      });
71645                      break;
71646                  // tab
71647                  case 9:
71648                      wrapper.selectAll('a.selected').each(function (d) {
71649                          dispatch$$1.call('accept', this, d);
71650                      });
71651                      hide();
71652                      break;
71653                  // return
71654                  case 13:
71655                      event.preventDefault();
71656                      break;
71657                  // up arrow
71658                  case 38:
71659                      if (tagName === 'textarea' && !shown) return;
71660                      nav(-1);
71661                      event.preventDefault();
71662                      break;
71663                  // down arrow
71664                  case 40:
71665                      if (tagName === 'textarea' && !shown) return;
71666                      nav(+1);
71667                      event.preventDefault();
71668                      break;
71669              }
71670              event.stopPropagation();
71671           }
71672
71673           function keyup() {
71674               switch (event.keyCode) {
71675                   // escape
71676                   case 27:
71677                       hide();
71678                       break;
71679                   // return
71680                   case 13:
71681                       wrapper.selectAll('a.selected').each(function (d) {
71682                          dispatch$$1.call('accept', this, d);
71683                       });
71684                       hide();
71685                       break;
71686               }
71687           }
71688
71689           function change() {
71690               fetch(value(), function() {
71691                   if (input.property('selectionEnd') === input.property('value').length) {
71692                       autocomplete();
71693                   }
71694                   render();
71695               });
71696           }
71697
71698           function nav(dir) {
71699               if (!_suggestions.length) return;
71700               idx = Math.max(Math.min(idx + dir, _suggestions.length - 1), 0);
71701               input.property('value', _suggestions[idx].value);
71702               render();
71703               ensureVisible();
71704           }
71705
71706           function value() {
71707               var value = input.property('value');
71708               var start = input.property('selectionStart');
71709               var end = input.property('selectionEnd');
71710
71711               if (start && end) {
71712                   value = value.substring(0, start);
71713               }
71714
71715               return value;
71716           }
71717
71718           function fetch(v, cb) {
71719               _fetcher.call(input, v, function(_) {
71720                   _suggestions = _;
71721                   cb();
71722               });
71723           }
71724
71725           function autocomplete() {
71726               var v = _caseSensitive ? value() : value().toLowerCase();
71727               idx = -1;
71728               if (!v) return;
71729
71730               // Don't autocomplete if user is typing a number - #4935
71731               if (!isNaN(parseFloat(v)) && isFinite(v)) return;
71732
71733               var best = -1;
71734               var suggestion, compare;
71735
71736               for (var i = 0; i < _suggestions.length; i++) {
71737                   suggestion = _suggestions[i].value;
71738                   compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
71739
71740                   // if search string matches suggestion exactly, pick it..
71741                   if (compare === v) {
71742                       best = i;
71743                       break;
71744
71745                   // otherwise lock in the first result that starts with the search string..
71746                   } else if (best === -1 && compare.indexOf(v) === 0) {
71747                       best = i;
71748                   }
71749               }
71750
71751               if (best !== -1) {
71752                   idx = best;
71753                   suggestion = _suggestions[best].value;
71754                   input.property('value', suggestion);
71755                   input.node().setSelectionRange(v.length, suggestion.length);
71756               }
71757           }
71758
71759           function render() {
71760               if (_suggestions.length >= _minItems &&
71761                   document.activeElement === input.node()) {
71762                   // input.attr('readonly') === null)
71763                   show();
71764               } else {
71765                   hide();
71766                   return;
71767               }
71768
71769               var options = wrapper
71770                   .selectAll('a.combobox-option')
71771                   .data(_suggestions, function(d) { return d.value; });
71772
71773               options.exit()
71774                   .remove();
71775
71776               options.enter()
71777                   .append('a')
71778                   .attr('class', 'combobox-option')
71779                   .text(function(d) { return d.value; })
71780                   .merge(options)
71781                   .attr('title', function(d) { return d.title; })
71782                   .classed('selected', function(d, i) { return i === idx; })
71783                   .on('mouseover', select$$1)
71784                   .on('click', accept)
71785                   .order();
71786
71787
71788               var node = attachTo ? attachTo.node() : input.node();
71789               var rect = node.getBoundingClientRect();
71790
71791               wrapper
71792                   .style('left', (rect.left + 5) + 'px')
71793                   .style('width', (rect.width - 10) + 'px')
71794                   .style('top', rect.height + rect.top + 'px');
71795           }
71796
71797           function select$$1(d, i) {
71798               idx = i;
71799               render();
71800           }
71801
71802           function ensureVisible() {
71803               var node = wrapper.selectAll('a.selected').node();
71804               if (node) node.scrollIntoView();
71805           }
71806
71807           function accept(d) {
71808               if (!shown) return;
71809               input.property('value', d.value);
71810               utilTriggerEvent(input, 'change');
71811               dispatch$$1.call('accept', this, d);
71812               hide();
71813           }
71814       };
71815
71816       combobox.fetcher = function(_) {
71817           if (!arguments.length) return _fetcher;
71818           _fetcher = _;
71819           return combobox;
71820       };
71821
71822       combobox.data = function(_) {
71823           if (!arguments.length) return _data;
71824           _data = _;
71825           return combobox;
71826       };
71827
71828       combobox.minItems = function(_) {
71829           if (!arguments.length) return _minItems;
71830           _minItems = _;
71831           return combobox;
71832       };
71833
71834       combobox.caseSensitive = function(_) {
71835           if (!arguments.length) return _caseSensitive;
71836           _caseSensitive = _;
71837           return combobox;
71838       };
71839
71840       combobox.container = function(_) {
71841           if (!arguments.length) return _container;
71842           _container = _;
71843           return combobox;
71844       };
71845
71846       return utilRebind(combobox, dispatch$$1, 'on');
71847   }
71848
71849
71850   d3combobox.off = function(input) {
71851       input
71852           .on('focus.typeahead', null)
71853           .on('blur.typeahead', null)
71854           .on('keydown.typeahead', null)
71855           .on('keyup.typeahead', null)
71856           .on('input.typeahead', null)
71857           .each(function() {
71858               select(this.parentNode).selectAll('.combobox-caret')
71859                   .filter(function(d) { return d === input.node(); })
71860                   .on('mousedown', null);
71861           });
71862
71863       select('body')
71864           .on('scroll.combobox', null);
71865   };
71866
71867   // This currently only works with the 'restrictions' field
71868   // It borrows some code from uiHelp
71869
71870   function uiFieldHelp(context, fieldName) {
71871       var fieldHelp = {};
71872       var _inspector = select(null);
71873       var _wrap = select(null);
71874       var _body = select(null);
71875
71876       var fieldHelpKeys = {
71877           restrictions: [
71878               ['about',[
71879                   'about',
71880                   'from_via_to',
71881                   'maxdist',
71882                   'maxvia'
71883               ]],
71884               ['inspecting',[
71885                   'about',
71886                   'from_shadow',
71887                   'allow_shadow',
71888                   'restrict_shadow',
71889                   'only_shadow',
71890                   'restricted',
71891                   'only'
71892               ]],
71893               ['modifying',[
71894                   'about',
71895                   'indicators',
71896                   'allow_turn',
71897                   'restrict_turn',
71898                   'only_turn'
71899               ]],
71900               ['tips',[
71901                   'simple',
71902                   'simple_example',
71903                   'indirect',
71904                   'indirect_example',
71905                   'indirect_noedit'
71906               ]]
71907           ]
71908       };
71909
71910       var fieldHelpHeadings = {};
71911
71912       var replacements = {
71913           distField: t('restriction.controls.distance'),
71914           viaField: t('restriction.controls.via'),
71915           fromShadow: icon('#iD-turn-shadow', 'pre-text shadow from'),
71916           allowShadow: icon('#iD-turn-shadow', 'pre-text shadow allow'),
71917           restrictShadow: icon('#iD-turn-shadow', 'pre-text shadow restrict'),
71918           onlyShadow: icon('#iD-turn-shadow', 'pre-text shadow only'),
71919           allowTurn: icon('#iD-turn-yes', 'pre-text turn'),
71920           restrictTurn: icon('#iD-turn-no', 'pre-text turn'),
71921           onlyTurn: icon('#iD-turn-only', 'pre-text turn')
71922       };
71923
71924
71925       // For each section, squash all the texts into a single markdown document
71926       var docs = fieldHelpKeys[fieldName].map(function(key) {
71927           var helpkey = 'help.field.' + fieldName + '.' + key[0];
71928           var text = key[1].reduce(function(all, part) {
71929               var subkey = helpkey + '.' + part;
71930               var depth = fieldHelpHeadings[subkey];                     // is this subkey a heading?
71931               var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
71932               return all + hhh + t(subkey, replacements) + '\n\n';
71933           }, '');
71934
71935           return {
71936               key: helpkey,
71937               title: t(helpkey + '.title'),
71938               html: marked(text.trim())
71939           };
71940       });
71941
71942
71943       function show() {
71944           updatePosition();
71945
71946           _body
71947               .classed('hide', false)
71948               .style('opacity', '0')
71949               .transition()
71950               .duration(200)
71951               .style('opacity', '1');
71952       }
71953
71954
71955       function hide() {
71956           _body
71957               .classed('hide', true)
71958               .transition()
71959               .duration(200)
71960               .style('opacity', '0')
71961               .on('end', function () {
71962                   _body.classed('hide', true);
71963               });
71964       }
71965
71966
71967       function clickHelp(index) {
71968           var d = docs[index];
71969           var tkeys = fieldHelpKeys[fieldName][index][1];
71970
71971           _body.selectAll('.field-help-nav-item')
71972               .classed('active', function(d, i) { return i === index; });
71973
71974           var content = _body.selectAll('.field-help-content')
71975               .html(d.html);
71976
71977           // class the paragraphs so we can find and style them
71978           content.selectAll('p')
71979               .attr('class', function(d, i) { return tkeys[i]; });
71980
71981           // insert special content for certain help sections
71982           if (d.key === 'help.field.restrictions.inspecting') {
71983               content
71984                   .insert('img', 'p.from_shadow')
71985                   .attr('class', 'field-help-image cf')
71986                   .attr('src', context.imagePath('tr_inspect.gif'));
71987
71988           } else if (d.key === 'help.field.restrictions.modifying') {
71989               content
71990                   .insert('img', 'p.allow_turn')
71991                   .attr('class', 'field-help-image cf')
71992                   .attr('src', context.imagePath('tr_modify.gif'));
71993           }
71994       }
71995
71996
71997       fieldHelp.button = function(selection$$1) {
71998           if (_body.empty()) return;
71999
72000           var button = selection$$1.selectAll('.field-help-button')
72001               .data([0]);
72002
72003           // enter/update
72004           button.enter()
72005               .append('button')
72006               .attr('class', 'field-help-button')
72007               .attr('tabindex', -1)
72008               .call(svgIcon('#iD-icon-help'))
72009               .merge(button)
72010               .on('click', function () {
72011                   event.stopPropagation();
72012                   event.preventDefault();
72013                   if (_body.classed('hide')) {
72014                       show();
72015                   } else {
72016                       hide();
72017                   }
72018               });
72019       };
72020
72021
72022       function updatePosition() {
72023           var wrap = _wrap.node();
72024           var inspector = _inspector.node();
72025           var wRect = wrap.getBoundingClientRect();
72026           var iRect = inspector.getBoundingClientRect();
72027
72028           _body
72029               .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
72030       }
72031
72032
72033       fieldHelp.body = function(selection$$1) {
72034           // This control expects the field to have a form-field-input-wrap div
72035           _wrap = selection$$1.selectAll('.form-field-input-wrap');
72036           if (_wrap.empty()) return;
72037
72038           // absolute position relative to the inspector, so it "floats" above the fields
72039           _inspector = select('#sidebar .entity-editor-pane .inspector-body');
72040           if (_inspector.empty()) return;
72041
72042           _body = _inspector.selectAll('.field-help-body')
72043               .data([0]);
72044
72045           var enter = _body.enter()
72046               .append('div')
72047               .attr('class', 'field-help-body hide');   // initially hidden
72048
72049           var titleEnter = enter
72050               .append('div')
72051               .attr('class', 'field-help-title cf');
72052
72053           titleEnter
72054               .append('h2')
72055               .attr('class', 'fl')
72056               .text(t('help.field.' + fieldName + '.title'));
72057
72058           titleEnter
72059               .append('button')
72060               .attr('class', 'fr close')
72061               .on('click', function() {
72062                   event.stopPropagation();
72063                   event.preventDefault();
72064                   hide();
72065               })
72066               .call(svgIcon('#iD-icon-close'));
72067
72068           var navEnter = enter
72069               .append('div')
72070               .attr('class', 'field-help-nav cf');
72071
72072           var titles = docs.map(function(d) { return d.title; });
72073           navEnter.selectAll('.field-help-nav-item')
72074               .data(titles)
72075               .enter()
72076               .append('div')
72077               .attr('class', 'field-help-nav-item')
72078               .text(function(d) { return d; })
72079               .on('click', function(d, i) {
72080                   event.stopPropagation();
72081                   event.preventDefault();
72082                   clickHelp(i);
72083               });
72084
72085           enter
72086               .append('div')
72087               .attr('class', 'field-help-content');
72088
72089           _body = _body
72090               .merge(enter);
72091
72092           clickHelp(0);
72093       };
72094
72095
72096       return fieldHelp;
72097   }
72098
72099   function uiFieldCheck(field, context) {
72100       var dispatch$$1 = dispatch('change');
72101       var options = field.strings && field.strings.options;
72102       var values = [];
72103       var texts = [];
72104
72105       var input = select(null);
72106       var text = select(null);
72107       var label = select(null);
72108       var reverser = select(null);
72109
72110       var _impliedYes;
72111       var _entityID;
72112       var _value;
72113
72114
72115       if (options) {
72116           for (var k in options) {
72117               values.push(k === 'undefined' ? undefined : k);
72118               texts.push(field.t('options.' + k, { 'default': options[k] }));
72119           }
72120       } else {
72121           values = [undefined, 'yes'];
72122           texts = [t('inspector.unknown'), t('inspector.check.yes')];
72123           if (field.type !== 'defaultCheck') {
72124               values.push('no');
72125               texts.push(t('inspector.check.no'));
72126           }
72127       }
72128
72129
72130       // Checks tags to see whether an undefined value is "Assumed to be Yes"
72131       function checkImpliedYes() {
72132           _impliedYes = (field.id === 'oneway_yes');
72133
72134           // hack: pretend `oneway` field is a `oneway_yes` field
72135           // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
72136           if (field.id === 'oneway') {
72137               var entity = context.entity(_entityID);
72138               for (var key in entity.tags) {
72139                   if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
72140                       _impliedYes = true;
72141                       texts[0] = t('presets.fields.oneway_yes.options.undefined');
72142                       break;
72143                   }
72144               }
72145           }
72146       }
72147
72148
72149       function reverserHidden() {
72150           if (!select('div.inspector-hover').empty()) return true;
72151           return !(_value === 'yes' || (_impliedYes && !_value));
72152       }
72153
72154
72155       function reverserSetText(selection$$1) {
72156           var entity = context.hasEntity(_entityID);
72157           if (reverserHidden() || !entity) return selection$$1;
72158
72159           var first = entity.first();
72160           var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
72161           var pseudoDirection = first < last;
72162           var icon = pseudoDirection ? '#iD-icon-forward' : '#iD-icon-backward';
72163
72164           selection$$1.selectAll('.reverser-span')
72165               .text(t('inspector.check.reverser'))
72166               .call(svgIcon(icon, 'inline'));
72167
72168           return selection$$1;
72169       }
72170
72171
72172       var check = function(selection$$1) {
72173           checkImpliedYes();
72174
72175           label = selection$$1.selectAll('.form-field-input-wrap')
72176               .data([0]);
72177
72178           var enter = label.enter()
72179               .append('label')
72180               .attr('class', 'form-field-input-wrap form-field-input-check');
72181
72182           enter
72183               .append('input')
72184               .property('indeterminate', field.type !== 'defaultCheck')
72185               .attr('type', 'checkbox')
72186               .attr('id', 'preset-input-' + field.safeid);
72187
72188           enter
72189               .append('span')
72190               .text(texts[0])
72191               .attr('class', 'value');
72192
72193           if (field.type === 'onewayCheck') {
72194               enter
72195                   .append('a')
72196                   .attr('id', 'preset-input-' + field.safeid + '-reverser')
72197                   .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
72198                   .attr('href', '#')
72199                   .append('span')
72200                   .attr('class', 'reverser-span');
72201           }
72202
72203           label = label.merge(enter);
72204           input = label.selectAll('input');
72205           text = label.selectAll('span.value');
72206
72207           input
72208               .on('click', function() {
72209                   event.stopPropagation();
72210                   var t$$1 = {};
72211                   t$$1[field.key] = values[(values.indexOf(_value) + 1) % values.length];
72212
72213                   // Don't cycle through `alternating` or `reversible` states - #4970
72214                   // (They are supported as translated strings, but should not toggle with clicks)
72215                   if (t$$1[field.key] === 'reversible' || t$$1[field.key] === 'alternating') {
72216                       t$$1[field.key] = values[0];
72217                   }
72218
72219                   dispatch$$1.call('change', this, t$$1);
72220               });
72221
72222           if (field.type === 'onewayCheck') {
72223               reverser = label.selectAll('.reverser');
72224
72225               reverser
72226                   .call(reverserSetText)
72227                   .on('click', function() {
72228                       event.preventDefault();
72229                       event.stopPropagation();
72230                       context.perform(
72231                           actionReverse(_entityID),
72232                           t('operations.reverse.annotation')
72233                       );
72234                       select(this)
72235                           .call(reverserSetText);
72236                   });
72237           }
72238       };
72239
72240
72241       check.entity = function(_) {
72242           if (!arguments.length) return context.hasEntity(_entityID);
72243           _entityID = _.id;
72244           return check;
72245       };
72246
72247
72248       check.tags = function(tags) {
72249
72250           function isChecked(val) {
72251               return val !== 'no' && val !== '' && val !== undefined && val !== null;
72252           }
72253
72254           function textFor(val) {
72255               if (val === '') val = undefined;
72256               var index = values.indexOf(val);
72257               return (index !== -1 ? texts[index] : ('"' + val + '"'));
72258           }
72259
72260           checkImpliedYes();
72261           _value = tags[field.key] && tags[field.key].toLowerCase();
72262
72263           if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
72264               _value = 'yes';
72265           }
72266
72267           input
72268               .property('indeterminate', field.type !== 'defaultCheck' && !_value)
72269               .property('checked', isChecked(_value));
72270
72271           text
72272               .text(textFor(_value));
72273
72274           label
72275               .classed('set', !!_value);
72276
72277           if (field.type === 'onewayCheck') {
72278               reverser
72279                   .classed('hide', reverserHidden())
72280                   .call(reverserSetText);
72281           }
72282       };
72283
72284
72285       check.focus = function() {
72286           input.node().focus();
72287       };
72288
72289       return utilRebind(check, dispatch$$1, 'on');
72290   }
72291
72292   /** Used for built-in method references. */
72293   var arrayProto$1 = Array.prototype;
72294
72295   /** Built-in value references. */
72296   var splice$1 = arrayProto$1.splice;
72297
72298   /**
72299    * The base implementation of `_.pullAt` without support for individual
72300    * indexes or capturing the removed elements.
72301    *
72302    * @private
72303    * @param {Array} array The array to modify.
72304    * @param {number[]} indexes The indexes of elements to remove.
72305    * @returns {Array} Returns `array`.
72306    */
72307   function basePullAt(array, indexes) {
72308     var length = array ? indexes.length : 0,
72309         lastIndex = length - 1;
72310
72311     while (length--) {
72312       var index = indexes[length];
72313       if (length == lastIndex || index !== previous) {
72314         var previous = index;
72315         if (isIndex(index)) {
72316           splice$1.call(array, index, 1);
72317         } else {
72318           baseUnset(array, index);
72319         }
72320       }
72321     }
72322     return array;
72323   }
72324
72325   /**
72326    * Removes all elements from `array` that `predicate` returns truthy for
72327    * and returns an array of the removed elements. The predicate is invoked
72328    * with three arguments: (value, index, array).
72329    *
72330    * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
72331    * to pull elements from an array by value.
72332    *
72333    * @static
72334    * @memberOf _
72335    * @since 2.0.0
72336    * @category Array
72337    * @param {Array} array The array to modify.
72338    * @param {Function} [predicate=_.identity] The function invoked per iteration.
72339    * @returns {Array} Returns the new array of removed elements.
72340    * @example
72341    *
72342    * var array = [1, 2, 3, 4];
72343    * var evens = _.remove(array, function(n) {
72344    *   return n % 2 == 0;
72345    * });
72346    *
72347    * console.log(array);
72348    * // => [1, 3]
72349    *
72350    * console.log(evens);
72351    * // => [2, 4]
72352    */
72353   function remove$8(array, predicate) {
72354     var result = [];
72355     if (!(array && array.length)) {
72356       return result;
72357     }
72358     var index = -1,
72359         indexes = [],
72360         length = array.length;
72361
72362     predicate = baseIteratee(predicate, 3);
72363     while (++index < length) {
72364       var value = array[index];
72365       if (predicate(value, index, array)) {
72366         result.push(value);
72367         indexes.push(index);
72368       }
72369     }
72370     basePullAt(array, indexes);
72371     return result;
72372   }
72373
72374   function uiFieldCombo(field, context) {
72375       var dispatch$$1 = dispatch('change');
72376       var nominatim = services.geocoder;
72377       var taginfo = services.taginfo;
72378       var isMulti = (field.type === 'multiCombo');
72379       var isNetwork = (field.type === 'networkCombo');
72380       var isSemi = (field.type === 'semiCombo');
72381       var optstrings = field.strings && field.strings.options;
72382       var optarray = field.options;
72383       var snake_case = (field.snake_case || (field.snake_case === undefined));
72384       var caseSensitive = field.caseSensitive;
72385       var combobox = d3combobox()
72386           .container(context.container())
72387           .caseSensitive(caseSensitive)
72388           .minItems(isMulti || isSemi ? 1 : 2);
72389       var container = select(null);
72390       var input = select(null);
72391       var _comboData = [];
72392       var _multiData = [];
72393       var _entity;
72394       var _country;
72395
72396       // ensure multiCombo field.key ends with a ':'
72397       if (isMulti && /[^:]$/.test(field.key)) {
72398           field.key += ':';
72399       }
72400
72401
72402       function snake(s) {
72403           return s.replace(/\s+/g, '_');
72404       }
72405
72406       function unsnake(s) {
72407           return s.replace(/_+/g, ' ');
72408       }
72409
72410       function clean(s) {
72411           return s.split(';')
72412               .map(function(s) { return s.trim(); })
72413               .join(';');
72414       }
72415
72416
72417       // returns the tag value for a display value
72418       // (for multiCombo, dval should be the key suffix, not the entire key)
72419       function tagValue(dval) {
72420           dval = clean(dval || '');
72421
72422           if (optstrings) {
72423               var found = find$1(_comboData, function(o) {
72424                   return o.key && clean(o.value) === dval;
72425               });
72426               if (found) {
72427                   return found.key;
72428               }
72429           }
72430
72431           if (field.type === 'typeCombo' && !dval) {
72432               return 'yes';
72433           }
72434
72435           return (snake_case ? snake(dval) : dval) || undefined;
72436       }
72437
72438
72439       // returns the display value for a tag value
72440       // (for multiCombo, tval should be the key suffix, not the entire key)
72441       function displayValue(tval) {
72442           tval = tval || '';
72443
72444           if (optstrings) {
72445               var found = find$1(_comboData, function(o) { return o.key === tval && o.value; });
72446               if (found) {
72447                   return found.value;
72448               }
72449           }
72450
72451           if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
72452               return '';
72453           }
72454
72455           return snake_case ? unsnake(tval) : tval;
72456       }
72457
72458
72459       function objectDifference(a, b) {
72460           return reject(a, function(d1) {
72461               return some(b, function(d2) { return d1.value === d2.value; });
72462           });
72463       }
72464
72465
72466       function initCombo(selection$$1, attachTo) {
72467           if (optstrings) {
72468               selection$$1.attr('readonly', 'readonly');
72469               selection$$1.call(combobox, attachTo);
72470               setStaticValues(setPlaceholder);
72471
72472           } else if (optarray) {
72473               selection$$1.call(combobox, attachTo);
72474               setStaticValues(setPlaceholder);
72475
72476           } else if (taginfo) {
72477               selection$$1.call(combobox.fetcher(setTaginfoValues), attachTo);
72478               setTaginfoValues('', setPlaceholder);
72479           }
72480       }
72481
72482
72483       function setStaticValues(callback) {
72484           if (!(optstrings || optarray)) return;
72485
72486           if (optstrings) {
72487               _comboData = Object.keys(optstrings).map(function(k) {
72488                   var v = field.t('options.' + k, { 'default': optstrings[k] });
72489                   return {
72490                       key: k,
72491                       value: v,
72492                       title: v
72493                   };
72494               });
72495
72496           } else if (optarray) {
72497               _comboData = optarray.map(function(k) {
72498                   var v = snake_case ? unsnake(k) : k;
72499                   return {
72500                       key: k,
72501                       value: v,
72502                       title: v
72503                   };
72504               });
72505           }
72506
72507           combobox.data(objectDifference(_comboData, _multiData));
72508           if (callback) callback(_comboData);
72509       }
72510
72511
72512       function setTaginfoValues(q, callback) {
72513           var fn = isMulti ? 'multikeys' : 'values';
72514           var query = (isMulti ? field.key : '') + q;
72515           var hasCountryPrefix = isNetwork && _country && _country.indexOf(q.toLowerCase()) === 0;
72516           if (hasCountryPrefix) {
72517               query = _country + ':';
72518           }
72519
72520           var params = {
72521               debounce: (q !== ''),
72522               key: field.key,
72523               query: query
72524           };
72525
72526           if (_entity) {
72527               params.geometry = context.geometry(_entity.id);
72528           }
72529
72530           taginfo[fn](params, function(err, data) {
72531               if (err) return;
72532               if (hasCountryPrefix) {
72533                   data = filter(data, function(d) {
72534                       return d.value.toLowerCase().indexOf(_country + ':') === 0;
72535                   });
72536               }
72537
72538               _comboData = map$3(data, function(d) {
72539                   var k = d.value;
72540                   if (isMulti) k = k.replace(field.key, '');
72541                   var v = snake_case ? unsnake(k) : k;
72542                   return {
72543                       key: k,
72544                       value: v,
72545                       title: isMulti ? v : d.title
72546                   };
72547               });
72548
72549               _comboData = objectDifference(_comboData, _multiData);
72550               if (callback) callback(_comboData);
72551           });
72552       }
72553
72554
72555       function setPlaceholder(d) {
72556           var ph;
72557
72558           if (isMulti || isSemi) {
72559               ph = field.placeholder() || t('inspector.add');
72560           } else {
72561               var vals = map$3(d, 'value').filter(function(s) { return s.length < 20; }),
72562                   placeholders = vals.length > 1 ? vals : map$3(d, 'key');
72563               ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
72564           }
72565
72566           if (!/(…|\.\.\.)$/.test(ph)) {
72567               ph += '…';
72568           }
72569
72570           container.selectAll('input')
72571               .attr('placeholder', ph);
72572       }
72573
72574
72575       function change() {
72576           var val = tagValue(utilGetSetValue(input));
72577           var t$$1 = {};
72578
72579           if (isMulti || isSemi) {
72580               if (!val) return;
72581               container.classed('active', false);
72582               utilGetSetValue(input, '');
72583
72584               if (isMulti) {
72585                   var key = field.key + val;
72586                   if (_entity) {
72587                       // don't set a multicombo value to 'yes' if it already has a non-'no' value
72588                       // e.g. `language:de=main`
72589                       var old = _entity.tags[key] || '';
72590                       if (old && old.toLowerCase() !== 'no') return;
72591                   }
72592                   field.keys.push(key);
72593                   t$$1[key] = 'yes';
72594
72595               } else if (isSemi) {
72596                   var arr = _multiData.map(function(d) { return d.key; });
72597                   arr.push(val);
72598                   t$$1[field.key] = compact(uniq(arr)).join(';');
72599               }
72600
72601               window.setTimeout(function() { input.node().focus(); }, 10);
72602
72603           } else {
72604               t$$1[field.key] = val;
72605           }
72606
72607           dispatch$$1.call('change', this, t$$1);
72608       }
72609
72610
72611       function removeMultikey(d) {
72612           event.stopPropagation();
72613           var t$$1 = {};
72614           if (isMulti) {
72615               t$$1[d.key] = undefined;
72616           } else if (isSemi) {
72617               remove$8(_multiData, function(md) { return md.key === d.key; });
72618               var arr = _multiData.map(function(md) { return md.key; });
72619               arr = compact(uniq(arr));
72620               t$$1[field.key] = arr.length ? arr.join(';') : undefined;
72621           }
72622           dispatch$$1.call('change', this, t$$1);
72623       }
72624
72625
72626       function combo(selection$$1) {
72627           container = selection$$1.selectAll('.form-field-input-wrap')
72628               .data([0]);
72629
72630           var type = (isMulti || isSemi) ? 'multicombo': 'combo';
72631           container = container.enter()
72632               .append('div')
72633               .attr('class', 'form-field-input-wrap form-field-input-' + type)
72634               .merge(container);
72635
72636           if (isMulti || isSemi) {
72637               container = container.selectAll('.chiplist')
72638                   .data([0]);
72639
72640               container = container.enter()
72641                   .append('ul')
72642                   .attr('class', 'chiplist')
72643                   .on('click', function() {
72644                       window.setTimeout(function() { input.node().focus(); }, 10);
72645                   })
72646                   .merge(container);
72647           }
72648
72649           input = container.selectAll('input')
72650               .data([0]);
72651
72652           input = input.enter()
72653               .append('input')
72654               .attr('type', 'text')
72655               .attr('id', 'preset-input-' + field.safeid)
72656               .call(utilNoAuto)
72657               .call(initCombo, selection$$1)
72658               .merge(input);
72659
72660           if (isNetwork && nominatim && _entity) {
72661               var center = _entity.extent(context.graph()).center();
72662               nominatim.countryCode(center, function (err, code) {
72663                   _country = code;
72664               });
72665           }
72666
72667           input
72668               .on('change', change)
72669               .on('blur', change);
72670
72671           if (isMulti || isSemi) {
72672               combobox
72673                   .on('accept', function() {
72674                       input.node().blur();
72675                       input.node().focus();
72676                   });
72677
72678               input
72679                   .on('focus', function() { container.classed('active', true); });
72680           }
72681       }
72682
72683
72684       combo.tags = function(tags) {
72685           if (isMulti || isSemi) {
72686               _multiData = [];
72687
72688               if (isMulti) {
72689                   // Build _multiData array containing keys already set..
72690                   for (var k in tags) {
72691                       if (k.indexOf(field.key) !== 0) continue;
72692                       var v = (tags[k] || '').toLowerCase();
72693                       if (v === '' || v === 'no') continue;
72694
72695                       var suffix = k.substring(field.key.length);
72696                       _multiData.push({
72697                           key: k,
72698                           value: displayValue(suffix)
72699                       });
72700                   }
72701
72702                   // Set keys for form-field modified (needed for undo and reset buttons)..
72703                   field.keys = map$3(_multiData, 'key');
72704
72705               } else if (isSemi) {
72706                   var arr = compact(uniq((tags[field.key] || '').split(';')));
72707                   _multiData = arr.map(function(k) {
72708                       return {
72709                           key: k,
72710                           value: displayValue(k)
72711                       };
72712                   });
72713               }
72714
72715               // Exclude existing multikeys from combo options..
72716               var available = objectDifference(_comboData, _multiData);
72717               combobox.data(available);
72718
72719               // Hide 'Add' button if this field uses fixed set of
72720               // translateable optstrings and they're all currently used..
72721               container.selectAll('.combobox-input, .combobox-caret')
72722                   .classed('hide', optstrings && !available.length);
72723
72724
72725               // Render chips
72726               var chips = container.selectAll('.chips')
72727                   .data(_multiData);
72728
72729               chips.exit()
72730                   .remove();
72731
72732               var enter = chips.enter()
72733                   .insert('li', 'input')
72734                   .attr('class', 'chips');
72735
72736               enter.append('span');
72737               enter.append('a');
72738
72739               chips = chips.merge(enter);
72740
72741               chips.select('span')
72742                   .text(function(d) { return d.value; });
72743
72744               chips.select('a')
72745                   .on('click', removeMultikey)
72746                   .attr('class', 'remove')
72747                   .text('×');
72748
72749           } else {
72750               utilGetSetValue(input, displayValue(tags[field.key]));
72751           }
72752       };
72753
72754
72755       combo.focus = function() {
72756           input.node().focus();
72757       };
72758
72759
72760       combo.entity = function(val) {
72761           if (!arguments.length) return _entity;
72762           _entity = val;
72763           return combo;
72764       };
72765
72766
72767       return utilRebind(combo, dispatch$$1, 'on');
72768   }
72769
72770   function uiFieldText(field, context) {
72771       var dispatch$$1 = dispatch('change');
72772       var nominatim = services.geocoder;
72773       var input = select(null);
72774       var _entity;
72775       var _brandTip;
72776
72777       if (field.id === 'brand') {
72778           _brandTip = tooltip()
72779               .title(t('inspector.lock.suggestion', { label: field.label }))
72780               .placement('bottom');
72781       }
72782
72783
72784       function i(selection$$1) {
72785           var preset = _entity && context.presets().match(_entity, context.graph());
72786           var isSuggestion = preset && preset.suggestion && field.id === 'brand';
72787
72788           var wrap = selection$$1.selectAll('.form-field-input-wrap')
72789               .data([0]);
72790
72791           wrap = wrap.enter()
72792               .append('div')
72793               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
72794               .merge(wrap);
72795
72796           var fieldID = 'preset-input-' + field.safeid;
72797
72798           input = wrap.selectAll('input')
72799               .data([0]);
72800
72801           input = input.enter()
72802               .append('input')
72803               .attr('type', field.type)
72804               .attr('id', fieldID)
72805               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
72806               .classed(field.type, true)
72807               .call(utilNoAuto)
72808               .merge(input);
72809
72810           input
72811               .classed('disabled', !!isSuggestion)
72812               .attr('readonly', isSuggestion || null)
72813               .on('input', change(true))
72814               .on('blur', change())
72815               .on('change', change());
72816
72817
72818           if (field.type === 'tel' && nominatim && _entity) {
72819               var center = _entity.extent(context.graph()).center();
72820               nominatim.countryCode(center, function (err, countryCode) {
72821                   if (err || !dataPhoneFormats[countryCode]) return;
72822                   wrap.selectAll('#' + fieldID)
72823                       .attr('placeholder', dataPhoneFormats[countryCode]);
72824               });
72825
72826           } else if (field.type === 'number') {
72827               var rtl = (textDirection === 'rtl');
72828
72829               input.attr('type', 'text');
72830
72831               var buttons = wrap.selectAll('.increment, .decrement')
72832                   .data(rtl ? [1, -1] : [-1, 1]);
72833
72834               buttons.enter()
72835                   .append('button')
72836                   .attr('tabindex', -1)
72837                   .attr('class', function(d) {
72838                       var which = (d === 1 ? 'increment' : 'decrement');
72839                       return 'form-field-button ' + which;
72840                   })
72841                   .merge(buttons)
72842                   .on('click', function(d) {
72843                       event.preventDefault();
72844                       input.node().value = parsed(input.node().value) + d;
72845                       change()();
72846                   });
72847
72848           } else if (preset && field.id === 'brand') {
72849               var pTag = preset.id.split('/', 2);
72850               var pKey = pTag[0];
72851               if (isSuggestion) {
72852                   // A "suggestion" preset (brand name)
72853                   // Put suggestion keys in `field.keys` so delete button can remove them all.
72854                   field.keys = Object.keys(preset.removeTags)
72855                       .filter(function(k) { return k !== pKey && k !== 'name'; });
72856               }
72857
72858               wrap.call(isSuggestion ? _brandTip : _brandTip.destroy);
72859           }
72860       }
72861
72862
72863       // parse as a number
72864       function parsed(val) {
72865           return parseFloat(val || 0, 10) || 0;
72866       }
72867
72868
72869       // clamp number to min/max
72870       function clamped(num) {
72871           if (field.minValue !== undefined) {
72872               num = Math.max(num, field.minValue);
72873           }
72874           if (field.maxValue !== undefined) {
72875               num = Math.min(num, field.maxValue);
72876           }
72877           return num;
72878       }
72879
72880
72881       function change(onInput) {
72882           return function() {
72883               var t$$1 = {};
72884               var val = utilGetSetValue(input).trim() || undefined;
72885
72886               if (!onInput) {
72887                   if (field.type === 'number' && val !== undefined) {
72888                       val = clamped(parsed(val)) + '';
72889                   }
72890                   utilGetSetValue(input, val || '');
72891               }
72892               t$$1[field.key] = val;
72893               dispatch$$1.call('change', this, t$$1, onInput);
72894           };
72895       }
72896
72897
72898       i.entity = function(val) {
72899           if (!arguments.length) return _entity;
72900           _entity = val;
72901           return i;
72902       };
72903
72904
72905       i.tags = function(tags) {
72906           utilGetSetValue(input, tags[field.key] || '');
72907       };
72908
72909
72910       i.focus = function() {
72911           var node = input.node();
72912           if (node) node.focus();
72913       };
72914
72915       return utilRebind(i, dispatch$$1, 'on');
72916   }
72917
72918   function uiFieldAccess(field, context) {
72919       var dispatch$$1 = dispatch('change');
72920       var items = select(null);
72921
72922       function access(selection$$1) {
72923           var wrap = selection$$1.selectAll('.form-field-input-wrap')
72924               .data([0]);
72925
72926           wrap = wrap.enter()
72927               .append('div')
72928               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
72929               .merge(wrap);
72930
72931           var list = wrap.selectAll('ul')
72932               .data([0]);
72933
72934           list = list.enter()
72935               .append('ul')
72936               .attr('class', 'labeled-inputs')
72937               .merge(list);
72938
72939
72940           items = list.selectAll('li')
72941               .data(field.keys);
72942
72943           // Enter
72944           var enter = items.enter()
72945               .append('li')
72946               .attr('class', function(d) { return 'preset-access-' + d; });
72947
72948           enter
72949               .append('span')
72950               .attr('class', 'label preset-label-access')
72951               .attr('for', function(d) { return 'preset-input-access-' + d; })
72952               .text(function(d) { return field.t('types.' + d); });
72953
72954           enter
72955               .append('div')
72956               .attr('class', 'preset-input-access-wrap')
72957               .append('input')
72958               .attr('type', 'text')
72959               .attr('class', 'preset-input-access')
72960               .attr('id', function(d) { return 'preset-input-access-' + d; })
72961               .call(utilNoAuto)
72962               .each(function(d) {
72963                   select(this)
72964                       .call(d3combobox()
72965                           .container(context.container())
72966                           .data(access.options(d))
72967                       );
72968               });
72969
72970
72971           // Update
72972           items = items.merge(enter);
72973
72974           wrap.selectAll('.preset-input-access')
72975               .on('change', change)
72976               .on('blur', change);
72977       }
72978
72979
72980       function change(d) {
72981           var tag = {};
72982           tag[d] = utilGetSetValue(select(this)) || undefined;
72983           dispatch$$1.call('change', this, tag);
72984       }
72985
72986
72987       access.options = function(type) {
72988           var options = ['no', 'permissive', 'private', 'permit', 'destination'];
72989
72990           if (type !== 'access') {
72991               options.unshift('yes');
72992               options.push('designated');
72993
72994               if (type === 'bicycle') {
72995                   options.push('dismount');
72996               }
72997           }
72998
72999           return options.map(function(option) {
73000               return {
73001                   title: field.t('options.' + option + '.description'),
73002                   value: option
73003               };
73004           });
73005       };
73006
73007
73008       var placeholders = {
73009           footway: {
73010               foot: 'designated',
73011               motor_vehicle: 'no'
73012           },
73013           steps: {
73014               foot: 'yes',
73015               motor_vehicle: 'no',
73016               bicycle: 'no',
73017               horse: 'no'
73018           },
73019           pedestrian: {
73020               foot: 'yes',
73021               motor_vehicle: 'no'
73022           },
73023           cycleway: {
73024               motor_vehicle: 'no',
73025               bicycle: 'designated'
73026           },
73027           bridleway: {
73028               motor_vehicle: 'no',
73029               horse: 'designated'
73030           },
73031           path: {
73032               foot: 'yes',
73033               motor_vehicle: 'no',
73034               bicycle: 'yes',
73035               horse: 'yes'
73036           },
73037           motorway: {
73038               foot: 'no',
73039               motor_vehicle: 'yes',
73040               bicycle: 'no',
73041               horse: 'no'
73042           },
73043           trunk: {
73044               motor_vehicle: 'yes'
73045           },
73046           primary: {
73047               foot: 'yes',
73048               motor_vehicle: 'yes',
73049               bicycle: 'yes',
73050               horse: 'yes'
73051           },
73052           secondary: {
73053               foot: 'yes',
73054               motor_vehicle: 'yes',
73055               bicycle: 'yes',
73056               horse: 'yes'
73057           },
73058           tertiary: {
73059               foot: 'yes',
73060               motor_vehicle: 'yes',
73061               bicycle: 'yes',
73062               horse: 'yes'
73063           },
73064           residential: {
73065               foot: 'yes',
73066               motor_vehicle: 'yes',
73067               bicycle: 'yes',
73068               horse: 'yes'
73069           },
73070           unclassified: {
73071               foot: 'yes',
73072               motor_vehicle: 'yes',
73073               bicycle: 'yes',
73074               horse: 'yes'
73075           },
73076           service: {
73077               foot: 'yes',
73078               motor_vehicle: 'yes',
73079               bicycle: 'yes',
73080               horse: 'yes'
73081           },
73082           motorway_link: {
73083               foot: 'no',
73084               motor_vehicle: 'yes',
73085               bicycle: 'no',
73086               horse: 'no'
73087           },
73088           trunk_link: {
73089               motor_vehicle: 'yes'
73090           },
73091           primary_link: {
73092               foot: 'yes',
73093               motor_vehicle: 'yes',
73094               bicycle: 'yes',
73095               horse: 'yes'
73096           },
73097           secondary_link: {
73098               foot: 'yes',
73099               motor_vehicle: 'yes',
73100               bicycle: 'yes',
73101               horse: 'yes'
73102           },
73103           tertiary_link: {
73104               foot: 'yes',
73105               motor_vehicle: 'yes',
73106               bicycle: 'yes',
73107               horse: 'yes'
73108           }
73109       };
73110
73111
73112       access.tags = function(tags) {
73113           utilGetSetValue(items.selectAll('.preset-input-access'),
73114               function(d) { return tags[d] || ''; })
73115               .attr('placeholder', function() {
73116                   return tags.access ? tags.access : field.placeholder();
73117               });
73118
73119           items.selectAll('#preset-input-access-access')
73120               .attr('placeholder', 'yes');
73121
73122           var which = tags.highway;
73123           if (!placeholders[which]) return;
73124
73125           var keys = Object.keys(placeholders[which]);
73126           keys.forEach(function(k) {
73127               var v = placeholders[which][k];
73128               items.selectAll('#preset-input-access-' + k)
73129                   .attr('placeholder', tags.access || v);
73130           });
73131       };
73132
73133
73134       access.focus = function() {
73135           items.selectAll('.preset-input-access')
73136               .node().focus();
73137       };
73138
73139
73140       return utilRebind(access, dispatch$$1, 'on');
73141   }
73142
73143   function uiFieldAddress(field, context) {
73144       var dispatch$$1 = dispatch('init', 'change');
73145       var nominatim = services.geocoder;
73146       var wrap = select(null);
73147       var _isInitialized = false;
73148       var _entity;
73149
73150       function getNearStreets() {
73151           var extent = _entity.extent(context.graph());
73152           var l = extent.center();
73153           var box = geoExtent$$1(l).padByMeters(200);
73154
73155           var streets = context.intersects(box)
73156               .filter(isAddressable)
73157               .map(function(d) {
73158                   var loc = context.projection([
73159                       (extent[0][0] + extent[1][0]) / 2,
73160                       (extent[0][1] + extent[1][1]) / 2
73161                   ]);
73162                   var choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
73163
73164                   return {
73165                       title: d.tags.name,
73166                       value: d.tags.name,
73167                       dist: choice.distance
73168                   };
73169               })
73170               .sort(function(a, b) {
73171                   return a.dist - b.dist;
73172               });
73173
73174           return uniqBy(streets, 'value');
73175
73176           function isAddressable(d) {
73177               return d.tags.highway && d.tags.name && d.type === 'way';
73178           }
73179       }
73180
73181
73182       function getNearCities() {
73183           var extent = _entity.extent(context.graph());
73184           var l = extent.center();
73185           var box = geoExtent$$1(l).padByMeters(200);
73186
73187           var cities = context.intersects(box)
73188               .filter(isAddressable)
73189               .map(function(d) {
73190                   return {
73191                       title: d.tags['addr:city'] || d.tags.name,
73192                       value: d.tags['addr:city'] || d.tags.name,
73193                       dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
73194                   };
73195               })
73196               .sort(function(a, b) {
73197                   return a.dist - b.dist;
73198               });
73199
73200           return uniqBy(cities, 'value');
73201
73202
73203           function isAddressable(d) {
73204               if (d.tags.name) {
73205                   if (d.tags.admin_level === '8' && d.tags.boundary === 'administrative')
73206                       return true;
73207                   if (d.tags.border_type === 'city')
73208                       return true;
73209                   if (d.tags.place === 'city' || d.tags.place === 'town' || d.tags.place === 'village')
73210                       return true;
73211               }
73212
73213               if (d.tags['addr:city'])
73214                   return true;
73215
73216               return false;
73217           }
73218       }
73219
73220       function getNearValues(key) {
73221           var extent = _entity.extent(context.graph());
73222           var l = extent.center();
73223           var box = geoExtent$$1(l).padByMeters(200);
73224
73225           var results = context.intersects(box)
73226               .filter(function hasTag(d) { return d.tags[key]; })
73227               .map(function(d) {
73228                   return {
73229                       title: d.tags[key],
73230                       value: d.tags[key],
73231                       dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
73232                   };
73233               })
73234               .sort(function(a, b) {
73235                   return a.dist - b.dist;
73236               });
73237
73238           return uniqBy(results, 'value');
73239       }
73240
73241
73242       function initCallback(err, countryCode) {
73243           if (err) return;
73244
73245           var addressFormat = find$1(dataAddressFormats, function (a) {
73246               return a && a.countryCodes && includes(a.countryCodes, countryCode.toLowerCase());
73247           }) || dataAddressFormats[0];
73248
73249           var widths = addressFormat.widths || {
73250               housenumber: 1/3, street: 2/3,
73251               city: 2/3, state: 1/4, postcode: 1/3
73252           };
73253
73254           function row(r) {
73255               // Normalize widths.
73256               var total = reduce(r, function(sum, field) {
73257                   return sum + (widths[field] || 0.5);
73258               }, 0);
73259
73260               return r.map(function (field) {
73261                   return {
73262                       id: field,
73263                       width: (widths[field] || 0.5) / total
73264                   };
73265               });
73266           }
73267
73268           wrap.selectAll('.addr-row')
73269               .data(addressFormat.format)
73270               .enter()
73271               .append('div')
73272               .attr('class', 'addr-row')
73273               .selectAll('input')
73274               .data(row)
73275               .enter()
73276               .append('input')
73277               .property('type', 'text')
73278               .attr('placeholder', function (d) {
73279                   var localkey = d.id + '!' + countryCode.toLowerCase();
73280                   var tkey = field.strings.placeholders[localkey] ? localkey : d.id;
73281                   return field.t('placeholders.' + tkey);
73282               })
73283               .attr('class', function (d) { return 'addr-' + d.id; })
73284               .call(utilNoAuto)
73285               .style('width', function (d) { return d.width * 100 + '%'; });
73286
73287           // Update
73288
73289           // setup dropdowns for common address tags
73290           var dropdowns = addressFormat.dropdowns || [
73291               'city', 'county', 'country', 'district', 'hamlet',
73292               'neighbourhood', 'place', 'postcode', 'province',
73293               'quarter', 'state', 'street', 'subdistrict', 'suburb'
73294           ];
73295
73296           // If fields exist for any of these tags, create dropdowns to pick nearby values..
73297           dropdowns.forEach(function(tag) {
73298               var nearValues = (tag === 'street') ? getNearStreets
73299                       : (tag === 'city') ? getNearCities
73300                       : getNearValues;
73301
73302               wrap.selectAll('input.addr-' + tag)
73303                   .call(d3combobox()
73304                       .container(context.container())
73305                       .minItems(1)
73306                       .fetcher(function(value, callback) {
73307                           callback(nearValues('addr:' + tag));
73308                       })
73309                   );
73310           });
73311
73312           wrap.selectAll('input')
73313               .on('blur', change())
73314               .on('change', change());
73315
73316           wrap.selectAll('input:not(.combobox-input)')
73317               .on('input', change(true));
73318
73319           dispatch$$1.call('init');
73320           _isInitialized = true;
73321       }
73322
73323
73324       function address(selection$$1) {
73325           _isInitialized = false;
73326
73327           wrap = selection$$1.selectAll('.form-field-input-wrap')
73328               .data([0]);
73329
73330           wrap = wrap.enter()
73331               .append('div')
73332               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
73333               .merge(wrap);
73334
73335           if (nominatim && _entity) {
73336               var center = _entity.extent(context.graph()).center();
73337               nominatim.countryCode(center, initCallback);
73338           }
73339       }
73340
73341
73342       function change(onInput) {
73343           return function() {
73344               var tags = {};
73345
73346               wrap.selectAll('input')
73347                   .each(function (field) {
73348                       tags['addr:' + field.id] = this.value || undefined;
73349                   });
73350
73351               dispatch$$1.call('change', this, tags, onInput);
73352           };
73353       }
73354
73355
73356       function updateTags(tags) {
73357           utilGetSetValue(wrap.selectAll('input'), function (field) {
73358               return tags['addr:' + field.id] || '';
73359           });
73360       }
73361
73362
73363       address.entity = function(val) {
73364           if (!arguments.length) return _entity;
73365           _entity = val;
73366           return address;
73367       };
73368
73369
73370       address.tags = function(tags) {
73371           if (_isInitialized) {
73372               updateTags(tags);
73373           } else {
73374               dispatch$$1.on('init', function () {
73375                   dispatch$$1.on('init', null);
73376                   updateTags(tags);
73377               });
73378           }
73379       };
73380
73381
73382       address.focus = function() {
73383           var node = wrap.selectAll('input').node();
73384           if (node) node.focus();
73385       };
73386
73387
73388       return utilRebind(address, dispatch$$1, 'on');
73389   }
73390
73391   function uiFieldCycleway(field, context) {
73392       var dispatch$$1 = dispatch('change');
73393       var items = select(null);
73394
73395
73396       function cycleway(selection$$1) {
73397
73398           function stripcolon(s) {
73399               return s.replace(':', '');
73400           }
73401
73402
73403           var wrap = selection$$1.selectAll('.form-field-input-wrap')
73404               .data([0]);
73405
73406           wrap = wrap.enter()
73407               .append('div')
73408               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
73409               .merge(wrap);
73410
73411
73412           var div = wrap.selectAll('ul')
73413               .data([0]);
73414
73415           div = div.enter()
73416               .append('ul')
73417               .attr('class', 'labeled-inputs')
73418               .merge(div);
73419
73420
73421           items = div.selectAll('li')
73422               .data(field.keys);
73423
73424           var enter = items.enter()
73425               .append('li')
73426               .attr('class', function(d) { return 'preset-cycleway-' + stripcolon(d); });
73427
73428           enter
73429               .append('span')
73430               .attr('class', 'label preset-label-cycleway')
73431               .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
73432               .text(function(d) { return field.t('types.' + d); });
73433
73434           enter
73435               .append('div')
73436               .attr('class', 'preset-input-cycleway-wrap')
73437               .append('input')
73438               .attr('type', 'text')
73439               .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
73440               .call(utilNoAuto)
73441               .each(function(d) {
73442                   select(this)
73443                       .call(d3combobox()
73444                           .container(context.container())
73445                           .data(cycleway.options(d))
73446                       );
73447               });
73448
73449
73450           // Update
73451           wrap.selectAll('.preset-input-cycleway')
73452               .on('change', change)
73453               .on('blur', change);
73454       }
73455
73456
73457       function change() {
73458           var left = utilGetSetValue(select('.preset-input-cyclewayleft'));
73459           var right = utilGetSetValue(select('.preset-input-cyclewayright'));
73460           var tag = {};
73461
73462           if (left === 'none' || left === '') { left = undefined; }
73463           if (right === 'none' || right === '') { right = undefined; }
73464
73465           // Always set both left and right as changing one can affect the other
73466           tag = {
73467               cycleway: undefined,
73468               'cycleway:left': left,
73469               'cycleway:right': right
73470           };
73471
73472           // If the left and right tags match, use the cycleway tag to tag both
73473           // sides the same way
73474           if (left === right) {
73475               tag = {
73476                   cycleway: left,
73477                   'cycleway:left': undefined,
73478                   'cycleway:right': undefined
73479               };
73480           }
73481
73482           dispatch$$1.call('change', this, tag);
73483       }
73484
73485
73486       cycleway.options = function() {
73487           return Object.keys(field.strings.options).map(function(option) {
73488               return {
73489                   title: field.t('options.' + option + '.description'),
73490                   value: option
73491               };
73492           });
73493       };
73494
73495
73496       cycleway.tags = function(tags) {
73497           utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
73498                   // If cycleway is set, always return that
73499                   if (tags.cycleway) {
73500                       return tags.cycleway;
73501                   }
73502                   return tags[d] || '';
73503               })
73504               .attr('placeholder', field.placeholder());
73505       };
73506
73507
73508       cycleway.focus = function() {
73509           items.selectAll('.preset-input-cycleway')
73510               .node().focus();
73511       };
73512
73513
73514       return utilRebind(cycleway, dispatch$$1, 'on');
73515   }
73516
73517   function uiFieldLanes(field, context) {
73518       var dispatch$$1 = dispatch('change');
73519       var LANE_WIDTH = 40;
73520       var LANE_HEIGHT = 200;
73521       var _entityID;
73522
73523       function lanes(selection$$1) {
73524           var lanesData = context.entity(_entityID).lanes();
73525
73526           if (!select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
73527               selection$$1.call(lanes.off);
73528               return;
73529           }
73530
73531           var wrap = selection$$1.selectAll('.form-field-input-wrap')
73532               .data([0]);
73533
73534           wrap = wrap.enter()
73535               .append('div')
73536               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
73537               .merge(wrap);
73538
73539           var surface =  wrap.selectAll('.surface')
73540               .data([0]);
73541
73542           var d = utilGetDimensions(wrap);
73543           var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
73544
73545           surface = surface.enter()
73546               .append('svg')
73547               .attr('width', d[0])
73548               .attr('height', 300)
73549               .attr('class', 'surface')
73550               .merge(surface);
73551
73552
73553           var lanesSelection = surface.selectAll('.lanes')
73554               .data([0]);
73555
73556           lanesSelection = lanesSelection.enter()
73557               .append('g')
73558               .attr('class', 'lanes')
73559               .merge(lanesSelection);
73560
73561           lanesSelection
73562               .attr('transform', function () {
73563                   return 'translate(' + (freeSpace / 2) + ', 0)';
73564               });
73565
73566
73567           var lane = lanesSelection.selectAll('.lane')
73568              .data(lanesData.lanes);
73569
73570           lane.exit()
73571               .remove();
73572
73573           var enter = lane.enter()
73574               .append('g')
73575               .attr('class', 'lane');
73576
73577           enter
73578               .append('g')
73579               .append('rect')
73580               .attr('y', 50)
73581               .attr('width', LANE_WIDTH)
73582               .attr('height', LANE_HEIGHT);
73583
73584           enter
73585               .append('g')
73586               .attr('class', 'forward')
73587               .append('text')
73588               .attr('y', 40)
73589               .attr('x', 14)
73590               .text('▲');
73591
73592           enter
73593               .append('g')
73594               .attr('class', 'bothways')
73595               .append('text')
73596               .attr('y', 40)
73597               .attr('x', 14)
73598               .text('▲▼');
73599
73600           enter
73601               .append('g')
73602               .attr('class', 'backward')
73603               .append('text')
73604               .attr('y', 40)
73605               .attr('x', 14)
73606               .text('▼');
73607
73608
73609           lane = lane
73610               .merge(enter);
73611
73612           lane
73613               .attr('transform', function(d) {
73614                   return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
73615               });
73616
73617           lane.select('.forward')
73618               .style('visibility', function(d) {
73619                   return d.direction === 'forward' ? 'visible' : 'hidden';
73620               });
73621
73622           lane.select('.bothways')
73623               .style('visibility', function(d) {
73624                   return d.direction === 'bothways' ? 'visible' : 'hidden';
73625               });
73626
73627           lane.select('.backward')
73628               .style('visibility', function(d) {
73629                   return d.direction === 'backward' ? 'visible' : 'hidden';
73630               });
73631       }
73632
73633
73634       lanes.entity = function(val) {
73635           if (!_entityID || _entityID !== val.id) {
73636               _entityID = val.id;
73637           }
73638       };
73639
73640       lanes.tags = function() {};
73641       lanes.focus = function() {};
73642       lanes.off = function() {};
73643
73644       return utilRebind(lanes, dispatch$$1, 'on');
73645   }
73646
73647   function uiFieldLocalized(field, context) {
73648       var dispatch$$1 = dispatch('change', 'input');
73649       var wikipedia = services.wikipedia;
73650       var input = select(null);
73651       var localizedInputs = select(null);
73652       var _selection = select(null);
73653       var _multilingual = [];
73654       var _isLocked = false;
73655       var _brandTip = tooltip()
73656           .title(t('inspector.lock.suggestion', { label: field.label }))
73657           .placement('bottom');
73658       var _buttonTip = tooltip()
73659           .title(t('translate.translate'))
73660           .placement('left');
73661       var _wikiTitles;
73662       var _entity;
73663
73664
73665       function calcLocked() {
73666           if (!_entity) {    // the original entity
73667               _isLocked = false;
73668               return;
73669           }
73670
73671           var latest = context.hasEntity(_entity.id);
73672           if (!latest) {    // get current entity, possibly edited
73673               _isLocked = false;
73674               return;
73675           }
73676
73677           var hasOriginalName = (latest.tags.name && latest.tags.name === _entity.tags.name);
73678           var hasWikidata = latest.tags.wikidata;
73679           var preset = context.presets().match(latest, context.graph());
73680           var isSuggestion = preset && preset.suggestion;
73681           var showsBrand = preset && preset.fields
73682               .filter(function(d) { return d.id === 'brand'; }).length;
73683
73684           _isLocked = !!(field.id === 'name' && hasOriginalName &&
73685               (hasWikidata || (isSuggestion && !showsBrand)));
73686       }
73687
73688
73689       function calcMultilingual(tags) {
73690           _multilingual = [];
73691           for (var k in tags) {
73692               var m = k.match(/^(.*):([a-zA-Z_-]+)$/);
73693               if (m && m[1] === field.key && m[2]) {
73694                   _multilingual.push({ lang: m[2], value: tags[k] });
73695               }
73696           }
73697           _multilingual.reverse();
73698       }
73699
73700
73701       function localized(selection$$1) {
73702           _selection = selection$$1;
73703           calcLocked();
73704           var entity = _entity && context.hasEntity(_entity.id);  // get latest
73705           var preset = entity && context.presets().match(entity, context.graph());
73706
73707           var wrap = selection$$1.selectAll('.form-field-input-wrap')
73708               .data([0]);
73709
73710           // enter/update
73711           wrap = wrap.enter()
73712               .append('div')
73713               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
73714               .merge(wrap)
73715               .call(_isLocked ? _brandTip : _brandTip.destroy);
73716
73717
73718           input = wrap.selectAll('.localized-main')
73719               .data([0]);
73720
73721           // enter/update
73722           input = input.enter()
73723               .append('input')
73724               .attr('type', 'text')
73725               .attr('id', 'preset-input-' + field.safeid)
73726               .attr('class', 'localized-main')
73727               .attr('placeholder', field.placeholder())
73728               .call(utilNoAuto)
73729               .merge(input);
73730
73731           if (preset && field.id === 'name') {
73732               var pTag = preset.id.split('/', 2);
73733               var pKey = pTag[0];
73734               var pValue = pTag[1];
73735
73736               if (preset.suggestion) {
73737                   // A "suggestion" preset (brand name)
73738                   // Put suggestion keys in `field.keys` so delete button can remove them all.
73739                   field.keys = Object.keys(preset.removeTags)
73740                       .filter(function(k) { return k !== pKey; });
73741
73742               } else {
73743                   // Not a suggestion preset - Add a suggestions dropdown if it makes sense to.
73744                   var allSuggestions = context.presets().collection.filter(function(p) {
73745                       return p.suggestion === true;
73746                   });
73747
73748                   // This code attempts to determine if the matched preset is the
73749                   // kind of preset that even can benefit from name suggestions..
73750                   // - true = shops, cafes, hotels, etc. (also generic and fallback presets)
73751                   // - false = churches, parks, hospitals, etc. (things not in the index)
73752                   var isFallback = preset.isFallback();
73753                   var goodSuggestions = allSuggestions.filter(function(s) {
73754                       if (isFallback) return true;
73755                       var sTag = s.id.split('/', 2);
73756                       var sKey = sTag[0];
73757                       var sValue = sTag[1];
73758                       return pKey === sKey && (!pValue || pValue === sValue);
73759                   });
73760
73761                   // Show the suggestions.. If the user picks one, change the tags..
73762                   if (allSuggestions.length && goodSuggestions.length) {
73763                       input
73764                           .call(d3combobox()
73765                               .container(context.container())
73766                               .fetcher(suggestNames(preset, allSuggestions))
73767                               .minItems(1)
73768                               .on('accept', function(d) {
73769                                   var entity = context.entity(_entity.id);  // get latest
73770                                   var tags = entity.tags;
73771                                   var geometry = entity.geometry(context.graph());
73772                                   var removed = preset.unsetTags(tags, geometry);
73773                                   for (var k in tags) {
73774                                       tags[k] = removed[k];  // set removed tags to `undefined`
73775                                   }
73776                                   tags = d.suggestion.setTags(tags, geometry);
73777                                   utilGetSetValue(input, tags.name);
73778                                   dispatch$$1.call('change', this, tags);
73779                               })
73780                           );
73781                   }
73782               }
73783           }
73784
73785           input
73786               .classed('disabled', !!_isLocked)
73787               .attr('readonly', _isLocked || null)
73788               .on('input', change(true))
73789               .on('blur', change())
73790               .on('change', change());
73791
73792
73793           var translateButton = wrap.selectAll('.localized-add')
73794               .data([0]);
73795
73796           translateButton = translateButton.enter()
73797               .append('button')
73798               .attr('class', 'localized-add form-field-button')
73799               .attr('tabindex', -1)
73800               .call(svgIcon('#iD-icon-plus'))
73801               .merge(translateButton);
73802
73803           translateButton
73804               .classed('disabled', !!_isLocked)
73805               .call(_isLocked ? _buttonTip.destroy : _buttonTip)
73806               .on('click', addNew);
73807
73808
73809           if (entity && !_multilingual.length) {
73810               calcMultilingual(entity.tags);
73811           }
73812
73813           localizedInputs = selection$$1.selectAll('.localized-multilingual')
73814               .data([0]);
73815
73816           localizedInputs = localizedInputs.enter()
73817               .append('div')
73818               .attr('class', 'localized-multilingual')
73819               .merge(localizedInputs);
73820
73821           localizedInputs
73822               .call(renderMultilingual);
73823
73824           localizedInputs.selectAll('button, input')
73825               .classed('disabled', !!_isLocked)
73826               .attr('readonly', _isLocked || null);
73827
73828
73829
73830           function suggestNames(preset, suggestions) {
73831               var pTag = preset.id.split('/', 2);
73832               var pKey = pTag[0];
73833               var pValue = pTag[1];
73834
73835               return function(value, callback) {
73836                   var results = [];
73837                   if (value && value.length > 2) {
73838                       for (var i = 0; i < suggestions.length; i++) {
73839                           var s = suggestions[i];
73840                           var sTag = s.id.split('/', 2);
73841                           var sKey = sTag[0];
73842                           var sValue = sTag[1];
73843                           var name = s.name();
73844                           var dist = utilEditDistance(value, name.substring(0, value.length));
73845                           var matchesPreset = (pKey === sKey && (!pValue || pValue === sValue));
73846
73847                           if (dist < 1 || (matchesPreset && dist < 3)) {
73848                               var obj = {
73849                                   title: name,
73850                                   value: name,
73851                                   suggestion: s,
73852                                   dist: dist + (matchesPreset ? 0 : 1)  // penalize if not matched preset
73853                               };
73854                               results.push(obj);
73855                           }
73856                       }
73857                       results.sort(function(a, b) { return a.dist - b.dist; });
73858                   }
73859                   results = results.slice(0, 10);
73860                   callback(results);
73861               };
73862           }
73863
73864
73865           function addNew() {
73866               event.preventDefault();
73867               if (_isLocked) return;
73868
73869               var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
73870               var langExists = find$1(_multilingual, function(datum) { return datum.lang === defaultLang;});
73871               var isLangEn = defaultLang.indexOf('en') > -1;
73872               if (isLangEn || langExists) {
73873                   defaultLang = '';
73874               }
73875               _multilingual.push({ lang: defaultLang, value: '' });
73876
73877               localizedInputs
73878                   .call(renderMultilingual);
73879           }
73880
73881
73882           function change(onInput) {
73883               return function() {
73884                   if (_isLocked) {
73885                       event.preventDefault();
73886                       return;
73887                   }
73888                   var t$$1 = {};
73889                   t$$1[field.key] = utilGetSetValue(select(this)) || undefined;
73890                   dispatch$$1.call('change', this, t$$1, onInput);
73891               };
73892           }
73893       }
73894
73895
73896       function key(lang) {
73897           return field.key + ':' + lang;
73898       }
73899
73900
73901       function changeLang(d) {
73902           var lang = utilGetSetValue(select(this));
73903           var t$$1 = {};
73904           var language = find$1(wikipedia$2, function(d) {
73905               return d[0].toLowerCase() === lang.toLowerCase() ||
73906                   d[1].toLowerCase() === lang.toLowerCase();
73907           });
73908
73909           if (language) lang = language[2];
73910
73911           if (d.lang && d.lang !== lang) {
73912               t$$1[key(d.lang)] = undefined;
73913           }
73914
73915           var value = utilGetSetValue(select(this.parentNode)
73916               .selectAll('.localized-value'));
73917
73918           if (lang && value) {
73919               t$$1[key(lang)] = value;
73920           } else if (lang && _wikiTitles && _wikiTitles[d.lang]) {
73921               t$$1[key(lang)] = _wikiTitles[d.lang];
73922           }
73923
73924           d.lang = lang;
73925           dispatch$$1.call('change', this, t$$1);
73926       }
73927
73928
73929       function changeValue(d) {
73930           if (!d.lang) return;
73931           var t$$1 = {};
73932           t$$1[key(d.lang)] = utilGetSetValue(select(this)) || undefined;
73933           dispatch$$1.call('change', this, t$$1);
73934       }
73935
73936
73937       function fetcher(value, cb) {
73938           var v = value.toLowerCase();
73939
73940           cb(wikipedia$2.filter(function(d) {
73941               return d[0].toLowerCase().indexOf(v) >= 0 ||
73942               d[1].toLowerCase().indexOf(v) >= 0 ||
73943               d[2].toLowerCase().indexOf(v) >= 0;
73944           }).map(function(d) {
73945               return { value: d[1] };
73946           }));
73947       }
73948
73949
73950       function renderMultilingual(selection$$1) {
73951           var wraps = selection$$1.selectAll('div.entry')
73952               .data(_multilingual, function(d) { return d.lang; });
73953
73954           wraps.exit()
73955               .transition()
73956               .duration(200)
73957               .style('max-height', '0px')
73958               .style('opacity', '0')
73959               .style('top', '-10px')
73960               .remove();
73961
73962           var innerWrap = wraps.enter()
73963               .insert('div', ':first-child');
73964
73965           innerWrap
73966               .attr('class', 'entry')
73967               .each(function() {
73968                   var wrap = select(this);
73969                   var langcombo = d3combobox()
73970                       .container(context.container())
73971                       .fetcher(fetcher)
73972                       .minItems(0);
73973
73974                   var label = wrap
73975                       .append('label')
73976                       .attr('class', 'form-field-label');
73977
73978                   label
73979                       .append('span')
73980                       .attr('class', 'label-text')
73981                       .text(t('translate.localized_translation_label'));
73982
73983                   label
73984                       .append('button')
73985                       .attr('class', 'remove-icon-multilingual')
73986                       .on('click', function(d){
73987                           if (_isLocked) return;
73988                           event.preventDefault();
73989                           var t$$1 = {};
73990                           t$$1[key(d.lang)] = undefined;
73991                           dispatch$$1.call('change', this, t$$1);
73992                           select(this.parentNode.parentNode.parentNode)
73993                               .style('top', '0')
73994                               .style('max-height', '240px')
73995                               .transition()
73996                               .style('opacity', '0')
73997                               .style('max-height', '0px')
73998                               .remove();
73999                       })
74000                       .call(svgIcon('#iD-operation-delete'));
74001
74002                   wrap
74003                       .append('input')
74004                       .attr('class', 'localized-lang')
74005                       .attr('type', 'text')
74006                       .attr('placeholder', t('translate.localized_translation_language'))
74007                       .on('blur', changeLang)
74008                       .on('change', changeLang)
74009                       .call(langcombo);
74010
74011                   wrap
74012                       .append('input')
74013                       .attr('type', 'text')
74014                       .attr('placeholder', t('translate.localized_translation_name'))
74015                       .attr('class', 'localized-value')
74016                       .on('blur', changeValue)
74017                       .on('change', changeValue);
74018               });
74019
74020           innerWrap
74021               .style('margin-top', '0px')
74022               .style('max-height', '0px')
74023               .style('opacity', '0')
74024               .transition()
74025               .duration(200)
74026               .style('margin-top', '10px')
74027               .style('max-height', '240px')
74028               .style('opacity', '1')
74029               .on('end', function() {
74030                   select(this)
74031                       .style('max-height', '')
74032                       .style('overflow', 'visible');
74033               });
74034
74035
74036           var entry = selection$$1.selectAll('.entry');
74037
74038           utilGetSetValue(entry.select('.localized-lang'), function(d) {
74039               var lang = find$1(wikipedia$2, function(lang) { return lang[2] === d.lang; });
74040               return lang ? lang[1] : d.lang;
74041           });
74042
74043           utilGetSetValue(entry.select('.localized-value'),
74044               function(d) { return d.value; });
74045       }
74046
74047
74048       localized.tags = function(tags) {
74049           // Fetch translations from wikipedia
74050           if (tags.wikipedia && !_wikiTitles) {
74051               _wikiTitles = {};
74052               var wm = tags.wikipedia.match(/([^:]+):(.+)/);
74053               if (wm && wm[0] && wm[1]) {
74054                   wikipedia.translations(wm[1], wm[2], function(d) { _wikiTitles = d; });
74055               }
74056           }
74057
74058           utilGetSetValue(input, tags[field.key] || '');
74059
74060           calcMultilingual(tags);
74061
74062           _selection
74063               .call(localized);
74064       };
74065
74066
74067       localized.focus = function() {
74068           input.node().focus();
74069       };
74070
74071
74072       localized.entity = function(val) {
74073           if (!arguments.length) return _entity;
74074           _entity = val;
74075           _multilingual = [];
74076           return localized;
74077       };
74078
74079       return utilRebind(localized, dispatch$$1, 'on');
74080   }
74081
74082   function uiFieldMaxspeed(field, context) {
74083       var dispatch$$1 = dispatch('change');
74084       var unitInput = select(null);
74085       var input = select(null);
74086       var combobox;
74087       var _entity;
74088       var _isImperial;
74089
74090       var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
74091       var imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
74092
74093
74094       function maxspeed(selection$$1) {
74095           combobox = d3combobox()
74096               .container(context.container());
74097
74098           var unitCombobox = d3combobox()
74099               .container(context.container())
74100               .data(['km/h', 'mph'].map(comboValues));
74101
74102           var wrap = selection$$1.selectAll('.form-field-input-wrap')
74103               .data([0]);
74104
74105           wrap = wrap.enter()
74106               .append('div')
74107               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
74108               .merge(wrap);
74109
74110
74111           input = wrap.selectAll('#preset-input-' + field.safeid)
74112               .data([0]);
74113
74114           input = input.enter()
74115               .append('input')
74116               .attr('type', 'text')
74117               .attr('id', 'preset-input-' + field.safeid)
74118               .attr('placeholder', field.placeholder())
74119               .call(utilNoAuto)
74120               .call(combobox)
74121               .merge(input);
74122
74123           input
74124               .on('change', change)
74125               .on('blur', change);
74126
74127           var loc;
74128           if (_entity.type === 'node') {
74129               loc = _entity.loc;
74130           } else {
74131               var childNodes = context.graph().childNodes(context.entity(_entity.id));
74132               loc = childNodes[~~(childNodes.length/2)].loc;
74133           }
74134
74135           _isImperial = some(dataImperial.features, function(f) {
74136               return some(f.geometry.coordinates, function(d) {
74137                   return geoPointInPolygon(loc, d);
74138               });
74139           });
74140
74141           unitInput = wrap.selectAll('input.maxspeed-unit')
74142               .data([0]);
74143
74144           unitInput = unitInput.enter()
74145               .append('input')
74146               .attr('type', 'text')
74147               .attr('class', 'maxspeed-unit')
74148               .call(unitCombobox)
74149               .merge(unitInput);
74150
74151           unitInput
74152               .on('blur', changeUnits)
74153               .on('change', changeUnits);
74154
74155
74156           function changeUnits() {
74157               _isImperial = utilGetSetValue(unitInput) === 'mph';
74158               utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
74159               setSuggestions();
74160               change();
74161           }
74162       }
74163
74164
74165       function setSuggestions() {
74166           combobox.data((_isImperial ? imperialValues : metricValues).map(comboValues));
74167           utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
74168       }
74169
74170
74171       function comboValues(d) {
74172           return {
74173               value: d.toString(),
74174               title: d.toString()
74175           };
74176       }
74177
74178
74179       function change() {
74180           var tag = {};
74181           var value = utilGetSetValue(input);
74182
74183           if (!value) {
74184               tag[field.key] = undefined;
74185           } else if (isNaN(value) || !_isImperial) {
74186               tag[field.key] = value;
74187           } else {
74188               tag[field.key] = value + ' mph';
74189           }
74190
74191           dispatch$$1.call('change', this, tag);
74192       }
74193
74194
74195       maxspeed.tags = function(tags) {
74196           var value = tags[field.key];
74197
74198           if (value && value.indexOf('mph') >= 0) {
74199               value = parseInt(value, 10);
74200               _isImperial = true;
74201           } else if (value) {
74202               _isImperial = false;
74203           }
74204
74205           setSuggestions();
74206           utilGetSetValue(input, value || '');
74207       };
74208
74209
74210       maxspeed.focus = function() {
74211           input.node().focus();
74212       };
74213
74214
74215       maxspeed.entity = function(val) {
74216           _entity = val;
74217       };
74218
74219
74220       return utilRebind(maxspeed, dispatch$$1, 'on');
74221   }
74222
74223   /**
74224    * This function is like `baseIndexOf` except that it accepts a comparator.
74225    *
74226    * @private
74227    * @param {Array} array The array to inspect.
74228    * @param {*} value The value to search for.
74229    * @param {number} fromIndex The index to search from.
74230    * @param {Function} comparator The comparator invoked per element.
74231    * @returns {number} Returns the index of the matched value, else `-1`.
74232    */
74233   function baseIndexOfWith(array, value, fromIndex, comparator) {
74234     var index = fromIndex - 1,
74235         length = array.length;
74236
74237     while (++index < length) {
74238       if (comparator(array[index], value)) {
74239         return index;
74240       }
74241     }
74242     return -1;
74243   }
74244
74245   /** Used for built-in method references. */
74246   var arrayProto$2 = Array.prototype;
74247
74248   /** Built-in value references. */
74249   var splice$2 = arrayProto$2.splice;
74250
74251   /**
74252    * The base implementation of `_.pullAllBy` without support for iteratee
74253    * shorthands.
74254    *
74255    * @private
74256    * @param {Array} array The array to modify.
74257    * @param {Array} values The values to remove.
74258    * @param {Function} [iteratee] The iteratee invoked per element.
74259    * @param {Function} [comparator] The comparator invoked per element.
74260    * @returns {Array} Returns `array`.
74261    */
74262   function basePullAll(array, values, iteratee, comparator) {
74263     var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
74264         index = -1,
74265         length = values.length,
74266         seen = array;
74267
74268     if (array === values) {
74269       values = copyArray(values);
74270     }
74271     if (iteratee) {
74272       seen = arrayMap(array, baseUnary(iteratee));
74273     }
74274     while (++index < length) {
74275       var fromIndex = 0,
74276           value = values[index],
74277           computed = iteratee ? iteratee(value) : value;
74278
74279       while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
74280         if (seen !== array) {
74281           splice$2.call(seen, fromIndex, 1);
74282         }
74283         splice$2.call(array, fromIndex, 1);
74284       }
74285     }
74286     return array;
74287   }
74288
74289   /**
74290    * This method is like `_.pull` except that it accepts an array of values to remove.
74291    *
74292    * **Note:** Unlike `_.difference`, this method mutates `array`.
74293    *
74294    * @static
74295    * @memberOf _
74296    * @since 4.0.0
74297    * @category Array
74298    * @param {Array} array The array to modify.
74299    * @param {Array} values The values to remove.
74300    * @returns {Array} Returns `array`.
74301    * @example
74302    *
74303    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
74304    *
74305    * _.pullAll(array, ['a', 'c']);
74306    * console.log(array);
74307    * // => ['b', 'b']
74308    */
74309   function pullAll(array, values) {
74310     return (array && array.length && values && values.length)
74311       ? basePullAll(array, values)
74312       : array;
74313   }
74314
74315   /**
74316    * Removes all given values from `array` using
74317    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
74318    * for equality comparisons.
74319    *
74320    * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
74321    * to remove elements from an array by predicate.
74322    *
74323    * @static
74324    * @memberOf _
74325    * @since 2.0.0
74326    * @category Array
74327    * @param {Array} array The array to modify.
74328    * @param {...*} [values] The values to remove.
74329    * @returns {Array} Returns `array`.
74330    * @example
74331    *
74332    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
74333    *
74334    * _.pull(array, 'a', 'c');
74335    * console.log(array);
74336    * // => ['b', 'b']
74337    */
74338   var pull = baseRest(pullAll);
74339
74340   function uiFieldRadio(field, context) {
74341       var dispatch$$1 = dispatch('change');
74342       var placeholder = select(null);
74343       var wrap = select(null);
74344       var labels = select(null);
74345       var radios = select(null);
74346       var radioData = clone(field.options || field.keys);
74347       var typeField;
74348       var layerField;
74349       var _oldType = {};
74350       var _entity;
74351
74352
74353       function selectedKey() {
74354           var node = wrap.selectAll('.form-field-input-radio label.active input');
74355           return !node.empty() && node.datum();
74356       }
74357
74358
74359       function radio(selection$$1) {
74360           selection$$1.classed('preset-radio', true);
74361
74362           wrap = selection$$1.selectAll('.form-field-input-wrap')
74363               .data([0]);
74364
74365           var enter = wrap.enter()
74366               .append('div')
74367               .attr('class', 'form-field-input-wrap form-field-input-radio');
74368
74369           enter
74370               .append('span')
74371               .attr('class', 'placeholder');
74372
74373           wrap = wrap
74374               .merge(enter);
74375
74376
74377           placeholder = wrap.selectAll('.placeholder');
74378
74379           labels = wrap.selectAll('label')
74380               .data(radioData);
74381
74382           enter = labels.enter()
74383               .append('label');
74384
74385           enter
74386               .append('input')
74387               .attr('type', 'radio')
74388               .attr('name', field.id)
74389               .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
74390               .attr('checked', false);
74391
74392           enter
74393               .append('span')
74394               .text(function(d) { return field.t('options.' + d, { 'default': d }); });
74395
74396           labels = labels
74397               .merge(enter);
74398
74399           radios = labels.selectAll('input')
74400               .on('change', changeRadio);
74401
74402       }
74403
74404
74405       function structureExtras(selection$$1, tags) {
74406           var selected = selectedKey();
74407           var type = context.presets().field(selected);
74408           var layer = context.presets().field('layer');
74409           var showLayer = (selected === 'bridge' || selected === 'tunnel');
74410
74411
74412           var extrasWrap = selection$$1.selectAll('.structure-extras-wrap')
74413               .data(selected ? [0] : []);
74414
74415           extrasWrap.exit()
74416               .remove();
74417
74418           extrasWrap = extrasWrap.enter()
74419               .append('div')
74420               .attr('class', 'structure-extras-wrap')
74421               .merge(extrasWrap);
74422
74423           var list = extrasWrap.selectAll('ul')
74424               .data([0]);
74425
74426           list = list.enter()
74427               .append('ul')
74428               .attr('class', 'labeled-inputs')
74429               .merge(list);
74430
74431
74432           // Type
74433           if (type) {
74434               if (!typeField || typeField.id !== selected) {
74435                   typeField = uiField(context, type, _entity, { wrap: false })
74436                       .on('change', changeType);
74437               }
74438               typeField.tags(tags);
74439           } else {
74440               typeField = null;
74441           }
74442
74443           var typeItem = list.selectAll('.structure-type-item')
74444               .data(typeField ? [typeField] : [], function(d) { return d.id; });
74445
74446           // Exit
74447           typeItem.exit()
74448               .remove();
74449
74450           // Enter
74451           var typeEnter = typeItem.enter()
74452               .insert('li', ':first-child')
74453               .attr('class', 'structure-type-item');
74454
74455           typeEnter
74456               .append('span')
74457               .attr('class', 'label structure-label-type')
74458               .attr('for', 'preset-input-' + selected)
74459               .text(t('inspector.radio.structure.type'));
74460
74461           typeEnter
74462               .append('div')
74463               .attr('class', 'structure-input-type-wrap');
74464
74465           // Update
74466           typeItem = typeItem
74467               .merge(typeEnter);
74468
74469           if (typeField) {
74470               typeItem.selectAll('.structure-input-type-wrap')
74471                   .call(typeField.render);
74472           }
74473
74474
74475           // Layer
74476           if (layer && showLayer) {
74477               if (!layerField) {
74478                   layerField = uiField(context, layer, _entity, { wrap: false })
74479                       .on('change', changeLayer);
74480               }
74481               layerField.tags(tags);
74482               field.keys = union(field.keys, ['layer']);
74483           } else {
74484               layerField = null;
74485               pull(field.keys, 'layer');
74486           }
74487
74488           var layerItem = list.selectAll('.structure-layer-item')
74489               .data(layerField ? [layerField] : []);
74490
74491           // Exit
74492           layerItem.exit()
74493               .remove();
74494
74495           // Enter
74496           var layerEnter = layerItem.enter()
74497               .append('li')
74498               .attr('class', 'structure-layer-item');
74499
74500           layerEnter
74501               .append('span')
74502               .attr('class', 'label structure-label-layer')
74503               .attr('for', 'preset-input-layer')
74504               .text(t('inspector.radio.structure.layer'));
74505
74506           layerEnter
74507               .append('div')
74508               .attr('class', 'structure-input-layer-wrap');
74509
74510           // Update
74511           layerItem = layerItem
74512               .merge(layerEnter);
74513
74514           if (layerField) {
74515               layerItem.selectAll('.structure-input-layer-wrap')
74516                   .call(layerField.render);
74517           }
74518       }
74519
74520
74521       function changeType(t$$1, onInput) {
74522           var key = selectedKey();
74523           if (!key) return;
74524
74525           var val = t$$1[key];
74526           if (val !== 'no') {
74527               _oldType[key] = val;
74528           }
74529
74530           if (field.type === 'structureRadio') {
74531               // remove layer if it should not be set
74532               if (val === 'no' ||
74533                   (key !== 'bridge' && key !== 'tunnel') ||
74534                   (key === 'tunnel' && val === 'building_passage')) {
74535                   t$$1.layer = undefined;
74536               }
74537               // add layer if it should be set
74538               if (t$$1.layer === undefined) {
74539                   if (key === 'bridge' && val !== 'no') {
74540                       t$$1.layer = '1';
74541                   }
74542                   if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
74543                       t$$1.layer = '-1';
74544                   }
74545               }
74546            }
74547
74548           dispatch$$1.call('change', this, t$$1, onInput);
74549       }
74550
74551
74552       function changeLayer(t$$1, onInput) {
74553           if (t$$1.layer === '0') {
74554               t$$1.layer = undefined;
74555           }
74556           dispatch$$1.call('change', this, t$$1, onInput);
74557       }
74558
74559
74560       function changeRadio() {
74561           var t$$1 = {};
74562           var activeKey;
74563
74564           if (field.key) {
74565               t$$1[field.key] = undefined;
74566           }
74567
74568           radios.each(function(d) {
74569               var active = select(this).property('checked');
74570               if (active) activeKey = d;
74571
74572               if (field.key) {
74573                   if (active) t$$1[field.key] = d;
74574               } else {
74575                   var val = _oldType[activeKey] || 'yes';
74576                   t$$1[d] = active ? val : undefined;
74577               }
74578           });
74579
74580           if (field.type === 'structureRadio') {
74581               if (activeKey === 'bridge') {
74582                   t$$1.layer = '1';
74583               } else if (activeKey === 'tunnel' && t$$1.tunnel !== 'building_passage') {
74584                   t$$1.layer = '-1';
74585               } else {
74586                   t$$1.layer = undefined;
74587               }
74588           }
74589
74590           dispatch$$1.call('change', this, t$$1);
74591       }
74592
74593
74594       radio.tags = function(tags) {
74595           function checked(d) {
74596               if (field.key) {
74597                   return tags[field.key] === d;
74598               } else {
74599                   return !!(tags[d] && tags[d].toLowerCase() !== 'no');
74600               }
74601           }
74602
74603           labels.classed('active', checked);
74604           radios.property('checked', checked);
74605
74606           var selection$$1 = radios.filter(function() { return this.checked; });
74607
74608           if (selection$$1.empty()) {
74609               placeholder.text(t('inspector.none'));
74610           } else {
74611               placeholder.text(selection$$1.attr('value'));
74612               _oldType[selection$$1.datum()] = tags[selection$$1.datum()];
74613           }
74614
74615           if (field.type === 'structureRadio') {
74616               // For waterways without a tunnel tag, set 'culvert' as
74617               // the _oldType to default to if the user picks 'tunnel'
74618               if (!!tags.waterway && !_oldType.tunnel) {
74619                   _oldType.tunnel = 'culvert';
74620               }
74621
74622               wrap.call(structureExtras, tags);
74623           }
74624       };
74625
74626
74627       radio.focus = function() {
74628           radios.node().focus();
74629       };
74630
74631
74632       radio.entity = function(val) {
74633           if (!arguments.length) return _entity;
74634           _entity = val;
74635           _oldType = {};
74636           return radio;
74637       };
74638
74639
74640       return utilRebind(radio, dispatch$$1, 'on');
74641   }
74642
74643   function uiFieldRestrictions(field, context) {
74644       var dispatch$$1 = dispatch('change');
74645       var breathe = behaviorBreathe(context);
74646       var storedViaWay = context.storage('turn-restriction-via-way');
74647       var storedDistance = context.storage('turn-restriction-distance');
74648
74649       var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
74650       var _maxDistance = storedDistance ? (+storedDistance) : 30;
74651       var _initialized = false;
74652       var _parent = select(null);       // the entire field
74653       var _container = select(null);    // just the map
74654       var _oldTurns;
74655       var _graph;
74656       var _vertexID;
74657       var _intersection;
74658       var _fromWayID;
74659
74660       var _lastXPos;
74661
74662
74663       function restrictions(selection$$1) {
74664           _parent = selection$$1;
74665
74666           // try to reuse the intersection, but always rebuild it if the graph has changed
74667           if (_vertexID && (context.graph() !== _graph || !_intersection)) {
74668               _graph = context.graph();
74669               _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
74670           }
74671
74672           // It's possible for there to be no actual intersection here.
74673           // for example, a vertex of two `highway=path`
74674           // In this case, hide the field.
74675           var isOK = (
74676               _intersection &&
74677               _intersection.vertices.length &&           // has vertices
74678               _intersection.vertices                     // has the vertex that the user selected
74679                   .filter(function(vertex) { return vertex.id === _vertexID; }).length &&
74680               _intersection.ways.length > 2 &&           // has more than 2 ways
74681               _intersection.ways                         // has more than 1 TO way
74682                   .filter(function(way) { return way.__to; }).length > 1
74683           );
74684
74685           // Also hide in the case where
74686           select(selection$$1.node().parentNode).classed('hide', !isOK);
74687
74688           // if form field is hidden or has detached from dom, clean up.
74689           if (!isOK ||
74690               !select('.inspector-wrap.inspector-hidden').empty() ||
74691               !selection$$1.node().parentNode ||
74692               !selection$$1.node().parentNode.parentNode) {
74693               selection$$1.call(restrictions.off);
74694               return;
74695           }
74696
74697
74698           var wrap = selection$$1.selectAll('.form-field-input-wrap')
74699               .data([0]);
74700
74701           wrap = wrap.enter()
74702               .append('div')
74703               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
74704               .merge(wrap);
74705
74706           var container = wrap.selectAll('.restriction-container')
74707               .data([0]);
74708
74709           // enter
74710           var containerEnter = container.enter()
74711               .append('div')
74712               .attr('class', 'restriction-container');
74713
74714           containerEnter
74715               .append('div')
74716               .attr('class', 'restriction-help');
74717
74718           // update
74719           _container = containerEnter
74720               .merge(container)
74721               .call(renderViewer);
74722
74723           var controls = wrap.selectAll('.restriction-controls')
74724               .data([0]);
74725
74726           // enter/update
74727           controls.enter()
74728               .append('div')
74729               .attr('class', 'restriction-controls-container')
74730               .append('div')
74731               .attr('class', 'restriction-controls')
74732               .merge(controls)
74733               .call(renderControls);
74734       }
74735
74736
74737       function renderControls(selection$$1) {
74738           var distControl = selection$$1.selectAll('.restriction-distance')
74739               .data([0]);
74740
74741           distControl.exit()
74742               .remove();
74743
74744           var distControlEnter = distControl.enter()
74745               .append('div')
74746               .attr('class', 'restriction-control restriction-distance');
74747
74748           distControlEnter
74749               .append('span')
74750               .attr('class', 'restriction-control-label restriction-distance-label')
74751               .text(t('restriction.controls.distance') + ':');
74752
74753           distControlEnter
74754               .append('input')
74755               .attr('class', 'restriction-distance-input')
74756               .attr('type', 'range')
74757               .attr('min', '20')
74758               .attr('max', '50')
74759               .attr('step', '5');
74760
74761           distControlEnter
74762               .append('span')
74763               .attr('class', 'restriction-distance-text');
74764
74765           // update
74766           selection$$1.selectAll('.restriction-distance-input')
74767               .property('value', _maxDistance)
74768               .on('input', function() {
74769                   var val = select(this).property('value');
74770                   _maxDistance = +val;
74771                   _intersection = null;
74772                   _container.selectAll('.layer-osm .layer-turns *').remove();
74773                   context.storage('turn-restriction-distance', _maxDistance);
74774                   _parent.call(restrictions);
74775               });
74776
74777           selection$$1.selectAll('.restriction-distance-text')
74778               .text(displayMaxDistance(_maxDistance));
74779
74780
74781           var viaControl = selection$$1.selectAll('.restriction-via-way')
74782               .data([0]);
74783
74784           viaControl.exit()
74785               .remove();
74786
74787           var viaControlEnter = viaControl.enter()
74788               .append('div')
74789               .attr('class', 'restriction-control restriction-via-way');
74790
74791           viaControlEnter
74792               .append('span')
74793               .attr('class', 'restriction-control-label restriction-via-way-label')
74794               .text(t('restriction.controls.via') + ':');
74795
74796           viaControlEnter
74797               .append('input')
74798               .attr('class', 'restriction-via-way-input')
74799               .attr('type', 'range')
74800               .attr('min', '0')
74801               .attr('max', '2')
74802               .attr('step', '1');
74803
74804           viaControlEnter
74805               .append('span')
74806               .attr('class', 'restriction-via-way-text');
74807
74808           // update
74809           selection$$1.selectAll('.restriction-via-way-input')
74810               .property('value', _maxViaWay)
74811               .on('input', function() {
74812                   var val = select(this).property('value');
74813                   _maxViaWay = +val;
74814                   _container.selectAll('.layer-osm .layer-turns *').remove();
74815                   context.storage('turn-restriction-via-way', _maxViaWay);
74816                   _parent.call(restrictions);
74817               });
74818
74819           selection$$1.selectAll('.restriction-via-way-text')
74820               .text(displayMaxVia(_maxViaWay));
74821       }
74822
74823
74824       function renderViewer(selection$$1) {
74825           if (!_intersection) return;
74826
74827           var vgraph = _intersection.graph;
74828           var filter = utilFunctor(true);
74829           var projection = geoRawMercator();
74830
74831           // Reflow warning: `utilGetDimensions` calls `getBoundingClientRect`
74832           // Instead of asking the restriction-container for its dimensions,
74833           //  we can ask the #sidebar, which can have its dimensions cached.
74834           // width: calc as sidebar - padding
74835           // height: hardcoded (from `80_app.css`)
74836           // var d = utilGetDimensions(selection);
74837           var sdims = utilGetDimensions(select('#sidebar'));
74838           var d = [ sdims[0] - 50, 370 ];
74839           var c = geoVecScale(d, 0.5);
74840           var z = 22;
74841
74842           projection.scale(geoZoomToScale(z));
74843
74844           // Calculate extent of all key vertices
74845           var extent = geoExtent$$1();
74846           for (var i = 0; i < _intersection.vertices.length; i++) {
74847               extent._extend(_intersection.vertices[i].extent());
74848           }
74849
74850           // If this is a large intersection, adjust zoom to fit extent
74851           if (_intersection.vertices.length > 1) {
74852               var padding = 180;   // in z22 pixels
74853               var tl = projection([extent[0][0], extent[1][1]]);
74854               var br = projection([extent[1][0], extent[0][1]]);
74855               var hFactor = (br[0] - tl[0]) / (d[0] - padding);
74856               var vFactor = (br[1] - tl[1]) / (d[1] - padding);
74857               var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
74858               var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
74859               z = z - Math.max(hZoomDiff, vZoomDiff);
74860               projection.scale(geoZoomToScale(z));
74861           }
74862
74863           var padTop = 35;   // reserve top space for hint text
74864           var extentCenter = projection(extent.center());
74865           extentCenter[1] = extentCenter[1] - padTop;
74866
74867           projection
74868               .translate(geoVecSubtract(c, extentCenter))
74869               .clipExtent([[0, 0], d]);
74870
74871           var drawLayers = svgLayers(projection, context).only(['osm','touch']).dimensions(d);
74872           var drawVertices = svgVertices$$1(projection, context);
74873           var drawLines = svgLines$$1(projection, context);
74874           var drawTurns = svgTurns(projection, context);
74875
74876           var firstTime = selection$$1.selectAll('.surface').empty();
74877
74878           selection$$1
74879               .call(drawLayers);
74880
74881           var surface = selection$$1.selectAll('.surface')
74882               .classed('tr', true);
74883
74884           if (firstTime) {
74885               _initialized = true;
74886
74887               surface
74888                   .call(breathe);
74889           }
74890
74891           // This can happen if we've lowered the detail while a FROM way
74892           // is selected, and that way is no longer part of the intersection.
74893           if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
74894               _fromWayID = null;
74895               _oldTurns = null;
74896           }
74897
74898           surface
74899               .call(utilSetDimensions, d)
74900               .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
74901               .call(drawLines, vgraph, _intersection.ways, filter)
74902               .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
74903
74904           surface
74905               .on('click.restrictions', click)
74906               .on('mouseover.restrictions', mouseover);
74907
74908           surface
74909               .selectAll('.selected')
74910               .classed('selected', false);
74911
74912           surface
74913               .selectAll('.related')
74914               .classed('related', false);
74915
74916           if (_fromWayID) {
74917               var way = vgraph.entity(_fromWayID);
74918               surface
74919                   .selectAll('.' + _fromWayID)
74920                   .classed('selected', true)
74921                   .classed('related', true);
74922           }
74923
74924           document.addEventListener('resizeWindow', function () {
74925               utilSetDimensions(_container, null);
74926               redraw(1);
74927           }, false);
74928
74929           updateHints(null);
74930
74931
74932           function click() {
74933               surface
74934                   .call(breathe.off)
74935                   .call(breathe);
74936
74937               var datum = event.target.__data__;
74938               var entity = datum && datum.properties && datum.properties.entity;
74939               if (entity) {
74940                   datum = entity;
74941               }
74942
74943               if (datum instanceof osmWay && (datum.__from || datum.__via)) {
74944                   _fromWayID = datum.id;
74945                   _oldTurns = null;
74946                   redraw();
74947
74948               } else if (datum instanceof osmTurn) {
74949                   var actions, extraActions, turns, i;
74950                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
74951
74952                   if (datum.restrictionID && !datum.direct) {
74953                       return;
74954
74955                   } else if (datum.restrictionID && !datum.only) {    // NO -> ONLY
74956                       var seen = {};
74957                       var datumOnly = cloneDeep(datum);
74958                       datumOnly.only = true;
74959                       restrictionType = restrictionType.replace(/^no/, 'only');
74960
74961                       // Adding an ONLY restriction should destroy all other direct restrictions from the FROM towards the VIA.
74962                       // We will remember them in _oldTurns, and restore them if the user clicks again.
74963                       turns = _intersection.turns(_fromWayID, 2);
74964                       extraActions = [];
74965                       _oldTurns = [];
74966                       for (i = 0; i < turns.length; i++) {
74967                           var turn = turns[i];
74968                           if (seen[turn.restrictionID]) continue;  // avoid deleting the turn twice (#4968, #4928)
74969
74970                           if (turn.direct && turn.path[1] === datum.path[1]) {
74971                               seen[turns[i].restrictionID] = true;
74972                               turn.restrictionType = osmInferRestriction(vgraph, turn, projection);
74973                               _oldTurns.push(turn);
74974                               extraActions.push(actionUnrestrictTurn(turn));
74975                           }
74976                       }
74977
74978                       actions = _intersection.actions.concat(extraActions, [
74979                           actionRestrictTurn(datumOnly, restrictionType),
74980                           t('operations.restriction.annotation.create')
74981                       ]);
74982
74983                   } else if (datum.restrictionID) {   // ONLY -> Allowed
74984                       // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
74985                       // This relies on the assumption that the intersection was already split up when we
74986                       // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
74987                       turns = _oldTurns || [];
74988                       extraActions = [];
74989                       for (i = 0; i < turns.length; i++) {
74990                           if (turns[i].key !== datum.key) {
74991                               extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
74992                           }
74993                       }
74994                       _oldTurns = null;
74995
74996                       actions = _intersection.actions.concat(extraActions, [
74997                           actionUnrestrictTurn(datum),
74998                           t('operations.restriction.annotation.delete')
74999                       ]);
75000
75001                   } else {    // Allowed -> NO
75002                       actions = _intersection.actions.concat([
75003                           actionRestrictTurn(datum, restrictionType),
75004                           t('operations.restriction.annotation.create')
75005                       ]);
75006                   }
75007
75008                   context.perform.apply(context, actions);
75009
75010                   // At this point the datum will be changed, but will have same key..
75011                   // Refresh it and update the help..
75012                   var s = surface.selectAll('.' + datum.key);
75013                   datum = s.empty() ? null : s.datum();
75014                   updateHints(datum);
75015
75016               } else {
75017                   _fromWayID = null;
75018                   _oldTurns = null;
75019                   redraw();
75020               }
75021           }
75022
75023
75024           function mouseover() {
75025               var datum = event.target.__data__;
75026               updateHints(datum);
75027           }
75028
75029           _lastXPos = _lastXPos || sdims[0];
75030
75031           function redraw(minChange) {
75032               var xPos = -1;
75033
75034               if (minChange) {
75035                   xPos = utilGetDimensions(select('#sidebar'))[0];
75036               }
75037
75038               if (!minChange || (minChange && Math.abs(xPos - _lastXPos) >= minChange)) {
75039                   if (context.hasEntity(_vertexID)) {
75040                       _lastXPos = xPos;
75041                       _container.call(renderViewer);
75042                   }
75043               }
75044           }
75045
75046
75047           function highlightPathsFrom(wayID) {
75048               surface.selectAll('.related')
75049                   .classed('related', false)
75050                   .classed('allow', false)
75051                   .classed('restrict', false)
75052                   .classed('only', false);
75053
75054               surface.selectAll('.' + wayID)
75055                   .classed('related', true);
75056
75057               if (wayID) {
75058                   var turns = _intersection.turns(wayID, _maxViaWay);
75059                   for (var i = 0; i < turns.length; i++) {
75060                       var turn = turns[i];
75061                       var ids = [turn.to.way];
75062                       var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
75063
75064                       if (turn.only || turns.length === 1) {
75065                           if (turn.via.ways) {
75066                               ids = ids.concat(turn.via.ways);
75067                           }
75068                       } else if (turn.to.way === wayID) {
75069                           continue;
75070                       }
75071
75072                       surface.selectAll(utilEntitySelector(ids))
75073                           .classed('related', true)
75074                           .classed('allow', (klass === 'allow'))
75075                           .classed('restrict', (klass === 'restrict'))
75076                           .classed('only', (klass === 'only'));
75077                   }
75078               }
75079           }
75080
75081
75082           function updateHints(datum) {
75083               var help = _container.selectAll('.restriction-help').html('');
75084
75085               var placeholders = {};
75086               ['from', 'via', 'to'].forEach(function(k) {
75087                   placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
75088               });
75089
75090               var entity = datum && datum.properties && datum.properties.entity;
75091               if (entity) {
75092                   datum = entity;
75093               }
75094
75095               if (_fromWayID) {
75096                   way = vgraph.entity(_fromWayID);
75097                   surface
75098                       .selectAll('.' + _fromWayID)
75099                       .classed('selected', true)
75100                       .classed('related', true);
75101               }
75102
75103               // Hovering a way
75104               if (datum instanceof osmWay && datum.__from) {
75105                   way = datum;
75106
75107                   highlightPathsFrom(_fromWayID ? null : way.id);
75108                   surface.selectAll('.' + way.id)
75109                       .classed('related', true);
75110
75111                   var clickSelect = (!_fromWayID || _fromWayID !== way.id);
75112                   help
75113                       .append('div')      // "Click to select FROM {fromName}." / "FROM {fromName}"
75114                       .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
75115                           from: placeholders.from,
75116                           fromName: displayName(way.id, vgraph)
75117                       }));
75118
75119
75120               // Hovering a turn arrow
75121               } else if (datum instanceof osmTurn) {
75122                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
75123                   var turnType = restrictionType.replace(/^(only|no)\_/, '');
75124                   var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
75125                   var klass, turnText, nextText;
75126
75127                   if (datum.no) {
75128                       klass = 'restrict';
75129                       turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
75130                       nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
75131                   } else if (datum.only) {
75132                       klass = 'only';
75133                       turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
75134                       nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
75135                   } else {
75136                       klass = 'allow';
75137                       turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
75138                       nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
75139                   }
75140
75141                   help
75142                       .append('div')      // "NO Right Turn (indirect)"
75143                       .attr('class', 'qualifier ' + klass)
75144                       .text(turnText);
75145
75146                   help
75147                       .append('div')      // "FROM {fromName} TO {toName}"
75148                       .html(t('restriction.help.from_name_to_name', {
75149                           from: placeholders.from,
75150                           fromName: displayName(datum.from.way, vgraph),
75151                           to: placeholders.to,
75152                           toName: displayName(datum.to.way, vgraph)
75153                       }));
75154
75155                   if (datum.via.ways && datum.via.ways.length) {
75156                       var names = [];
75157                       for (var i = 0; i < datum.via.ways.length; i++) {
75158                           var prev = names[names.length - 1];
75159                           var curr = displayName(datum.via.ways[i], vgraph);
75160                           if (!prev || curr !== prev)   // collapse identical names
75161                               names.push(curr);
75162                       }
75163
75164                       help
75165                           .append('div')      // "VIA {viaNames}"
75166                           .html(t('restriction.help.via_names', {
75167                               via: placeholders.via,
75168                               viaNames: names.join(', ')
75169                           }));
75170                   }
75171
75172                   if (!indirect) {
75173                       help
75174                           .append('div')      // Click for "No Right Turn"
75175                           .text(t('restriction.help.toggle', { turn: nextText.trim() }));
75176                   }
75177
75178                   highlightPathsFrom(null);
75179                   var alongIDs = datum.path.slice();
75180                   surface.selectAll(utilEntitySelector(alongIDs))
75181                       .classed('related', true)
75182                       .classed('allow', (klass === 'allow'))
75183                       .classed('restrict', (klass === 'restrict'))
75184                       .classed('only', (klass === 'only'));
75185
75186
75187               // Hovering empty surface
75188               } else {
75189                   highlightPathsFrom(null);
75190                   if (_fromWayID) {
75191                       help
75192                           .append('div')      // "FROM {fromName}"
75193                           .html(t('restriction.help.from_name', {
75194                               from: placeholders.from,
75195                               fromName: displayName(_fromWayID, vgraph)
75196                           }));
75197
75198                   } else {
75199                       help
75200                           .append('div')      // "Click to select a FROM segment."
75201                           .html(t('restriction.help.select_from', {
75202                               from: placeholders.from
75203                           }));
75204                   }
75205               }
75206           }
75207       }
75208
75209
75210       function displayMaxDistance(maxDist) {
75211           var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
75212           var opts;
75213
75214           if (isImperial) {
75215               var distToFeet = {   // imprecise conversion for prettier display
75216                   20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
75217               }[maxDist];
75218               opts = { distance: t('units.feet', { quantity: distToFeet }) };
75219           } else {
75220               opts = { distance: t('units.meters', { quantity: maxDist }) };
75221           }
75222
75223           return t('restriction.controls.distance_up_to', opts);
75224       }
75225
75226
75227       function displayMaxVia(maxVia) {
75228           return maxVia === 0 ? t('restriction.controls.via_node_only')
75229               : maxVia === 1 ? t('restriction.controls.via_up_to_one')
75230               : t('restriction.controls.via_up_to_two');
75231       }
75232
75233
75234       function displayName(entityID, graph) {
75235           var entity = graph.entity(entityID);
75236           var name = utilDisplayName(entity) || '';
75237           var matched = context.presets().match(entity, graph);
75238           var type = (matched && matched.name()) || utilDisplayType(entity.id);
75239           return name || type;
75240       }
75241
75242
75243       restrictions.entity = function(_) {
75244           _intersection = null;
75245           _fromWayID = null;
75246           _oldTurns = null;
75247           _vertexID = _.id;
75248       };
75249
75250
75251       restrictions.tags = function() {};
75252       restrictions.focus = function() {};
75253
75254
75255       restrictions.off = function(selection$$1) {
75256           if (!_initialized) return;
75257
75258           selection$$1.selectAll('.surface')
75259               .call(breathe.off)
75260               .on('click.restrictions', null)
75261               .on('mouseover.restrictions', null);
75262
75263           select(window)
75264               .on('resize.restrictions', null);
75265       };
75266
75267
75268       return utilRebind(restrictions, dispatch$$1, 'on');
75269   }
75270
75271   function uiFieldTextarea(field) {
75272       var dispatch$$1 = dispatch('change');
75273       var input = select(null);
75274
75275
75276       function textarea(selection$$1) {
75277           var wrap = selection$$1.selectAll('.form-field-input-wrap')
75278               .data([0]);
75279
75280           wrap = wrap.enter()
75281               .append('div')
75282               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
75283               .merge(wrap);
75284
75285           input = wrap.selectAll('textarea')
75286               .data([0]);
75287
75288           input = input.enter()
75289               .append('textarea')
75290               .attr('id', 'preset-input-' + field.safeid)
75291               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
75292               .attr('maxlength', 255)
75293               .call(utilNoAuto)
75294               .on('input', change(true))
75295               .on('blur', change())
75296               .on('change', change())
75297               .merge(input);
75298       }
75299
75300
75301       function change(onInput) {
75302           return function() {
75303               var t$$1 = {};
75304               t$$1[field.key] = utilGetSetValue(input) || undefined;
75305               dispatch$$1.call('change', this, t$$1, onInput);
75306           };
75307       }
75308
75309
75310       textarea.tags = function(tags) {
75311           utilGetSetValue(input, tags[field.key] || '');
75312       };
75313
75314
75315       textarea.focus = function() {
75316           input.node().focus();
75317       };
75318
75319
75320       return utilRebind(textarea, dispatch$$1, 'on');
75321   }
75322
75323   function uiFieldWikidata(field) {
75324       var wikidata = services.wikidata;
75325       var dispatch$$1 = dispatch('change');
75326       var link = select(null);
75327       var title = select(null);
75328       var _wikiURL = '';
75329
75330
75331       function wiki(selection$$1) {
75332
75333           var wrap = selection$$1.selectAll('.form-field-input-wrap')
75334               .data([0]);
75335
75336           wrap = wrap.enter()
75337               .append('div')
75338               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
75339               .merge(wrap);
75340
75341
75342           var list = wrap.selectAll('ul')
75343               .data([0]);
75344
75345           list = list.enter()
75346               .append('ul')
75347               .attr('class', 'labeled-inputs')
75348               .merge(list);
75349
75350           var wikidataProperties = ['identifier', 'label', 'description'];
75351
75352           var items = list.selectAll('li')
75353               .data(wikidataProperties);
75354
75355           // Enter
75356           var enter = items.enter()
75357               .append('li')
75358               .attr('class', function(d) { return 'preset-wikidata-' + d; });
75359
75360           enter
75361               .append('span')
75362               .attr('class', 'label')
75363               .attr('for', function(d) { return 'preset-input-wikidata-' + d; })
75364               .text(function(d) { return t('wikidata.' + d); });
75365
75366           var inputWrap = enter
75367               .append('div')
75368               .attr('class', 'input-wrap');
75369
75370           inputWrap
75371               .append('input')
75372               .attr('type', 'text')
75373               .attr('class', 'preset-input-wikidata')
75374               .attr('id', function(d) { return 'preset-input-wikidata-' + d; });
75375
75376
75377           title = wrap.select('.preset-wikidata-identifier input')
75378               .call(utilNoAuto)
75379               .merge(title);
75380
75381           title
75382               .on('blur', blur)
75383               .on('change', change);
75384
75385           var idItem = wrap.select('.preset-wikidata-identifier');
75386
75387           idItem.select('button')
75388               .remove();
75389
75390           link = idItem
75391               .append('button')
75392               .attr('class', 'form-field-button wiki-link')
75393               .attr('title', t('icons.open_wikidata'))
75394               .attr('tabindex', -1)
75395               .call(svgIcon('#iD-icon-out-link'))
75396               .merge(link);
75397
75398           link
75399               .on('click', function() {
75400                   event.preventDefault();
75401                   if (_wikiURL) window.open(_wikiURL, '_blank');
75402               });
75403
75404           var readOnlyItems = wrap.selectAll('li:not(.preset-wikidata-identifier)');
75405
75406           readOnlyItems.select('input')
75407               .classed('disabled', 'true')
75408               .attr('readonly', 'true');
75409
75410           readOnlyItems.select('button')
75411               .remove();
75412
75413           readOnlyItems.append('button')
75414               .attr('class', 'form-field-button wiki-link')
75415               .attr('title', t('icons.copy'))
75416               .attr('tabindex', -1)
75417               .call(svgIcon('#iD-operation-copy'))
75418               .on('click', function() {
75419                   event.preventDefault();
75420                   select(this.parentNode)
75421                       .select('input')
75422                       .node()
75423                       .select();
75424                   document.execCommand('copy');
75425               });
75426       }
75427
75428
75429       function blur() {
75430           change();
75431       }
75432
75433
75434       function change() {
75435           var syncTags = {
75436               wikidata: utilGetSetValue(title)
75437           };
75438           dispatch$$1.call('change', this, syncTags);
75439       }
75440
75441
75442       wiki.tags = function(tags) {
75443           var value = tags[field.key] || '';
75444           var matches = value.match(/^Q[0-9]*$/);
75445
75446           utilGetSetValue(title, value);
75447
75448           // value in correct format
75449           if (matches) {
75450               _wikiURL = 'https://wikidata.org/wiki/' + value;
75451               wikidata.entityByQID(value, function(qid, entity) {
75452                   var label = '';
75453                   var description = '';
75454
75455                   if (entity.labels && Object.keys(entity.labels).length > 0) {
75456                       label = entity.labels[Object.keys(entity.labels)[0]].value;
75457                   }
75458                   if (entity.descriptions && Object.keys(entity.descriptions).length > 0) {
75459                       description = entity.descriptions[Object.keys(entity.descriptions)[0]].value;
75460                   }
75461
75462                   select('.preset-wikidata-label')
75463                       .style('display', function(){
75464                           return label.length > 0 ? 'flex' : 'none';
75465                       })
75466                       .select('input')
75467                       .attr('value', label);
75468
75469                   select('.preset-wikidata-description')
75470                       .style('display', function(){
75471                           return description.length > 0 ? 'flex' : 'none';
75472                       })
75473                       .select('input')
75474                       .attr('value', description);
75475               });
75476
75477           // unrecognized value format
75478           } else {
75479               select('.preset-wikidata-label').style('display', 'none');
75480               select('.preset-wikidata-description').style('display', 'none');
75481               if (value && value !== '') {
75482                   _wikiURL = 'https://wikidata.org/wiki/Special:Search?search=' + value;
75483               } else {
75484                   _wikiURL = '';
75485               }
75486           }
75487       };
75488
75489
75490       wiki.focus = function() {
75491           title.node().focus();
75492       };
75493
75494
75495       return utilRebind(wiki, dispatch$$1, 'on');
75496   }
75497
75498   function uiFieldWikipedia(field, context) {
75499       var dispatch$$1 = dispatch('change');
75500       var wikipedia = services.wikipedia;
75501       var wikidata = services.wikidata;
75502       var lang = select(null);
75503       var title = select(null);
75504       var _wikiURL = '';
75505       var _entity;
75506
75507
75508       function wiki(selection$$1) {
75509           var langcombo = d3combobox()
75510               .container(context.container())
75511               .fetcher(function(value, cb) {
75512                   var v = value.toLowerCase();
75513
75514                   cb(wikipedia$2.filter(function(d) {
75515                       return d[0].toLowerCase().indexOf(v) >= 0 ||
75516                           d[1].toLowerCase().indexOf(v) >= 0 ||
75517                           d[2].toLowerCase().indexOf(v) >= 0;
75518                   }).map(function(d) {
75519                       return { value: d[1] };
75520                   }));
75521               });
75522
75523           var titlecombo = d3combobox()
75524               .container(context.container())
75525               .fetcher(function(value, cb) {
75526                   if (!value) {
75527                       value = context.entity(_entity.id).tags.name || '';
75528                   }
75529
75530                   var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
75531                   searchfn(language()[2], value, function(query, data$$1) {
75532                       cb(data$$1.map(function(d) {
75533                           return { value: d };
75534                       }));
75535                   });
75536               });
75537
75538
75539           var wrap = selection$$1.selectAll('.form-field-input-wrap')
75540               .data([0]);
75541
75542           wrap = wrap.enter()
75543               .append('div')
75544               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
75545               .merge(wrap);
75546
75547
75548           var langRow = wrap.selectAll('.wiki-lang-container')
75549               .data([0]);
75550
75551           langRow = langRow.enter()
75552               .append('div')
75553               .attr('class', 'wiki-lang-container')
75554               .merge(langRow);
75555
75556
75557           lang = langRow.selectAll('input.wiki-lang')
75558               .data([0]);
75559
75560           lang = lang.enter()
75561               .append('input')
75562               .attr('type', 'text')
75563               .attr('class', 'wiki-lang')
75564               .attr('placeholder', t('translate.localized_translation_language'))
75565               .call(utilNoAuto)
75566               .merge(lang);
75567
75568           utilGetSetValue(lang, language()[1]);
75569
75570           lang
75571               .call(langcombo)
75572               .on('blur', changeLang)
75573               .on('change', changeLang);
75574
75575
75576           var titleRow = wrap.selectAll('.wiki-title-container')
75577               .data([0]);
75578
75579           titleRow = titleRow.enter()
75580               .append('div')
75581               .attr('class', 'wiki-title-container')
75582               .merge(titleRow);
75583
75584           title = titleRow.selectAll('input.wiki-title')
75585               .data([0]);
75586
75587           title = title.enter()
75588               .append('input')
75589               .attr('type', 'text')
75590               .attr('class', 'wiki-title')
75591               .attr('id', 'preset-input-' + field.safeid)
75592               .call(utilNoAuto)
75593               .merge(title);
75594
75595           title
75596               .call(titlecombo)
75597               .on('blur', blur)
75598               .on('change', change);
75599
75600
75601           var link = titleRow.selectAll('.wiki-link')
75602               .data([0]);
75603
75604           link = link.enter()
75605               .append('button')
75606               .attr('class', 'form-field-button wiki-link')
75607               .attr('tabindex', -1)
75608               .call(svgIcon('#iD-icon-out-link'))
75609               .merge(link);
75610
75611           link
75612               .on('click', function() {
75613                   event.preventDefault();
75614                   if (_wikiURL) window.open(_wikiURL, '_blank');
75615               });
75616       }
75617
75618
75619       function language() {
75620           var value = utilGetSetValue(lang).toLowerCase();
75621           var locale = utilDetect().locale.toLowerCase();
75622           var localeLanguage;
75623           return find$1(wikipedia$2, function(d) {
75624               if (d[2] === locale) localeLanguage = d;
75625               return d[0].toLowerCase() === value ||
75626                   d[1].toLowerCase() === value ||
75627                   d[2] === value;
75628           }) || localeLanguage || ['English', 'English', 'en'];
75629       }
75630
75631
75632       function changeLang() {
75633           utilGetSetValue(lang, language()[1]);
75634           change(true);
75635       }
75636
75637
75638       function blur() {
75639           change(true);
75640       }
75641
75642
75643       function change(skipWikidata) {
75644           var value = utilGetSetValue(title);
75645           var m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
75646           var l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; });
75647           var syncTags = {};
75648
75649           if (l) {
75650               // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
75651               value = decodeURIComponent(m[2]).replace(/_/g, ' ');
75652               if (m[3]) {
75653                   var anchor;
75654                   try {
75655                       // Best-effort `anchordecode:` implementation
75656                       anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
75657                   } catch (e) {
75658                       anchor = decodeURIComponent(m[3]);
75659                   }
75660                   value += '#' + anchor.replace(/_/g, ' ');
75661               }
75662               value = value.slice(0, 1).toUpperCase() + value.slice(1);
75663               utilGetSetValue(lang, l[1]);
75664               utilGetSetValue(title, value);
75665           }
75666
75667           if (value) {
75668               syncTags.wikipedia = language()[2] + ':' + value;
75669           } else {
75670               syncTags.wikipedia = undefined;
75671               syncTags.wikidata = undefined;
75672           }
75673
75674           dispatch$$1.call('change', this, syncTags);
75675
75676
75677           if (skipWikidata || !value || !language()[2]) return;
75678
75679           // attempt asynchronous update of wikidata tag..
75680           var initGraph = context.graph();
75681           var initEntityID = _entity.id;
75682
75683           wikidata.itemsByTitle(language()[2], value, function(title, data$$1) {
75684               // If graph has changed, we can't apply this update.
75685               if (context.graph() !== initGraph) return;
75686
75687               if (!data$$1 || !Object.keys(data$$1).length) return;
75688
75689               var qids = Object.keys(data$$1);
75690               var value = qids && find$1(qids, function(id) { return id.match(/^Q\d+$/); });
75691               var currTags = clone(context.entity(initEntityID).tags);
75692
75693               currTags.wikidata = value;
75694
75695               // Coalesce the update of wikidata tag into the previous tag change
75696               context.overwrite(
75697                   actionChangeTags(initEntityID, currTags),
75698                   context.history().undoAnnotation()
75699               );
75700
75701               // do not dispatch.call('change') here, because entity_editor
75702               // changeTags() is not intended to be called asynchronously
75703           });
75704       }
75705
75706
75707       wiki.tags = function(tags) {
75708           var value = tags[field.key] || '';
75709           var m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
75710           var l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; });
75711           var anchor = m && m[3];
75712
75713           // value in correct format
75714           if (l) {
75715               utilGetSetValue(lang, l[1]);
75716               utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
75717               if (anchor) {
75718                   try {
75719                       // Best-effort `anchorencode:` implementation
75720                       anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
75721                   } catch (e) {
75722                       anchor = anchor.replace(/ /g, '_');
75723                   }
75724               }
75725               _wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
75726                   m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
75727
75728           // unrecognized value format
75729           } else {
75730               utilGetSetValue(title, value);
75731               if (value && value !== '') {
75732                   utilGetSetValue(lang, '');
75733                   _wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
75734               } else {
75735                   _wikiURL = '';
75736               }
75737           }
75738       };
75739
75740
75741       wiki.entity = function(val) {
75742           if (!arguments.length) return _entity;
75743           _entity = val;
75744           return wiki;
75745       };
75746
75747
75748       wiki.focus = function() {
75749           title.node().focus();
75750       };
75751
75752
75753       return utilRebind(wiki, dispatch$$1, 'on');
75754   }
75755
75756   var uiFields = {
75757       access: uiFieldAccess,
75758       address: uiFieldAddress,
75759       check: uiFieldCheck,
75760       combo: uiFieldCombo,
75761       cycleway: uiFieldCycleway,
75762       defaultCheck: uiFieldCheck,
75763       email: uiFieldText,
75764       lanes: uiFieldLanes,
75765       localized: uiFieldLocalized,
75766       maxspeed: uiFieldMaxspeed,
75767       multiCombo: uiFieldCombo,
75768       networkCombo: uiFieldCombo,
75769       number: uiFieldText,
75770       onewayCheck: uiFieldCheck,
75771       radio: uiFieldRadio,
75772       restrictions: uiFieldRestrictions,
75773       semiCombo: uiFieldCombo,
75774       structureRadio: uiFieldRadio,
75775       tel: uiFieldText,
75776       text: uiFieldText,
75777       textarea: uiFieldTextarea,
75778       typeCombo: uiFieldCombo,
75779       url: uiFieldText,
75780       wikidata: uiFieldWikidata,
75781       wikipedia: uiFieldWikipedia
75782   };
75783
75784   function uiTagReference(tag) {
75785       var taginfo = services.taginfo;
75786       var tagReference = {};
75787
75788       var _button = select(null);
75789       var _body = select(null);
75790       var _loaded;
75791       var _showing;
75792
75793
75794       function findLocal(data) {
75795           var locale = utilDetect().locale.toLowerCase();
75796           var localized;
75797
75798           if (locale !== 'pt-br') {  // see #3776, prefer 'pt' over 'pt-br'
75799               localized = find$1(data, function(d) {
75800                   return d.lang.toLowerCase() === locale;
75801               });
75802               if (localized) return localized;
75803           }
75804
75805           // try the non-regional version of a language, like
75806           // 'en' if the language is 'en-US'
75807           if (locale.indexOf('-') !== -1) {
75808               var first = locale.split('-')[0];
75809               localized = find$1(data, function(d) {
75810                   return d.lang.toLowerCase() === first;
75811               });
75812               if (localized) return localized;
75813           }
75814
75815           // finally fall back to english
75816           return find$1(data, function(d) {
75817               return d.lang.toLowerCase() === 'en';
75818           });
75819       }
75820
75821
75822       function load(param) {
75823           if (!taginfo) return;
75824
75825           _button
75826               .classed('tag-reference-loading', true);
75827
75828           taginfo.docs(param, function show(err, data) {
75829               var docs;
75830               if (!err && data) {
75831                   docs = findLocal(data);
75832               }
75833
75834               _body.html('');
75835
75836               if (!docs || !docs.title) {
75837                   if (param.hasOwnProperty('value')) {
75838                       load(omit(param, 'value'));   // retry with key only
75839                   } else {
75840                       _body
75841                           .append('p')
75842                           .attr('class', 'tag-reference-description')
75843                           .text(t('inspector.no_documentation_key'));
75844                       done();
75845                   }
75846                   return;
75847               }
75848
75849               if (docs.image && docs.image.thumb_url_prefix) {
75850                   _body
75851                       .append('img')
75852                       .attr('class', 'tag-reference-wiki-image')
75853                       .attr('src', docs.image.thumb_url_prefix + '100' + docs.image.thumb_url_suffix)
75854                       .on('load', function() { done(); })
75855                       .on('error', function() { select(this).remove(); done(); });
75856               } else {
75857                   done();
75858               }
75859
75860               _body
75861                   .append('p')
75862                   .attr('class', 'tag-reference-description')
75863                   .text(docs.description || t('inspector.documentation_redirect'));
75864
75865               _body
75866                   .append('a')
75867                   .attr('class', 'tag-reference-link')
75868                   .attr('target', '_blank')
75869                   .attr('tabindex', -1)
75870                   .attr('href', 'https://wiki.openstreetmap.org/wiki/' + docs.title)
75871                   .call(svgIcon('#iD-icon-out-link', 'inline'))
75872                   .append('span')
75873                   .text(t('inspector.reference'));
75874
75875               // Add link to info about "good changeset comments" - #2923
75876               if (param.key === 'comment') {
75877                   _body
75878                       .append('a')
75879                       .attr('class', 'tag-reference-comment-link')
75880                       .attr('target', '_blank')
75881                       .attr('tabindex', -1)
75882                       .call(svgIcon('#iD-icon-out-link', 'inline'))
75883                       .attr('href', t('commit.about_changeset_comments_link'))
75884                       .append('span')
75885                       .text(t('commit.about_changeset_comments'));
75886               }
75887           });
75888       }
75889
75890
75891       function done() {
75892           _loaded = true;
75893
75894           _button
75895               .classed('tag-reference-loading', false);
75896
75897           _body
75898               .classed('expanded', true)
75899               .transition()
75900               .duration(200)
75901               .style('max-height', '200px')
75902               .style('opacity', '1');
75903
75904           _showing = true;
75905       }
75906
75907
75908       function hide() {
75909           _body
75910               .transition()
75911               .duration(200)
75912               .style('max-height', '0px')
75913               .style('opacity', '0')
75914               .on('end', function () {
75915                   _body.classed('expanded', false);
75916               });
75917
75918           _showing = false;
75919       }
75920
75921
75922       tagReference.button = function(selection$$1) {
75923           _button = selection$$1.selectAll('.tag-reference-button')
75924               .data([0]);
75925
75926           _button = _button.enter()
75927               .append('button')
75928               .attr('class', 'tag-reference-button')
75929               .attr('title', t('icons.information'))
75930               .attr('tabindex', -1)
75931               .call(svgIcon('#iD-icon-inspect'))
75932               .merge(_button);
75933
75934           _button
75935               .on('click', function () {
75936                   event.stopPropagation();
75937                   event.preventDefault();
75938                   if (_showing) {
75939                       hide();
75940                   } else if (_loaded) {
75941                       done();
75942                   } else {
75943                       load(tag);
75944                   }
75945               });
75946       };
75947
75948
75949       tagReference.body = function(selection$$1) {
75950           var tagid = tag.rtype || (tag.key + '-' + tag.value);
75951           _body = selection$$1.selectAll('.tag-reference-body')
75952               .data([tagid], function(d) { return d; });
75953
75954           _body.exit()
75955               .remove();
75956
75957           _body = _body.enter()
75958               .append('div')
75959               .attr('class', 'tag-reference-body')
75960               .style('max-height', '0')
75961               .style('opacity', '0')
75962               .merge(_body);
75963
75964           if (_showing === false) {
75965               hide();
75966           }
75967       };
75968
75969
75970       tagReference.showing = function(_) {
75971           if (!arguments.length) return _showing;
75972           _showing = _;
75973           return tagReference;
75974       };
75975
75976
75977       return tagReference;
75978   }
75979
75980   function uiField(context, presetField, entity, options) {
75981       options = assignIn({
75982           show: true,
75983           wrap: true,
75984           remove: true,
75985           revert: true,
75986           info: true
75987       }, options);
75988
75989       var dispatch$$1 = dispatch('change');
75990       var field = clone(presetField);
75991       var _show = options.show;
75992       var _state = '';
75993       var _tags = {};
75994
75995
75996       // field implementation
75997       field.impl = uiFields[field.type](field, context)
75998           .on('change', function(t$$1, onInput) {
75999               dispatch$$1.call('change', field, t$$1, onInput);
76000           });
76001
76002       // if this field cares about the entity, pass it along
76003       if (entity && field.impl.entity) {
76004           field.entityID = entity.id;
76005           field.impl.entity(entity);
76006       }
76007
76008       field.keys = field.keys || [field.key];
76009
76010
76011       function isModified() {
76012           if (!entity) return false;
76013           var original = context.graph().base().entities[entity.id];
76014           return some(field.keys, function(key) {
76015               return original ? _tags[key] !== original.tags[key] : _tags[key];
76016           });
76017       }
76018
76019
76020       function isPresent() {
76021           return some(field.keys, function(key) {
76022               return _tags[key];
76023           });
76024       }
76025
76026
76027       function revert(d) {
76028           event.stopPropagation();
76029           event.preventDefault();
76030           if (!entity) return false;
76031
76032           var original = context.graph().base().entities[entity.id];
76033           var t$$1 = {};
76034           d.keys.forEach(function(key) {
76035               t$$1[key] = original ? original.tags[key] : undefined;
76036           });
76037
76038           dispatch$$1.call('change', d, t$$1);
76039       }
76040
76041
76042       function remove(d) {
76043           event.stopPropagation();
76044           event.preventDefault();
76045
76046           var t$$1 = {};
76047           d.keys.forEach(function(key) {
76048               t$$1[key] = undefined;
76049           });
76050
76051           dispatch$$1.call('change', d, t$$1);
76052       }
76053
76054
76055       field.render = function(selection$$1) {
76056           var container = selection$$1.selectAll('.form-field')
76057               .data([field]);
76058
76059           // Enter
76060           var enter = container.enter()
76061               .append('div')
76062               .attr('class', function(d) { return 'form-field form-field-' + d.safeid; })
76063               .classed('nowrap', !options.wrap);
76064
76065           if (options.wrap) {
76066               var label = enter
76067                   .append('label')
76068                   .attr('class', 'form-field-label')
76069                   .attr('for', function(d) { return 'preset-input-' + d.safeid; });
76070
76071               label
76072                   .append('span')
76073                   .attr('class', 'label-text')
76074                   .text(function(d) { return d.label(); });
76075
76076               if (options.remove) {
76077                   label
76078                       .append('button')
76079                       .attr('class', 'remove-icon')
76080                       .attr('title', t('icons.remove'))
76081                       .attr('tabindex', -1)
76082                       .call(svgIcon('#iD-operation-delete'));
76083               }
76084
76085               if (options.revert) {
76086                   label
76087                       .append('button')
76088                       .attr('class', 'modified-icon')
76089                       .attr('title', t('icons.undo'))
76090                       .attr('tabindex', -1)
76091                       .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-redo' : '#iD-icon-undo'));
76092               }
76093           }
76094
76095
76096           // Update
76097           container = container
76098               .merge(enter);
76099
76100           container.selectAll('.form-field-label > .remove-icon')
76101               .on('click', remove);
76102
76103           container.selectAll('.form-field-label > .modified-icon')
76104               .on('click', revert);
76105
76106           container
76107               .classed('modified', isModified())
76108               .classed('present', isPresent())
76109               .each(function(d) {
76110                   var reference, help;
76111
76112                   // instantiate field help
76113                   if (options.wrap && field.type === 'restrictions') {
76114                       help = uiFieldHelp(context, 'restrictions');
76115                   }
76116
76117                   // instantiate tag reference
76118                   if (options.wrap && options.info) {
76119                       var referenceKey = d.key;
76120                       if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
76121                           referenceKey = referenceKey.replace(/:$/, '');
76122                       }
76123
76124                       reference = uiTagReference(d.reference || { key: referenceKey }, context);
76125                       if (_state === 'hover') {
76126                           reference.showing(false);
76127                       }
76128                   }
76129
76130                   select(this)
76131                       .call(d.impl);
76132
76133                   // add field help components
76134                   if (help) {
76135                       select(this)
76136                           .call(help.body)
76137                           .select('.form-field-label')
76138                           .call(help.button);
76139                   }
76140
76141                   // add tag reference components
76142                   if (reference) {
76143                       select(this)
76144                           .call(reference.body)
76145                           .select('.form-field-label')
76146                           .call(reference.button);
76147                   }
76148
76149                   d.impl.tags(_tags);
76150               });
76151       };
76152
76153
76154       field.state = function(_) {
76155           if (!arguments.length) return _state;
76156           _state = _;
76157           return field;
76158       };
76159
76160
76161       field.tags = function(_) {
76162           if (!arguments.length) return _tags;
76163           _tags = _;
76164           return field;
76165       };
76166
76167
76168       field.show = function() {
76169           _show = true;
76170           if (field.default && field.key && _tags[field.key] !== field.default) {
76171               var t$$1 = {};
76172               t$$1[field.key] = field.default;
76173               dispatch$$1.call('change', this, t$$1);
76174           }
76175       };
76176
76177
76178       field.isShown = function() {
76179           return _show || some(field.keys, function(key) { return !!_tags[key]; });
76180       };
76181
76182
76183       field.focus = function() {
76184           field.impl.focus();
76185       };
76186
76187
76188       return utilRebind(field, dispatch$$1, 'on');
76189   }
76190
76191   function uiFormFields(context) {
76192       var _fieldsArr;
76193
76194
76195       function formFields(selection$$1, klass) {
76196           render(selection$$1, klass);
76197       }
76198
76199
76200       function render(selection$$1, klass) {
76201           var shown = _fieldsArr.filter(function(field) { return field.isShown(); });
76202           var notShown = _fieldsArr.filter(function(field) { return !field.isShown(); });
76203
76204           var container = selection$$1.selectAll('.form-fields-container')
76205               .data([0]);
76206
76207           container = container.enter()
76208               .append('div')
76209               .attr('class', 'form-fields-container ' + (klass || ''))
76210               .merge(container);
76211
76212
76213           var fields = container.selectAll('.wrap-form-field')
76214               .data(shown, function(d) { return d.id + (d.entityID || ''); });
76215
76216           fields.exit()
76217               .remove();
76218
76219           // Enter
76220           var enter = fields.enter()
76221               .append('div')
76222               .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.safeid; });
76223
76224           // Update
76225           fields = fields
76226               .merge(enter);
76227
76228           fields
76229               .order()
76230               .each(function(d) {
76231                   select(this)
76232                       .call(d.render);
76233               });
76234
76235
76236           notShown = notShown.map(function(field) {
76237               return {
76238                   title: field.label(),
76239                   value: field.label(),
76240                   field: field
76241               };
76242           });
76243
76244
76245           var more = selection$$1.selectAll('.more-fields')
76246               .data((notShown.length > 0) ? [0] : []);
76247
76248           more.exit()
76249               .remove();
76250
76251           more = more.enter()
76252               .append('div')
76253               .attr('class', 'more-fields')
76254               .append('label')
76255               .text(t('inspector.add_fields'))
76256               .merge(more);
76257
76258
76259           var input = more.selectAll('.value')
76260               .data([0]);
76261
76262           input.exit()
76263               .remove();
76264
76265           input = input.enter()
76266               .append('input')
76267               .attr('class', 'value')
76268               .attr('type', 'text')
76269               .call(utilNoAuto)
76270               .merge(input);
76271
76272           input
76273               .call(utilGetSetValue, '')
76274               .attr('placeholder', function() {
76275                   var placeholder = [];
76276                   for (var field in notShown) {
76277                       placeholder.push(notShown[field].title);
76278                   }
76279                   return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
76280               })
76281               .call(d3combobox()
76282                   .container(context.container())
76283                   .data(notShown)
76284                   .minItems(1)
76285                   .on('accept', function (d) {
76286                       var field = d.field;
76287                       field.show();
76288                       render(selection$$1);
76289                       if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
76290                           field.focus();
76291                       }
76292                   })
76293               );
76294       }
76295
76296
76297       formFields.fieldsArr = function(val) {
76298           if (!arguments.length) return _fieldsArr;
76299           _fieldsArr = val;
76300           return formFields;
76301       };
76302
76303
76304       return formFields;
76305   }
76306
76307   function uiChangesetEditor(context) {
76308       var dispatch$$1 = dispatch('change');
76309       var formFields = uiFormFields(context);
76310       var _fieldsArr;
76311       var _tags;
76312       var _changesetID;
76313
76314
76315       function changesetEditor(selection) {
76316           render(selection);
76317       }
76318
76319
76320       function render(selection) {
76321           var initial = false;
76322
76323           if (!_fieldsArr) {
76324               initial = true;
76325               var presets = context.presets();
76326
76327               _fieldsArr = [
76328                   uiField(context, presets.field('comment'), null, { show: true, revert: false }),
76329                   uiField(context, presets.field('source'), null, { show: false, revert: false }),
76330                   uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
76331               ];
76332
76333               _fieldsArr.forEach(function(field) {
76334                   field
76335                       .on('change', function(t$$1, onInput) {
76336                           dispatch$$1.call('change', field, t$$1, onInput);
76337                       });
76338               });
76339           }
76340
76341           _fieldsArr.forEach(function(field) {
76342               field
76343                   .tags(_tags);
76344           });
76345
76346
76347           selection
76348               .call(formFields.fieldsArr(_fieldsArr));
76349
76350
76351           if (initial) {
76352               var commentField = selection.select('#preset-input-comment');
76353               var commentNode = commentField.node();
76354
76355               if (commentNode) {
76356                   commentNode.focus();
76357                   commentNode.select();
76358               }
76359
76360               // trigger a 'blur' event so that comment field can be cleaned
76361               // and checked for hashtags, even if retrieved from localstorage
76362               utilTriggerEvent(commentField, 'blur');
76363
76364               var osm = context.connection();
76365               if (osm) {
76366                   osm.userChangesets(function (err, changesets) {
76367                       if (err) return;
76368
76369                       var comments = changesets.map(function(changeset) {
76370                           return {
76371                               title: changeset.tags.comment,
76372                               value: changeset.tags.comment
76373                           };
76374                       });
76375
76376                       commentField
76377                           .call(d3combobox()
76378                               .container(context.container())
76379                               .caseSensitive(true)
76380                               .data(uniqBy(comments, 'title'))
76381                           );
76382                   });
76383               }
76384           }
76385
76386           // Add warning if comment mentions Google
76387           var hasGoogle = _tags.comment.match(/google/i);
76388           var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
76389               .data(hasGoogle ? [0] : []);
76390
76391           commentWarning.exit()
76392               .transition()
76393               .duration(200)
76394               .style('opacity', 0)
76395               .remove();
76396
76397           var commentEnter = commentWarning.enter()
76398               .insert('div', '.tag-reference-body')
76399               .attr('class', 'field-warning comment-warning')
76400               .style('opacity', 0);
76401
76402           commentEnter
76403               .append('a')
76404               .attr('target', '_blank')
76405               .attr('tabindex', -1)
76406               .call(svgIcon('#iD-icon-alert', 'inline'))
76407               .attr('href', t('commit.google_warning_link'))
76408               .append('span')
76409               .text(t('commit.google_warning'));
76410
76411           commentEnter
76412               .transition()
76413               .duration(200)
76414               .style('opacity', 1);
76415       }
76416
76417
76418       changesetEditor.tags = function(_) {
76419           if (!arguments.length) return _tags;
76420           _tags = _;
76421           // Don't reset _fieldsArr here.
76422           return changesetEditor;
76423       };
76424
76425
76426       changesetEditor.changesetID = function(_) {
76427           if (!arguments.length) return _changesetID;
76428           if (_changesetID === _) return changesetEditor;
76429           _changesetID = _;
76430           _fieldsArr = null;
76431           return changesetEditor;
76432       };
76433
76434
76435       return utilRebind(changesetEditor, dispatch$$1, 'on');
76436   }
76437
76438   /**
76439    * This method is like `_.union` except that it accepts `iteratee` which is
76440    * invoked for each element of each `arrays` to generate the criterion by
76441    * which uniqueness is computed. Result values are chosen from the first
76442    * array in which the value occurs. The iteratee is invoked with one argument:
76443    * (value).
76444    *
76445    * @static
76446    * @memberOf _
76447    * @since 4.0.0
76448    * @category Array
76449    * @param {...Array} [arrays] The arrays to inspect.
76450    * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
76451    * @returns {Array} Returns the new array of combined values.
76452    * @example
76453    *
76454    * _.unionBy([2.1], [1.2, 2.3], Math.floor);
76455    * // => [2.1, 1.2]
76456    *
76457    * // The `_.property` iteratee shorthand.
76458    * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
76459    * // => [{ 'x': 1 }, { 'x': 2 }]
76460    */
76461   var unionBy = baseRest(function(arrays) {
76462     var iteratee = last(arrays);
76463     if (isArrayLikeObject(iteratee)) {
76464       iteratee = undefined;
76465     }
76466     return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
76467   });
76468
76469   function uiCommitChanges(context) {
76470       var detected = utilDetect();
76471       var _entityID;
76472
76473
76474       function commitChanges(selection$$1) {
76475           var history = context.history();
76476           var summary = history.difference().summary();
76477
76478           var container = selection$$1.selectAll('.modal-section.commit-section')
76479               .data([0]);
76480
76481           var containerEnter = container.enter()
76482               .append('div')
76483               .attr('class', 'commit-section modal-section fillL2');
76484
76485           containerEnter
76486               .append('h3')
76487               .text(t('commit.changes', { count: summary.length }));
76488
76489           containerEnter
76490               .append('ul')
76491               .attr('class', 'changeset-list');
76492
76493           container = containerEnter
76494               .merge(container);
76495
76496
76497           var items = container.select('ul').selectAll('li')
76498               .data(summary);
76499
76500           var itemsEnter = items.enter()
76501               .append('li')
76502               .attr('class', 'change-item');
76503
76504           itemsEnter
76505               .each(function(d) {
76506                   select(this)
76507                       .call(svgIcon('#iD-icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
76508               });
76509
76510           itemsEnter
76511               .append('span')
76512               .attr('class', 'change-type')
76513               .text(function(d) { return t('commit.' + d.changeType) + ' '; });
76514
76515           itemsEnter
76516               .append('strong')
76517               .attr('class', 'entity-type')
76518               .text(function(d) {
76519                   var matched = context.presets().match(d.entity, d.graph);
76520                   return (matched && matched.name()) || utilDisplayType(d.entity.id);
76521               });
76522
76523           itemsEnter
76524               .append('span')
76525               .attr('class', 'entity-name')
76526               .text(function(d) {
76527                   var name = utilDisplayName(d.entity) || '',
76528                       string = '';
76529                   if (name !== '') {
76530                       string += ':';
76531                   }
76532                   return string += ' ' + name;
76533               });
76534
76535           itemsEnter
76536               .style('opacity', 0)
76537               .transition()
76538               .style('opacity', 1);
76539
76540           items = itemsEnter
76541               .merge(items);
76542
76543           items
76544               .on('mouseover', mouseover)
76545               .on('mouseout', mouseout)
76546               .on('click', click);
76547
76548
76549           // Download changeset link
76550           var changeset = new osmChangeset().update({ id: undefined });
76551           var changes = history.changes(actionDiscardTags(history.difference()));
76552
76553           delete changeset.id;  // Export without chnageset_id
76554
76555           var data = JXON.stringify(changeset.osmChangeJXON(changes));
76556           var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
76557           var fileName = 'changes.osc';
76558
76559           var linkEnter = container.selectAll('.download-changes')
76560               .data([0])
76561               .enter()
76562               .append('a')
76563               .attr('class', 'download-changes');
76564
76565           if (detected.download) {      // All except IE11 and Edge
76566               linkEnter                 // download the data as a file
76567                   .attr('href', window.URL.createObjectURL(blob))
76568                   .attr('download', fileName);
76569
76570           } else {                      // IE11 and Edge
76571               linkEnter                 // open data uri in a new tab
76572                   .attr('target', '_blank')
76573                   .on('click.download', function() {
76574                       navigator.msSaveBlob(blob, fileName);
76575                   });
76576           }
76577
76578           linkEnter
76579               .call(svgIcon('#iD-icon-load', 'inline'))
76580               .append('span')
76581               .text(t('commit.download_changes'));
76582
76583
76584           function mouseover(d) {
76585               if (d.entity) {
76586                   context.surface().selectAll(
76587                       utilEntityOrMemberSelector([d.entity.id], context.graph())
76588                   ).classed('hover', true);
76589               }
76590           }
76591
76592
76593           function mouseout() {
76594               context.surface().selectAll('.hover')
76595                   .classed('hover', false);
76596           }
76597
76598
76599           function click(change) {
76600               if (change.changeType === 'deleted') {
76601                   _entityID = null;
76602               } else {
76603                   var entity = change.entity;
76604                   _entityID = change.entity.id;
76605                   context.map().zoomTo(entity);
76606                   context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
76607                       .classed('hover', true);
76608               }
76609           }
76610       }
76611
76612
76613       commitChanges.entityID = function(_) {
76614           if (!arguments.length) return _entityID;
76615           _entityID = _;
76616           return commitChanges;
76617       };
76618
76619
76620       return commitChanges;
76621   }
76622
76623   function uiCommitWarnings(context) {
76624
76625       function commitWarnings(selection) {
76626
76627           var changes = context.history().changes();
76628           var warnings = context.history().validate(changes);
76629
76630           var container = selection.selectAll('.warning-section')
76631               .data(warnings.length ? [0] : []);
76632
76633           container.exit()
76634               .remove();
76635
76636           var containerEnter = container.enter()
76637               .append('div')
76638               .attr('class', 'modal-section warning-section fillL2');
76639
76640           containerEnter
76641               .append('h3')
76642               .text(t('commit.warnings'));
76643
76644           containerEnter
76645               .append('ul')
76646               .attr('class', 'changeset-list');
76647
76648           container = containerEnter
76649               .merge(container);
76650
76651
76652           var items = container.select('ul').selectAll('li')
76653               .data(warnings);
76654
76655           items.exit()
76656               .remove();
76657
76658           var itemsEnter = items.enter()
76659               .append('li')
76660               .attr('class', 'warning-item');
76661
76662           itemsEnter
76663               .call(svgIcon('#iD-icon-alert', 'pre-text'));
76664
76665           itemsEnter
76666               .append('strong')
76667               .text(function(d) { return d.message; });
76668
76669           itemsEnter.filter(function(d) { return d.tooltip; })
76670               .call(tooltip()
76671                   .title(function(d) { return d.tooltip; })
76672                   .placement('top')
76673               );
76674
76675           items = itemsEnter
76676               .merge(items);
76677
76678           items
76679               .on('mouseover', mouseover)
76680               .on('mouseout', mouseout)
76681               .on('click', warningClick);
76682
76683
76684           function mouseover(d) {
76685               if (d.entity) {
76686                   context.surface().selectAll(
76687                       utilEntityOrMemberSelector([d.entity.id], context.graph())
76688                   ).classed('hover', true);
76689               }
76690           }
76691
76692
76693           function mouseout() {
76694               context.surface().selectAll('.hover')
76695                   .classed('hover', false);
76696           }
76697
76698
76699           function warningClick(d) {
76700               if (d.entity) {
76701                   context.map().zoomTo(d.entity);
76702                   context.enter(modeSelect(context, [d.entity.id]));
76703               }
76704           }
76705
76706       }
76707
76708
76709       return commitWarnings;
76710   }
76711
76712   function uiRawTagEditor(context) {
76713       var taginfo = services.taginfo;
76714       var dispatch$$1 = dispatch('change');
76715       var _readOnlyTags = [];
76716       var _showBlank = false;
76717       var _updatePreference = true;
76718       var _expanded = false;
76719       var _newRow;
76720       var _state;
76721       var _preset;
76722       var _tags;
76723       var _entityID;
76724
76725
76726       function rawTagEditor(selection$$1) {
76727           var count = Object.keys(_tags).filter(function(d) { return d; }).length;
76728
76729           var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
76730               .title(t('inspector.all_tags') + ' (' + count + ')')
76731               .on('toggled', toggled)
76732               .updatePreference(_updatePreference)
76733               .content(content);
76734
76735           // Sometimes we want to force the raw_tag_editor to be opened/closed..
76736           // When undefined, uiDisclosure will use the user's stored preference.
76737           if (_expanded !== undefined) {
76738               disclosure.expanded(_expanded);
76739           }
76740
76741           selection$$1.call(disclosure);
76742
76743           function toggled(expanded) {
76744               _expanded = expanded;
76745               if (expanded) {
76746                   selection$$1.node().parentNode.scrollTop += 200;
76747               }
76748           }
76749       }
76750
76751
76752       function content(wrap) {
76753           var entries = map$3(_tags, function(v, k) {
76754               return { key: k, value: v };
76755           });
76756
76757           if (!entries.length || _showBlank) {
76758               _showBlank = false;
76759               entries.push({key: '', value: ''});
76760               _newRow = '';
76761           }
76762
76763           var list = wrap.selectAll('.tag-list')
76764               .data([0]);
76765
76766           list = list.enter()
76767               .append('ul')
76768               .attr('class', 'tag-list')
76769               .merge(list);
76770
76771           var newTag = wrap.selectAll('.add-tag')
76772               .data([0]);
76773
76774           newTag.enter()
76775               .append('button')
76776               .attr('class', 'add-tag')
76777               .on('click', addTag)
76778               .call(svgIcon('#iD-icon-plus', 'light'));
76779
76780
76781           var items = list.selectAll('.tag-row')
76782               .data(entries, function(d) { return d.key; });
76783
76784           items.exit()
76785               .each(unbind)
76786               .remove();
76787
76788           // Enter
76789
76790           var enter = items.enter()
76791               .append('li')
76792               .attr('class', 'tag-row')
76793               .classed('readonly', isReadOnly);
76794
76795           var innerWrap = enter.append('div')
76796               .attr('class', 'inner-wrap');
76797
76798           innerWrap
76799               .append('div')
76800               .attr('class', 'key-wrap')
76801               .append('input')
76802               .property('type', 'text')
76803               .attr('class', 'key')
76804               .attr('maxlength', 255)
76805               .call(utilNoAuto)
76806               .on('blur', keyChange)
76807               .on('change', keyChange);
76808
76809           innerWrap
76810               .append('div')
76811               .attr('class', 'value-wrap')
76812               .append('input')
76813               .property('type', 'text')
76814               .attr('class', 'value')
76815               .attr('maxlength', 255)
76816               .call(utilNoAuto)
76817               .on('blur', valueChange)
76818               .on('change', valueChange)
76819               .on('keydown.push-more', pushMore);
76820
76821           innerWrap
76822               .append('button')
76823               .attr('tabindex', -1)
76824               .attr('class', 'form-field-button remove')
76825               .call(svgIcon('#iD-operation-delete'));
76826
76827
76828           // Update
76829
76830           items = items
76831               .merge(enter)
76832               .sort(function(a, b) {
76833                   return (a.key === _newRow && b.key !== _newRow) ? 1
76834                       : (a.key !== _newRow && b.key === _newRow) ? -1
76835                       : ascending(a.key, b.key);
76836               });
76837
76838           items
76839               .each(function(tag) {
76840                   var row = select(this);
76841                   var key = row.select('input.key');      // propagate bound data to child
76842                   var value = row.select('input.value');  // propagate bound data to child
76843
76844                   if (_entityID && taginfo) {
76845                       bindTypeahead(key, value);
76846                   }
76847
76848                   var isRelation = (_entityID && context.entity(_entityID).type === 'relation');
76849                   var reference;
76850
76851                   if (isRelation && tag.key === 'type') {
76852                       reference = uiTagReference({ rtype: tag.value }, context);
76853                   } else {
76854                       reference = uiTagReference({ key: tag.key, value: tag.value }, context);
76855                   }
76856
76857                   if (_state === 'hover') {
76858                       reference.showing(false);
76859                   }
76860
76861                   row.select('.inner-wrap')
76862                       .call(reference.button);
76863
76864                   row.call(reference.body);
76865               });
76866
76867           items.selectAll('input.key')
76868               .attr('title', function(d) { return d.key; })
76869               .call(utilGetSetValue, function(d) { return d.key; })
76870               .property('disabled', isReadOnly);
76871
76872           items.selectAll('input.value')
76873               .attr('title', function(d) { return d.value; })
76874               .call(utilGetSetValue, function(d) { return d.value; })
76875               .property('disabled', isReadOnly);
76876
76877           items.selectAll('button.remove')
76878               .on('click', removeTag);
76879
76880
76881
76882           function isReadOnly(d) {
76883               for (var i = 0; i < _readOnlyTags.length; i++) {
76884                   if (d.key.match(_readOnlyTags[i]) !== null) {
76885                       return true;
76886                   }
76887               }
76888               return false;
76889           }
76890
76891
76892           function pushMore() {
76893               if (event.keyCode === 9 && !event.shiftKey &&
76894                   list.selectAll('li:last-child input.value').node() === this) {
76895                   addTag();
76896               }
76897           }
76898
76899
76900           function bindTypeahead(key, value) {
76901               if (isReadOnly(key.datum())) return;
76902
76903               var geometry = context.geometry(_entityID);
76904
76905               key.call(d3combobox()
76906                   .container(context.container())
76907                   .fetcher(function(value, callback) {
76908                       taginfo.keys({
76909                           debounce: true,
76910                           geometry: geometry,
76911                           query: value
76912                       }, function(err, data) {
76913                           if (!err) callback(sort(value, data));
76914                       });
76915                   }));
76916
76917               value.call(d3combobox()
76918                   .container(context.container())
76919                   .fetcher(function(value, callback) {
76920                       taginfo.values({
76921                           debounce: true,
76922                           key: utilGetSetValue(key),
76923                           geometry: geometry,
76924                           query: value
76925                       }, function(err, data) {
76926                           if (!err) callback(sort(value, data));
76927                       });
76928                   }));
76929
76930
76931               function sort(value, data) {
76932                   var sameletter = [];
76933                   var other = [];
76934                   for (var i = 0; i < data.length; i++) {
76935                       if (data[i].value.substring(0, value.length) === value) {
76936                           sameletter.push(data[i]);
76937                       } else {
76938                           other.push(data[i]);
76939                       }
76940                   }
76941                   return sameletter.concat(other);
76942               }
76943           }
76944
76945
76946           function unbind() {
76947               var row = select(this);
76948
76949               row.selectAll('input.key')
76950                   .call(d3combobox.off);
76951
76952               row.selectAll('input.value')
76953                   .call(d3combobox.off);
76954           }
76955
76956
76957           function keyChange(d) {
76958               var kOld = d.key;
76959               var kNew = this.value.trim();
76960               var tag = {};
76961
76962               if (isReadOnly({ key: kNew })) {
76963                   this.value = kOld;
76964                   return;
76965               }
76966
76967               if (kNew && kNew !== kOld) {
76968                   var match = kNew.match(/^(.*?)(?:_(\d+))?$/);
76969                   var base = match[1];
76970                   var suffix = +(match[2] || 1);
76971                   while (_tags[kNew]) {  // rename key if already in use
76972                       kNew = base + '_' + suffix++;
76973                   }
76974
76975                   if (includes(kNew, '=')) {
76976                       var splitStr = kNew.split('=').map(function(str) { return str.trim(); });
76977                       var key = splitStr[0];
76978                       var value = splitStr[1];
76979
76980                       kNew = key;
76981                       d.value = value;
76982                   }
76983               }
76984               tag[kOld] = undefined;
76985               tag[kNew] = d.value;
76986
76987               d.key = kNew;  // Maintain DOM identity through the subsequent update.
76988
76989               if (_newRow === kOld) {   // see if this row is still a new row
76990                   _newRow = ((d.value === '' || kNew === '') ? kNew : undefined);
76991               }
76992
76993               this.value = kNew;
76994               dispatch$$1.call('change', this, tag);
76995           }
76996
76997
76998           function valueChange(d) {
76999               if (isReadOnly(d)) return;
77000               var tag = {};
77001               tag[d.key] = this.value;
77002
77003               if (_newRow === d.key && d.key !== '' && d.value !== '') {   // not a new row anymore
77004                   _newRow = undefined;
77005               }
77006
77007               dispatch$$1.call('change', this, tag);
77008           }
77009
77010
77011           function removeTag(d) {
77012               if (isReadOnly(d)) return;
77013               var tag = {};
77014               tag[d.key] = undefined;
77015               dispatch$$1.call('change', this, tag);
77016               select(this.parentNode).remove();
77017           }
77018
77019
77020           function addTag() {
77021               // Wrapped in a setTimeout in case it's being called from a blur
77022               // handler. Without the setTimeout, the call to `content` would
77023               // wipe out the pending value change.
77024               window.setTimeout(function() {
77025                   _showBlank = true;
77026                   content(wrap);
77027                   list.selectAll('li:last-child input.key').node().focus();
77028               }, 1);
77029           }
77030       }
77031
77032
77033       rawTagEditor.state = function(_) {
77034           if (!arguments.length) return _state;
77035           _state = _;
77036           return rawTagEditor;
77037       };
77038
77039
77040       rawTagEditor.preset = function(_) {
77041           if (!arguments.length) return _preset;
77042           _preset = _;
77043           if (_preset.isFallback()) {
77044               _expanded = true;
77045               _updatePreference = false;
77046           } else {
77047               _expanded = undefined;
77048               _updatePreference = true;
77049           }
77050           return rawTagEditor;
77051       };
77052
77053
77054       rawTagEditor.tags = function(_) {
77055           if (!arguments.length) return _tags;
77056           _tags = _;
77057           return rawTagEditor;
77058       };
77059
77060
77061       rawTagEditor.entityID = function(_) {
77062           if (!arguments.length) return _entityID;
77063           _entityID = _;
77064           return rawTagEditor;
77065       };
77066
77067
77068       rawTagEditor.expanded = function(_) {
77069           if (!arguments.length) return _expanded;
77070           _expanded = _;
77071           _updatePreference = false;
77072           return rawTagEditor;
77073       };
77074
77075
77076       rawTagEditor.readOnlyTags = function(_) {
77077           if (!arguments.length) return _readOnlyTags;
77078           _readOnlyTags = _;
77079           return rawTagEditor;
77080       };
77081
77082
77083       return utilRebind(rawTagEditor, dispatch$$1, 'on');
77084   }
77085
77086   var _changeset$1;
77087   var readOnlyTags = [
77088       /^changesets_count$/,
77089       /^created_by$/,
77090       /^ideditor:/,
77091       /^imagery_used$/,
77092       /^host$/,
77093       /^locale$/
77094   ];
77095
77096   // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
77097   // from https://stackoverflow.com/a/25575009
77098   var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
77099
77100
77101   function uiCommit(context) {
77102       var dispatch$$1 = dispatch('cancel', 'save');
77103       var _userDetails;
77104       var _selection;
77105
77106       var changesetEditor = uiChangesetEditor(context)
77107           .on('change', changeTags);
77108       var rawTagEditor = uiRawTagEditor(context)
77109           .on('change', changeTags);
77110       var commitChanges = uiCommitChanges(context);
77111       var commitWarnings = uiCommitWarnings(context);
77112
77113
77114       function commit(selection$$1) {
77115           _selection = selection$$1;
77116
77117           var osm = context.connection();
77118           if (!osm) return;
77119
77120           // expire stored comment, hashtags, source after cutoff datetime - #3947 #4899
77121           var commentDate = +context.storage('commentDate') || 0;
77122           var currDate = Date.now();
77123           var cutoff = 2 * 86400 * 1000;   // 2 days
77124           if (commentDate > currDate || currDate - commentDate > cutoff) {
77125               context.storage('comment', null);
77126               context.storage('hashtags', null);
77127               context.storage('source', null);
77128           }
77129
77130           var tags;
77131           if (!_changeset$1) {
77132               var detected = utilDetect();
77133               tags = {
77134                   comment: context.storage('comment') || '',
77135                   created_by: ('iD ' + context.version).substr(0, 255),
77136                   host: detected.host.substr(0, 255),
77137                   locale: detected.locale.substr(0, 255)
77138               };
77139
77140               // call findHashtags initially - this will remove stored
77141               // hashtags if any hashtags are found in the comment - #4304
77142               findHashtags(tags, true);
77143
77144               var hashtags = context.storage('hashtags');
77145               if (hashtags) {
77146                   tags.hashtags = hashtags;
77147               }
77148
77149               // iD 2.8.1 could write a literal 'undefined' here.. see #5021
77150               // (old source values expire after 2 days, so 'undefined' checks can go away in v2.9)
77151               var source = context.storage('source');
77152               if (source && source !== 'undefined') {
77153                   tags.source = source;
77154               } else if (source === 'undefined') {
77155                   context.storage('source', null);
77156               }
77157
77158               _changeset$1 = new osmChangeset({ tags: tags });
77159           }
77160
77161           tags = clone(_changeset$1.tags);
77162           tags.imagery_used = context.history().imageryUsed().join(';').substr(0, 255);
77163           _changeset$1 = _changeset$1.update({ tags: tags });
77164
77165           var header = selection$$1.selectAll('.header')
77166               .data([0]);
77167
77168           header.enter()
77169               .append('div')
77170               .attr('class', 'header fillL')
77171               .append('h3')
77172               .text(t('commit.title'));
77173
77174           var body = selection$$1.selectAll('.body')
77175               .data([0]);
77176
77177           body = body.enter()
77178               .append('div')
77179               .attr('class', 'body')
77180               .merge(body);
77181
77182
77183           // Changeset Section
77184           var changesetSection = body.selectAll('.changeset-editor')
77185               .data([0]);
77186
77187           changesetSection = changesetSection.enter()
77188               .append('div')
77189               .attr('class', 'modal-section changeset-editor')
77190               .merge(changesetSection);
77191
77192           changesetSection
77193               .call(changesetEditor
77194                   .changesetID(_changeset$1.id)
77195                   .tags(tags)
77196               );
77197
77198
77199           // Warnings
77200           body.call(commitWarnings);
77201
77202
77203           // Upload Explanation
77204           var saveSection = body.selectAll('.save-section')
77205               .data([0]);
77206
77207           saveSection = saveSection.enter()
77208               .append('div')
77209               .attr('class','modal-section save-section fillL cf')
77210               .merge(saveSection);
77211
77212           var prose = saveSection.selectAll('.commit-info')
77213               .data([0]);
77214
77215           prose = prose.enter()
77216               .append('p')
77217               .attr('class', 'commit-info')
77218               .text(t('commit.upload_explanation'))
77219               .merge(prose);
77220
77221           osm.userDetails(function(err, user) {
77222               if (err) return;
77223
77224               var userLink = select(document.createElement('div'));
77225
77226               _userDetails = user;
77227
77228               if (user.image_url) {
77229                   userLink
77230                       .append('img')
77231                       .attr('src', user.image_url)
77232                       .attr('class', 'icon pre-text user-icon');
77233               }
77234
77235               userLink
77236                   .append('a')
77237                   .attr('class', 'user-info')
77238                   .text(user.display_name)
77239                   .attr('href', osm.userURL(user.display_name))
77240                   .attr('tabindex', -1)
77241                   .attr('target', '_blank');
77242
77243               prose
77244                   .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
77245           });
77246
77247
77248           // Request Review
77249           var requestReview = saveSection.selectAll('.request-review')
77250               .data([0]);
77251
77252           // Enter
77253           var requestReviewEnter = requestReview.enter()
77254               .append('div')
77255               .attr('class', 'request-review');
77256
77257           var labelEnter = requestReviewEnter
77258               .append('label')
77259               .attr('for', 'commit-input-request-review');
77260
77261           labelEnter
77262               .append('input')
77263               .attr('type', 'checkbox')
77264               .attr('id', 'commit-input-request-review');
77265
77266           labelEnter
77267               .append('span')
77268               .text(t('commit.request_review'));
77269
77270           // Update
77271           requestReview = requestReview
77272               .merge(requestReviewEnter);
77273
77274           var requestReviewInput = requestReview.selectAll('input')
77275               .property('checked', isReviewRequested(_changeset$1.tags))
77276               .on('change', toggleRequestReview);
77277
77278
77279           // Buttons
77280           var buttonSection = saveSection.selectAll('.buttons')
77281               .data([0]);
77282
77283           // enter
77284           var buttonEnter = buttonSection.enter()
77285               .append('div')
77286               .attr('class', 'buttons fillL cf');
77287
77288           buttonEnter
77289               .append('button')
77290               .attr('class', 'secondary-action button cancel-button')
77291               .append('span')
77292               .attr('class', 'label')
77293               .text(t('commit.cancel'));
77294
77295           buttonEnter
77296               .append('button')
77297               .attr('class', 'action button save-button')
77298               .append('span')
77299               .attr('class', 'label')
77300               .text(t('commit.save'));
77301
77302           // update
77303           buttonSection = buttonSection
77304               .merge(buttonEnter);
77305
77306           buttonSection.selectAll('.cancel-button')
77307               .on('click.cancel', function() {
77308                   var selectedID = commitChanges.entityID();
77309                   dispatch$$1.call('cancel', this, selectedID);
77310               });
77311
77312           buttonSection.selectAll('.save-button')
77313               .attr('disabled', function() {
77314                   var n = select('#preset-input-comment').node();
77315                   return (n && n.value.length) ? null : true;
77316               })
77317               .on('click.save', function() {
77318                   this.blur();    // avoid keeping focus on the button - #4641
77319                   dispatch$$1.call('save', this, _changeset$1);
77320               });
77321
77322
77323           // Raw Tag Editor
77324           var tagSection = body.selectAll('.tag-section.raw-tag-editor')
77325               .data([0]);
77326
77327           tagSection = tagSection.enter()
77328               .append('div')
77329               .attr('class', 'modal-section tag-section raw-tag-editor')
77330               .merge(tagSection);
77331
77332           var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
77333           tagSection
77334               .call(rawTagEditor
77335                   .expanded(expanded)
77336                   .readOnlyTags(readOnlyTags)
77337                   .tags(clone(_changeset$1.tags))
77338               );
77339
77340
77341           // Change summary
77342           body.call(commitChanges);
77343
77344
77345           function toggleRequestReview() {
77346               var rr = requestReviewInput.property('checked');
77347               updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
77348
77349               var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
77350               tagSection
77351                   .call(rawTagEditor
77352                       .expanded(expanded)
77353                       .readOnlyTags(readOnlyTags)
77354                       .tags(clone(_changeset$1.tags))
77355                   );
77356           }
77357       }
77358
77359
77360       function changeTags(changed, onInput) {
77361           if (changed.hasOwnProperty('comment')) {
77362               if (changed.comment === undefined) {
77363                   changed.comment = '';
77364               }
77365               if (!onInput) {
77366                   context.storage('comment', changed.comment);
77367                   context.storage('commentDate', Date.now());
77368               }
77369           }
77370           if (changed.hasOwnProperty('source')) {
77371               if (changed.source === undefined) {
77372                   context.storage('source', null);
77373               } else if (!onInput) {
77374                   context.storage('source', changed.source);
77375                   context.storage('commentDate', Date.now());
77376               }
77377           }
77378
77379           updateChangeset(changed, onInput);
77380
77381           if (_selection) {
77382               _selection.call(commit);
77383           }
77384       }
77385
77386
77387       function findHashtags(tags, commentOnly) {
77388           var inComment = commentTags();
77389           var inHashTags = hashTags();
77390
77391           if (inComment !== null) {                    // when hashtags are detected in comment...
77392               context.storage('hashtags', null);       // always remove stored hashtags - #4304
77393               if (commentOnly) { inHashTags = null; }  // optionally override hashtags field
77394           }
77395           return unionBy(inComment, inHashTags, function (s) {
77396               return s.toLowerCase();
77397           });
77398
77399           // Extract hashtags from `comment`
77400           function commentTags() {
77401               return tags.comment
77402                   .replace(/http\S*/g, '')  // drop anything that looks like a URL - #4289
77403                   .match(hashtagRegex);
77404           }
77405
77406           // Extract and clean hashtags from `hashtags`
77407           function hashTags() {
77408               var t$$1 = tags.hashtags || '';
77409               return t$$1
77410                   .split(/[,;\s]+/)
77411                   .map(function (s) {
77412                       if (s[0] !== '#') { s = '#' + s; }    // prepend '#'
77413                       var matched = s.match(hashtagRegex);
77414                       return matched && matched[0];
77415                   }).filter(Boolean);                       // exclude falsey
77416           }
77417       }
77418
77419
77420       function isReviewRequested(tags) {
77421           var rr = tags.review_requested;
77422           if (rr === undefined) return false;
77423           rr = rr.trim().toLowerCase();
77424           return !(rr === '' || rr === 'no');
77425       }
77426
77427
77428       function updateChangeset(changed, onInput) {
77429           var tags = clone(_changeset$1.tags);
77430
77431           forEach(changed, function(v, k) {
77432               k = k.trim().substr(0, 255);
77433               if (readOnlyTags.indexOf(k) !== -1) return;
77434
77435               if (k !== '' && v !== undefined) {
77436                   if (onInput) {
77437                       tags[k] = v;
77438                   } else {
77439                       tags[k] = v.trim().substr(0, 255);
77440                   }
77441               } else {
77442                   delete tags[k];
77443               }
77444           });
77445
77446           if (!onInput) {
77447               // when changing the comment, override hashtags with any found in comment.
77448               var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
77449               var arr = findHashtags(tags, commentOnly);
77450               if (arr.length) {
77451                   tags.hashtags = arr.join(';').substr(0, 255);
77452                   context.storage('hashtags', tags.hashtags);
77453               } else {
77454                   delete tags.hashtags;
77455                   context.storage('hashtags', null);
77456               }
77457           }
77458
77459           // always update userdetails, just in case user reauthenticates as someone else
77460           if (_userDetails && _userDetails.changesets_count !== undefined) {
77461               var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1;  // #4283
77462               tags.changesets_count = String(changesetsCount);
77463
77464               // first 100 edits - new user
77465               if (changesetsCount <= 100) {
77466                   var s;
77467                   s = context.storage('walkthrough_completed');
77468                   if (s) {
77469                       tags['ideditor:walkthrough_completed'] = s;
77470                   }
77471
77472                   s = context.storage('walkthrough_progress');
77473                   if (s) {
77474                       tags['ideditor:walkthrough_progress'] = s;
77475                   }
77476
77477                   s = context.storage('walkthrough_started');
77478                   if (s) {
77479                       tags['ideditor:walkthrough_started'] = s;
77480                   }
77481               }
77482           } else {
77483               delete tags.changesets_count;
77484           }
77485
77486           if (!isEqual(_changeset$1.tags, tags)) {
77487               _changeset$1 = _changeset$1.update({ tags: tags });
77488           }
77489       }
77490
77491
77492       commit.reset = function() {
77493           _changeset$1 = null;
77494       };
77495
77496
77497       return utilRebind(commit, dispatch$$1, 'on');
77498   }
77499
77500   function uiConflicts(context) {
77501       var dispatch$$1 = dispatch('cancel', 'save');
77502       var keybinding = utilKeybinding('conflicts');
77503       var _origChanges;
77504       var _conflictList;
77505
77506
77507       function keybindingOn() {
77508           select(document)
77509               .call(keybinding.on('⎋', cancel, true));
77510       }
77511
77512       function keybindingOff() {
77513           select(document)
77514               .call(keybinding.unbind);
77515       }
77516
77517       function tryAgain() {
77518           keybindingOff();
77519           dispatch$$1.call('save');
77520       }
77521
77522       function cancel() {
77523           keybindingOff();
77524           dispatch$$1.call('cancel');
77525       }
77526
77527
77528       function conflicts(selection$$1) {
77529           keybindingOn();
77530
77531           var headerEnter = selection$$1.selectAll('.header')
77532               .data([0])
77533               .enter()
77534               .append('div')
77535               .attr('class', 'header fillL');
77536
77537           headerEnter
77538               .append('button')
77539               .attr('class', 'fr')
77540               .on('click', cancel)
77541               .call(svgIcon('#iD-icon-close'));
77542
77543           headerEnter
77544               .append('h3')
77545               .text(t('save.conflict.header'));
77546
77547           var bodyEnter = selection$$1.selectAll('.body')
77548               .data([0])
77549               .enter()
77550               .append('div')
77551               .attr('class', 'body fillL');
77552
77553           var conflictsHelpEnter = bodyEnter
77554               .append('div')
77555               .attr('class', 'conflicts-help')
77556               .text(t('save.conflict.help'));
77557
77558
77559           // Download changes link
77560           var detected = utilDetect();
77561           var changeset = new osmChangeset();
77562
77563           delete changeset.id;  // Export without changeset_id
77564
77565           var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
77566           var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
77567           var fileName = 'changes.osc';
77568
77569           var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
77570               .append('a')
77571               .attr('class', 'download-changes');
77572
77573           if (detected.download) {      // All except IE11 and Edge
77574               linkEnter                 // download the data as a file
77575                   .attr('href', window.URL.createObjectURL(blob))
77576                   .attr('download', fileName);
77577
77578           } else {                      // IE11 and Edge
77579               linkEnter                 // open data uri in a new tab
77580                   .attr('target', '_blank')
77581                   .on('click.download', function() {
77582                       navigator.msSaveBlob(blob, fileName);
77583                   });
77584           }
77585
77586           linkEnter
77587               .call(svgIcon('#iD-icon-load', 'inline'))
77588               .append('span')
77589               .text(t('save.conflict.download_changes'));
77590
77591
77592           bodyEnter
77593               .append('div')
77594               .attr('class', 'conflict-container fillL3')
77595               .call(showConflict, 0);
77596
77597           bodyEnter
77598               .append('div')
77599               .attr('class', 'conflicts-done')
77600               .attr('opacity', 0)
77601               .style('display', 'none')
77602               .text(t('save.conflict.done'));
77603
77604           var buttonsEnter = bodyEnter
77605               .append('div')
77606               .attr('class','buttons col12 joined conflicts-buttons');
77607
77608           buttonsEnter
77609               .append('button')
77610               .attr('disabled', _conflictList.length > 1)
77611               .attr('class', 'action conflicts-button col6')
77612               .text(t('save.title'))
77613               .on('click.try_again', tryAgain);
77614
77615           buttonsEnter
77616               .append('button')
77617               .attr('class', 'secondary-action conflicts-button col6')
77618               .text(t('confirm.cancel'))
77619               .on('click.cancel', cancel);
77620       }
77621
77622
77623       function showConflict(selection$$1, index) {
77624           index = utilWrap(index, _conflictList.length);
77625
77626           var parent = select(selection$$1.node().parentNode);
77627
77628           // enable save button if this is the last conflict being reviewed..
77629           if (index === _conflictList.length - 1) {
77630               window.setTimeout(function() {
77631                   parent.select('.conflicts-button')
77632                       .attr('disabled', null);
77633
77634                   parent.select('.conflicts-done')
77635                       .transition()
77636                       .attr('opacity', 1)
77637                       .style('display', 'block');
77638               }, 250);
77639           }
77640
77641           var conflict = selection$$1
77642               .selectAll('.conflict')
77643               .data([_conflictList[index]]);
77644
77645           conflict.exit()
77646               .remove();
77647
77648           var conflictEnter = conflict.enter()
77649               .append('div')
77650               .attr('class', 'conflict');
77651
77652           conflictEnter
77653               .append('h4')
77654               .attr('class', 'conflict-count')
77655               .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
77656
77657           conflictEnter
77658               .append('a')
77659               .attr('class', 'conflict-description')
77660               .attr('href', '#')
77661               .text(function(d) { return d.name; })
77662               .on('click', function(d) {
77663                   event.preventDefault();
77664                   zoomToEntity(d.id);
77665               });
77666
77667           var details = conflictEnter
77668               .append('div')
77669               .attr('class', 'conflict-detail-container');
77670
77671           details
77672               .append('ul')
77673               .attr('class', 'conflict-detail-list')
77674               .selectAll('li')
77675               .data(function(d) { return d.details || []; })
77676               .enter()
77677               .append('li')
77678               .attr('class', 'conflict-detail-item')
77679               .html(function(d) { return d; });
77680
77681           details
77682               .append('div')
77683               .attr('class', 'conflict-choices')
77684               .call(addChoices);
77685
77686           details
77687               .append('div')
77688               .attr('class', 'conflict-nav-buttons joined cf')
77689               .selectAll('button')
77690               .data(['previous', 'next'])
77691               .enter()
77692               .append('button')
77693               .text(function(d) { return t('save.conflict.' + d); })
77694               .attr('class', 'conflict-nav-button action col6')
77695               .attr('disabled', function(d, i) {
77696                   return (i === 0 && index === 0) ||
77697                       (i === 1 && index === _conflictList.length - 1) || null;
77698               })
77699               .on('click', function(d, i) {
77700                   event.preventDefault();
77701
77702                   var container = parent.selectAll('.conflict-container');
77703                   var sign = (i === 0 ? -1 : 1);
77704
77705                   container
77706                       .selectAll('.conflict')
77707                       .remove();
77708
77709                   container
77710                       .call(showConflict, index + sign);
77711               });
77712
77713       }
77714
77715
77716       function addChoices(selection$$1) {
77717           var choices = selection$$1
77718               .append('ul')
77719               .attr('class', 'layer-list')
77720               .selectAll('li')
77721               .data(function(d) { return d.choices || []; });
77722
77723           // enter
77724           var choicesEnter = choices.enter()
77725               .append('li')
77726               .attr('class', 'layer');
77727
77728           var labelEnter = choicesEnter
77729               .append('label');
77730
77731           labelEnter
77732               .append('input')
77733               .attr('type', 'radio')
77734               .attr('name', function(d) { return d.id; })
77735               .on('change', function(d, i) {
77736                   var ul = this.parentNode.parentNode.parentNode;
77737                   ul.__data__.chosen = i;
77738                   choose(ul, d);
77739               });
77740
77741           labelEnter
77742               .append('span')
77743               .text(function(d) { return d.text; });
77744
77745           // update
77746           choicesEnter
77747               .merge(choices)
77748               .each(function(d, i) {
77749                   var ul = this.parentNode;
77750                   if (ul.__data__.chosen === i) {
77751                       choose(ul, d);
77752                   }
77753               });
77754       }
77755
77756
77757       function choose(ul, datum) {
77758           if (event) event.preventDefault();
77759
77760           select(ul)
77761               .selectAll('li')
77762               .classed('active', function(d) { return d === datum; })
77763               .selectAll('input')
77764               .property('checked', function(d) { return d === datum; });
77765
77766           var extent = geoExtent$$1();
77767           var entity;
77768
77769           entity = context.graph().hasEntity(datum.id);
77770           if (entity) extent._extend(entity.extent(context.graph()));
77771
77772           datum.action();
77773
77774           entity = context.graph().hasEntity(datum.id);
77775           if (entity) extent._extend(entity.extent(context.graph()));
77776
77777           zoomToEntity(datum.id, extent);
77778       }
77779
77780
77781       function zoomToEntity(id, extent) {
77782           context.surface().selectAll('.hover')
77783               .classed('hover', false);
77784
77785           var entity = context.graph().hasEntity(id);
77786           if (entity) {
77787               if (extent) {
77788                   context.map().trimmedExtent(extent);
77789               } else {
77790                   context.map().zoomTo(entity);
77791               }
77792               context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
77793                   .classed('hover', true);
77794           }
77795       }
77796
77797
77798       // The conflict list should be an array of objects like:
77799       // {
77800       //     id: id,
77801       //     name: entityName(local),
77802       //     details: merge.conflicts(),
77803       //     chosen: 1,
77804       //     choices: [
77805       //         choice(id, keepMine, forceLocal),
77806       //         choice(id, keepTheirs, forceRemote)
77807       //     ]
77808       // }
77809       conflicts.conflictList = function(_) {
77810           if (!arguments.length) return _conflictList;
77811           _conflictList = _;
77812           return conflicts;
77813       };
77814
77815
77816       conflicts.origChanges = function(_) {
77817           if (!arguments.length) return _origChanges;
77818           _origChanges = _;
77819           return conflicts;
77820       };
77821
77822
77823       return utilRebind(conflicts, dispatch$$1, 'on');
77824   }
77825
77826   function uiDataEditor$$1(context) {
77827       var dataHeader = uiDataHeader();
77828       var rawTagEditor = uiRawTagEditor(context);
77829       var _datum;
77830
77831
77832       function dataEditor(selection) {
77833           var header = selection.selectAll('.header')
77834               .data([0]);
77835
77836           var headerEnter = header.enter()
77837               .append('div')
77838               .attr('class', 'header fillL');
77839
77840           headerEnter
77841               .append('button')
77842               .attr('class', 'fr data-editor-close')
77843               .on('click', function() {
77844                   context.enter(modeBrowse(context));
77845               })
77846               .call(svgIcon('#iD-icon-close'));
77847
77848           headerEnter
77849               .append('h3')
77850               .text(t('map_data.title'));
77851
77852
77853           var body = selection.selectAll('.body')
77854               .data([0]);
77855
77856           body = body.enter()
77857               .append('div')
77858               .attr('class', 'body')
77859               .merge(body);
77860
77861           var editor = body.selectAll('.data-editor')
77862               .data([0]);
77863
77864           editor.enter()
77865               .append('div')
77866               .attr('class', 'modal-section data-editor')
77867               .merge(editor)
77868               .call(dataHeader.datum(_datum));
77869
77870           var rte = body.selectAll('.raw-tag-editor')
77871               .data([0]);
77872
77873           rte.enter()
77874               .append('div')
77875               .attr('class', 'inspector-border raw-tag-editor inspector-inner data-editor')
77876               .merge(rte)
77877               .call(rawTagEditor
77878                   .expanded(true)
77879                   .readOnlyTags([/./])
77880                   .tags((_datum && _datum.properties) || {})
77881                   .state('hover')
77882               );
77883       }
77884
77885
77886       dataEditor.datum = function(val) {
77887           if (!arguments.length) return _datum;
77888           _datum = val;
77889           return this;
77890       };
77891
77892
77893       return dataEditor;
77894   }
77895
77896   function uiDataHeader() {
77897       var _datum;
77898
77899
77900       function dataHeader(selection) {
77901           var header = selection.selectAll('.data-header')
77902               .data(
77903                   (_datum ? [_datum] : []),
77904                   function(d) { return d.__featurehash__; }
77905               );
77906
77907           header.exit()
77908               .remove();
77909
77910           var headerEnter = header.enter()
77911               .append('div')
77912               .attr('class', 'data-header');
77913
77914           var iconEnter = headerEnter
77915               .append('div')
77916               .attr('class', 'data-header-icon');
77917
77918           iconEnter
77919               .append('div')
77920               .attr('class', 'preset-icon-28')
77921               .call(svgIcon('#iD-icon-data', 'note-fill'));
77922
77923           headerEnter
77924               .append('div')
77925               .attr('class', 'data-header-label')
77926               .text(t('map_data.layers.custom.title'));
77927       }
77928
77929
77930       dataHeader.datum = function(val) {
77931           if (!arguments.length) return _datum;
77932           _datum = val;
77933           return this;
77934       };
77935
77936
77937       return dataHeader;
77938   }
77939
77940   function uiEditMenu(context, operations) {
77941       var menu;
77942       var center = [0, 0];
77943       var offset = [0, 0];
77944       var tooltip;
77945
77946       var p = 8;               // top padding
77947       var m = 4;               // top margin
77948       var h = 15;              // height of icon
77949       var vpBottomMargin = 45; // viewport bottom margin
77950       var vpSideMargin = 35;   // viewport side margin
77951       var buttonWidth = 44;
77952       var buttonHeight = (2 * p + h);
77953       var menuWidth = buttonWidth;
77954       var menuHeight = (2 * m) + operations.length * buttonHeight;
77955       var menuSideMargin = 10;
77956       var tooltipWidth = 200;
77957       var tooltipHeight = 200;  // a reasonable guess, real height depends on tooltip contents
77958
77959
77960       var editMenu = function (selection$$1) {
77961           if (!operations.length) return;
77962
77963           selection$$1.node().parentNode.focus();
77964
77965           var isRTL = textDirection === 'rtl';
77966           var viewport = context.surfaceRect();
77967
77968           if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
77969               // menu is going left-to-right and near right viewport edge, go left instead
77970               isRTL = true;
77971           } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
77972               // menu is going right-to-left and near left viewport edge, go right instead
77973               isRTL = false;
77974           }
77975
77976           offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
77977
77978           if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
77979               // menu is near bottom viewport edge, shift upwards
77980               offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
77981           }
77982
77983           var origin = [ center[0] + offset[0], center[1] + offset[1] ];
77984
77985           menu = selection$$1
77986               .append('g')
77987               .attr('class', 'edit-menu')
77988               .attr('transform', 'translate(' + origin + ')')
77989               .attr('opacity', 0);
77990
77991           menu
77992               .transition()
77993               .attr('opacity', 1);
77994
77995           menu
77996               .append('rect')
77997               .attr('class', 'edit-menu-background')
77998               .attr('x', 4)
77999               .attr('rx', 4)
78000               .attr('ry', 4)
78001               .attr('width', menuWidth)
78002               .attr('height', menuHeight)
78003               .attr('stroke-linecap', 'round');
78004
78005
78006           var button = menu.selectAll('.edit-menu-item')
78007               .data(operations)
78008               .enter()
78009               .append('g')
78010               .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
78011               .classed('disabled', function (d) { return d.disabled(); })
78012               .attr('transform', function (d, i) {
78013                   return 'translate(' + geoVecFloor([
78014                       0,
78015                       m + i * buttonHeight
78016                   ]).join(',') + ')';
78017               });
78018
78019           button
78020               .append('rect')
78021               .attr('x', 4)
78022               .attr('width', buttonWidth)
78023               .attr('height', buttonHeight)
78024               .on('click', click)
78025               .on('mousedown', mousedown)
78026               .on('mouseover', mouseover)
78027               .on('mouseout', mouseout);
78028
78029           button
78030               .append('use')
78031               .attr('width', '20')
78032               .attr('height', '20')
78033               .attr('transform', function () { return 'translate(' + [2 * p, 5] + ')'; })
78034               .attr('xlink:href', function (d) { return '#iD-operation-' + d.id; });
78035
78036           tooltip = select(document.body)
78037               .append('div')
78038               .attr('class', 'tooltip-inner edit-menu-tooltip');
78039
78040
78041           function click(operation) {
78042               event.stopPropagation();
78043               if (operation.disabled()) return;
78044               operation();
78045               editMenu.close();
78046           }
78047
78048           function mousedown() {
78049               event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
78050           }
78051
78052           function mouseover(d, i) {
78053               var tipX, tipY;
78054
78055               if (!isRTL) {
78056                   tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
78057               } else {
78058                   tipX = viewport.left + origin[0] - 4 - tooltipWidth;
78059               }
78060
78061               if (tipX + tooltipWidth > viewport.right) {
78062                   // tip is going left-to-right and near right viewport edge, go left instead
78063                   tipX = viewport.left + origin[0] - 4 - tooltipWidth;
78064               } else if (tipX < viewport.left) {
78065                   // tip is going right-to-left and near left viewport edge, go right instead
78066                   tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
78067               }
78068
78069               tipY = viewport.top + origin[1] + (i * buttonHeight);
78070               if (tipY + tooltipHeight > viewport.bottom) {
78071                   // tip is near bottom viewport edge, shift upwards
78072                   tipY -= tipY + tooltipHeight - viewport.bottom;
78073               }
78074
78075               tooltip
78076                   .style('left', tipX + 'px')
78077                   .style('top', tipY + 'px')
78078                   .style('display', 'block')
78079                   .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
78080           }
78081
78082           function mouseout() {
78083               tooltip.style('display', 'none');
78084           }
78085       };
78086
78087
78088       editMenu.close = function () {
78089           if (menu) {
78090               menu
78091                   .style('pointer-events', 'none')
78092                   .transition()
78093                   .attr('opacity', 0)
78094                   .remove();
78095           }
78096
78097           if (tooltip) {
78098               tooltip.remove();
78099           }
78100       };
78101
78102
78103       editMenu.center = function (_) {
78104           if (!arguments.length) return center;
78105           center = _;
78106           return editMenu;
78107       };
78108
78109
78110       return editMenu;
78111   }
78112
78113   function uiPresetIcon() {
78114       var preset, geometry;
78115
78116
78117       function presetIcon(selection$$1) {
78118           selection$$1.each(render);
78119       }
78120
78121
78122       function getIcon(p, geom) {
78123           if (p.icon)
78124               return p.icon;
78125           else if (geom === 'line')
78126               return 'iD-other-line';
78127           else if (geom === 'vertex')
78128               return p.isFallback() ? '' : 'temaki-vertex';
78129           else
78130               return 'maki-marker-stroked';
78131       }
78132
78133
78134       function render() {
78135           var selection$$1 = select(this);
78136           var p = preset.apply(this, arguments);
78137           var geom = geometry.apply(this, arguments);
78138           var picon = getIcon(p, geom);
78139           var isMaki = /^maki-/.test(picon);
78140           var isTemaki = /^temaki-/.test(picon);
78141           var isFa = /^fa[srb]-/.test(picon);
78142           var isPOI = isMaki || isTemaki || isFa;
78143           var isFramed = (geom === 'area' || geom === 'vertex');
78144
78145
78146           function tag_classes(p) {
78147               var s = '';
78148               for (var i in p.tags) {
78149                   s += ' tag-' + i;
78150                   if (p.tags[i] !== '*') {
78151                       s += ' tag-' + i + '-' + p.tags[i];
78152                   }
78153               }
78154               return s;
78155           }
78156
78157
78158           var fill = selection$$1.selectAll('.preset-icon-fill')
78159               .data([0]);
78160
78161           fill = fill.enter()
78162               .append('div')
78163               .merge(fill);
78164
78165           fill
78166               .attr('class', function() {
78167                   return 'preset-icon-fill preset-icon-fill-' + geom + tag_classes(p);
78168               });
78169
78170
78171           var areaFrame = selection$$1.selectAll('.preset-icon-frame')
78172               .data((geom === 'area') ? [0] : []);
78173
78174           areaFrame.exit()
78175               .remove();
78176
78177           areaFrame = areaFrame.enter()
78178               .append('div')
78179               .attr('class', 'preset-icon-frame')
78180               .call(svgIcon('#iD-preset-icon-frame'));
78181
78182
78183           var icon = selection$$1.selectAll('.preset-icon')
78184               .data([0]);
78185
78186           icon = icon.enter()
78187               .append('div')
78188               .attr('class', 'preset-icon')
78189               .call(svgIcon(''))
78190               .merge(icon);
78191
78192           icon
78193               .attr('class', 'preset-icon preset-icon-' +
78194                   (isPOI ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
78195               );
78196
78197           icon.selectAll('svg')
78198               .attr('class', function() {
78199                   return 'icon ' + picon + (isPOI ? '' : tag_classes(p));
78200               });
78201
78202           icon.selectAll('use')
78203               .attr('href', '#' + picon + (isMaki ? '-15' : ''));
78204       }
78205
78206
78207       presetIcon.preset = function(_) {
78208           if (!arguments.length) return preset;
78209           preset = utilFunctor(_);
78210           return presetIcon;
78211       };
78212
78213
78214       presetIcon.geometry = function(_) {
78215           if (!arguments.length) return geometry;
78216           geometry = utilFunctor(_);
78217           return presetIcon;
78218       };
78219
78220       return presetIcon;
78221   }
78222
78223   function uiRawMemberEditor(context) {
78224       var taginfo = services.taginfo;
78225       var _entityID;
78226
78227       function downloadMember(d) {
78228           event.preventDefault();
78229
78230           // display the loading indicator
78231           select(this.parentNode).classed('tag-reference-loading', true);
78232           context.loadEntity(d.id);
78233       }
78234
78235       function zoomToMember(d) {
78236           event.preventDefault();
78237
78238           var entity = context.entity(d.id);
78239           context.map().zoomTo(entity);
78240
78241           // highlight the feature in case it wasn't previously on-screen
78242           utilHighlightEntity(d.id, true, context);
78243       }
78244
78245
78246       function selectMember(d) {
78247           event.preventDefault();
78248
78249           // remove the hover-highlight styling
78250           utilHighlightEntity(d.id, false, context);
78251
78252           var entity = context.entity(d.id);
78253           var mapExtent = context.map().extent();
78254           if (!entity.intersects(mapExtent, context.graph())) {
78255               // zoom to the entity if its extent is not visible now
78256               context.map().zoomTo(entity);
78257           }
78258
78259           context.enter(modeSelect(context, [d.id]));
78260       }
78261
78262
78263       function changeRole(d) {
78264           var role = select(this).property('value');
78265           var member = { id: d.id, type: d.type, role: role };
78266           context.perform(
78267               actionChangeMember(d.relation.id, member, d.index),
78268               t('operations.change_role.annotation')
78269           );
78270       }
78271
78272
78273       function deleteMember(d) {
78274           context.perform(
78275               actionDeleteMember(d.relation.id, d.index),
78276               t('operations.delete_member.annotation')
78277           );
78278
78279           if (!context.hasEntity(d.relation.id)) {
78280               context.enter(modeBrowse(context));
78281           }
78282       }
78283
78284
78285       function rawMemberEditor(selection$$1) {
78286           var entity = context.entity(_entityID);
78287           var memberships = [];
78288
78289           entity.members.slice(0, 1000).forEach(function(member, index) {
78290               memberships.push({
78291                   index: index,
78292                   id: member.id,
78293                   type: member.type,
78294                   role: member.role,
78295                   relation: entity,
78296                   member: context.hasEntity(member.id)
78297               });
78298           });
78299
78300           var gt = entity.members.length > 1000 ? '>' : '';
78301           selection$$1.call(uiDisclosure(context, 'raw_member_editor', true)
78302               .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
78303               .expanded(true)
78304               .updatePreference(false)
78305               .on('toggled', function(expanded) {
78306                   if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
78307               })
78308               .content(content)
78309           );
78310
78311
78312           function content(selection$$1) {
78313               var list = selection$$1.selectAll('.member-list')
78314                   .data([0]);
78315
78316               list = list.enter()
78317                   .append('ul')
78318                   .attr('class', 'member-list')
78319                   .merge(list);
78320
78321
78322               var items = list.selectAll('li')
78323                   .data(memberships, function(d) {
78324                       return osmEntity$$1.key(d.relation) + ',' + d.index + ',' +
78325                           (d.member ? osmEntity$$1.key(d.member) : 'incomplete');
78326                   });
78327
78328               items.exit()
78329                   .each(unbind)
78330                   .remove();
78331
78332               var enter = items.enter()
78333                   .append('li')
78334                   .attr('class', 'member-row form-field')
78335                   .classed('member-incomplete', function(d) { return !d.member; });
78336
78337               enter
78338                   .each(function(d) {
78339                       if (d.member) {
78340
78341                           // highlight the member feature in the map while hovering on the list item
78342                           select(this).on('mouseover', function() {
78343                               utilHighlightEntity(d.id, true, context);
78344                           });
78345                           select(this).on('mouseout', function() {
78346                               utilHighlightEntity(d.id, false, context);
78347                           });
78348
78349                           var label = select(this)
78350                               .append('label')
78351                               .attr('class', 'form-field-label');
78352
78353                           var labelLink = label
78354                               .append('span')
78355                               .attr('class', 'label-text')
78356                               .append('a')
78357                               .attr('href', '#')
78358                               .on('click', selectMember);
78359
78360                           labelLink
78361                               .append('span')
78362                               .attr('class', 'member-entity-type')
78363                               .text(function(d) {
78364                                   var matched = context.presets().match(d.member, context.graph());
78365                                   return (matched && matched.name()) || utilDisplayType(d.member.id);
78366                               });
78367
78368                           labelLink
78369                               .append('span')
78370                               .attr('class', 'member-entity-name')
78371                               .text(function(d) { return utilDisplayName(d.member); });
78372
78373                           label
78374                               .append('button')
78375                               .attr('class', 'download-icon')
78376                               .attr('title', t('icons.zoom_to'))
78377                               .attr('tabindex', -1)
78378                               .call(svgIcon('#iD-icon-geolocate'))
78379                               .on('click', zoomToMember);
78380
78381                       } else {
78382                           var incompleteLabel = select(this)
78383                               .append('label')
78384                               .attr('class', 'form-field-label');
78385
78386                           var labelText = incompleteLabel
78387                               .append('span')
78388                               .attr('class', 'label-text');
78389
78390                           labelText
78391                               .append('span')
78392                               .attr('class', 'member-entity-type')
78393                               .text(t('inspector.'+d.type, { id: d.id }));
78394
78395                           labelText
78396                               .append('span')
78397                               .attr('class', 'member-entity-name')
78398                               .text(t('inspector.incomplete', { id: d.id }));
78399
78400                           incompleteLabel
78401                               .append('button')
78402                               .attr('class', 'download-icon')
78403                               .attr('title', t('icons.download'))
78404                               .attr('tabindex', -1)
78405                               .call(svgIcon('#iD-icon-load'))
78406                               .on('click', downloadMember);
78407                       }
78408                   });
78409
78410               var wrapEnter = enter
78411                   .append('div')
78412                   .attr('class', 'form-field-input-wrap form-field-input-member');
78413
78414               wrapEnter
78415                   .append('input')
78416                   .attr('class', 'member-role')
78417                   .property('type', 'text')
78418                   .attr('maxlength', 255)
78419                   .attr('placeholder', t('inspector.role'))
78420                   .call(utilNoAuto)
78421                   .property('value', function(d) { return d.role; })
78422                   .on('change', changeRole);
78423
78424               wrapEnter
78425                   .append('button')
78426                   .attr('tabindex', -1)
78427                   .attr('title', t('icons.remove'))
78428                   .attr('class', 'remove form-field-button member-delete')
78429                   .on('click', deleteMember)
78430                   .call(svgIcon('#iD-operation-delete'));
78431
78432               if (taginfo) {
78433                   wrapEnter.each(bindTypeahead);
78434               }
78435
78436
78437               function bindTypeahead(d) {
78438                   var row = select(this);
78439                   var role = row.selectAll('input.member-role');
78440
78441                   function sort(value, data) {
78442                       var sameletter = [];
78443                       var other = [];
78444                       for (var i = 0; i < data.length; i++) {
78445                           if (data[i].value.substring(0, value.length) === value) {
78446                               sameletter.push(data[i]);
78447                           } else {
78448                               other.push(data[i]);
78449                           }
78450                       }
78451                       return sameletter.concat(other);
78452                   }
78453
78454                   role.call(d3combobox()
78455                       .container(context.container())
78456                       .fetcher(function(role, callback) {
78457                           var rtype = entity.tags.type;
78458                           taginfo.roles({
78459                               debounce: true,
78460                               rtype: rtype || '',
78461                               geometry: context.geometry(d.member.id),
78462                               query: role
78463                           }, function(err, data) {
78464                               if (!err) callback(sort(role, data));
78465                           });
78466                       }));
78467               }
78468
78469
78470               function unbind() {
78471                   var row = select(this);
78472
78473                   row.selectAll('input.member-role')
78474                       .call(d3combobox.off);
78475               }
78476           }
78477       }
78478
78479
78480       rawMemberEditor.entityID = function(_) {
78481           if (!arguments.length) return _entityID;
78482           _entityID = _;
78483           return rawMemberEditor;
78484       };
78485
78486
78487       return rawMemberEditor;
78488   }
78489
78490   function uiRawMembershipEditor(context) {
78491       var taginfo = services.taginfo;
78492       var _entityID;
78493       var _showBlank;
78494
78495
78496       function selectRelation(d) {
78497           event.preventDefault();
78498
78499           // remove the hover-highlight styling
78500           utilHighlightEntity(d.relation.id, false, context);
78501
78502           context.enter(modeSelect(context, [d.relation.id]));
78503       }
78504
78505
78506       function changeRole(d) {
78507           var role = select(this).property('value');
78508           context.perform(
78509               actionChangeMember(d.relation.id, assignIn({}, d.member, { role: role }), d.index),
78510               t('operations.change_role.annotation')
78511           );
78512       }
78513
78514
78515       function addMembership(d, role) {
78516           _showBlank = false;
78517
78518           var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
78519
78520           if (d.relation) {
78521               context.perform(
78522                   actionAddMember(d.relation.id, member),
78523                   t('operations.add_member.annotation')
78524               );
78525
78526           } else {
78527               var relation = osmRelation();
78528               context.perform(
78529                   actionAddEntity(relation),
78530                   actionAddMember(relation.id, member),
78531                   t('operations.add.annotation.relation')
78532               );
78533
78534               context.enter(modeSelect(context, [relation.id]));
78535           }
78536       }
78537
78538
78539       function deleteMembership(d) {
78540           context.perform(
78541               actionDeleteMember(d.relation.id, d.index),
78542               t('operations.delete_member.annotation')
78543           );
78544       }
78545
78546
78547       function relations(q) {
78548           var newRelation = { relation: null, value: t('inspector.new_relation') };
78549           var result = [];
78550           var graph = context.graph();
78551
78552           context.intersects(context.extent()).forEach(function(entity) {
78553               if (entity.type !== 'relation' || entity.id === _entityID) return;
78554
78555               var matched = context.presets().match(entity, graph);
78556               var presetName = (matched && matched.name()) || t('inspector.relation');
78557               var entityName = utilDisplayName(entity) || '';
78558
78559               var value = presetName + ' ' + entityName;
78560               if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1) return;
78561
78562               result.push({ relation: entity, value: value });
78563           });
78564
78565           result.sort(function(a, b) {
78566               return osmRelation.creationOrder(a.relation, b.relation);
78567           });
78568
78569           // Dedupe identical names by appending relation id - see #2891
78570           var dupeGroups = filter(
78571               groupBy(result, 'value'),
78572               function(v) { return v.length > 1; }
78573           );
78574
78575           dupeGroups.forEach(function(group) {
78576               group.forEach(function(obj) {
78577                   obj.value += ' ' + obj.relation.id;
78578               });
78579           });
78580
78581           result.forEach(function(obj) {
78582               obj.title = obj.value;
78583           });
78584
78585           result.unshift(newRelation);
78586           return result;
78587       }
78588
78589
78590       function rawMembershipEditor(selection$$1) {
78591           var entity = context.entity(_entityID);
78592           var parents = context.graph().parentRelations(entity);
78593           var memberships = [];
78594
78595           parents.slice(0, 1000).forEach(function(relation) {
78596               relation.members.forEach(function(member, index) {
78597                   if (member.id === entity.id) {
78598                       memberships.push({ relation: relation, member: member, index: index });
78599                   }
78600               });
78601           });
78602
78603           var gt = parents.length > 1000 ? '>' : '';
78604           selection$$1.call(uiDisclosure(context, 'raw_membership_editor', true)
78605               .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
78606               .expanded(true)
78607               .updatePreference(false)
78608               .on('toggled', function(expanded) {
78609                   if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
78610               })
78611               .content(content)
78612           );
78613
78614
78615           function content(selection$$1) {
78616               var list = selection$$1.selectAll('.member-list')
78617                   .data([0]);
78618
78619               list = list.enter()
78620                   .append('ul')
78621                   .attr('class', 'member-list')
78622                   .merge(list);
78623
78624
78625               var items = list.selectAll('li.member-row-normal')
78626                   .data(memberships, function(d) {
78627                       return osmEntity$$1.key(d.relation) + ',' + d.index;
78628                   });
78629
78630               items.exit()
78631                   .each(unbind)
78632                   .remove();
78633
78634               var enter = items.enter()
78635                   .append('li')
78636                   .attr('class', 'member-row member-row-normal form-field');
78637
78638               enter.each(function(d){
78639                   // highlight the relation in the map while hovering on the list item
78640                   select(this).on('mouseover', function() {
78641                       utilHighlightEntity(d.relation.id, true, context);
78642                   });
78643                   select(this).on('mouseout', function() {
78644                       utilHighlightEntity(d.relation.id, false, context);
78645                   });
78646               });
78647
78648               var labelEnter = enter
78649                   .append('label')
78650                   .attr('class', 'form-field-label')
78651                   .append('span')
78652                   .attr('class', 'label-text')
78653                   .append('a')
78654                   .attr('href', '#')
78655                   .on('click', selectRelation);
78656
78657               labelEnter
78658                   .append('span')
78659                   .attr('class', 'member-entity-type')
78660                   .text(function(d) {
78661                       var matched = context.presets().match(d.relation, context.graph());
78662                       return (matched && matched.name()) || t('inspector.relation');
78663                   });
78664
78665               labelEnter
78666                   .append('span')
78667                   .attr('class', 'member-entity-name')
78668                   .text(function(d) { return utilDisplayName(d.relation); });
78669
78670               var wrapEnter = enter
78671                   .append('div')
78672                   .attr('class', 'form-field-input-wrap form-field-input-member');
78673
78674               wrapEnter
78675                   .append('input')
78676                   .attr('class', 'member-role')
78677                   .property('type', 'text')
78678                   .attr('maxlength', 255)
78679                   .attr('placeholder', t('inspector.role'))
78680                   .call(utilNoAuto)
78681                   .property('value', function(d) { return d.member.role; })
78682                   .on('change', changeRole);
78683
78684               wrapEnter
78685                   .append('button')
78686                   .attr('tabindex', -1)
78687                   .attr('class', 'remove form-field-button member-delete')
78688                   .on('click', deleteMembership)
78689                   .call(svgIcon('#iD-operation-delete'));
78690
78691               if (taginfo) {
78692                   wrapEnter.each(bindTypeahead);
78693               }
78694
78695
78696               var newrow = list.selectAll('.member-row-new')
78697                   .data(_showBlank ? [0] : []);
78698
78699               newrow.exit()
78700                   .remove();
78701
78702               enter = newrow.enter()
78703                   .append('li')
78704                   .attr('class', 'member-row member-row-new form-field');
78705
78706               enter
78707                   .append('input')
78708                   .attr('type', 'text')
78709                   .attr('class', 'member-entity-input')
78710                   .call(utilNoAuto);
78711
78712               enter
78713                   .append('input')
78714                   .attr('class', 'member-role')
78715                   .property('type', 'text')
78716                   .attr('maxlength', 255)
78717                   .attr('placeholder', t('inspector.role'))
78718                   .call(utilNoAuto)
78719                   .on('change', changeRole);
78720
78721               enter
78722                   .append('button')
78723                   .attr('tabindex', -1)
78724                   .attr('class', 'remove form-field-button member-delete')
78725                   .on('click', deleteMembership)
78726                   .call(svgIcon('#iD-operation-delete'));
78727
78728               newrow = newrow
78729                   .merge(enter);
78730
78731               newrow.selectAll('.member-entity-input')
78732                   .call(d3combobox()
78733                       .container(context.container())
78734                       .minItems(1)
78735                       .fetcher(function(value, callback) { callback(relations(value)); })
78736                       .on('accept', onAccept)
78737                   );
78738
78739
78740               var addrel = selection$$1.selectAll('.add-relation')
78741                   .data([0]);
78742
78743               addrel = addrel.enter()
78744                   .append('button')
78745                   .attr('class', 'add-relation')
78746                   .merge(addrel);
78747
78748               addrel
78749                   .call(svgIcon('#iD-icon-plus', 'light'))
78750                   .on('click', function() {
78751                       _showBlank = true;
78752                       content(selection$$1);
78753                       list.selectAll('.member-entity-input').node().focus();
78754                   });
78755
78756
78757               function onAccept(d) {
78758                   var role = list.selectAll('.member-row-new .member-role').property('value');
78759                   addMembership(d, role);
78760               }
78761
78762
78763               function bindTypeahead(d) {
78764                   var row = select(this);
78765                   var role = row.selectAll('input.member-role');
78766
78767                   function sort(value, data) {
78768                       var sameletter = [];
78769                       var other = [];
78770                       for (var i = 0; i < data.length; i++) {
78771                           if (data[i].value.substring(0, value.length) === value) {
78772                               sameletter.push(data[i]);
78773                           } else {
78774                               other.push(data[i]);
78775                           }
78776                       }
78777                       return sameletter.concat(other);
78778                   }
78779
78780                   role.call(d3combobox()
78781                       .container(context.container())
78782                       .fetcher(function(role, callback) {
78783                           var rtype = d.relation.tags.type;
78784                           taginfo.roles({
78785                               debounce: true,
78786                               rtype: rtype || '',
78787                               geometry: context.geometry(_entityID),
78788                               query: role
78789                           }, function(err, data) {
78790                               if (!err) callback(sort(role, data));
78791                           });
78792                       }));
78793               }
78794
78795
78796               function unbind() {
78797                   var row = select(this);
78798
78799                   row.selectAll('input.member-role')
78800                       .call(d3combobox.off);
78801               }
78802           }
78803       }
78804
78805
78806       rawMembershipEditor.entityID = function(_) {
78807           if (!arguments.length) return _entityID;
78808           _entityID = _;
78809           return rawMembershipEditor;
78810       };
78811
78812
78813       return rawMembershipEditor;
78814   }
78815
78816   function uiPresetEditor(context) {
78817       var dispatch$$1 = dispatch('change');
78818       var formFields = uiFormFields(context);
78819       var _state;
78820       var _fieldsArr;
78821       var _preset;
78822       var _tags;
78823       var _entityID;
78824
78825
78826       function presetEditor(selection$$1) {
78827           selection$$1.call(uiDisclosure(context, 'preset_fields', true)
78828               .title(t('inspector.all_fields'))
78829               .content(render)
78830           );
78831       }
78832
78833
78834       function render(selection$$1) {
78835           if (!_fieldsArr) {
78836               var entity = context.entity(_entityID);
78837               var geometry = context.geometry(_entityID);
78838               var presets = context.presets();
78839
78840               _fieldsArr = [];
78841
78842               _preset.fields.forEach(function(field) {
78843                   if (field.matchGeometry(geometry)) {
78844                       _fieldsArr.push(
78845                           uiField(context, field, entity)
78846                       );
78847                   }
78848               });
78849
78850               if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
78851                   _fieldsArr.push(
78852                       uiField(context, presets.field('restrictions'), entity)
78853                   );
78854               }
78855
78856               presets.universal().forEach(function(field) {
78857                   if (_preset.fields.indexOf(field) === -1) {
78858                       _fieldsArr.push(
78859                           uiField(context, field, entity, { show: false })
78860                       );
78861                   }
78862               });
78863
78864               _fieldsArr.forEach(function(field) {
78865                   field
78866                       .on('change', function(t$$1, onInput) {
78867                           dispatch$$1.call('change', field, t$$1, onInput);
78868                       });
78869               });
78870           }
78871
78872           _fieldsArr.forEach(function(field) {
78873               field
78874                   .state(_state)
78875                   .tags(_tags);
78876           });
78877
78878
78879           selection$$1
78880               .call(formFields.fieldsArr(_fieldsArr), 'inspector-inner fillL3');
78881
78882
78883           selection$$1.selectAll('.wrap-form-field input')
78884               .on('keydown', function() {
78885                   // if user presses enter, and combobox is not active, accept edits..
78886                   if (event.keyCode === 13 && select('.combobox').empty()) {
78887                       context.enter(modeBrowse(context));
78888                   }
78889               });
78890       }
78891
78892
78893       presetEditor.preset = function(val) {
78894           if (!arguments.length) return _preset;
78895           if (_preset && _preset.id === val.id) return presetEditor;
78896           _preset = val;
78897           _fieldsArr = null;
78898           return presetEditor;
78899       };
78900
78901
78902       presetEditor.state = function(val) {
78903           if (!arguments.length) return _state;
78904           _state = val;
78905           return presetEditor;
78906       };
78907
78908
78909       presetEditor.tags = function(val) {
78910           if (!arguments.length) return _tags;
78911           _tags = val;
78912           // Don't reset _fieldsArr here.
78913           return presetEditor;
78914       };
78915
78916
78917       presetEditor.entityID = function(val) {
78918           if (!arguments.length) return _entityID;
78919           if (_entityID === val) return presetEditor;
78920           _entityID = val;
78921           _fieldsArr = null;
78922           return presetEditor;
78923       };
78924
78925
78926       return utilRebind(presetEditor, dispatch$$1, 'on');
78927   }
78928
78929   function uiEntityEditor(context) {
78930       var dispatch$$1 = dispatch('choose');
78931       var _state = 'select';
78932       var _coalesceChanges = false;
78933       var _modified = false;
78934       var _base;
78935       var _entityID;
78936       var _activePreset;
78937       var _tagReference;
78938
78939       var presetEditor = uiPresetEditor(context)
78940           .on('change', changeTags);
78941       var rawTagEditor = uiRawTagEditor(context)
78942           .on('change', changeTags);
78943
78944
78945       function entityEditor(selection$$1) {
78946           var entity = context.entity(_entityID);
78947           var tags = clone(entity.tags);
78948
78949           // Header
78950           var header = selection$$1.selectAll('.header')
78951               .data([0]);
78952
78953           // Enter
78954           var enter = header.enter()
78955               .append('div')
78956               .attr('class', 'header fillL cf');
78957
78958           enter
78959               .append('button')
78960               .attr('class', 'fl preset-reset preset-choose')
78961               .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-forward' : '#iD-icon-backward'));
78962
78963           enter
78964               .append('button')
78965               .attr('class', 'fr preset-close')
78966               .on('click', function() { context.enter(modeBrowse(context)); })
78967               .call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close'));
78968
78969           enter
78970               .append('h3')
78971               .text(t('inspector.edit'));
78972
78973           // Update
78974           header = header
78975               .merge(enter);
78976
78977           header.selectAll('.preset-reset')
78978               .on('click', function() {
78979                   dispatch$$1.call('choose', this, _activePreset);
78980               });
78981
78982
78983           // Body
78984           var body = selection$$1.selectAll('.inspector-body')
78985               .data([0]);
78986
78987           // Enter
78988           enter = body.enter()
78989               .append('div')
78990               .attr('class', 'inspector-body');
78991
78992           enter
78993               .append('div')
78994               .attr('class', 'preset-list-item inspector-inner')
78995               .append('div')
78996               .attr('class', 'preset-list-button-wrap')
78997               .append('button')
78998               .attr('class', 'preset-list-button preset-reset')
78999               .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
79000               .append('div')
79001               .attr('class', 'label')
79002               .append('div')
79003               .attr('class', 'label-inner');
79004
79005           enter
79006               .append('div')
79007               .attr('class', 'inspector-border preset-editor');
79008
79009           enter
79010               .append('div')
79011               .attr('class', 'inspector-border raw-tag-editor inspector-inner');
79012
79013           enter
79014               .append('div')
79015               .attr('class', 'inspector-border raw-member-editor inspector-inner');
79016
79017           enter
79018               .append('div')
79019               .attr('class', 'raw-membership-editor inspector-inner');
79020
79021           enter
79022               .append('input')
79023               .attr('type', 'text')
79024               .attr('class', 'key-trap');
79025
79026
79027           // Update
79028           body = body
79029               .merge(enter);
79030
79031           if (_tagReference) {
79032               body.selectAll('.preset-list-button-wrap')
79033                   .call(_tagReference.button);
79034
79035               body.selectAll('.preset-list-item')
79036                   .call(_tagReference.body);
79037           }
79038
79039           body.selectAll('.preset-reset')
79040               .on('click', function() {
79041                   dispatch$$1.call('choose', this, _activePreset);
79042               });
79043
79044           body.select('.preset-list-item button')
79045               .call(uiPresetIcon()
79046                   .geometry(context.geometry(_entityID))
79047                   .preset(_activePreset)
79048               );
79049
79050
79051           var label = body.select('.label-inner');
79052           var nameparts = label.selectAll('.namepart')
79053               .data(_activePreset.name().split(' - '), function(d) { return d; });
79054
79055           nameparts.exit()
79056               .remove();
79057
79058           nameparts
79059               .enter()
79060               .append('div')
79061               .attr('class', 'namepart')
79062               .text(function(d) { return d; });
79063
79064
79065           body.select('.preset-editor')
79066               .call(presetEditor
79067                   .preset(_activePreset)
79068                   .entityID(_entityID)
79069                   .tags(tags)
79070                   .state(_state)
79071               );
79072
79073           body.select('.raw-tag-editor')
79074               .call(rawTagEditor
79075                   .preset(_activePreset)
79076                   .entityID(_entityID)
79077                   .tags(tags)
79078                   .state(_state)
79079               );
79080
79081           if (entity.type === 'relation') {
79082               body.select('.raw-member-editor')
79083                   .style('display', 'block')
79084                   .call(uiRawMemberEditor(context)
79085                       .entityID(_entityID)
79086                   );
79087           } else {
79088               body.select('.raw-member-editor')
79089                   .style('display', 'none');
79090           }
79091
79092           body.select('.raw-membership-editor')
79093               .call(uiRawMembershipEditor(context)
79094                   .entityID(_entityID)
79095               );
79096
79097           body.select('.key-trap')
79098               .on('keydown.key-trap', function() {
79099                   // On tabbing, send focus back to the first field on the inspector-body
79100                   // (probably the `name` field) #4159
79101                   if (event.keyCode === 9 && !event.shiftKey) {
79102                       event.preventDefault();
79103                       body.select('input').node().focus();
79104                   }
79105               });
79106
79107           context.history()
79108               .on('change.entity-editor', historyChanged);
79109
79110
79111           function historyChanged() {
79112               if (_state === 'hide') return;
79113
79114               var entity = context.hasEntity(_entityID);
79115               var graph = context.graph();
79116               if (!entity) return;
79117
79118               var match = context.presets().match(entity, graph);
79119               var activePreset = entityEditor.preset();
79120               var weakPreset = activePreset && isEmpty(activePreset.addTags);
79121
79122               // A "weak" preset doesn't set any tags. (e.g. "Address")
79123               // Don't replace a weak preset with a fallback preset (e.g. "Point")
79124               if (!(weakPreset && match.isFallback())) {
79125                   entityEditor.preset(match);
79126               }
79127               entityEditor.modified(_base !== graph);
79128               entityEditor(selection$$1);
79129           }
79130       }
79131
79132
79133       // Tag changes that fire on input can all get coalesced into a single
79134       // history operation when the user leaves the field.  #2342
79135       function changeTags(changed, onInput) {
79136           var entity = context.entity(_entityID);
79137           var annotation = t('operations.change_tags.annotation');
79138           var tags = clone(entity.tags);
79139
79140           for (var k in changed) {
79141               if (!k) continue;
79142               var v = changed[k];
79143               if (v !== undefined || tags.hasOwnProperty(k)) {
79144                   tags[k] = v;
79145               }
79146           }
79147
79148           if (!onInput) {
79149               tags = utilCleanTags(tags);
79150           }
79151
79152           if (!isEqual(entity.tags, tags)) {
79153               if (_coalesceChanges) {
79154                   context.overwrite(actionChangeTags(_entityID, tags), annotation);
79155               } else {
79156                   context.perform(actionChangeTags(_entityID, tags), annotation);
79157                   _coalesceChanges = !!onInput;
79158               }
79159           }
79160       }
79161
79162
79163       entityEditor.modified = function(_) {
79164           if (!arguments.length) return _modified;
79165           _modified = _;
79166           d3_selectAll('button.preset-close use')
79167               .attr('xlink:href', (_modified ? '#iD-icon-apply' : '#iD-icon-close'));
79168           return entityEditor;
79169       };
79170
79171
79172       entityEditor.state = function(_) {
79173           if (!arguments.length) return _state;
79174           _state = _;
79175           return entityEditor;
79176       };
79177
79178
79179       entityEditor.entityID = function(_) {
79180           if (!arguments.length) return _entityID;
79181           _entityID = _;
79182           _base = context.graph();
79183           _coalesceChanges = false;
79184
79185           // reset the scroll to the top of the inspector
79186           var body = d3_selectAll('.entity-editor-pane .inspector-body');
79187           if (!body.empty()) {
79188               body.node().scrollTop = 0;
79189           }
79190
79191           var presetMatch = context.presets().match(context.entity(_entityID), _base);
79192
79193           return entityEditor
79194               .preset(presetMatch)
79195               .modified(false);
79196       };
79197
79198
79199       entityEditor.preset = function(_) {
79200           if (!arguments.length) return _activePreset;
79201           if (_ !== _activePreset) {
79202               _activePreset = _;
79203               _tagReference = uiTagReference(_activePreset.reference(context.geometry(_entityID)), context)
79204                   .showing(false);
79205           }
79206           return entityEditor;
79207       };
79208
79209
79210       return utilRebind(entityEditor, dispatch$$1, 'on');
79211   }
79212
79213   var pair_1 = pair$1;
79214
79215   function search(x, dims, r) {
79216     if (!dims) dims = 'NSEW';
79217     if (typeof x !== 'string') return { val: null, regex: r };
79218
79219     r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
79220
79221     var m = r.exec(x);
79222     if (!m) return { val: null, regex: r };
79223
79224     var dim = m[1] || m[5];
79225     if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
79226
79227     return {
79228       val: (((m[2]) ? parseFloat(m[2]) : 0) +
79229             ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
79230             ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
79231             ((dim === 'S' || dim === 'W') ? -1 : 1),
79232       regex: r,
79233       raw: m[0],
79234       dim: dim
79235     };
79236   }
79237
79238   function pair$1(x, dims) {
79239     x = x.trim();
79240     var one = search(x, dims);
79241     if (one.val === null) return null;
79242     var two = search(x, dims, one.regex);
79243     if (two.val === null) return null;
79244     // null if one/two are not contiguous.
79245     if (one.raw + two.raw !== x) return null;
79246     if (one.dim) {
79247       return swapdim(one.val, two.val, one.dim);
79248     } else {
79249       return [one.val, two.val];
79250     }
79251   }
79252
79253   function swapdim(a, b, dim) {
79254     if (dim === 'N' || dim === 'S') return [a, b];
79255     if (dim === 'W' || dim === 'E') return [b, a];
79256   }
79257
79258   function uiFeatureList(context) {
79259       var _geocodeResults;
79260
79261
79262       function featureList(selection$$1) {
79263           var header = selection$$1
79264               .append('div')
79265               .attr('class', 'header fillL cf');
79266
79267           header
79268               .append('h3')
79269               .text(t('inspector.feature_list'));
79270
79271           var searchWrap = selection$$1
79272               .append('div')
79273               .attr('class', 'search-header');
79274
79275           var search = searchWrap
79276               .append('input')
79277               .attr('placeholder', t('inspector.search'))
79278               .attr('type', 'search')
79279               .call(utilNoAuto)
79280               .on('keypress', keypress)
79281               .on('keydown', keydown)
79282               .on('input', inputevent);
79283
79284           searchWrap
79285               .call(svgIcon('#iD-icon-search', 'pre-text'));
79286
79287           var listWrap = selection$$1
79288               .append('div')
79289               .attr('class', 'inspector-body');
79290
79291           var list = listWrap
79292               .append('div')
79293               .attr('class', 'feature-list cf');
79294
79295           context
79296               .on('exit.feature-list', clearSearch);
79297           context.map()
79298               .on('drawn.feature-list', mapDrawn);
79299
79300           context.keybinding()
79301               .on(uiCmd('⌘F'), focusSearch);
79302
79303
79304           function focusSearch() {
79305               var mode = context.mode() && context.mode().id;
79306               if (mode !== 'browse') return;
79307
79308               event.preventDefault();
79309               search.node().focus();
79310           }
79311
79312
79313           function keydown() {
79314               if (event.keyCode === 27) {  // escape
79315                   search.node().blur();
79316               }
79317           }
79318
79319
79320           function keypress() {
79321               var q = search.property('value'),
79322                   items = list.selectAll('.feature-list-item');
79323               if (event.keyCode === 13 && q.length && items.size()) {  // return
79324                   click(items.datum());
79325               }
79326           }
79327
79328
79329           function inputevent() {
79330               _geocodeResults = undefined;
79331               drawList();
79332           }
79333
79334
79335           function clearSearch() {
79336               search.property('value', '');
79337               drawList();
79338           }
79339
79340
79341           function mapDrawn(e) {
79342               if (e.full) {
79343                   drawList();
79344               }
79345           }
79346
79347
79348           function features() {
79349               var entities = {};
79350               var result = [];
79351               var graph = context.graph();
79352               var q = search.property('value').toLowerCase();
79353
79354               if (!q) return result;
79355
79356               var idMatch = q.match(/^([nwr])([0-9]+)$/);
79357
79358               if (idMatch) {
79359                   result.push({
79360                       id: idMatch[0],
79361                       geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
79362                       type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
79363                       name: idMatch[2]
79364                   });
79365               }
79366
79367               var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
79368
79369               if (locationMatch) {
79370                   var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
79371                   result.push({
79372                       id: -1,
79373                       geometry: 'point',
79374                       type: t('inspector.location'),
79375                       name: dmsCoordinatePair([loc[1], loc[0]]),
79376                       location: loc
79377                   });
79378               }
79379
79380               function addEntity(entity) {
79381                   if (entity.id in entities || result.length > 200)
79382                       return;
79383
79384                   entities[entity.id] = true;
79385
79386                   var name = utilDisplayName(entity) || '';
79387                   if (name.toLowerCase().indexOf(q) >= 0) {
79388                       var matched = context.presets().match(entity, graph);
79389                       var type = (matched && matched.name()) || utilDisplayType(entity.id);
79390
79391                       result.push({
79392                           id: entity.id,
79393                           entity: entity,
79394                           geometry: context.geometry(entity.id),
79395                           type: type,
79396                           name: name
79397                       });
79398                   }
79399
79400                   graph.parentRelations(entity).forEach(function(parent) {
79401                       addEntity(parent);
79402                   });
79403               }
79404
79405               var visible = context.surface().selectAll('.point, .line, .area').nodes();
79406               for (var i = 0; i < visible.length && result.length <= 200; i++) {
79407                   var datum = visible[i].__data__;
79408                   var entity = datum && datum.properties && datum.properties.entity;
79409                   if (entity) { addEntity(entity); }
79410               }
79411
79412               (_geocodeResults || []).forEach(function(d) {
79413                   if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
79414
79415                       // Make a temporary osmEntity so we can preset match
79416                       // and better localize the search result - #4725
79417                       var id = osmEntity$$1.id.fromOSM(d.osm_type, d.osm_id);
79418                       var tags = {};
79419                       tags[d.class] = d.type;
79420
79421                       var attrs = { id: id, type: d.osm_type, tags: tags };
79422                       if (d.osm_type === 'way') {   // for ways, add some fake closed nodes
79423                           attrs.nodes = ['a','a'];  // so that geometry area is possible
79424                       }
79425
79426                       var tempEntity = osmEntity$$1(attrs);
79427                       var tempGraph = coreGraph$$1([tempEntity]);
79428                       var matched = context.presets().match(tempEntity, tempGraph);
79429                       var type = (matched && matched.name()) || utilDisplayType(id);
79430
79431                       result.push({
79432                           id: tempEntity.id,
79433                           geometry: tempEntity.geometry(tempGraph),
79434                           type: type,
79435                           name: d.display_name,
79436                           extent: new geoExtent$$1(
79437                               [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
79438                               [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
79439                       });
79440                   }
79441               });
79442
79443               return result;
79444           }
79445
79446
79447           function drawList() {
79448               var value = search.property('value');
79449               var results = features();
79450
79451               list.classed('filtered', value.length);
79452
79453               var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
79454
79455               var resultsIndicator = list.selectAll('.no-results-item')
79456                   .data([0])
79457                   .enter()
79458                   .append('button')
79459                   .property('disabled', true)
79460                   .attr('class', 'no-results-item')
79461                   .call(svgIcon('#iD-icon-alert', 'pre-text'));
79462
79463               resultsIndicator.append('span')
79464                   .attr('class', 'entity-name');
79465
79466               list.selectAll('.no-results-item .entity-name')
79467                   .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
79468
79469               if (services.geocoder) {
79470                 list.selectAll('.geocode-item')
79471                     .data([0])
79472                     .enter()
79473                     .append('button')
79474                     .attr('class', 'geocode-item')
79475                     .on('click', geocoderSearch)
79476                     .append('div')
79477                     .attr('class', 'label')
79478                     .append('span')
79479                     .attr('class', 'entity-name')
79480                     .text(t('geocoder.search'));
79481               }
79482
79483               list.selectAll('.no-results-item')
79484                   .style('display', (value.length && !results.length) ? 'block' : 'none');
79485
79486               list.selectAll('.geocode-item')
79487                   .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
79488
79489               list.selectAll('.feature-list-item')
79490                   .data([-1])
79491                   .remove();
79492
79493               var items = list.selectAll('.feature-list-item')
79494                   .data(results, function(d) { return d.id; });
79495
79496               var enter = items.enter()
79497                   .insert('button', '.geocode-item')
79498                   .attr('class', 'feature-list-item')
79499                   .on('mouseover', mouseover)
79500                   .on('mouseout', mouseout)
79501                   .on('click', click);
79502
79503               var label = enter
79504                   .append('div')
79505                   .attr('class', 'label');
79506
79507               label
79508                   .each(function(d) {
79509                       select(this)
79510                           .call(svgIcon('#iD-icon-' + d.geometry, 'pre-text'));
79511                   });
79512
79513               label
79514                   .append('span')
79515                   .attr('class', 'entity-type')
79516                   .text(function(d) { return d.type; });
79517
79518               label
79519                   .append('span')
79520                   .attr('class', 'entity-name')
79521                   .text(function(d) { return d.name; });
79522
79523               enter
79524                   .style('opacity', 0)
79525                   .transition()
79526                   .style('opacity', 1);
79527
79528               items.order();
79529
79530               items.exit()
79531                   .remove();
79532           }
79533
79534
79535           function mouseover(d) {
79536               if (d.id === -1) return;
79537
79538               context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
79539                   .classed('hover', true);
79540           }
79541
79542
79543           function mouseout() {
79544               context.surface().selectAll('.hover')
79545                   .classed('hover', false);
79546           }
79547
79548
79549           function click(d) {
79550               event.preventDefault();
79551               if (d.location) {
79552                   context.map().centerZoom([d.location[1], d.location[0]], 19);
79553               }
79554               else if (d.entity) {
79555                   if (d.entity.type === 'node') {
79556                       context.map().center(d.entity.loc);
79557                   } else if (d.entity.type === 'way') {
79558                       var center = context.projection(context.map().center());
79559                       var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
79560                       context.map().center(edge.loc);
79561                   }
79562                   context.enter(modeSelect(context, [d.entity.id]));
79563               } else {
79564                   context.zoomToEntity(d.id);
79565               }
79566           }
79567
79568
79569           function geocoderSearch() {
79570               services.geocoder.search(search.property('value'), function (err, resp) {
79571                   _geocodeResults = resp || [];
79572                   drawList();
79573               });
79574           }
79575       }
79576
79577
79578       return featureList;
79579   }
79580
79581   var _flashTimer;
79582
79583
79584   function uiFlash() {
79585       var _duration = 2000;
79586       var _iconName = '#iD-icon-no';
79587       var _iconClass = 'disabled';
79588       var _text = '';
79589       var _textClass;
79590
79591
79592       function flash() {
79593           if (_flashTimer) {
79594               _flashTimer.stop();
79595           }
79596
79597           select('#footer-wrap')
79598               .attr('class', 'footer-hide');
79599           select('#flash-wrap')
79600               .attr('class', 'footer-show');
79601
79602           var content = select('#flash-wrap').selectAll('.flash-content')
79603               .data([0]);
79604
79605           // Enter
79606           var contentEnter = content.enter()
79607               .append('div')
79608               .attr('class', 'flash-content');
79609
79610           var iconEnter = contentEnter
79611               .append('svg')
79612               .attr('class', 'flash-icon')
79613               .append('g')
79614               .attr('transform', 'translate(10,10)');
79615
79616           iconEnter
79617               .append('circle')
79618               .attr('r', 9);
79619
79620           iconEnter
79621               .append('use')
79622               .attr('transform', 'translate(-7,-7)')
79623               .attr('width', '14')
79624               .attr('height', '14');
79625
79626           contentEnter
79627               .append('div')
79628               .attr('class', 'flash-text');
79629
79630
79631           // Update
79632           content = content
79633               .merge(contentEnter);
79634
79635           content
79636               .selectAll('.flash-icon')
79637               .attr('class', 'flash-icon ' + (_iconClass || ''));
79638
79639           content
79640               .selectAll('.flash-icon use')
79641               .attr('xlink:href', _iconName);
79642
79643           content
79644               .selectAll('.flash-text')
79645               .attr('class', 'flash-text ' + (_textClass || ''))
79646               .text(_text);
79647
79648
79649           _flashTimer = timeout$1(function() {
79650               _flashTimer = null;
79651               select('#footer-wrap')
79652                   .attr('class', 'footer-show');
79653               select('#flash-wrap')
79654                   .attr('class', 'footer-hide');
79655           }, _duration);
79656
79657           return content;
79658       }
79659
79660
79661       flash.duration = function(_) {
79662           if (!arguments.length) return _duration;
79663           _duration = _;
79664           return flash;
79665       };
79666
79667       flash.text = function(_) {
79668           if (!arguments.length) return _text;
79669           _text = _;
79670           return flash;
79671       };
79672
79673       flash.textClass = function(_) {
79674           if (!arguments.length) return _textClass;
79675           _textClass = _;
79676           return flash;
79677       };
79678
79679       flash.iconName = function(_) {
79680           if (!arguments.length) return _iconName;
79681           _iconName = _;
79682           return flash;
79683       };
79684
79685       flash.iconClass = function(_) {
79686           if (!arguments.length) return _iconClass;
79687           _iconClass = _;
79688           return flash;
79689       };
79690
79691       return flash;
79692   }
79693
79694   function uiPresetList(context) {
79695       var dispatch$$1 = dispatch('choose');
79696       var _entityID;
79697       var _currentPreset;
79698       var _autofocus = false;
79699
79700
79701       function presetList(selection$$1) {
79702           var entity = context.entity(_entityID);
79703           var geometry = context.geometry(_entityID);
79704
79705           // Treat entities on addr:interpolation lines as points, not vertices (#3241)
79706           if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
79707               geometry = 'point';
79708           }
79709
79710           var presets = context.presets().matchGeometry(geometry);
79711
79712           selection$$1.html('');
79713
79714           var messagewrap = selection$$1
79715               .append('div')
79716               .attr('class', 'header fillL cf');
79717
79718           var message = messagewrap
79719               .append('h3')
79720               .text(t('inspector.choose'));
79721
79722           if (context.entity(_entityID).isUsed(context.graph())) {
79723               messagewrap
79724                   .append('button')
79725                   .attr('class', 'preset-choose')
79726                   .on('click', function() { dispatch$$1.call('choose', this, _currentPreset); })
79727                   .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'));
79728           } else {
79729               messagewrap
79730                   .append('button')
79731                   .attr('class', 'close')
79732                   .on('click', function() {
79733                       context.enter(modeBrowse(context));
79734                   })
79735                   .call(svgIcon('#iD-icon-close'));
79736           }
79737
79738           function initialKeydown() {
79739               // hack to let delete shortcut work when search is autofocused
79740               if (search.property('value').length === 0 &&
79741                   (event.keyCode === utilKeybinding.keyCodes['⌫'] ||
79742                    event.keyCode === utilKeybinding.keyCodes['⌦'])) {
79743                   event.preventDefault();
79744                   event.stopPropagation();
79745                   operationDelete([_entityID], context)();
79746
79747               // hack to let undo work when search is autofocused
79748               } else if (search.property('value').length === 0 &&
79749                   (event.ctrlKey || event.metaKey) &&
79750                   event.keyCode === utilKeybinding.keyCodes.z) {
79751                   event.preventDefault();
79752                   event.stopPropagation();
79753                   context.undo();
79754               } else if (!event.ctrlKey && !event.metaKey) {
79755                   // don't check for delete/undo hack on future keydown events
79756                   select(this).on('keydown', keydown);
79757                   keydown.call(this);
79758               }
79759           }
79760
79761           function keydown() {
79762               // down arrow
79763               if (event.keyCode === utilKeybinding.keyCodes['↓'] &&
79764                   // if insertion point is at the end of the string
79765                   search.node().selectionStart === search.property('value').length) {
79766                   event.preventDefault();
79767                   event.stopPropagation();
79768                   // move focus to the first item in the preset list
79769                   list.select('.preset-list-button').node().focus();
79770               }
79771           }
79772
79773           function keypress() {
79774               // enter
79775               var value = search.property('value');
79776               if (event.keyCode === 13 && value.length) {
79777                   list.selectAll('.preset-list-item:first-child').datum().choose();
79778               }
79779           }
79780
79781           function inputevent() {
79782               var value = search.property('value');
79783               list.classed('filtered', value.length);
79784               if (value.length) {
79785                   var results = presets.search(value, geometry);
79786                   message.text(t('inspector.results', {
79787                       n: results.collection.length,
79788                       search: value
79789                   }));
79790                   list.call(drawList, results);
79791               } else {
79792                   list.call(drawList, context.presets().defaults(geometry, 36));
79793                   message.text(t('inspector.choose'));
79794               }
79795           }
79796
79797           var searchWrap = selection$$1
79798               .append('div')
79799               .attr('class', 'search-header');
79800
79801           var search = searchWrap
79802               .append('input')
79803               .attr('class', 'preset-search-input')
79804               .attr('placeholder', t('inspector.search'))
79805               .attr('type', 'search')
79806               .call(utilNoAuto)
79807               .on('keydown', initialKeydown)
79808               .on('keypress', keypress)
79809               .on('input', inputevent);
79810
79811           searchWrap
79812               .call(svgIcon('#iD-icon-search', 'pre-text'));
79813
79814           if (_autofocus) {
79815               search.node().focus();
79816           }
79817
79818           var listWrap = selection$$1
79819               .append('div')
79820               .attr('class', 'inspector-body');
79821
79822           var list = listWrap
79823               .append('div')
79824               .attr('class', 'preset-list fillL cf')
79825               .call(drawList, context.presets().defaults(geometry, 36));
79826       }
79827
79828
79829       function drawList(list, presets) {
79830           var collection = presets.collection.map(function(preset) {
79831               return preset.members ? CategoryItem(preset) : PresetItem(preset);
79832           });
79833
79834           var items = list.selectAll('.preset-list-item')
79835               .data(collection, function(d) { return d.preset.id; });
79836
79837           items.order();
79838
79839           items.exit()
79840               .remove();
79841
79842           items.enter()
79843               .append('div')
79844               .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
79845               .classed('current', function(item) { return item.preset === _currentPreset; })
79846               .each(function(item) { select(this).call(item); })
79847               .style('opacity', 0)
79848               .transition()
79849               .style('opacity', 1);
79850       }
79851
79852       function itemKeydown(){
79853           // the actively focused item
79854           var item = select(this.closest('.preset-list-item'));
79855           var parentItem = select(item.node().parentElement.closest('.preset-list-item'));
79856
79857           // arrow down, move focus to the next, lower item
79858           if (event.keyCode === utilKeybinding.keyCodes['↓']) {
79859               event.preventDefault();
79860               event.stopPropagation();
79861               // the next item in the list at the same level
79862               var nextItem = select(item.node().nextElementSibling);
79863               // if there is no next item in this list
79864               if (nextItem.empty()) {
79865                   // if there is a parent item
79866                   if (!parentItem.empty()) {
79867                       // the item is the last item of a sublist,
79868                       // select the next item at the parent level
79869                       nextItem = select(parentItem.node().nextElementSibling);
79870                   }
79871               // if the focused item is expanded
79872               } else if (select(this).classed('expanded')) {
79873                   // select the first subitem instead
79874                   nextItem = item.select('.subgrid .preset-list-item:first-child');
79875               }
79876               if (!nextItem.empty()) {
79877                   // focus on the next item
79878                   nextItem.select('.preset-list-button').node().focus();
79879               }
79880
79881           // arrow up, move focus to the previous, higher item
79882           } else if (event.keyCode === utilKeybinding.keyCodes['↑']) {
79883               event.preventDefault();
79884               event.stopPropagation();
79885               // the previous item in the list at the same level
79886               var previousItem = select(item.node().previousElementSibling);
79887
79888               // if there is no previous item in this list
79889               if (previousItem.empty()) {
79890                   // if there is a parent item
79891                   if (!parentItem.empty()) {
79892                       // the item is the first subitem of a sublist select the parent item
79893                       previousItem = parentItem;
79894                   }
79895               // if the previous item is expanded
79896               } else if (previousItem.select('.preset-list-button').classed('expanded')) {
79897                   // select the last subitem of the sublist of the previous item
79898                   previousItem = previousItem.select('.subgrid .preset-list-item:last-child');
79899               }
79900
79901               if (!previousItem.empty()) {
79902                   // focus on the previous item
79903                   previousItem.select('.preset-list-button').node().focus();
79904               } else {
79905                   // the focus is at the top of the list, move focus back to the search field
79906                   var search = select(this.closest('.preset-list-pane')).select('.preset-search-input');
79907                   search.node().focus();
79908               }
79909
79910           // arrow left, move focus to the parent item if there is one
79911           } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
79912               event.preventDefault();
79913               event.stopPropagation();
79914               // if there is a parent item, focus on the parent item
79915               if (!parentItem.empty()) {
79916                   parentItem.select('.preset-list-button').node().focus();
79917               }
79918
79919           // arrow right, choose this item
79920           } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
79921               event.preventDefault();
79922               event.stopPropagation();
79923               item.datum().choose();
79924           }
79925       }
79926
79927
79928       function CategoryItem(preset) {
79929           var box, sublist, shown = false;
79930
79931           function item(selection$$1) {
79932               var wrap = selection$$1.append('div')
79933                   .attr('class', 'preset-list-button-wrap category col12');
79934
79935               function click() {
79936                   var isExpanded = select(this).classed('expanded');
79937                   var iconName = isExpanded ?
79938                       (textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward') : '#iD-icon-down';
79939                   select(this)
79940                       .classed('expanded', !isExpanded);
79941                   select(this).selectAll('div.label-inner svg.icon use')
79942                       .attr('href', iconName);
79943                   item.choose();
79944               }
79945
79946               var button = wrap
79947                   .append('button')
79948                   .attr('class', 'preset-list-button')
79949                   .classed('expanded', false)
79950                   .call(uiPresetIcon()
79951                       .geometry(context.geometry(_entityID))
79952                       .preset(preset))
79953                   .on('click', click)
79954                   .on('keydown', function() {
79955                       // right arrow, expand the focused item
79956                       if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
79957                           event.preventDefault();
79958                           event.stopPropagation();
79959                           // if the item isn't expanded
79960                           if (!select(this).classed('expanded')) {
79961                               // toggle expansion (expand the item)
79962                               click.call(this);
79963                           }
79964                       // left arrow, collapse the focused item
79965                       } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
79966                           event.preventDefault();
79967                           event.stopPropagation();
79968                           // if the item is expanded
79969                           if (select(this).classed('expanded')) {
79970                               // toggle expansion (collapse the item)
79971                               click.call(this);
79972                           }
79973                       } else {
79974                           itemKeydown.call(this);
79975                       }
79976                   });
79977
79978               var label = button
79979                   .append('div')
79980                   .attr('class', 'label')
79981                   .append('div')
79982                   .attr('class', 'label-inner');
79983
79984               label
79985                   .append('div')
79986                   .attr('class', 'namepart')
79987                   .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'))
79988                   .append('span')
79989                   .html(function() { return preset.name() + '&hellip;'; });
79990
79991               box = selection$$1.append('div')
79992                   .attr('class', 'subgrid col12')
79993                   .style('max-height', '0px')
79994                   .style('opacity', 0);
79995
79996               box.append('div')
79997                   .attr('class', 'arrow');
79998
79999               sublist = box.append('div')
80000                   .attr('class', 'preset-list fillL3 cf fl');
80001           }
80002
80003
80004           item.choose = function() {
80005               if (!box || !sublist) return;
80006
80007               if (shown) {
80008                   shown = false;
80009                   box.transition()
80010                       .duration(200)
80011                       .style('opacity', '0')
80012                       .style('max-height', '0px')
80013                       .style('padding-bottom', '0px');
80014               } else {
80015                   shown = true;
80016                   sublist.call(drawList, preset.members);
80017                   box.transition()
80018                       .duration(200)
80019                       .style('opacity', '1')
80020                       .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
80021                       .style('padding-bottom', '20px');
80022               }
80023           };
80024
80025           item.preset = preset;
80026           return item;
80027       }
80028
80029
80030       function PresetItem(preset) {
80031           function item(selection$$1) {
80032               var wrap = selection$$1.append('div')
80033                   .attr('class', 'preset-list-button-wrap col12');
80034
80035               var button = wrap.append('button')
80036                   .attr('class', 'preset-list-button')
80037                   .call(uiPresetIcon()
80038                       .geometry(context.geometry(_entityID))
80039                       .preset(preset))
80040                   .on('click', item.choose)
80041                   .on('keydown', itemKeydown);
80042
80043               var label = button
80044                   .append('div')
80045                   .attr('class', 'label')
80046                   .append('div')
80047                   .attr('class', 'label-inner');
80048
80049               label.selectAll('.namepart')
80050                   .data(preset.name().split(' - '))
80051                   .enter()
80052                   .append('div')
80053                   .attr('class', 'namepart')
80054                   .text(function(d) { return d; });
80055
80056               wrap.call(item.reference.button);
80057               selection$$1.call(item.reference.body);
80058           }
80059
80060           item.choose = function() {
80061               context.presets().choose(preset);
80062               context.perform(
80063                   actionChangePreset(_entityID, _currentPreset, preset),
80064                   t('operations.change_tags.annotation')
80065               );
80066
80067               dispatch$$1.call('choose', this, preset);
80068           };
80069
80070           item.help = function() {
80071               event.stopPropagation();
80072               item.reference.toggle();
80073           };
80074
80075           item.preset = preset;
80076           item.reference = uiTagReference(preset.reference(context.geometry(_entityID)), context);
80077
80078           return item;
80079       }
80080
80081
80082       presetList.autofocus = function(val) {
80083           if (!arguments.length) return _autofocus;
80084           _autofocus = val;
80085           return presetList;
80086       };
80087
80088
80089       presetList.entityID = function(val) {
80090           if (!arguments.length) return _entityID;
80091           _entityID = val;
80092           presetList.preset(context.presets().match(context.entity(_entityID), context.graph()));
80093           return presetList;
80094       };
80095
80096
80097       presetList.preset = function(val) {
80098           if (!arguments.length) return _currentPreset;
80099           _currentPreset = val;
80100           return presetList;
80101       };
80102
80103
80104       return utilRebind(presetList, dispatch$$1, 'on');
80105   }
80106
80107   function uiViewOnOSM(context) {
80108       var _what;   // an osmEntity or osmNote
80109
80110
80111       function viewOnOSM(selection) {
80112           var url;
80113           if (_what instanceof osmEntity$$1) {
80114               url = context.connection().entityURL(_what);
80115           } else if (_what instanceof osmNote) {
80116               url = context.connection().noteURL(_what);
80117           }
80118
80119           var data = ((!_what || _what.isNew()) ? [] : [_what]);
80120           var link = selection.selectAll('.view-on-osm')
80121               .data(data, function(d) { return d.id; });
80122
80123           // exit
80124           link.exit()
80125               .remove();
80126
80127           // enter
80128           var linkEnter = link.enter()
80129               .append('a')
80130               .attr('class', 'view-on-osm')
80131               .attr('target', '_blank')
80132               .attr('href', url)
80133               .call(svgIcon('#iD-icon-out-link', 'inline'));
80134
80135           linkEnter
80136               .append('span')
80137               .text(t('inspector.view_on_osm'));
80138       }
80139
80140
80141       viewOnOSM.what = function(_) {
80142           if (!arguments.length) return _what;
80143           _what = _;
80144           return viewOnOSM;
80145       };
80146
80147       return viewOnOSM;
80148   }
80149
80150   function uiInspector(context) {
80151       var presetList = uiPresetList(context);
80152       var entityEditor = uiEntityEditor(context);
80153       var _state = 'select';
80154       var _entityID;
80155       var _newFeature = false;
80156
80157
80158       function inspector(selection$$1) {
80159           presetList
80160               .entityID(_entityID)
80161               .autofocus(_newFeature)
80162               .on('choose', setPreset);
80163
80164           entityEditor
80165               .state(_state)
80166               .entityID(_entityID)
80167               .on('choose', showList);
80168
80169           var wrap = selection$$1.selectAll('.panewrap')
80170               .data([0]);
80171
80172           var enter = wrap.enter()
80173               .append('div')
80174               .attr('class', 'panewrap');
80175
80176           enter
80177               .append('div')
80178               .attr('class', 'preset-list-pane pane');
80179
80180           enter
80181               .append('div')
80182               .attr('class', 'entity-editor-pane pane');
80183
80184           wrap = wrap.merge(enter);
80185           var presetPane = wrap.selectAll('.preset-list-pane');
80186           var editorPane = wrap.selectAll('.entity-editor-pane');
80187
80188           var graph = context.graph();
80189           var entity = context.entity(_entityID);
80190
80191           var showEditor = _state === 'hover' ||
80192               entity.isUsed(graph) ||
80193               entity.isHighwayIntersection(graph);
80194
80195           if (showEditor) {
80196               wrap.style('right', '0%');
80197               editorPane.call(entityEditor);
80198           } else {
80199               wrap.style('right', '-100%');
80200               presetPane.call(presetList);
80201           }
80202
80203           var footer = selection$$1.selectAll('.footer')
80204               .data([0]);
80205
80206           footer = footer.enter()
80207               .append('div')
80208               .attr('class', 'footer')
80209               .merge(footer);
80210
80211           footer
80212               .call(uiViewOnOSM(context)
80213                   .what(context.hasEntity(_entityID))
80214               );
80215
80216
80217           function showList(preset) {
80218               wrap.transition()
80219                   .styleTween('right', function() { return interpolate('0%', '-100%'); });
80220
80221               presetPane
80222                   .call(presetList.preset(preset).autofocus(true));
80223           }
80224
80225
80226           function setPreset(preset) {
80227               wrap.transition()
80228                   .styleTween('right', function() { return interpolate('-100%', '0%'); });
80229
80230               editorPane
80231                   .call(entityEditor.preset(preset));
80232           }
80233       }
80234
80235
80236       inspector.state = function(_) {
80237           if (!arguments.length) return _state;
80238           _state = _;
80239           entityEditor.state(_state);
80240
80241           // remove any old field help overlay that might have gotten attached to the inspector
80242           d3_selectAll('.field-help-body').remove();
80243
80244           return inspector;
80245       };
80246
80247
80248       inspector.entityID = function(_) {
80249           if (!arguments.length) return _entityID;
80250           _entityID = _;
80251           return inspector;
80252       };
80253
80254
80255       inspector.newFeature = function(_) {
80256           if (!arguments.length) return _newFeature;
80257           _newFeature = _;
80258           return inspector;
80259       };
80260
80261
80262       return inspector;
80263   }
80264
80265   function uiLasso(context) {
80266       var group, polygon;
80267
80268       lasso.coordinates = [];
80269
80270       function lasso(selection$$1) {
80271           context.container()
80272               .classed('lasso', true);
80273
80274           group = selection$$1
80275               .append('g')
80276               .attr('class', 'lasso hide');
80277
80278           polygon = group
80279               .append('path')
80280               .attr('class', 'lasso-path');
80281
80282           group
80283               .call(uiToggle(true));
80284       }
80285
80286
80287       function draw() {
80288           if (polygon) {
80289               polygon.data([lasso.coordinates])
80290                   .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
80291           }
80292       }
80293
80294
80295       lasso.extent = function () {
80296           return lasso.coordinates.reduce(function(extent, point$$1) {
80297               return extent.extend(geoExtent$$1(point$$1));
80298           }, geoExtent$$1());
80299       };
80300
80301
80302       lasso.p = function(_) {
80303           if (!arguments.length) return lasso;
80304           lasso.coordinates.push(_);
80305           draw();
80306           return lasso;
80307       };
80308
80309
80310       lasso.close = function() {
80311           if (group) {
80312               group.call(uiToggle(false, function() {
80313                   select(this).remove();
80314               }));
80315           }
80316           context.container().classed('lasso', false);
80317       };
80318
80319
80320       return lasso;
80321   }
80322
80323   function uiNoteComments() {
80324       var _note;
80325
80326
80327       function noteComments(selection$$1) {
80328           if (_note.isNew()) return; // don't draw .comments-container
80329
80330           var comments = selection$$1.selectAll('.comments-container')
80331               .data([0]);
80332
80333           comments = comments.enter()
80334               .append('div')
80335               .attr('class', 'comments-container')
80336               .merge(comments);
80337
80338           var commentEnter = comments.selectAll('.comment')
80339               .data(_note.comments)
80340               .enter()
80341               .append('div')
80342               .attr('class', 'comment');
80343
80344           commentEnter
80345               .append('div')
80346               .attr('class', function(d) { return 'comment-avatar user-' + d.uid; })
80347               .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
80348
80349           var mainEnter = commentEnter
80350               .append('div')
80351               .attr('class', 'comment-main');
80352
80353           var metadataEnter = mainEnter
80354               .append('div')
80355               .attr('class', 'comment-metadata');
80356
80357           metadataEnter
80358               .append('div')
80359               .attr('class', 'comment-author')
80360               .each(function(d) {
80361                   var selection$$1 = select(this);
80362                   var osm = services.osm;
80363                   if (osm && d.user) {
80364                       selection$$1 = selection$$1
80365                           .append('a')
80366                           .attr('class', 'comment-author-link')
80367                           .attr('href', osm.userURL(d.user))
80368                           .attr('tabindex', -1)
80369                           .attr('target', '_blank');
80370                   }
80371                   selection$$1
80372                       .text(function(d) { return d.user || t('note.anonymous'); });
80373               });
80374
80375           metadataEnter
80376               .append('div')
80377               .attr('class', 'comment-date')
80378               .text(function(d) {
80379                   return t('note.status.' + d.action, { when: localeDateString(d.date) });
80380               });
80381
80382           mainEnter
80383               .append('div')
80384               .attr('class', 'comment-text')
80385               .html(function(d) { return d.html; });
80386
80387           comments
80388               .call(replaceAvatars);
80389       }
80390
80391
80392       function replaceAvatars(selection$$1) {
80393           var osm = services.osm;
80394           if (!osm) return;
80395
80396           var uids = {};  // gather uids in the comment thread
80397           _note.comments.forEach(function(d) {
80398               if (d.uid) uids[d.uid] = true;
80399           });
80400
80401           Object.keys(uids).forEach(function(uid) {
80402               osm.loadUser(uid, function(err, user) {
80403                   if (!user || !user.image_url) return;
80404
80405                   selection$$1.selectAll('.comment-avatar.user-' + uid)
80406                       .html('')
80407                       .append('img')
80408                       .attr('class', 'icon comment-avatar-icon')
80409                       .attr('src', user.image_url)
80410                       .attr('alt', user.display_name);
80411               });
80412           });
80413       }
80414
80415
80416       function localeDateString(s) {
80417           if (!s) return null;
80418           var detected = utilDetect();
80419           var options = { day: 'numeric', month: 'short', year: 'numeric' };
80420           s = s.replace(/-/g, '/'); // fix browser-specific Date() issues
80421           var d = new Date(s);
80422           if (isNaN(d.getTime())) return null;
80423           return d.toLocaleDateString(detected.locale, options);
80424       }
80425
80426
80427       noteComments.note = function(_) {
80428           if (!arguments.length) return _note;
80429           _note = _;
80430           return noteComments;
80431       };
80432
80433
80434       return noteComments;
80435   }
80436
80437   function uiNoteEditor$$1(context) {
80438       var dispatch$$1 = dispatch('change');
80439       var noteComments = uiNoteComments();
80440       var noteHeader = uiNoteHeader();
80441
80442       // var formFields = uiFormFields(context);
80443
80444       var _note;
80445       // var _fieldsArr;
80446
80447
80448       function noteEditor(selection$$1) {
80449           var header = selection$$1.selectAll('.header')
80450               .data([0]);
80451
80452           var headerEnter = header.enter()
80453               .append('div')
80454               .attr('class', 'header fillL');
80455
80456           headerEnter
80457               .append('button')
80458               .attr('class', 'fr note-editor-close')
80459               .on('click', function() {
80460                   context.enter(modeBrowse(context));
80461               })
80462               .call(svgIcon('#iD-icon-close'));
80463
80464           headerEnter
80465               .append('h3')
80466               .text(t('note.title'));
80467
80468
80469           var body = selection$$1.selectAll('.body')
80470               .data([0]);
80471
80472           body = body.enter()
80473               .append('div')
80474               .attr('class', 'body')
80475               .merge(body);
80476
80477           var editor = body.selectAll('.note-editor')
80478               .data([0]);
80479
80480           editor.enter()
80481               .append('div')
80482               .attr('class', 'modal-section note-editor')
80483               .merge(editor)
80484               .call(noteHeader.note(_note))
80485               .call(noteComments.note(_note))
80486               .call(noteSaveSection);
80487
80488
80489           var footer = selection$$1.selectAll('.footer')
80490               .data([0]);
80491
80492           footer.enter()
80493               .append('div')
80494               .attr('class', 'footer')
80495               .merge(footer)
80496               .call(uiViewOnOSM(context).what(_note))
80497               .call(uiNoteReport(context).note(_note));
80498
80499
80500           // rerender the note editor on any auth change
80501           var osm = services.osm;
80502           if (osm) {
80503               osm.on('change.note-save', function() {
80504                   selection$$1.call(noteEditor);
80505               });
80506           }
80507       }
80508
80509
80510       function noteSaveSection(selection$$1) {
80511           var isSelected = (_note && _note.id === context.selectedNoteID());
80512           var noteSave = selection$$1.selectAll('.note-save')
80513               .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
80514
80515           // exit
80516           noteSave.exit()
80517               .remove();
80518
80519           // enter
80520           var noteSaveEnter = noteSave.enter()
80521               .append('div')
80522               .attr('class', 'note-save save-section cf');
80523
80524           // // if new note, show categories to pick from
80525           // if (_note.isNew()) {
80526           //     var presets = context.presets();
80527
80528           //     // NOTE: this key isn't a age and therefore there is no documentation (yet)
80529           //     _fieldsArr = [
80530           //         uiField(context, presets.field('category'), null, { show: true, revert: false }),
80531           //     ];
80532
80533           //     _fieldsArr.forEach(function(field) {
80534           //         field
80535           //             .on('change', changeCategory);
80536           //     });
80537
80538           //     noteSaveEnter
80539           //         .append('div')
80540           //         .attr('class', 'note-category')
80541           //         .call(formFields.fieldsArr(_fieldsArr));
80542           // }
80543
80544           // function changeCategory() {
80545           //     // NOTE: perhaps there is a better way to get value
80546           //     var val = d3_select('input[name=\'category\']:checked').property('__data__') || undefined;
80547
80548           //     // store the unsaved category with the note itself
80549           //     _note = _note.update({ newCategory: val });
80550           //     var osm = services.osm;
80551           //     if (osm) {
80552           //         osm.replaceNote(_note);  // update note cache
80553           //     }
80554           //     noteSave
80555           //         .call(noteSaveButtons);
80556           // }
80557
80558           noteSaveEnter
80559               .append('h4')
80560               .attr('class', '.note-save-header')
80561               .text(function() {
80562                   return _note.isNew() ? t('note.newDescription') : t('note.newComment');
80563               });
80564
80565           noteSaveEnter
80566               .append('textarea')
80567               .attr('id', 'new-comment-input')
80568               .attr('placeholder', t('note.inputPlaceholder'))
80569               .attr('maxlength', 1000)
80570               .property('value', function(d) { return d.newComment; })
80571               .call(utilNoAuto)
80572               .on('keydown.note-input', keydown)
80573               .on('input.note-input', changeInput)
80574               .on('blur.note-input', changeInput);
80575
80576           // update
80577           noteSave = noteSaveEnter
80578               .merge(noteSave)
80579               .call(userDetails)
80580               .call(noteSaveButtons);
80581
80582
80583           // fast submit if user presses cmd+enter
80584           function keydown() {
80585               if (!(event.keyCode === 13 && event.metaKey)) return;
80586
80587               var osm = services.osm;
80588               if (!osm) return;
80589
80590               var hasAuth = osm.authenticated();
80591               if (!hasAuth) return;
80592
80593               if (!_note.newComment) return;
80594
80595               event.preventDefault();
80596
80597               select(this)
80598                   .on('keydown.note-input', null);
80599
80600               // focus on button and submit
80601               window.setTimeout(function() {
80602                   if (_note.isNew()) {
80603                       noteSave.selectAll('.save-button').node().focus();
80604                       clickSave(_note);
80605                   } else  {
80606                       noteSave.selectAll('.comment-button').node().focus();
80607                       clickComment(_note);
80608                   }
80609               }, 10);
80610           }
80611
80612
80613           function changeInput() {
80614               var input = select(this);
80615               var val = input.property('value').trim() || undefined;
80616
80617               // store the unsaved comment with the note itself
80618               _note = _note.update({ newComment: val });
80619
80620               var osm = services.osm;
80621               if (osm) {
80622                   osm.replaceNote(_note);  // update note cache
80623               }
80624
80625               noteSave
80626                   .call(noteSaveButtons);
80627           }
80628       }
80629
80630
80631       function userDetails(selection$$1) {
80632           var detailSection = selection$$1.selectAll('.detail-section')
80633               .data([0]);
80634
80635           detailSection = detailSection.enter()
80636               .append('div')
80637               .attr('class', 'detail-section')
80638               .merge(detailSection);
80639
80640           var osm = services.osm;
80641           if (!osm) return;
80642
80643           // Add warning if user is not logged in
80644           var hasAuth = osm.authenticated();
80645           var authWarning = detailSection.selectAll('.auth-warning')
80646               .data(hasAuth ? [] : [0]);
80647
80648           authWarning.exit()
80649               .transition()
80650               .duration(200)
80651               .style('opacity', 0)
80652               .remove();
80653
80654           var authEnter = authWarning.enter()
80655               .insert('div', '.tag-reference-body')
80656               .attr('class', 'field-warning auth-warning')
80657               .style('opacity', 0);
80658
80659           authEnter
80660               .call(svgIcon('#iD-icon-alert', 'inline'));
80661
80662           authEnter
80663               .append('span')
80664               .text(t('note.login'));
80665
80666           authEnter
80667               .append('a')
80668               .attr('target', '_blank')
80669               .call(svgIcon('#iD-icon-out-link', 'inline'))
80670               .append('span')
80671               .text(t('login'))
80672               .on('click.note-login', function() {
80673                   event.preventDefault();
80674                   osm.authenticate();
80675               });
80676
80677           authEnter
80678               .transition()
80679               .duration(200)
80680               .style('opacity', 1);
80681
80682
80683           var prose = detailSection.selectAll('.note-save-prose')
80684               .data(hasAuth ? [0] : []);
80685
80686           prose.exit()
80687               .remove();
80688
80689           prose = prose.enter()
80690               .append('p')
80691               .attr('class', 'note-save-prose')
80692               .text(t('note.upload_explanation'))
80693               .merge(prose);
80694
80695           osm.userDetails(function(err, user) {
80696               if (err) return;
80697
80698               var userLink = select(document.createElement('div'));
80699
80700               if (user.image_url) {
80701                   userLink
80702                       .append('img')
80703                       .attr('src', user.image_url)
80704                       .attr('class', 'icon pre-text user-icon');
80705               }
80706
80707               userLink
80708                   .append('a')
80709                   .attr('class', 'user-info')
80710                   .text(user.display_name)
80711                   .attr('href', osm.userURL(user.display_name))
80712                   .attr('tabindex', -1)
80713                   .attr('target', '_blank');
80714
80715               prose
80716                   .html(t('note.upload_explanation_with_user', { user: userLink.html() }));
80717           });
80718       }
80719
80720
80721       function noteSaveButtons(selection$$1) {
80722           var osm = services.osm;
80723           var hasAuth = osm && osm.authenticated();
80724
80725           var isSelected = (_note && _note.id === context.selectedNoteID());
80726           var buttonSection = selection$$1.selectAll('.buttons')
80727               .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
80728
80729           // exit
80730           buttonSection.exit()
80731               .remove();
80732
80733           // enter
80734           var buttonEnter = buttonSection.enter()
80735               .append('div')
80736               .attr('class', 'buttons');
80737
80738           if (_note.isNew()) {
80739               buttonEnter
80740                   .append('button')
80741                   .attr('class', 'button cancel-button secondary-action')
80742                   .text(t('confirm.cancel'));
80743
80744               buttonEnter
80745                   .append('button')
80746                   .attr('class', 'button save-button action')
80747                   .text(t('note.save'));
80748
80749           } else {
80750               buttonEnter
80751                   .append('button')
80752                   .attr('class', 'button status-button action');
80753
80754               buttonEnter
80755                   .append('button')
80756                   .attr('class', 'button comment-button action')
80757                   .text(t('note.comment'));
80758           }
80759
80760
80761           // update
80762           buttonSection = buttonSection
80763               .merge(buttonEnter);
80764
80765           buttonSection.select('.cancel-button')   // select and propagate data
80766               .on('click.cancel', clickCancel);
80767
80768           buttonSection.select('.save-button')     // select and propagate data
80769               .attr('disabled', isSaveDisabled)
80770               .on('click.save', clickSave);
80771
80772           buttonSection.select('.status-button')   // select and propagate data
80773               .attr('disabled', (hasAuth ? null : true))
80774               .text(function(d) {
80775                   var action = (d.status === 'open' ? 'close' : 'open');
80776                   var andComment = (d.newComment ? '_comment' : '');
80777                   return t('note.' + action + andComment);
80778               })
80779               .on('click.status', clickStatus);
80780
80781           buttonSection.select('.comment-button')   // select and propagate data
80782               .attr('disabled', isSaveDisabled)
80783               .on('click.comment', clickComment);
80784
80785
80786           function isSaveDisabled(d) {
80787               return (hasAuth && d.status === 'open' && d.newComment) ? null : true;
80788           }
80789       }
80790
80791
80792
80793       function clickCancel(d) {
80794           this.blur();    // avoid keeping focus on the button - #4641
80795           var osm = services.osm;
80796           if (osm) {
80797               osm.removeNote(d);
80798           }
80799           context.enter(modeBrowse(context));
80800           dispatch$$1.call('change');
80801       }
80802
80803
80804       function clickSave(d) {
80805           this.blur();    // avoid keeping focus on the button - #4641
80806           var osm = services.osm;
80807           if (osm) {
80808               osm.postNoteCreate(d, function(err, note) {
80809                   dispatch$$1.call('change', note);
80810               });
80811           }
80812       }
80813
80814
80815       function clickStatus(d) {
80816           this.blur();    // avoid keeping focus on the button - #4641
80817           var osm = services.osm;
80818           if (osm) {
80819               var setStatus = (d.status === 'open' ? 'closed' : 'open');
80820               osm.postNoteUpdate(d, setStatus, function(err, note) {
80821                   dispatch$$1.call('change', note);
80822               });
80823           }
80824       }
80825
80826       function clickComment(d) {
80827           this.blur();    // avoid keeping focus on the button - #4641
80828           var osm = services.osm;
80829           if (osm) {
80830               osm.postNoteUpdate(d, d.status, function(err, note) {
80831                   dispatch$$1.call('change', note);
80832               });
80833           }
80834       }
80835
80836
80837       noteEditor.note = function(_) {
80838           if (!arguments.length) return _note;
80839           _note = _;
80840           return noteEditor;
80841       };
80842
80843
80844       return utilRebind(noteEditor, dispatch$$1, 'on');
80845   }
80846
80847   function uiNoteHeader() {
80848       var _note;
80849
80850
80851       function noteHeader(selection) {
80852           var header = selection.selectAll('.note-header')
80853               .data(
80854                   (_note ? [_note] : []),
80855                   function(d) { return d.status + d.id; }
80856               );
80857
80858           header.exit()
80859               .remove();
80860
80861           var headerEnter = header.enter()
80862               .append('div')
80863               .attr('class', 'note-header');
80864
80865           var iconEnter = headerEnter
80866               .append('div')
80867               .attr('class', function(d) { return 'note-header-icon ' + d.status; })
80868               .classed('new', function(d) { return d.id < 0; });
80869
80870           iconEnter
80871               .append('div')
80872               .attr('class', 'preset-icon-28')
80873               .call(svgIcon('#iD-icon-note', 'note-fill'));
80874
80875           iconEnter.each(function(d) {
80876               var statusIcon = '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
80877               iconEnter
80878                   .append('div')
80879                   .attr('class', 'note-icon-annotation')
80880                   .call(svgIcon(statusIcon, 'note-annotation'));
80881           });
80882
80883           headerEnter
80884               .append('div')
80885               .attr('class', 'note-header-label')
80886               .text(function(d) {
80887                   if (_note.isNew()) { return t('note.new'); }
80888                   return t('note.note') + ' ' + d.id + ' ' +
80889                       (d.status === 'closed' ? t('note.closed') : '');
80890               });
80891       }
80892
80893
80894       noteHeader.note = function(_) {
80895           if (!arguments.length) return _note;
80896           _note = _;
80897           return noteHeader;
80898       };
80899
80900
80901       return noteHeader;
80902   }
80903
80904   function uiNoteReport() {
80905       var _note;
80906       var url = 'https://www.openstreetmap.org/reports/new?reportable_id=';
80907
80908       function noteReport(selection) {
80909
80910           if (!(_note instanceof osmNote)) return;
80911
80912           url += _note.id + '&reportable_type=Note';
80913
80914           var data = ((!_note || _note.isNew()) ? [] : [_note]);
80915           var link = selection.selectAll('.note-report')
80916               .data(data, function(d) { return d.id; });
80917
80918           // exit
80919           link.exit()
80920               .remove();
80921
80922           // enter
80923           var linkEnter = link.enter()
80924               .append('a')
80925               .attr('class', 'note-report')
80926               .attr('target', '_blank')
80927               .attr('href', url)
80928               .call(svgIcon('#iD-icon-out-link', 'inline'));
80929
80930           linkEnter
80931               .append('span')
80932               .text(t('note.report'));
80933       }
80934
80935
80936       noteReport.note = function(_) {
80937           if (!arguments.length) return _note;
80938           _note = _;
80939           return noteReport;
80940       };
80941
80942       return noteReport;
80943   }
80944
80945   function uiRadialMenu(context, operations) {
80946       var menu;
80947       var center = [0, 0];
80948       var tooltip;
80949
80950
80951       var radialMenu = function(selection$$1) {
80952           if (!operations.length) return;
80953
80954           selection$$1.node().parentNode.focus();
80955
80956           function click(operation) {
80957               event.stopPropagation();
80958               if (operation.disabled()) return;
80959               operation();
80960               radialMenu.close();
80961           }
80962
80963           menu = selection$$1
80964               .append('g')
80965               .attr('class', 'radial-menu')
80966               .attr('transform', 'translate(' + center + ')')
80967               .attr('opacity', 0);
80968
80969           menu
80970               .transition()
80971               .attr('opacity', 1);
80972
80973           var r = 50;
80974           var a = Math.PI / 4;
80975           var a0 = -Math.PI / 4;
80976           var a1 = a0 + (operations.length - 1) * a;
80977
80978           menu
80979               .append('path')
80980               .attr('class', 'radial-menu-background')
80981               .attr('d', 'M' + r * Math.sin(a0) + ',' +
80982                                r * Math.cos(a0) +
80983                         ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
80984                                (r * Math.sin(a1) + 1e-3) + ',' +
80985                                (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
80986               .attr('stroke-width', 50)
80987               .attr('stroke-linecap', 'round');
80988
80989           var button = menu.selectAll()
80990               .data(operations)
80991               .enter()
80992               .append('g')
80993               .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
80994               .classed('disabled', function(d) { return d.disabled(); })
80995               .attr('transform', function(d, i) {
80996                   return 'translate(' + geoVecFloor([
80997                           r * Math.sin(a0 + i * a),
80998                           r * Math.cos(a0 + i * a)]).join(',') + ')';
80999               });
81000
81001           button
81002               .append('circle')
81003               .attr('r', 15)
81004               .on('click', click)
81005               .on('mousedown', mousedown)
81006               .on('mouseover', mouseover)
81007               .on('mouseout', mouseout);
81008
81009           button
81010               .append('use')
81011               .attr('transform', 'translate(-10,-10)')
81012               .attr('width', '20')
81013               .attr('height', '20')
81014               .attr('xlink:href', function(d) { return '#iD-operation-' + d.id; });
81015
81016           tooltip = select(document.body)
81017               .append('div')
81018               .attr('class', 'tooltip-inner radial-menu-tooltip');
81019
81020           function mousedown() {
81021               event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
81022           }
81023
81024           function mouseover(d, i) {
81025               var rect = context.surfaceRect();
81026               var angle = a0 + i * a;
81027               var top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px';
81028               var left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px';
81029               var bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px';
81030               var right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
81031
81032               tooltip
81033                   .style('top', null)
81034                   .style('left', null)
81035                   .style('bottom', null)
81036                   .style('right', null)
81037                   .style('display', 'block')
81038                   .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
81039
81040               if (i === 0) {
81041                   tooltip
81042                       .style('right', right)
81043                       .style('top', top);
81044               } else if (i >= 4) {
81045                   tooltip
81046                       .style('left', left)
81047                       .style('bottom', bottom);
81048               } else {
81049                   tooltip
81050                       .style('left', left)
81051                       .style('top', top);
81052               }
81053           }
81054
81055           function mouseout() {
81056               tooltip.style('display', 'none');
81057           }
81058       };
81059
81060
81061       radialMenu.close = function() {
81062           if (menu) {
81063               menu
81064                   .style('pointer-events', 'none')
81065                   .transition()
81066                   .attr('opacity', 0)
81067                   .remove();
81068           }
81069
81070           if (tooltip) {
81071               tooltip.remove();
81072           }
81073       };
81074
81075
81076       radialMenu.center = function(_) {
81077           if (!arguments.length) return center;
81078           center = _;
81079           return radialMenu;
81080       };
81081
81082
81083       return radialMenu;
81084   }
81085
81086   function uiSelectionList(context, selectedIDs) {
81087
81088       function selectEntity(entity) {
81089           context.enter(modeSelect(context, [entity.id]));
81090       }
81091
81092
81093       function deselectEntity(entity) {
81094           event.stopPropagation();
81095           var index = selectedIDs.indexOf(entity.id);
81096           if (index > -1) {
81097               selectedIDs.splice(index, 1);
81098           }
81099           context.enter(modeSelect(context, selectedIDs));
81100       }
81101
81102
81103       function selectionList(selection$$1) {
81104           selection$$1.classed('selection-list-pane', true);
81105
81106           var header = selection$$1
81107               .append('div')
81108               .attr('class', 'header fillL cf');
81109
81110           header
81111               .append('h3')
81112               .text(t('inspector.multiselect'));
81113
81114           var listWrap = selection$$1
81115               .append('div')
81116               .attr('class', 'inspector-body');
81117
81118           var list = listWrap
81119               .append('div')
81120               .attr('class', 'feature-list cf');
81121
81122           context.history().on('change.selection-list', drawList);
81123           drawList();
81124
81125
81126           function drawList() {
81127               var entities = selectedIDs
81128                   .map(function(id) { return context.hasEntity(id); })
81129                   .filter(function(entity) { return entity; });
81130
81131               var items = list.selectAll('.feature-list-item')
81132                   .data(entities, osmEntity$$1.key);
81133
81134               items.exit()
81135                   .remove();
81136
81137               // Enter
81138               var enter = items.enter()
81139                   .append('div')
81140                   .attr('class', 'feature-list-item')
81141                   .on('click', selectEntity);
81142
81143               enter
81144                   .each(function(d) {
81145                   // highlight the feature in the map while hovering on the list item
81146                   select(this).on('mouseover', function() {
81147                       utilHighlightEntity(d.id, true, context);
81148                   });
81149                   select(this).on('mouseout', function() {
81150                       utilHighlightEntity(d.id, false, context);
81151                   });
81152               });
81153
81154               var label = enter
81155                   .append('button')
81156                   .attr('class', 'label');
81157
81158               enter
81159                   .append('button')
81160                   .attr('class', 'close')
81161                   .on('click', deselectEntity)
81162                   .call(svgIcon('#iD-icon-close'));
81163
81164               label
81165                   .append('span')
81166                   .attr('class', 'entity-geom-icon')
81167                   .call(svgIcon('', 'pre-text'));
81168
81169               label
81170                   .append('span')
81171                   .attr('class', 'entity-type');
81172
81173               label
81174                   .append('span')
81175                   .attr('class', 'entity-name');
81176
81177               // Update
81178               items = items.merge(enter);
81179
81180               items.selectAll('.entity-geom-icon use')
81181                   .attr('href', function() {
81182                       var entity = this.parentNode.parentNode.__data__;
81183                       return '#iD-icon-' + context.geometry(entity.id);
81184                   });
81185
81186               items.selectAll('.entity-type')
81187                   .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
81188
81189               items.selectAll('.entity-name')
81190                   .text(function(entity) { return utilDisplayName(entity); });
81191           }
81192       }
81193
81194       return selectionList;
81195   }
81196
81197   function uiSourceSwitch(context) {
81198       var keys;
81199
81200
81201       function click() {
81202           event.preventDefault();
81203
81204           var osm = context.connection();
81205           if (!osm) return;
81206
81207           if (context.inIntro()) return;
81208
81209           if (context.history().hasChanges() &&
81210               !window.confirm(t('source_switch.lose_changes'))) return;
81211
81212           var isLive = select(this)
81213               .classed('live');
81214
81215           isLive = !isLive;
81216           context.enter(modeBrowse(context));
81217           context.history().clearSaved();          // remove saved history
81218           context.flush();                         // remove stored data
81219
81220           select(this)
81221               .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
81222               .classed('live', isLive);
81223
81224           osm.switch(isLive ? keys[0] : keys[1]);  // switch connection (warning: dispatches 'change' event)
81225       }
81226
81227       var sourceSwitch = function(selection$$1) {
81228           selection$$1
81229               .append('a')
81230               .attr('href', '#')
81231               .text(t('source_switch.live'))
81232               .classed('live', true)
81233               .attr('tabindex', -1)
81234               .on('click', click);
81235       };
81236
81237
81238       sourceSwitch.keys = function(_) {
81239           if (!arguments.length) return keys;
81240           keys = _;
81241           return sourceSwitch;
81242       };
81243
81244
81245       return sourceSwitch;
81246   }
81247
81248   function uiSuccess$$1(context) {
81249       var MAXEVENTS = 2;
81250
81251       // All else being equal, rank more "social" communities higher
81252       // (anything not in this list receives no adjustment)
81253       var COMMUNITYRANK = {
81254           'meetup': +5,
81255           'slack': +4,
81256           'facebook': +3,
81257           'reddit': +2,
81258           'forum': -2,
81259           'mailinglist': -3,
81260           'irc': -4
81261       };
81262
81263       var detected = utilDetect();
81264       var dispatch$$1 = dispatch('cancel');
81265       var _changeset;
81266       var _location;
81267
81268
81269       // string-to-date parsing in JavaScript is weird
81270       function parseEventDate(when) {
81271           if (!when) return;
81272
81273           var raw = when.trim();
81274           if (!raw) return;
81275
81276           if (!/Z$/.test(raw)) {    // if no trailing 'Z', add one
81277               raw += 'Z';           // this forces date to be parsed as a UTC date
81278           }
81279
81280           var parsed = new Date(raw);
81281           return new Date(parsed.toUTCString().substr(0, 25));  // convert to local timezone
81282       }
81283
81284
81285       function success(selection$$1) {
81286           var header = selection$$1
81287               .append('div')
81288               .attr('class', 'header fillL');
81289
81290           header
81291               .append('button')
81292               .attr('class', 'fr')
81293               .on('click', function() { dispatch$$1.call('cancel'); })
81294               .call(svgIcon('#iD-icon-close'));
81295
81296           header
81297               .append('h3')
81298               .text(t('success.just_edited'));
81299
81300           var body = selection$$1
81301               .append('div')
81302               .attr('class', 'body save-success fillL');
81303
81304           var summary = body
81305               .append('div')
81306               .attr('class', 'save-summary');
81307
81308           summary
81309               .append('h3')
81310               .text(t('success.thank_you' + (_location ? '_location' : ''), { where: _location }));
81311
81312           summary
81313               .append('p')
81314               .text(t('success.help_html'))
81315               .append('a')
81316               .attr('class', 'link-out')
81317               .attr('target', '_blank')
81318               .attr('tabindex', -1)
81319               .attr('href', t('success.help_link_url'))
81320               .call(svgIcon('#iD-icon-out-link', 'inline'))
81321               .append('span')
81322               .text(t('success.help_link_text'));
81323
81324           var osm = context.connection();
81325           if (!osm) return;
81326
81327           var changesetURL = osm.changesetURL(_changeset.id);
81328
81329           var table = summary
81330               .append('table')
81331               .attr('class', 'summary-table');
81332
81333           var row = table
81334               .append('tr')
81335               .attr('class', 'summary-row');
81336
81337           row
81338               .append('td')
81339               .attr('class', 'cell-icon summary-icon')
81340               .append('a')
81341               .attr('target', '_blank')
81342               .attr('href', changesetURL)
81343               .append('svg')
81344               .attr('class', 'logo-small')
81345               .append('use')
81346               .attr('xlink:href', '#iD-logo-osm');
81347
81348           var summaryDetail = row
81349               .append('td')
81350               .attr('class', 'cell-detail summary-detail');
81351
81352           summaryDetail
81353               .append('a')
81354               .attr('class', 'cell-detail summary-view-on-osm')
81355               .attr('target', '_blank')
81356               .attr('href', changesetURL)
81357               .text(t('success.view_on_osm'));
81358
81359           summaryDetail
81360               .append('div')
81361               .text(t('success.changeset_id', { changeset_id: _changeset.id }));
81362
81363
81364           // Gather community polygon IDs intersecting the map..
81365           var matchFeatures = data.community.query(context.map().center(), true) || [];
81366           var matchIDs = matchFeatures.map(function(feature) { return feature.id; });
81367
81368           // Gather community resources that are either global or match a polygon.
81369           var matchResources = filter(data.community.resources, function(v) {
81370               return !v.featureId || matchIDs.indexOf(v.featureId) !== -1;
81371           });
81372
81373           if (matchResources.length) {
81374               // sort by size ascending, then by community rank
81375               matchResources.sort(function(a, b) {
81376                   var aSize = Infinity;
81377                   var bSize = Infinity;
81378                   var aRank = COMMUNITYRANK[a.type] || 0;
81379                   var bRank = COMMUNITYRANK[b.type] || 0;
81380
81381                   if (a.featureId) {
81382                       aSize = data.community.features[a.featureId].properties.area;
81383                   }
81384                   if (b.featureId) {
81385                       bSize = data.community.features[b.featureId].properties.area;
81386                   }
81387
81388                   return aSize < bSize ? -1 : aSize > bSize ? 1 : bRank - aRank;
81389               });
81390
81391               body
81392                   .call(showCommunityLinks, matchResources);
81393           }
81394       }
81395
81396
81397       function showCommunityLinks(selection$$1, matchResources) {
81398           var communityLinks = selection$$1
81399               .append('div')
81400               .attr('class', 'save-communityLinks');
81401
81402           communityLinks
81403               .append('h3')
81404               .text(t('success.like_osm'));
81405
81406           var table = communityLinks
81407               .append('table')
81408               .attr('class', 'community-table');
81409
81410           var row = table.selectAll('.community-row')
81411               .data(matchResources);
81412
81413           var rowEnter = row.enter()
81414               .append('tr')
81415               .attr('class', 'community-row');
81416
81417           rowEnter
81418               .append('td')
81419               .attr('class', 'cell-icon community-icon')
81420               .append('a')
81421               .attr('target', '_blank')
81422               .attr('href', function(d) { return d.url; })
81423               .append('svg')
81424               .attr('class', 'logo-small')
81425               .append('use')
81426               .attr('xlink:href', function(d) { return '#community-' + d.type; });
81427
81428           var communityDetail = rowEnter
81429               .append('td')
81430               .attr('class', 'cell-detail community-detail');
81431
81432           communityDetail
81433               .each(showCommunityDetails);
81434
81435           communityLinks
81436               .append('div')
81437               .attr('class', 'community-missing')
81438               .text(t('success.missing'))
81439               .append('a')
81440               .attr('class', 'link-out')
81441               .attr('target', '_blank')
81442               .attr('tabindex', -1)
81443               .call(svgIcon('#iD-icon-out-link', 'inline'))
81444               .attr('href', 'https://github.com/osmlab/osm-community-index/issues')
81445               .append('span')
81446               .text(t('success.tell_us'));
81447       }
81448
81449
81450       function showCommunityDetails(d) {
81451           var selection$$1 = select(this);
81452           var communityID = d.id;
81453           var replacements = {
81454               url: linkify(d.url),
81455               signupUrl: linkify(d.signupUrl || d.url)
81456           };
81457
81458           selection$$1
81459               .append('div')
81460               .attr('class', 'community-name')
81461               .append('a')
81462               .attr('target', '_blank')
81463               .attr('href', d.url)
81464               .text(t('community.' + d.id + '.name'));
81465
81466           var descriptionHTML = t('community.' + d.id + '.description', replacements);
81467
81468           if (d.type === 'reddit') {   // linkify subreddits  #4997
81469               descriptionHTML = descriptionHTML
81470                   .replace(/(\/r\/\w*\/*)/i, function(match) { return linkify(d.url, match); });
81471           }
81472
81473           selection$$1
81474               .append('div')
81475               .attr('class', 'community-description')
81476               .html(descriptionHTML);
81477
81478           if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
81479               selection$$1
81480                   .append('div')
81481                   .call(uiDisclosure(context, 'community-more-' + d.id, false)
81482                       .expanded(false)
81483                       .updatePreference(false)
81484                       .title(t('success.more'))
81485                       .content(showMore)
81486                   );
81487           }
81488
81489           var nextEvents = (d.events || [])
81490               .map(function(event$$1) {
81491                   event$$1.date = parseEventDate(event$$1.when);
81492                   return event$$1;
81493               })
81494               .filter(function(event$$1) {               // date is valid and future (or today)
81495                   var t$$1 = event$$1.date.getTime();
81496                   var now = (new Date()).setHours(0,0,0,0);
81497                   return !isNaN(t$$1) && t$$1 >= now;
81498               })
81499               .sort(function(a, b) {                  // sort by date ascending
81500                   return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
81501               })
81502               .slice(0, MAXEVENTS);                   // limit number of events shown
81503
81504           if (nextEvents.length) {
81505               selection$$1
81506                   .append('div')
81507                   .call(uiDisclosure(context, 'community-events-' + d.id, false)
81508                       .expanded(false)
81509                       .updatePreference(false)
81510                       .title(t('success.events'))
81511                       .content(showNextEvents)
81512                   )
81513                   .select('.hide-toggle')
81514                   .append('span')
81515                   .attr('class', 'badge-text')
81516                   .text(nextEvents.length);
81517           }
81518
81519
81520           function showMore(selection$$1) {
81521               var more = selection$$1
81522                   .append('div')
81523                   .attr('class', 'community-more');
81524
81525               if (d.extendedDescription) {
81526                   more
81527                       .append('div')
81528                       .attr('class', 'community-extended-description')
81529                       .html(t('community.' + d.id + '.extendedDescription', replacements));
81530               }
81531
81532               if (d.languageCodes && d.languageCodes.length) {
81533                   more
81534                       .append('div')
81535                       .attr('class', 'community-languages')
81536                       .text(t('success.languages', { languages: d.languageCodes.join(', ') }));
81537               }
81538           }
81539
81540
81541           function showNextEvents(selection$$1) {
81542               var events = selection$$1
81543                   .append('div')
81544                   .attr('class', 'community-events');
81545
81546               var item = events.selectAll('.community-event')
81547                   .data(nextEvents);
81548
81549               var itemEnter = item.enter()
81550                   .append('div')
81551                   .attr('class', 'community-event');
81552
81553               itemEnter
81554                   .append('div')
81555                   .attr('class', 'community-event-name')
81556                   .append('a')
81557                   .attr('target', '_blank')
81558                   .attr('href', function(d) { return d.url; })
81559                   .text(function(d) {
81560                       var name = d.name;
81561                       if (d.i18n && d.id) {
81562                           name = t('community.' + communityID + '.events.' + d.id + '.name', { default: name });
81563                       }
81564                       return name;
81565                   });
81566
81567               itemEnter
81568                   .append('div')
81569                   .attr('class', 'community-event-when')
81570                   .text(function(d) {
81571                       var options = {
81572                           weekday: 'short', day: 'numeric', month: 'short', year: 'numeric'
81573                       };
81574                       if (d.date.getHours() || d.date.getMinutes()) {   // include time if it has one
81575                           options.hour = 'numeric';
81576                           options.minute = 'numeric';
81577                       }
81578                       return d.date.toLocaleString(detected.locale, options);
81579                   });
81580
81581               itemEnter
81582                   .append('div')
81583                   .attr('class', 'community-event-where')
81584                   .text(function(d) {
81585                       var where = d.where;
81586                       if (d.i18n && d.id) {
81587                           where = t('community.' + communityID + '.events.' + d.id + '.where', { default: where });
81588                       }
81589                       return where;
81590                   });
81591
81592               itemEnter
81593                   .append('div')
81594                   .attr('class', 'community-event-description')
81595                   .text(function(d) {
81596                       var description = d.description;
81597                       if (d.i18n && d.id) {
81598                           description = t('community.' + communityID + '.events.' + d.id + '.description', { default: description });
81599                       }
81600                       return description;
81601                   });
81602           }
81603
81604
81605           function linkify(url, text) {
81606               text = text || url;
81607               return '<a target="_blank" href="' + url + '">' + text + '</a>';
81608           }
81609       }
81610
81611
81612       success.changeset = function(_) {
81613           if (!arguments.length) return _changeset;
81614           _changeset = _;
81615           return success;
81616       };
81617
81618
81619       success.location = function(_) {
81620           if (!arguments.length) return _location;
81621           _location = _;
81622           return success;
81623       };
81624
81625
81626       return utilRebind(success, dispatch$$1, 'on');
81627   }
81628
81629   function coreHistory(context) {
81630       var imageryUsed = ['Bing'];
81631       var dispatch$$1 = dispatch('change', 'undone', 'redone');
81632       var lock = utilSessionMutex('lock');
81633       var duration = 150;
81634       var _checkpoints = {};
81635       var _stack;
81636       var _index;
81637       var _tree;
81638
81639
81640       // internal _act, accepts list of actions and eased time
81641       function _act(actions, t) {
81642           actions = Array.prototype.slice.call(actions);
81643
81644           var annotation;
81645           if (!isFunction(actions[actions.length - 1])) {
81646               annotation = actions.pop();
81647           }
81648
81649           _stack[_index].transform = context.projection.transform();
81650           _stack[_index].selectedIDs = context.selectedIDs();
81651
81652           var graph = _stack[_index].graph;
81653           for (var i = 0; i < actions.length; i++) {
81654               graph = actions[i](graph, t);
81655           }
81656
81657           return {
81658               graph: graph,
81659               annotation: annotation,
81660               imageryUsed: imageryUsed
81661           };
81662       }
81663
81664
81665       // internal _perform with eased time
81666       function _perform(args, t) {
81667           var previous = _stack[_index].graph;
81668           _stack = _stack.slice(0, _index + 1);
81669           _stack.push(_act(args, t));
81670           _index++;
81671           return change(previous);
81672       }
81673
81674
81675       // internal _replace with eased time
81676       function _replace(args, t) {
81677           var previous = _stack[_index].graph;
81678           // assert(_index == _stack.length - 1)
81679           _stack[_index] = _act(args, t);
81680           return change(previous);
81681       }
81682
81683
81684       // internal _overwrite with eased time
81685       function _overwrite(args, t) {
81686           var previous = _stack[_index].graph;
81687           if (_index > 0) {
81688               _index--;
81689               _stack.pop();
81690           }
81691           _stack = _stack.slice(0, _index + 1);
81692           _stack.push(_act(args, t));
81693           _index++;
81694           return change(previous);
81695       }
81696
81697
81698       // determine diffrence and dispatch a change event
81699       function change(previous) {
81700           var difference$$1 = coreDifference(previous, history.graph());
81701           dispatch$$1.call('change', this, difference$$1);
81702           return difference$$1;
81703       }
81704
81705
81706       // iD uses namespaced keys so multiple installations do not conflict
81707       function getKey(n) {
81708           return 'iD_' + window.location.origin + '_' + n;
81709       }
81710
81711
81712       var history = {
81713
81714           graph: function() {
81715               return _stack[_index].graph;
81716           },
81717
81718
81719           base: function() {
81720               return _stack[0].graph;
81721           },
81722
81723
81724           merge: function(entities, extent) {
81725               _stack[0].graph.rebase(entities, map$3(_stack, 'graph'), false);
81726               _tree.rebase(entities, false);
81727
81728               dispatch$$1.call('change', this, undefined, extent);
81729           },
81730
81731
81732           perform: function() {
81733               // complete any transition already in progress
81734               select(document).interrupt('history.perform');
81735
81736               var transitionable = false;
81737               var action0 = arguments[0];
81738
81739               if (arguments.length === 1 ||
81740                   arguments.length === 2 && !isFunction(arguments[1])) {
81741                   transitionable = !!action0.transitionable;
81742               }
81743
81744               if (transitionable) {
81745                   var origArguments = arguments;
81746                   select(document)
81747                       .transition('history.perform')
81748                       .duration(duration)
81749                       .ease(linear$1)
81750                       .tween('history.tween', function() {
81751                           return function(t) {
81752                               if (t < 1) _overwrite([action0], t);
81753                           };
81754                       })
81755                       .on('start', function() {
81756                           _perform([action0], 0);
81757                       })
81758                       .on('end interrupt', function() {
81759                           _overwrite(origArguments, 1);
81760                       });
81761
81762               } else {
81763                   return _perform(arguments);
81764               }
81765           },
81766
81767
81768           replace: function() {
81769               select(document).interrupt('history.perform');
81770               return _replace(arguments, 1);
81771           },
81772
81773
81774           // Same as calling pop and then perform
81775           overwrite: function() {
81776               select(document).interrupt('history.perform');
81777               return _overwrite(arguments, 1);
81778           },
81779
81780
81781           pop: function(n) {
81782               select(document).interrupt('history.perform');
81783
81784               var previous = _stack[_index].graph;
81785               if (isNaN(+n) || +n < 0) {
81786                   n = 1;
81787               }
81788               while (n-- > 0 && _index > 0) {
81789                   _index--;
81790                   _stack.pop();
81791               }
81792               return change(previous);
81793           },
81794
81795
81796           // Back to the previous annotated state or _index = 0.
81797           undo: function() {
81798               select(document).interrupt('history.perform');
81799
81800               var previous = _stack[_index].graph;
81801               while (_index > 0) {
81802                   _index--;
81803                   if (_stack[_index].annotation) break;
81804               }
81805
81806               dispatch$$1.call('undone', this, _stack[_index]);
81807               return change(previous);
81808           },
81809
81810
81811           // Forward to the next annotated state.
81812           redo: function() {
81813               select(document).interrupt('history.perform');
81814
81815               var previous = _stack[_index].graph;
81816               var tryIndex = _index;
81817               while (tryIndex < _stack.length - 1) {
81818                   tryIndex++;
81819                   if (_stack[tryIndex].annotation) {
81820                       _index = tryIndex;
81821                       dispatch$$1.call('redone', this, _stack[_index]);
81822                       break;
81823                   }
81824               }
81825
81826               return change(previous);
81827           },
81828
81829
81830           undoAnnotation: function() {
81831               var i = _index;
81832               while (i >= 0) {
81833                   if (_stack[i].annotation) return _stack[i].annotation;
81834                   i--;
81835               }
81836           },
81837
81838
81839           redoAnnotation: function() {
81840               var i = _index + 1;
81841               while (i <= _stack.length - 1) {
81842                   if (_stack[i].annotation) return _stack[i].annotation;
81843                   i++;
81844               }
81845           },
81846
81847
81848           intersects: function(extent) {
81849               return _tree.intersects(extent, _stack[_index].graph);
81850           },
81851
81852
81853           difference: function() {
81854               var base = _stack[0].graph;
81855               var head = _stack[_index].graph;
81856               return coreDifference(base, head);
81857           },
81858
81859
81860           changes: function(action) {
81861               var base = _stack[0].graph;
81862               var head = _stack[_index].graph;
81863
81864               if (action) {
81865                   head = action(head);
81866               }
81867
81868               var difference$$1 = coreDifference(base, head);
81869
81870               return {
81871                   modified: difference$$1.modified(),
81872                   created: difference$$1.created(),
81873                   deleted: difference$$1.deleted()
81874               };
81875           },
81876
81877
81878           validate: function(changes) {
81879               return flatten(
81880                   map$3(Validations, function(fn) { return fn()(changes, _stack[_index].graph); })
81881               );
81882           },
81883
81884
81885           hasChanges: function() {
81886               return this.difference().length() > 0;
81887           },
81888
81889
81890           imageryUsed: function(sources) {
81891               if (sources) {
81892                   imageryUsed = sources;
81893                   return history;
81894               } else {
81895                   var arr = map$3(_stack.slice(1, _index + 1), 'imageryUsed');
81896                   return without(uniq(flatten(arr)), 'Custom');
81897               }
81898           },
81899
81900
81901           // save the current history state
81902           checkpoint: function(key) {
81903               _checkpoints[key] = {
81904                   stack: cloneDeep(_stack),
81905                   index: _index
81906               };
81907               return history;
81908           },
81909
81910
81911           // restore history state to a given checkpoint or reset completely
81912           reset: function(key) {
81913               if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
81914                   _stack = cloneDeep(_checkpoints[key].stack);
81915                   _index = _checkpoints[key].index;
81916               } else {
81917                   _stack = [{graph: coreGraph$$1()}];
81918                   _index = 0;
81919                   _tree = coreTree(_stack[0].graph);
81920                   _checkpoints = {};
81921               }
81922               dispatch$$1.call('change');
81923               return history;
81924           },
81925
81926
81927           toIntroGraph: function() {
81928               var nextId = { n: 0, r: 0, w: 0 };
81929               var permIds = {};
81930               var graph = this.graph();
81931               var baseEntities = {};
81932
81933               // clone base entities..
81934               forEach(graph.base().entities, function(entity) {
81935                   var copy = cloneDeepWith(entity, customizer);
81936                   baseEntities[copy.id] = copy;
81937               });
81938
81939               // replace base entities with head entities..
81940               forEach(graph.entities, function(entity, id) {
81941                   if (entity) {
81942                       var copy = cloneDeepWith(entity, customizer);
81943                       baseEntities[copy.id] = copy;
81944                   } else {
81945                       delete baseEntities[id];
81946                   }
81947               });
81948
81949               // swap temporary for permanent ids..
81950               forEach(baseEntities, function(entity) {
81951                   if (Array.isArray(entity.nodes)) {
81952                       entity.nodes = entity.nodes.map(function(node) {
81953                           return permIds[node] || node;
81954                       });
81955                   }
81956                   if (Array.isArray(entity.members)) {
81957                       entity.members = entity.members.map(function(member) {
81958                           member.id = permIds[member.id] || member.id;
81959                           return member;
81960                       });
81961                   }
81962               });
81963
81964               return JSON.stringify({ dataIntroGraph: baseEntities });
81965
81966
81967               function customizer(src) {
81968                   var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
81969                   if (isEmpty(copy.tags)) {
81970                       delete copy.tags;
81971                   }
81972
81973                   if (Array.isArray(copy.loc)) {
81974                       copy.loc[0] = +copy.loc[0].toFixed(6);
81975                       copy.loc[1] = +copy.loc[1].toFixed(6);
81976                   }
81977
81978                   var match = src.id.match(/([nrw])-\d*/);  // temporary id
81979                   if (match !== null) {
81980                       var nrw = match[1], permId;
81981                       do { permId = nrw + (++nextId[nrw]); }
81982                       while (baseEntities.hasOwnProperty(permId));
81983
81984                       copy.id = permIds[src.id] = permId;
81985                   }
81986                   return copy;
81987               }
81988           },
81989
81990
81991           toJSON: function() {
81992               if (!this.hasChanges()) return;
81993
81994               var allEntities = {};
81995               var baseEntities = {};
81996               var base = _stack[0];
81997
81998               var s = _stack.map(function(i) {
81999                   var modified = [], deleted = [];
82000
82001                   forEach(i.graph.entities, function(entity, id) {
82002                       if (entity) {
82003                           var key = osmEntity$$1.key(entity);
82004                           allEntities[key] = entity;
82005                           modified.push(key);
82006                       } else {
82007                           deleted.push(id);
82008                       }
82009
82010                       // make sure that the originals of changed or deleted entities get merged
82011                       // into the base of the _stack after restoring the data from JSON.
82012                       if (id in base.graph.entities) {
82013                           baseEntities[id] = base.graph.entities[id];
82014                       }
82015                       // get originals of parent entities too
82016                       forEach(base.graph._parentWays[id], function(parentId) {
82017                           if (parentId in base.graph.entities) {
82018                               baseEntities[parentId] = base.graph.entities[parentId];
82019                           }
82020                       });
82021                   });
82022
82023                   var x = {};
82024
82025                   if (modified.length) x.modified = modified;
82026                   if (deleted.length) x.deleted = deleted;
82027                   if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
82028                   if (i.annotation) x.annotation = i.annotation;
82029
82030                   return x;
82031               });
82032
82033               return JSON.stringify({
82034                   version: 3,
82035                   entities: values$1(allEntities),
82036                   baseEntities: values$1(baseEntities),
82037                   stack: s,
82038                   nextIDs: osmEntity$$1.id.next,
82039                   index: _index
82040               });
82041           },
82042
82043
82044           fromJSON: function(json, loadChildNodes) {
82045               var h = JSON.parse(json);
82046               var loadComplete = true;
82047
82048               osmEntity$$1.id.next = h.nextIDs;
82049               _index = h.index;
82050
82051               if (h.version === 2 || h.version === 3) {
82052                   var allEntities = {};
82053
82054                   h.entities.forEach(function(entity) {
82055                       allEntities[osmEntity$$1.key(entity)] = osmEntity$$1(entity);
82056                   });
82057
82058                   if (h.version === 3) {
82059                       // This merges originals for changed entities into the base of
82060                       // the _stack even if the current _stack doesn't have them (for
82061                       // example when iD has been restarted in a different region)
82062                       var baseEntities = h.baseEntities.map(function(d) { return osmEntity$$1(d); });
82063                       _stack[0].graph.rebase(baseEntities, map$3(_stack, 'graph'), true);
82064                       _tree.rebase(baseEntities, true);
82065
82066                       // When we restore a modified way, we also need to fetch any missing
82067                       // childnodes that would normally have been downloaded with it.. #2142
82068                       if (loadChildNodes) {
82069                           var osm = context.connection();
82070                           var nodes = flatten(uniq(map$3(filter(baseEntities, { type: 'way' }), 'nodes')));
82071                           var missing = reject(nodes, function(n) { return _stack[0].graph.hasEntity(n); });
82072
82073                           if (!isEmpty(missing) && osm) {
82074                               loadComplete = false;
82075                               context.redrawEnable(false);
82076
82077                               var loading = uiLoading(context).blocking(true);
82078                               context.container().call(loading);
82079
82080                               var childNodesLoaded = function(err, result) {
82081                                   if (!err) {
82082                                       var visible = groupBy(result.data, 'visible');
82083                                       if (!isEmpty(visible.true)) {
82084                                           missing = difference(missing, map$3(visible.true, 'id'));
82085                                           _stack[0].graph.rebase(visible.true, map$3(_stack, 'graph'), true);
82086                                           _tree.rebase(visible.true, true);
82087                                       }
82088
82089                                       // fetch older versions of nodes that were deleted..
82090                                       forEach(visible.false, function(entity) {
82091                                           osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
82092                                       });
82093                                   }
82094
82095                                   if (err || isEmpty(missing)) {
82096                                       loading.close();
82097                                       context.redrawEnable(true);
82098                                       dispatch$$1.call('change');
82099                                   }
82100                               };
82101
82102                               osm.loadMultiple(missing, childNodesLoaded);
82103                           }
82104                       }
82105                   }
82106
82107                   _stack = h.stack.map(function(d) {
82108                       var entities = {}, entity;
82109
82110                       if (d.modified) {
82111                           d.modified.forEach(function(key) {
82112                               entity = allEntities[key];
82113                               entities[entity.id] = entity;
82114                           });
82115                       }
82116
82117                       if (d.deleted) {
82118                           d.deleted.forEach(function(id) {
82119                               entities[id] = undefined;
82120                           });
82121                       }
82122
82123                       return {
82124                           graph: coreGraph$$1(_stack[0].graph).load(entities),
82125                           annotation: d.annotation,
82126                           imageryUsed: d.imageryUsed
82127                       };
82128                   });
82129
82130               } else { // original version
82131                   _stack = h.stack.map(function(d) {
82132                       var entities = {};
82133
82134                       for (var i in d.entities) {
82135                           var entity = d.entities[i];
82136                           entities[i] = entity === 'undefined' ? undefined : osmEntity$$1(entity);
82137                       }
82138
82139                       d.graph = coreGraph$$1(_stack[0].graph).load(entities);
82140                       return d;
82141                   });
82142               }
82143
82144               if (loadComplete) {
82145                   dispatch$$1.call('change');
82146               }
82147
82148               return history;
82149           },
82150
82151
82152           save: function() {
82153               if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
82154               return history;
82155           },
82156
82157
82158           clearSaved: function() {
82159               context.debouncedSave.cancel();
82160               if (lock.locked()) context.storage(getKey('saved_history'), null);
82161               return history;
82162           },
82163
82164
82165           lock: function() {
82166               return lock.lock();
82167           },
82168
82169
82170           unlock: function() {
82171               lock.unlock();
82172           },
82173
82174
82175           // is iD not open in another window and it detects that
82176           // there's a history stored in localStorage that's recoverable?
82177           restorableChanges: function() {
82178               return lock.locked() && !!context.storage(getKey('saved_history'));
82179           },
82180
82181
82182           // load history from a version stored in localStorage
82183           restore: function() {
82184               if (!lock.locked()) return;
82185
82186               var json = context.storage(getKey('saved_history'));
82187               if (json) history.fromJSON(json, true);
82188           },
82189
82190
82191           _getKey: getKey
82192
82193       };
82194
82195
82196       history.reset();
82197
82198       return utilRebind(history, dispatch$$1, 'on');
82199   }
82200
82201   /** Used to store function metadata. */
82202   var metaMap = WeakMap && new WeakMap;
82203
82204   /**
82205    * The base implementation of `setData` without support for hot loop shorting.
82206    *
82207    * @private
82208    * @param {Function} func The function to associate metadata with.
82209    * @param {*} data The metadata.
82210    * @returns {Function} Returns `func`.
82211    */
82212   var baseSetData = !metaMap ? identity$8 : function(func, data) {
82213     metaMap.set(func, data);
82214     return func;
82215   };
82216
82217   /**
82218    * Creates a function that produces an instance of `Ctor` regardless of
82219    * whether it was invoked as part of a `new` expression or by `call` or `apply`.
82220    *
82221    * @private
82222    * @param {Function} Ctor The constructor to wrap.
82223    * @returns {Function} Returns the new wrapped function.
82224    */
82225   function createCtor(Ctor) {
82226     return function() {
82227       // Use a `switch` statement to work with class constructors. See
82228       // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
82229       // for more details.
82230       var args = arguments;
82231       switch (args.length) {
82232         case 0: return new Ctor;
82233         case 1: return new Ctor(args[0]);
82234         case 2: return new Ctor(args[0], args[1]);
82235         case 3: return new Ctor(args[0], args[1], args[2]);
82236         case 4: return new Ctor(args[0], args[1], args[2], args[3]);
82237         case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
82238         case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
82239         case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
82240       }
82241       var thisBinding = baseCreate(Ctor.prototype),
82242           result = Ctor.apply(thisBinding, args);
82243
82244       // Mimic the constructor's `return` behavior.
82245       // See https://es5.github.io/#x13.2.2 for more details.
82246       return isObject(result) ? result : thisBinding;
82247     };
82248   }
82249
82250   /** Used to compose bitmasks for function metadata. */
82251   var WRAP_BIND_FLAG = 1;
82252
82253   /**
82254    * Creates a function that wraps `func` to invoke it with the optional `this`
82255    * binding of `thisArg`.
82256    *
82257    * @private
82258    * @param {Function} func The function to wrap.
82259    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
82260    * @param {*} [thisArg] The `this` binding of `func`.
82261    * @returns {Function} Returns the new wrapped function.
82262    */
82263   function createBind(func, bitmask, thisArg) {
82264     var isBind = bitmask & WRAP_BIND_FLAG,
82265         Ctor = createCtor(func);
82266
82267     function wrapper() {
82268       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
82269       return fn.apply(isBind ? thisArg : this, arguments);
82270     }
82271     return wrapper;
82272   }
82273
82274   /* Built-in method references for those with the same name as other `lodash` methods. */
82275   var nativeMax$5 = Math.max;
82276
82277   /**
82278    * Creates an array that is the composition of partially applied arguments,
82279    * placeholders, and provided arguments into a single array of arguments.
82280    *
82281    * @private
82282    * @param {Array} args The provided arguments.
82283    * @param {Array} partials The arguments to prepend to those provided.
82284    * @param {Array} holders The `partials` placeholder indexes.
82285    * @params {boolean} [isCurried] Specify composing for a curried function.
82286    * @returns {Array} Returns the new array of composed arguments.
82287    */
82288   function composeArgs(args, partials, holders, isCurried) {
82289     var argsIndex = -1,
82290         argsLength = args.length,
82291         holdersLength = holders.length,
82292         leftIndex = -1,
82293         leftLength = partials.length,
82294         rangeLength = nativeMax$5(argsLength - holdersLength, 0),
82295         result = Array(leftLength + rangeLength),
82296         isUncurried = !isCurried;
82297
82298     while (++leftIndex < leftLength) {
82299       result[leftIndex] = partials[leftIndex];
82300     }
82301     while (++argsIndex < holdersLength) {
82302       if (isUncurried || argsIndex < argsLength) {
82303         result[holders[argsIndex]] = args[argsIndex];
82304       }
82305     }
82306     while (rangeLength--) {
82307       result[leftIndex++] = args[argsIndex++];
82308     }
82309     return result;
82310   }
82311
82312   /* Built-in method references for those with the same name as other `lodash` methods. */
82313   var nativeMax$6 = Math.max;
82314
82315   /**
82316    * This function is like `composeArgs` except that the arguments composition
82317    * is tailored for `_.partialRight`.
82318    *
82319    * @private
82320    * @param {Array} args The provided arguments.
82321    * @param {Array} partials The arguments to append to those provided.
82322    * @param {Array} holders The `partials` placeholder indexes.
82323    * @params {boolean} [isCurried] Specify composing for a curried function.
82324    * @returns {Array} Returns the new array of composed arguments.
82325    */
82326   function composeArgsRight(args, partials, holders, isCurried) {
82327     var argsIndex = -1,
82328         argsLength = args.length,
82329         holdersIndex = -1,
82330         holdersLength = holders.length,
82331         rightIndex = -1,
82332         rightLength = partials.length,
82333         rangeLength = nativeMax$6(argsLength - holdersLength, 0),
82334         result = Array(rangeLength + rightLength),
82335         isUncurried = !isCurried;
82336
82337     while (++argsIndex < rangeLength) {
82338       result[argsIndex] = args[argsIndex];
82339     }
82340     var offset = argsIndex;
82341     while (++rightIndex < rightLength) {
82342       result[offset + rightIndex] = partials[rightIndex];
82343     }
82344     while (++holdersIndex < holdersLength) {
82345       if (isUncurried || argsIndex < argsLength) {
82346         result[offset + holders[holdersIndex]] = args[argsIndex++];
82347       }
82348     }
82349     return result;
82350   }
82351
82352   /**
82353    * Gets the number of `placeholder` occurrences in `array`.
82354    *
82355    * @private
82356    * @param {Array} array The array to inspect.
82357    * @param {*} placeholder The placeholder to search for.
82358    * @returns {number} Returns the placeholder count.
82359    */
82360   function countHolders(array, placeholder) {
82361     var length = array.length,
82362         result = 0;
82363
82364     while (length--) {
82365       if (array[length] === placeholder) {
82366         ++result;
82367       }
82368     }
82369     return result;
82370   }
82371
82372   /**
82373    * The function whose prototype chain sequence wrappers inherit from.
82374    *
82375    * @private
82376    */
82377   function baseLodash() {
82378     // No operation performed.
82379   }
82380
82381   /** Used as references for the maximum length and index of an array. */
82382   var MAX_ARRAY_LENGTH = 4294967295;
82383
82384   /**
82385    * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
82386    *
82387    * @private
82388    * @constructor
82389    * @param {*} value The value to wrap.
82390    */
82391   function LazyWrapper(value) {
82392     this.__wrapped__ = value;
82393     this.__actions__ = [];
82394     this.__dir__ = 1;
82395     this.__filtered__ = false;
82396     this.__iteratees__ = [];
82397     this.__takeCount__ = MAX_ARRAY_LENGTH;
82398     this.__views__ = [];
82399   }
82400
82401   // Ensure `LazyWrapper` is an instance of `baseLodash`.
82402   LazyWrapper.prototype = baseCreate(baseLodash.prototype);
82403   LazyWrapper.prototype.constructor = LazyWrapper;
82404
82405   /**
82406    * Gets metadata for `func`.
82407    *
82408    * @private
82409    * @param {Function} func The function to query.
82410    * @returns {*} Returns the metadata for `func`.
82411    */
82412   var getData = !metaMap ? noop$3 : function(func) {
82413     return metaMap.get(func);
82414   };
82415
82416   /** Used to lookup unminified function names. */
82417   var realNames = {};
82418
82419   /** Used for built-in method references. */
82420   var objectProto$k = Object.prototype;
82421
82422   /** Used to check objects for own properties. */
82423   var hasOwnProperty$h = objectProto$k.hasOwnProperty;
82424
82425   /**
82426    * Gets the name of `func`.
82427    *
82428    * @private
82429    * @param {Function} func The function to query.
82430    * @returns {string} Returns the function name.
82431    */
82432   function getFuncName(func) {
82433     var result = (func.name + ''),
82434         array = realNames[result],
82435         length = hasOwnProperty$h.call(realNames, result) ? array.length : 0;
82436
82437     while (length--) {
82438       var data = array[length],
82439           otherFunc = data.func;
82440       if (otherFunc == null || otherFunc == func) {
82441         return data.name;
82442       }
82443     }
82444     return result;
82445   }
82446
82447   /**
82448    * The base constructor for creating `lodash` wrapper objects.
82449    *
82450    * @private
82451    * @param {*} value The value to wrap.
82452    * @param {boolean} [chainAll] Enable explicit method chain sequences.
82453    */
82454   function LodashWrapper(value, chainAll) {
82455     this.__wrapped__ = value;
82456     this.__actions__ = [];
82457     this.__chain__ = !!chainAll;
82458     this.__index__ = 0;
82459     this.__values__ = undefined;
82460   }
82461
82462   LodashWrapper.prototype = baseCreate(baseLodash.prototype);
82463   LodashWrapper.prototype.constructor = LodashWrapper;
82464
82465   /**
82466    * Creates a clone of `wrapper`.
82467    *
82468    * @private
82469    * @param {Object} wrapper The wrapper to clone.
82470    * @returns {Object} Returns the cloned wrapper.
82471    */
82472   function wrapperClone(wrapper) {
82473     if (wrapper instanceof LazyWrapper) {
82474       return wrapper.clone();
82475     }
82476     var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
82477     result.__actions__ = copyArray(wrapper.__actions__);
82478     result.__index__  = wrapper.__index__;
82479     result.__values__ = wrapper.__values__;
82480     return result;
82481   }
82482
82483   /** Used for built-in method references. */
82484   var objectProto$l = Object.prototype;
82485
82486   /** Used to check objects for own properties. */
82487   var hasOwnProperty$i = objectProto$l.hasOwnProperty;
82488
82489   /**
82490    * Creates a `lodash` object which wraps `value` to enable implicit method
82491    * chain sequences. Methods that operate on and return arrays, collections,
82492    * and functions can be chained together. Methods that retrieve a single value
82493    * or may return a primitive value will automatically end the chain sequence
82494    * and return the unwrapped value. Otherwise, the value must be unwrapped
82495    * with `_#value`.
82496    *
82497    * Explicit chain sequences, which must be unwrapped with `_#value`, may be
82498    * enabled using `_.chain`.
82499    *
82500    * The execution of chained methods is lazy, that is, it's deferred until
82501    * `_#value` is implicitly or explicitly called.
82502    *
82503    * Lazy evaluation allows several methods to support shortcut fusion.
82504    * Shortcut fusion is an optimization to merge iteratee calls; this avoids
82505    * the creation of intermediate arrays and can greatly reduce the number of
82506    * iteratee executions. Sections of a chain sequence qualify for shortcut
82507    * fusion if the section is applied to an array and iteratees accept only
82508    * one argument. The heuristic for whether a section qualifies for shortcut
82509    * fusion is subject to change.
82510    *
82511    * Chaining is supported in custom builds as long as the `_#value` method is
82512    * directly or indirectly included in the build.
82513    *
82514    * In addition to lodash methods, wrappers have `Array` and `String` methods.
82515    *
82516    * The wrapper `Array` methods are:
82517    * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
82518    *
82519    * The wrapper `String` methods are:
82520    * `replace` and `split`
82521    *
82522    * The wrapper methods that support shortcut fusion are:
82523    * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
82524    * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
82525    * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
82526    *
82527    * The chainable wrapper methods are:
82528    * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
82529    * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
82530    * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
82531    * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
82532    * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
82533    * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
82534    * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
82535    * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
82536    * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
82537    * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
82538    * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
82539    * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
82540    * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
82541    * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
82542    * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
82543    * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
82544    * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
82545    * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
82546    * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
82547    * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
82548    * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
82549    * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
82550    * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
82551    * `zipObject`, `zipObjectDeep`, and `zipWith`
82552    *
82553    * The wrapper methods that are **not** chainable by default are:
82554    * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
82555    * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
82556    * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
82557    * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
82558    * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
82559    * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
82560    * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
82561    * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
82562    * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
82563    * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
82564    * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
82565    * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
82566    * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
82567    * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
82568    * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
82569    * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
82570    * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
82571    * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
82572    * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
82573    * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
82574    * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
82575    * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
82576    * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
82577    * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
82578    * `upperFirst`, `value`, and `words`
82579    *
82580    * @name _
82581    * @constructor
82582    * @category Seq
82583    * @param {*} value The value to wrap in a `lodash` instance.
82584    * @returns {Object} Returns the new `lodash` wrapper instance.
82585    * @example
82586    *
82587    * function square(n) {
82588    *   return n * n;
82589    * }
82590    *
82591    * var wrapped = _([1, 2, 3]);
82592    *
82593    * // Returns an unwrapped value.
82594    * wrapped.reduce(_.add);
82595    * // => 6
82596    *
82597    * // Returns a wrapped value.
82598    * var squares = wrapped.map(square);
82599    *
82600    * _.isArray(squares);
82601    * // => false
82602    *
82603    * _.isArray(squares.value());
82604    * // => true
82605    */
82606   function lodash(value) {
82607     if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
82608       if (value instanceof LodashWrapper) {
82609         return value;
82610       }
82611       if (hasOwnProperty$i.call(value, '__wrapped__')) {
82612         return wrapperClone(value);
82613       }
82614     }
82615     return new LodashWrapper(value);
82616   }
82617
82618   // Ensure wrappers are instances of `baseLodash`.
82619   lodash.prototype = baseLodash.prototype;
82620   lodash.prototype.constructor = lodash;
82621
82622   /**
82623    * Checks if `func` has a lazy counterpart.
82624    *
82625    * @private
82626    * @param {Function} func The function to check.
82627    * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
82628    *  else `false`.
82629    */
82630   function isLaziable(func) {
82631     var funcName = getFuncName(func),
82632         other = lodash[funcName];
82633
82634     if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
82635       return false;
82636     }
82637     if (func === other) {
82638       return true;
82639     }
82640     var data = getData(other);
82641     return !!data && func === data[0];
82642   }
82643
82644   /**
82645    * Sets metadata for `func`.
82646    *
82647    * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
82648    * period of time, it will trip its breaker and transition to an identity
82649    * function to avoid garbage collection pauses in V8. See
82650    * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
82651    * for more details.
82652    *
82653    * @private
82654    * @param {Function} func The function to associate metadata with.
82655    * @param {*} data The metadata.
82656    * @returns {Function} Returns `func`.
82657    */
82658   var setData = shortOut(baseSetData);
82659
82660   /** Used to match wrap detail comments. */
82661   var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
82662       reSplitDetails = /,? & /;
82663
82664   /**
82665    * Extracts wrapper details from the `source` body comment.
82666    *
82667    * @private
82668    * @param {string} source The source to inspect.
82669    * @returns {Array} Returns the wrapper details.
82670    */
82671   function getWrapDetails(source) {
82672     var match = source.match(reWrapDetails);
82673     return match ? match[1].split(reSplitDetails) : [];
82674   }
82675
82676   /** Used to match wrap detail comments. */
82677   var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
82678
82679   /**
82680    * Inserts wrapper `details` in a comment at the top of the `source` body.
82681    *
82682    * @private
82683    * @param {string} source The source to modify.
82684    * @returns {Array} details The details to insert.
82685    * @returns {string} Returns the modified source.
82686    */
82687   function insertWrapDetails(source, details) {
82688     var length = details.length;
82689     if (!length) {
82690       return source;
82691     }
82692     var lastIndex = length - 1;
82693     details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
82694     details = details.join(length > 2 ? ', ' : ' ');
82695     return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
82696   }
82697
82698   /** Used to compose bitmasks for function metadata. */
82699   var WRAP_BIND_FLAG$1 = 1,
82700       WRAP_BIND_KEY_FLAG = 2,
82701       WRAP_CURRY_FLAG = 8,
82702       WRAP_CURRY_RIGHT_FLAG = 16,
82703       WRAP_PARTIAL_FLAG = 32,
82704       WRAP_PARTIAL_RIGHT_FLAG = 64,
82705       WRAP_ARY_FLAG = 128,
82706       WRAP_REARG_FLAG = 256,
82707       WRAP_FLIP_FLAG = 512;
82708
82709   /** Used to associate wrap methods with their bit flags. */
82710   var wrapFlags = [
82711     ['ary', WRAP_ARY_FLAG],
82712     ['bind', WRAP_BIND_FLAG$1],
82713     ['bindKey', WRAP_BIND_KEY_FLAG],
82714     ['curry', WRAP_CURRY_FLAG],
82715     ['curryRight', WRAP_CURRY_RIGHT_FLAG],
82716     ['flip', WRAP_FLIP_FLAG],
82717     ['partial', WRAP_PARTIAL_FLAG],
82718     ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
82719     ['rearg', WRAP_REARG_FLAG]
82720   ];
82721
82722   /**
82723    * Updates wrapper `details` based on `bitmask` flags.
82724    *
82725    * @private
82726    * @returns {Array} details The details to modify.
82727    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
82728    * @returns {Array} Returns `details`.
82729    */
82730   function updateWrapDetails(details, bitmask) {
82731     arrayEach(wrapFlags, function(pair) {
82732       var value = '_.' + pair[0];
82733       if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
82734         details.push(value);
82735       }
82736     });
82737     return details.sort();
82738   }
82739
82740   /**
82741    * Sets the `toString` method of `wrapper` to mimic the source of `reference`
82742    * with wrapper details in a comment at the top of the source body.
82743    *
82744    * @private
82745    * @param {Function} wrapper The function to modify.
82746    * @param {Function} reference The reference function.
82747    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
82748    * @returns {Function} Returns `wrapper`.
82749    */
82750   function setWrapToString(wrapper, reference, bitmask) {
82751     var source = (reference + '');
82752     return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
82753   }
82754
82755   /** Used to compose bitmasks for function metadata. */
82756   var WRAP_BIND_FLAG$2 = 1,
82757       WRAP_BIND_KEY_FLAG$1 = 2,
82758       WRAP_CURRY_BOUND_FLAG = 4,
82759       WRAP_CURRY_FLAG$1 = 8,
82760       WRAP_PARTIAL_FLAG$1 = 32,
82761       WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
82762
82763   /**
82764    * Creates a function that wraps `func` to continue currying.
82765    *
82766    * @private
82767    * @param {Function} func The function to wrap.
82768    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
82769    * @param {Function} wrapFunc The function to create the `func` wrapper.
82770    * @param {*} placeholder The placeholder value.
82771    * @param {*} [thisArg] The `this` binding of `func`.
82772    * @param {Array} [partials] The arguments to prepend to those provided to
82773    *  the new function.
82774    * @param {Array} [holders] The `partials` placeholder indexes.
82775    * @param {Array} [argPos] The argument positions of the new function.
82776    * @param {number} [ary] The arity cap of `func`.
82777    * @param {number} [arity] The arity of `func`.
82778    * @returns {Function} Returns the new wrapped function.
82779    */
82780   function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
82781     var isCurry = bitmask & WRAP_CURRY_FLAG$1,
82782         newHolders = isCurry ? holders : undefined,
82783         newHoldersRight = isCurry ? undefined : holders,
82784         newPartials = isCurry ? partials : undefined,
82785         newPartialsRight = isCurry ? undefined : partials;
82786
82787     bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1);
82788     bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);
82789
82790     if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
82791       bitmask &= ~(WRAP_BIND_FLAG$2 | WRAP_BIND_KEY_FLAG$1);
82792     }
82793     var newData = [
82794       func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
82795       newHoldersRight, argPos, ary, arity
82796     ];
82797
82798     var result = wrapFunc.apply(undefined, newData);
82799     if (isLaziable(func)) {
82800       setData(result, newData);
82801     }
82802     result.placeholder = placeholder;
82803     return setWrapToString(result, func, bitmask);
82804   }
82805
82806   /**
82807    * Gets the argument placeholder value for `func`.
82808    *
82809    * @private
82810    * @param {Function} func The function to inspect.
82811    * @returns {*} Returns the placeholder value.
82812    */
82813   function getHolder(func) {
82814     var object = func;
82815     return object.placeholder;
82816   }
82817
82818   /* Built-in method references for those with the same name as other `lodash` methods. */
82819   var nativeMin$2 = Math.min;
82820
82821   /**
82822    * Reorder `array` according to the specified indexes where the element at
82823    * the first index is assigned as the first element, the element at
82824    * the second index is assigned as the second element, and so on.
82825    *
82826    * @private
82827    * @param {Array} array The array to reorder.
82828    * @param {Array} indexes The arranged array indexes.
82829    * @returns {Array} Returns `array`.
82830    */
82831   function reorder(array, indexes) {
82832     var arrLength = array.length,
82833         length = nativeMin$2(indexes.length, arrLength),
82834         oldArray = copyArray(array);
82835
82836     while (length--) {
82837       var index = indexes[length];
82838       array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
82839     }
82840     return array;
82841   }
82842
82843   /** Used as the internal argument placeholder. */
82844   var PLACEHOLDER = '__lodash_placeholder__';
82845
82846   /**
82847    * Replaces all `placeholder` elements in `array` with an internal placeholder
82848    * and returns an array of their indexes.
82849    *
82850    * @private
82851    * @param {Array} array The array to modify.
82852    * @param {*} placeholder The placeholder to replace.
82853    * @returns {Array} Returns the new array of placeholder indexes.
82854    */
82855   function replaceHolders(array, placeholder) {
82856     var index = -1,
82857         length = array.length,
82858         resIndex = 0,
82859         result = [];
82860
82861     while (++index < length) {
82862       var value = array[index];
82863       if (value === placeholder || value === PLACEHOLDER) {
82864         array[index] = PLACEHOLDER;
82865         result[resIndex++] = index;
82866       }
82867     }
82868     return result;
82869   }
82870
82871   /** Used to compose bitmasks for function metadata. */
82872   var WRAP_BIND_FLAG$3 = 1,
82873       WRAP_BIND_KEY_FLAG$2 = 2,
82874       WRAP_CURRY_FLAG$2 = 8,
82875       WRAP_CURRY_RIGHT_FLAG$1 = 16,
82876       WRAP_ARY_FLAG$1 = 128,
82877       WRAP_FLIP_FLAG$1 = 512;
82878
82879   /**
82880    * Creates a function that wraps `func` to invoke it with optional `this`
82881    * binding of `thisArg`, partial application, and currying.
82882    *
82883    * @private
82884    * @param {Function|string} func The function or method name to wrap.
82885    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
82886    * @param {*} [thisArg] The `this` binding of `func`.
82887    * @param {Array} [partials] The arguments to prepend to those provided to
82888    *  the new function.
82889    * @param {Array} [holders] The `partials` placeholder indexes.
82890    * @param {Array} [partialsRight] The arguments to append to those provided
82891    *  to the new function.
82892    * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
82893    * @param {Array} [argPos] The argument positions of the new function.
82894    * @param {number} [ary] The arity cap of `func`.
82895    * @param {number} [arity] The arity of `func`.
82896    * @returns {Function} Returns the new wrapped function.
82897    */
82898   function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
82899     var isAry = bitmask & WRAP_ARY_FLAG$1,
82900         isBind = bitmask & WRAP_BIND_FLAG$3,
82901         isBindKey = bitmask & WRAP_BIND_KEY_FLAG$2,
82902         isCurried = bitmask & (WRAP_CURRY_FLAG$2 | WRAP_CURRY_RIGHT_FLAG$1),
82903         isFlip = bitmask & WRAP_FLIP_FLAG$1,
82904         Ctor = isBindKey ? undefined : createCtor(func);
82905
82906     function wrapper() {
82907       var length = arguments.length,
82908           args = Array(length),
82909           index = length;
82910
82911       while (index--) {
82912         args[index] = arguments[index];
82913       }
82914       if (isCurried) {
82915         var placeholder = getHolder(wrapper),
82916             holdersCount = countHolders(args, placeholder);
82917       }
82918       if (partials) {
82919         args = composeArgs(args, partials, holders, isCurried);
82920       }
82921       if (partialsRight) {
82922         args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
82923       }
82924       length -= holdersCount;
82925       if (isCurried && length < arity) {
82926         var newHolders = replaceHolders(args, placeholder);
82927         return createRecurry(
82928           func, bitmask, createHybrid, wrapper.placeholder, thisArg,
82929           args, newHolders, argPos, ary, arity - length
82930         );
82931       }
82932       var thisBinding = isBind ? thisArg : this,
82933           fn = isBindKey ? thisBinding[func] : func;
82934
82935       length = args.length;
82936       if (argPos) {
82937         args = reorder(args, argPos);
82938       } else if (isFlip && length > 1) {
82939         args.reverse();
82940       }
82941       if (isAry && ary < length) {
82942         args.length = ary;
82943       }
82944       if (this && this !== root$2 && this instanceof wrapper) {
82945         fn = Ctor || createCtor(fn);
82946       }
82947       return fn.apply(thisBinding, args);
82948     }
82949     return wrapper;
82950   }
82951
82952   /**
82953    * Creates a function that wraps `func` to enable currying.
82954    *
82955    * @private
82956    * @param {Function} func The function to wrap.
82957    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
82958    * @param {number} arity The arity of `func`.
82959    * @returns {Function} Returns the new wrapped function.
82960    */
82961   function createCurry(func, bitmask, arity) {
82962     var Ctor = createCtor(func);
82963
82964     function wrapper() {
82965       var length = arguments.length,
82966           args = Array(length),
82967           index = length,
82968           placeholder = getHolder(wrapper);
82969
82970       while (index--) {
82971         args[index] = arguments[index];
82972       }
82973       var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
82974         ? []
82975         : replaceHolders(args, placeholder);
82976
82977       length -= holders.length;
82978       if (length < arity) {
82979         return createRecurry(
82980           func, bitmask, createHybrid, wrapper.placeholder, undefined,
82981           args, holders, undefined, undefined, arity - length);
82982       }
82983       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
82984       return apply(fn, this, args);
82985     }
82986     return wrapper;
82987   }
82988
82989   /** Used to compose bitmasks for function metadata. */
82990   var WRAP_BIND_FLAG$4 = 1;
82991
82992   /**
82993    * Creates a function that wraps `func` to invoke it with the `this` binding
82994    * of `thisArg` and `partials` prepended to the arguments it receives.
82995    *
82996    * @private
82997    * @param {Function} func The function to wrap.
82998    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
82999    * @param {*} thisArg The `this` binding of `func`.
83000    * @param {Array} partials The arguments to prepend to those provided to
83001    *  the new function.
83002    * @returns {Function} Returns the new wrapped function.
83003    */
83004   function createPartial(func, bitmask, thisArg, partials) {
83005     var isBind = bitmask & WRAP_BIND_FLAG$4,
83006         Ctor = createCtor(func);
83007
83008     function wrapper() {
83009       var argsIndex = -1,
83010           argsLength = arguments.length,
83011           leftIndex = -1,
83012           leftLength = partials.length,
83013           args = Array(leftLength + argsLength),
83014           fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
83015
83016       while (++leftIndex < leftLength) {
83017         args[leftIndex] = partials[leftIndex];
83018       }
83019       while (argsLength--) {
83020         args[leftIndex++] = arguments[++argsIndex];
83021       }
83022       return apply(fn, isBind ? thisArg : this, args);
83023     }
83024     return wrapper;
83025   }
83026
83027   /** Used as the internal argument placeholder. */
83028   var PLACEHOLDER$1 = '__lodash_placeholder__';
83029
83030   /** Used to compose bitmasks for function metadata. */
83031   var WRAP_BIND_FLAG$5 = 1,
83032       WRAP_BIND_KEY_FLAG$3 = 2,
83033       WRAP_CURRY_BOUND_FLAG$1 = 4,
83034       WRAP_CURRY_FLAG$3 = 8,
83035       WRAP_ARY_FLAG$2 = 128,
83036       WRAP_REARG_FLAG$1 = 256;
83037
83038   /* Built-in method references for those with the same name as other `lodash` methods. */
83039   var nativeMin$3 = Math.min;
83040
83041   /**
83042    * Merges the function metadata of `source` into `data`.
83043    *
83044    * Merging metadata reduces the number of wrappers used to invoke a function.
83045    * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
83046    * may be applied regardless of execution order. Methods like `_.ary` and
83047    * `_.rearg` modify function arguments, making the order in which they are
83048    * executed important, preventing the merging of metadata. However, we make
83049    * an exception for a safe combined case where curried functions have `_.ary`
83050    * and or `_.rearg` applied.
83051    *
83052    * @private
83053    * @param {Array} data The destination metadata.
83054    * @param {Array} source The source metadata.
83055    * @returns {Array} Returns `data`.
83056    */
83057   function mergeData(data, source) {
83058     var bitmask = data[1],
83059         srcBitmask = source[1],
83060         newBitmask = bitmask | srcBitmask,
83061         isCommon = newBitmask < (WRAP_BIND_FLAG$5 | WRAP_BIND_KEY_FLAG$3 | WRAP_ARY_FLAG$2);
83062
83063     var isCombo =
83064       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$3)) ||
83065       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
83066       ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$3));
83067
83068     // Exit early if metadata can't be merged.
83069     if (!(isCommon || isCombo)) {
83070       return data;
83071     }
83072     // Use source `thisArg` if available.
83073     if (srcBitmask & WRAP_BIND_FLAG$5) {
83074       data[2] = source[2];
83075       // Set when currying a bound function.
83076       newBitmask |= bitmask & WRAP_BIND_FLAG$5 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
83077     }
83078     // Compose partial arguments.
83079     var value = source[3];
83080     if (value) {
83081       var partials = data[3];
83082       data[3] = partials ? composeArgs(partials, value, source[4]) : value;
83083       data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];
83084     }
83085     // Compose partial right arguments.
83086     value = source[5];
83087     if (value) {
83088       partials = data[5];
83089       data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
83090       data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];
83091     }
83092     // Use source `argPos` if available.
83093     value = source[7];
83094     if (value) {
83095       data[7] = value;
83096     }
83097     // Use source `ary` if it's smaller.
83098     if (srcBitmask & WRAP_ARY_FLAG$2) {
83099       data[8] = data[8] == null ? source[8] : nativeMin$3(data[8], source[8]);
83100     }
83101     // Use source `arity` if one is not provided.
83102     if (data[9] == null) {
83103       data[9] = source[9];
83104     }
83105     // Use source `func` and merge bitmasks.
83106     data[0] = source[0];
83107     data[1] = newBitmask;
83108
83109     return data;
83110   }
83111
83112   /** Error message constants. */
83113   var FUNC_ERROR_TEXT$4 = 'Expected a function';
83114
83115   /** Used to compose bitmasks for function metadata. */
83116   var WRAP_BIND_FLAG$6 = 1,
83117       WRAP_BIND_KEY_FLAG$4 = 2,
83118       WRAP_CURRY_FLAG$4 = 8,
83119       WRAP_CURRY_RIGHT_FLAG$2 = 16,
83120       WRAP_PARTIAL_FLAG$2 = 32,
83121       WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
83122
83123   /* Built-in method references for those with the same name as other `lodash` methods. */
83124   var nativeMax$7 = Math.max;
83125
83126   /**
83127    * Creates a function that either curries or invokes `func` with optional
83128    * `this` binding and partially applied arguments.
83129    *
83130    * @private
83131    * @param {Function|string} func The function or method name to wrap.
83132    * @param {number} bitmask The bitmask flags.
83133    *    1 - `_.bind`
83134    *    2 - `_.bindKey`
83135    *    4 - `_.curry` or `_.curryRight` of a bound function
83136    *    8 - `_.curry`
83137    *   16 - `_.curryRight`
83138    *   32 - `_.partial`
83139    *   64 - `_.partialRight`
83140    *  128 - `_.rearg`
83141    *  256 - `_.ary`
83142    *  512 - `_.flip`
83143    * @param {*} [thisArg] The `this` binding of `func`.
83144    * @param {Array} [partials] The arguments to be partially applied.
83145    * @param {Array} [holders] The `partials` placeholder indexes.
83146    * @param {Array} [argPos] The argument positions of the new function.
83147    * @param {number} [ary] The arity cap of `func`.
83148    * @param {number} [arity] The arity of `func`.
83149    * @returns {Function} Returns the new wrapped function.
83150    */
83151   function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
83152     var isBindKey = bitmask & WRAP_BIND_KEY_FLAG$4;
83153     if (!isBindKey && typeof func != 'function') {
83154       throw new TypeError(FUNC_ERROR_TEXT$4);
83155     }
83156     var length = partials ? partials.length : 0;
83157     if (!length) {
83158       bitmask &= ~(WRAP_PARTIAL_FLAG$2 | WRAP_PARTIAL_RIGHT_FLAG$2);
83159       partials = holders = undefined;
83160     }
83161     ary = ary === undefined ? ary : nativeMax$7(toInteger(ary), 0);
83162     arity = arity === undefined ? arity : toInteger(arity);
83163     length -= holders ? holders.length : 0;
83164
83165     if (bitmask & WRAP_PARTIAL_RIGHT_FLAG$2) {
83166       var partialsRight = partials,
83167           holdersRight = holders;
83168
83169       partials = holders = undefined;
83170     }
83171     var data = isBindKey ? undefined : getData(func);
83172
83173     var newData = [
83174       func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
83175       argPos, ary, arity
83176     ];
83177
83178     if (data) {
83179       mergeData(newData, data);
83180     }
83181     func = newData[0];
83182     bitmask = newData[1];
83183     thisArg = newData[2];
83184     partials = newData[3];
83185     holders = newData[4];
83186     arity = newData[9] = newData[9] === undefined
83187       ? (isBindKey ? 0 : func.length)
83188       : nativeMax$7(newData[9] - length, 0);
83189
83190     if (!arity && bitmask & (WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2)) {
83191       bitmask &= ~(WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2);
83192     }
83193     if (!bitmask || bitmask == WRAP_BIND_FLAG$6) {
83194       var result = createBind(func, bitmask, thisArg);
83195     } else if (bitmask == WRAP_CURRY_FLAG$4 || bitmask == WRAP_CURRY_RIGHT_FLAG$2) {
83196       result = createCurry(func, bitmask, arity);
83197     } else if ((bitmask == WRAP_PARTIAL_FLAG$2 || bitmask == (WRAP_BIND_FLAG$6 | WRAP_PARTIAL_FLAG$2)) && !holders.length) {
83198       result = createPartial(func, bitmask, thisArg, partials);
83199     } else {
83200       result = createHybrid.apply(undefined, newData);
83201     }
83202     var setter = data ? baseSetData : setData;
83203     return setWrapToString(setter(result, newData), func, bitmask);
83204   }
83205
83206   /** Used to compose bitmasks for function metadata. */
83207   var WRAP_BIND_FLAG$7 = 1,
83208       WRAP_PARTIAL_FLAG$3 = 32;
83209
83210   /**
83211    * Creates a function that invokes `func` with the `this` binding of `thisArg`
83212    * and `partials` prepended to the arguments it receives.
83213    *
83214    * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
83215    * may be used as a placeholder for partially applied arguments.
83216    *
83217    * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
83218    * property of bound functions.
83219    *
83220    * @static
83221    * @memberOf _
83222    * @since 0.1.0
83223    * @category Function
83224    * @param {Function} func The function to bind.
83225    * @param {*} thisArg The `this` binding of `func`.
83226    * @param {...*} [partials] The arguments to be partially applied.
83227    * @returns {Function} Returns the new bound function.
83228    * @example
83229    *
83230    * function greet(greeting, punctuation) {
83231    *   return greeting + ' ' + this.user + punctuation;
83232    * }
83233    *
83234    * var object = { 'user': 'fred' };
83235    *
83236    * var bound = _.bind(greet, object, 'hi');
83237    * bound('!');
83238    * // => 'hi fred!'
83239    *
83240    * // Bound with placeholders.
83241    * var bound = _.bind(greet, object, _, '!');
83242    * bound('hi');
83243    * // => 'hi fred!'
83244    */
83245   var bind$2 = baseRest(function(func, thisArg, partials) {
83246     var bitmask = WRAP_BIND_FLAG$7;
83247     if (partials.length) {
83248       var holders = replaceHolders(partials, getHolder(bind$2));
83249       bitmask |= WRAP_PARTIAL_FLAG$3;
83250     }
83251     return createWrap(func, bitmask, thisArg, partials, holders);
83252   });
83253
83254   // Assign default placeholders.
83255   bind$2.placeholder = {};
83256
83257   function presetCollection(collection) {
83258       var maxSearchResults = 50;
83259       var maxSuggestionResults = 10;
83260
83261       var presets = {
83262
83263           collection: collection,
83264
83265
83266           item: function(id) {
83267               return find$1(this.collection, function(d) {
83268                   return d.id === id;
83269               });
83270           },
83271
83272
83273           matchGeometry: function(geometry) {
83274               return presetCollection(this.collection.filter(function(d) {
83275                   return d.matchGeometry(geometry);
83276               }));
83277           },
83278
83279
83280           search: function(value, geometry) {
83281               if (!value) return this;
83282
83283               function leading(a) {
83284                   var index = a.indexOf(value);
83285                   return index === 0 || a[index - 1] === ' ';
83286               }
83287
83288               function suggestionName(name) {
83289                   var nameArray = name.split(' - ');
83290                   if (nameArray.length > 1) {
83291                       name = nameArray.slice(0, nameArray.length - 1).join(' - ');
83292                   }
83293                   return name.toLowerCase();
83294               }
83295
83296
83297               value = value.toLowerCase();
83298
83299               var searchable = filter(this.collection, function(a) {
83300                   return a.searchable !== false && a.suggestion !== true;
83301               });
83302               var suggestions = filter(this.collection, function(a) {
83303                   return a.suggestion === true;
83304               });
83305
83306
83307               // matches value to preset.name
83308               var leading_name = filter(searchable, function(a) {
83309                       return leading(a.name().toLowerCase());
83310                   }).sort(function(a, b) {
83311                       var aCompare = a.name().toLowerCase();
83312                       var bCompare = b.name().toLowerCase();
83313                       var i;
83314
83315                       // priority if search string matches preset name exactly - #4325
83316                       if (value === aCompare) return -1;
83317                       if (value === bCompare) return 1;
83318
83319                       // priority for higher matchScore
83320                       i = b.originalScore - a.originalScore;
83321                       if (i !== 0) return i;
83322
83323                       // priority if search string appears earlier in preset name
83324                       i = aCompare.indexOf(value) - bCompare.indexOf(value);
83325                       if (i !== 0) return i;
83326
83327                       // priority for shorter preset names
83328                       return a.name().length - b.name().length;
83329                   });
83330
83331               // matches value to preset.terms values
83332               var leading_terms = filter(searchable, function(a) {
83333                   return some(a.terms() || [], leading);
83334               });
83335
83336               // matches value to preset.tags values
83337               var leading_tag_values = filter(searchable, function(a) {
83338                   return some(without(values$1(a.tags || {}), '*'), leading);
83339               });
83340
83341
83342               // finds close matches to value in preset.name
83343               var similar_name = searchable
83344                   .map(function(a) {
83345                       return { preset: a, dist: utilEditDistance(value, a.name()) };
83346                   }).filter(function(a) {
83347                       return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
83348                   }).sort(function(a, b) {
83349                       return a.dist - b.dist;
83350                   }).map(function(a) {
83351                       return a.preset;
83352                   });
83353
83354               // finds close matches to value in preset.terms
83355               var similar_terms = filter(searchable, function(a) {
83356                       return some(a.terms() || [], function(b) {
83357                           return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
83358                       });
83359                   });
83360
83361               var leading_suggestions = filter(suggestions, function(a) {
83362                       return leading(suggestionName(a.name()));
83363                   }).sort(function(a, b) {
83364                       a = suggestionName(a.name());
83365                       b = suggestionName(b.name());
83366                       var i = a.indexOf(value) - b.indexOf(value);
83367                       if (i === 0) return a.length - b.length;
83368                       else return i;
83369                   });
83370
83371               var similar_suggestions = suggestions.map(function(a) {
83372                       return { preset: a, dist: utilEditDistance(value, suggestionName(a.name())) };
83373                   }).filter(function(a) {
83374                       return a.dist + Math.min(value.length - suggestionName(a.preset.name()).length, 0) < 1;
83375                   }).sort(function(a, b) {
83376                       return a.dist - b.dist;
83377                   }).map(function(a) {
83378                       return a.preset;
83379                   });
83380
83381               var other = presets.item(geometry);
83382
83383               var results = leading_name.concat(
83384                   leading_terms,
83385                   leading_tag_values,
83386                   leading_suggestions.slice(0, maxSuggestionResults + 5),
83387                   similar_name,
83388                   similar_terms,
83389                   similar_suggestions.slice(0, maxSuggestionResults)
83390               ).slice(0, maxSearchResults - 1);
83391
83392               return presetCollection(uniq(results.concat(other)));
83393           }
83394       };
83395
83396
83397       return presets;
83398   }
83399
83400   function presetCategory(id, category, all) {
83401       category = clone(category);
83402
83403       category.id = id;
83404
83405
83406       category.members = presetCollection(category.members.map(function(id) {
83407           return all.item(id);
83408       }));
83409
83410
83411       category.matchGeometry = function(geometry) {
83412           return category.geometry.indexOf(geometry) >= 0;
83413       };
83414
83415
83416       category.matchScore = function() {
83417           return -1;
83418       };
83419
83420
83421       category.name = function() {
83422           return t('presets.categories.' + id + '.name', {'default': id});
83423       };
83424
83425
83426       category.terms = function() {
83427           return [];
83428       };
83429
83430
83431       return category;
83432   }
83433
83434   function presetField(id, field) {
83435       field = clone(field);
83436
83437       field.id = id;
83438
83439       // for use in classes, element ids, css selectors
83440       field.safeid = id.replace(/[^_a-zA-Z0-9\-]/g, '_');
83441
83442       field.matchGeometry = function(geometry) {
83443           return !field.geometry || field.geometry === geometry;
83444       };
83445
83446
83447       field.t = function(scope, options) {
83448           return t('presets.fields.' + id + '.' + scope, options);
83449       };
83450
83451
83452       field.label = function() {
83453           return field.t('label', {'default': id});
83454       };
83455
83456
83457       var placeholder = field.placeholder;
83458       field.placeholder = function() {
83459           return field.t('placeholder', {'default': placeholder});
83460       };
83461
83462
83463       return field;
83464   }
83465
83466   function presetPreset(id, preset, fields) {
83467       preset = clone(preset);
83468
83469       preset.id = id;
83470       preset.fields = (preset.fields || []).map(getFields);
83471       preset.geometry = (preset.geometry || []);
83472
83473
83474       function getFields(f) {
83475           return fields[f];
83476       }
83477
83478
83479       preset.matchGeometry = function(geometry) {
83480           return preset.geometry.indexOf(geometry) >= 0;
83481       };
83482
83483
83484       preset.originalScore = preset.matchScore || 1;
83485
83486
83487       preset.matchScore = function(entity) {
83488           var tags = preset.tags;
83489           var score = 0;
83490
83491           for (var t$$1 in tags) {
83492               if (entity.tags[t$$1] === tags[t$$1]) {
83493                   score += preset.originalScore;
83494               } else if (tags[t$$1] === '*' && t$$1 in entity.tags) {
83495                   score += preset.originalScore / 2;
83496               } else {
83497                   return -1;
83498               }
83499           }
83500
83501           return score;
83502       };
83503
83504
83505       preset.t = function(scope, options) {
83506           return t('presets.presets.' + id + '.' + scope, options);
83507       };
83508
83509
83510       var origName = preset.name || '';
83511       preset.name = function() {
83512           if (preset.suggestion) {
83513               id = id.split('/');
83514               id = id[0] + '/' + id[1];
83515               return origName + ' - ' + t('presets.presets.' + id + '.name');
83516           }
83517           return preset.t('name', { 'default': origName });
83518       };
83519
83520       var origTerms = (preset.terms || []).join();
83521       preset.terms = function() {
83522           return preset.t('terms', { 'default': origTerms }).toLowerCase().trim().split(/\s*,+\s*/);
83523       };
83524
83525
83526       preset.isFallback = function() {
83527           var tagCount = Object.keys(preset.tags).length;
83528           return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
83529       };
83530
83531
83532       var reference = preset.reference || {};
83533       preset.reference = function(geometry) {
83534           var key = reference.key || Object.keys(omit(preset.tags, 'name'))[0],
83535               value = reference.value || preset.tags[key];
83536
83537           if (geometry === 'relation' && key === 'type') {
83538               if (value in preset.tags) {
83539                   key = value;
83540                   value = preset.tags[key];
83541               } else {
83542                   return { rtype: value };
83543               }
83544           }
83545
83546           if (value === '*') {
83547               return { key: key };
83548           } else {
83549               return { key: key, value: value };
83550           }
83551       };
83552
83553
83554       preset.removeTags = preset.removeTags || preset.tags || {};
83555       preset.unsetTags = function(tags, geometry) {
83556           tags = omit(tags, Object.keys(preset.removeTags));
83557
83558           for (var f in preset.fields) {
83559               var field = preset.fields[f];
83560               if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
83561                   delete tags[field.key];
83562               }
83563           }
83564
83565           delete tags.area;
83566           return tags;
83567       };
83568
83569
83570       preset.addTags = preset.addTags || preset.tags || {};
83571       preset.setTags = function(tags, geometry) {
83572           var addTags = preset.addTags;
83573           var k;
83574
83575           tags = clone(tags);
83576
83577           for (k in addTags) {
83578               if (addTags[k] === '*') {
83579                   tags[k] = 'yes';
83580               } else {
83581                   tags[k] = addTags[k];
83582               }
83583           }
83584
83585           // Add area=yes if necessary.
83586           // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
83587           // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
83588           // 2. chosen preset doesn't have a key in areaKeys (`railway=station`)
83589           if (!addTags.hasOwnProperty('area')) {
83590               delete tags.area;
83591               if (geometry === 'area') {
83592                   var needsAreaTag = true;
83593                   if (preset.geometry.indexOf('line') === -1) {
83594                       for (k in addTags) {
83595                           if (k in areaKeys) {
83596                               needsAreaTag = false;
83597                               break;
83598                           }
83599                       }
83600                   }
83601                   if (needsAreaTag) {
83602                       tags.area = 'yes';
83603                   }
83604               }
83605           }
83606
83607           for (var f in preset.fields) {
83608               var field = preset.fields[f];
83609               if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
83610                   tags[field.key] = field.default;
83611               }
83612           }
83613
83614           return tags;
83615       };
83616
83617
83618       return preset;
83619   }
83620
83621   function presetIndex() {
83622       // a presetCollection with methods for
83623       // loading new data and returning defaults
83624
83625       var all = presetCollection([]);
83626       var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
83627       var _fields = {};
83628       var _universal = [];
83629       var _recent = presetCollection([]);
83630
83631       // Index of presets by (geometry, tag key).
83632       var _index = {
83633           point: {},
83634           vertex: {},
83635           line: {},
83636           area: {},
83637           relation: {}
83638       };
83639
83640       all.match = function(entity, resolver) {
83641           return resolver.transient(entity, 'presetMatch', function() {
83642               var geometry = entity.geometry(resolver);
83643               var address;
83644
83645               // Treat entities on addr:interpolation lines as points, not vertices - #3241
83646               if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
83647                   geometry = 'point';
83648               }
83649
83650               var geometryMatches = _index[geometry];
83651               var best = -1;
83652               var match;
83653
83654               for (var k in entity.tags) {
83655                   // If any part of an address is present,
83656                   // allow fallback to "Address" preset - #4353
83657                   if (k.match(/^addr:/) !== null && geometryMatches['addr:*']) {
83658                       address = geometryMatches['addr:*'][0];
83659                   }
83660
83661                   var keyMatches = geometryMatches[k];
83662                   if (!keyMatches) continue;
83663
83664                   for (var i = 0; i < keyMatches.length; i++) {
83665                       var score = keyMatches[i].matchScore(entity);
83666                       if (score > best) {
83667                           best = score;
83668                           match = keyMatches[i];
83669                       }
83670                   }
83671               }
83672
83673               if (address && (!match || match.isFallback())) {
83674                   match = address;
83675               }
83676
83677               return match || all.item(geometry);
83678           });
83679       };
83680
83681
83682       // Because of the open nature of tagging, iD will never have a complete
83683       // list of tags used in OSM, so we want it to have logic like "assume
83684       // that a closed way with an amenity tag is an area, unless the amenity
83685       // is one of these specific types". This function computes a structure
83686       // that allows testing of such conditions, based on the presets designated
83687       // as as supporting (or not supporting) the area geometry.
83688       //
83689       // The returned object L is a whitelist/blacklist of tags. A closed way
83690       // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
83691       // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
83692       // and the subkeys form the blacklist.
83693       all.areaKeys = function() {
83694           var areaKeys = {};
83695           var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
83696           var presets = reject(all.collection, 'suggestion');
83697
83698           // whitelist
83699           presets.forEach(function(d) {
83700               for (var key in d.tags) break;
83701               if (!key) return;
83702               if (ignore.indexOf(key) !== -1) return;
83703
83704               if (d.geometry.indexOf('area') !== -1) {    // probably an area..
83705                   areaKeys[key] = areaKeys[key] || {};
83706               }
83707           });
83708
83709           // blacklist
83710           presets.forEach(function(d) {
83711               for (var key in d.tags) break;
83712               if (!key) return;
83713               if (ignore.indexOf(key) !== -1) return;
83714
83715               var value = d.tags[key];
83716               if (key in areaKeys &&                      // probably an area...
83717                   d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
83718                   value !== '*') {
83719                   areaKeys[key][value] = true;
83720               }
83721           });
83722
83723           return areaKeys;
83724       };
83725
83726
83727       all.init = function() {
83728           var d = data.presets;
83729
83730           all.collection = [];
83731           _recent.collection = [];
83732           _fields = {};
83733           _universal = [];
83734           _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
83735
83736           if (d.fields) {
83737               forEach(d.fields, function(d, id) {
83738                   _fields[id] = presetField(id, d);
83739                   if (d.universal) {
83740                       _universal.push(_fields[id]);
83741                   }
83742               });
83743           }
83744
83745           // move the wikidata field to directly follow the wikipedia field
83746           _universal.splice(_universal.indexOf(_fields.wikidata), 1);
83747           _universal.splice(_universal.indexOf(_fields.wikipedia)+1, 0, _fields.wikidata);
83748
83749           if (d.presets) {
83750               forEach(d.presets, function(d, id) {
83751                   all.collection.push(presetPreset(id, d, _fields));
83752               });
83753           }
83754
83755           if (d.categories) {
83756               forEach(d.categories, function(d, id) {
83757                   all.collection.push(presetCategory(id, d, all));
83758               });
83759           }
83760
83761           if (d.defaults) {
83762               var getItem = bind$2(all.item, all);
83763               _defaults = {
83764                   area: presetCollection(d.defaults.area.map(getItem)),
83765                   line: presetCollection(d.defaults.line.map(getItem)),
83766                   point: presetCollection(d.defaults.point.map(getItem)),
83767                   vertex: presetCollection(d.defaults.vertex.map(getItem)),
83768                   relation: presetCollection(d.defaults.relation.map(getItem))
83769               };
83770           }
83771
83772           for (var i = 0; i < all.collection.length; i++) {
83773               var preset = all.collection[i];
83774               var geometry = preset.geometry;
83775
83776               for (var j = 0; j < geometry.length; j++) {
83777                   var g = _index[geometry[j]];
83778                   for (var k in preset.tags) {
83779                       (g[k] = g[k] || []).push(preset);
83780                   }
83781               }
83782           }
83783
83784           return all;
83785       };
83786
83787       all.field = function(id) {
83788           return _fields[id];
83789       };
83790
83791       all.universal = function() {
83792           return _universal;
83793       };
83794
83795       all.defaults = function(geometry, n) {
83796           var rec = _recent.matchGeometry(geometry).collection.slice(0, 4);
83797           var def = uniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
83798           return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
83799       };
83800
83801       all.choose = function(preset) {
83802           if (preset.searchable !== false) {
83803               _recent = presetCollection(uniq([preset].concat(_recent.collection)));
83804           }
83805           return all;
83806       };
83807
83808       return all;
83809   }
83810
83811   var areaKeys = {};
83812
83813   function setAreaKeys(value) {
83814       areaKeys = value;
83815   }
83816
83817
83818   function coreContext() {
83819       var context = {};
83820       context.version = '2.12.0';
83821
83822       // create a special translation that contains the keys in place of the strings
83823       var tkeys = cloneDeep(en);
83824       var parents = [];
83825
83826       function traverser(v, k, obj) {
83827           parents.push(k);
83828           if (isObject(v)) {
83829               forOwn(v, traverser);
83830           } else if (isString(v)) {
83831               obj[k] = parents.join('.');
83832           }
83833           parents.pop();
83834       }
83835
83836       forOwn(tkeys, traverser);
83837       addTranslation('_tkeys_', tkeys);
83838
83839       addTranslation('en', en);
83840       setLocale('en');
83841
83842       var dispatch$$1 = dispatch('enter', 'exit', 'change');
83843
83844       // https://github.com/openstreetmap/iD/issues/772
83845       // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
83846       var storage;
83847       try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
83848       storage = storage || (function() {
83849           var s = {};
83850           return {
83851               getItem: function(k) { return s[k]; },
83852               setItem: function(k, v) { s[k] = v; },
83853               removeItem: function(k) { delete s[k]; }
83854           };
83855       })();
83856
83857       context.storage = function(k, v) {
83858           try {
83859               if (arguments.length === 1) return storage.getItem(k);
83860               else if (v === null) storage.removeItem(k);
83861               else storage.setItem(k, v);
83862           } catch (e) {
83863               // localstorage quota exceeded
83864               /* eslint-disable no-console */
83865               if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
83866               /* eslint-enable no-console */
83867           }
83868       };
83869
83870
83871       /* User interface and keybinding */
83872       var ui;
83873       context.ui = function() { return ui; };
83874
83875       var keybinding = utilKeybinding('context');
83876       context.keybinding = function() { return keybinding; };
83877       select(document).call(keybinding);
83878
83879
83880       /* Straight accessors. Avoid using these if you can. */
83881       var connection, history;
83882       context.connection = function() { return connection; };
83883       context.history = function() { return history; };
83884
83885
83886       /* Connection */
83887       context.preauth = function(options) {
83888           if (connection) {
83889               connection.switch(options);
83890           }
83891           return context;
83892       };
83893
83894       context.loadTiles = utilCallWhenIdle(function(projection, callback) {
83895           var cid;
83896           function done(err, result) {
83897               if (connection.getConnectionId() !== cid) {
83898                   if (callback) callback({ message: 'Connection Switched', status: -1 });
83899                   return;
83900               }
83901               if (!err) history.merge(result.data, result.extent);
83902               if (callback) callback(err, result);
83903           }
83904           if (connection && context.editable()) {
83905               cid = connection.getConnectionId();
83906               connection.loadTiles(projection, done);
83907           }
83908       });
83909
83910       context.loadEntity = function(entityID, callback) {
83911           var cid;
83912           function done(err, result) {
83913               if (connection.getConnectionId() !== cid) {
83914                   if (callback) callback({ message: 'Connection Switched', status: -1 });
83915                   return;
83916               }
83917               if (!err) history.merge(result.data, result.extent);
83918               if (callback) callback(err, result);
83919           }
83920           if (connection) {
83921               cid = connection.getConnectionId();
83922               connection.loadEntity(entityID, done);
83923           }
83924       };
83925
83926       context.zoomToEntity = function(entityID, zoomTo) {
83927           if (zoomTo !== false) {
83928               this.loadEntity(entityID, function(err, result) {
83929                   if (err) return;
83930                   var entity = find$1(result.data, function(e) { return e.id === entityID; });
83931                   if (entity) { map.zoomTo(entity); }
83932               });
83933           }
83934
83935           map.on('drawn.zoomToEntity', function() {
83936               if (!context.hasEntity(entityID)) return;
83937               map.on('drawn.zoomToEntity', null);
83938               context.on('enter.zoomToEntity', null);
83939               context.enter(modeSelect(context, [entityID]));
83940           });
83941
83942           context.on('enter.zoomToEntity', function() {
83943               if (mode.id !== 'browse') {
83944                   map.on('drawn.zoomToEntity', null);
83945                   context.on('enter.zoomToEntity', null);
83946               }
83947           });
83948       };
83949
83950       var minEditableZoom = 16;
83951       context.minEditableZoom = function(_) {
83952           if (!arguments.length) return minEditableZoom;
83953           minEditableZoom = _;
83954           if (connection) {
83955               connection.tileZoom(_);
83956           }
83957           return context;
83958       };
83959
83960
83961       /* History */
83962       var inIntro = false;
83963       context.inIntro = function(_) {
83964           if (!arguments.length) return inIntro;
83965           inIntro = _;
83966           return context;
83967       };
83968
83969       context.save = function() {
83970           // no history save, no message onbeforeunload
83971           if (inIntro || select('.modal').size()) return;
83972
83973           var canSave;
83974           if (mode && mode.id === 'save') {
83975               canSave = false;
83976
83977               // Attempt to prevent user from creating duplicate changes - see #5200
83978               if (services.osm && services.osm.isChangesetInflight()) {
83979                   history.clearSaved();
83980                   return;
83981               }
83982
83983           } else {
83984               canSave = context.selectedIDs().every(function(id) {
83985                   var entity = context.hasEntity(id);
83986                   return entity && !entity.isDegenerate();
83987               });
83988           }
83989
83990           if (canSave) {
83991               history.save();
83992           }
83993           if (history.hasChanges()) {
83994               return t('save.unsaved_changes');
83995           }
83996       };
83997
83998
83999       /* Graph */
84000       context.hasEntity = function(id) {
84001           return history.graph().hasEntity(id);
84002       };
84003       context.entity = function(id) {
84004           return history.graph().entity(id);
84005       };
84006       context.childNodes = function(way) {
84007           return history.graph().childNodes(way);
84008       };
84009       context.geometry = function(id) {
84010           return context.entity(id).geometry(history.graph());
84011       };
84012
84013
84014       /* Modes */
84015       var mode;
84016       context.mode = function() {
84017           return mode;
84018       };
84019       context.enter = function(newMode) {
84020           if (mode) {
84021               mode.exit();
84022               dispatch$$1.call('exit', this, mode);
84023           }
84024
84025           mode = newMode;
84026           mode.enter();
84027           dispatch$$1.call('enter', this, mode);
84028       };
84029
84030       context.selectedIDs = function() {
84031           if (mode && mode.selectedIDs) {
84032               return mode.selectedIDs();
84033           } else {
84034               return [];
84035           }
84036       };
84037
84038       context.activeID = function() {
84039           return mode && mode.activeID && mode.activeID();
84040       };
84041
84042       var _selectedNoteID;
84043       context.selectedNoteID = function(noteID) {
84044           if (!arguments.length) return _selectedNoteID;
84045           _selectedNoteID = noteID;
84046           return context;
84047       };
84048
84049
84050       /* Behaviors */
84051       context.install = function(behavior) {
84052           context.surface().call(behavior);
84053       };
84054       context.uninstall = function(behavior) {
84055           context.surface().call(behavior.off);
84056       };
84057
84058
84059       /* Copy/Paste */
84060       var copyIDs = [], copyGraph;
84061       context.copyGraph = function() { return copyGraph; };
84062       context.copyIDs = function(_) {
84063           if (!arguments.length) return copyIDs;
84064           copyIDs = _;
84065           copyGraph = history.graph();
84066           return context;
84067       };
84068
84069
84070       /* Background */
84071       var background;
84072       context.background = function() { return background; };
84073
84074
84075       /* Features */
84076       var features;
84077       context.features = function() { return features; };
84078       context.hasHiddenConnections = function(id) {
84079           var graph = history.graph(),
84080               entity = graph.entity(id);
84081           return features.hasHiddenConnections(entity, graph);
84082       };
84083
84084
84085       /* Presets */
84086       var presets;
84087       context.presets = function() { return presets; };
84088
84089
84090       /* Map */
84091       var map;
84092       context.map = function() { return map; };
84093       context.layers = function() { return map.layers; };
84094       context.surface = function() { return map.surface; };
84095       context.editable = function() { return map.editable(); };
84096       context.surfaceRect = function() {
84097           return map.surface.node().getBoundingClientRect();
84098       };
84099
84100
84101       /* Debug */
84102       var debugFlags = {
84103           tile: false,        // tile boundaries
84104           collision: false,   // label collision bounding boxes
84105           imagery: false,     // imagery bounding polygons
84106           community: false,   // community bounding polygons
84107           imperial: false,    // imperial (not metric) bounding polygons
84108           driveLeft: false,   // driveLeft bounding polygons
84109           target: false       // touch targets
84110       };
84111       context.debugFlags = function() {
84112           return debugFlags;
84113       };
84114       context.setDebug = function(flag, val) {
84115           if (arguments.length === 1) val = true;
84116           debugFlags[flag] = val;
84117           dispatch$$1.call('change');
84118           return context;
84119       };
84120       context.getDebug = function(flag) {
84121           return flag && debugFlags[flag];
84122       };
84123
84124
84125       /* Container */
84126       var container = select(document.body);
84127       context.container = function(_) {
84128           if (!arguments.length) return container;
84129           container = _;
84130           container.classed('id-container', true);
84131           return context;
84132       };
84133       var embed;
84134       context.embed = function(_) {
84135           if (!arguments.length) return embed;
84136           embed = _;
84137           return context;
84138       };
84139
84140
84141       /* Assets */
84142       var assetPath = '';
84143       context.assetPath = function(_) {
84144           if (!arguments.length) return assetPath;
84145           assetPath = _;
84146           return context;
84147       };
84148
84149       var assetMap = {};
84150       context.assetMap = function(_) {
84151           if (!arguments.length) return assetMap;
84152           assetMap = _;
84153           return context;
84154       };
84155
84156       context.asset = function(_) {
84157           var filename = assetPath + _;
84158           return assetMap[filename] || filename;
84159       };
84160
84161       context.imagePath = function(_) {
84162           return context.asset('img/' + _);
84163       };
84164
84165
84166       /* locales */
84167       // `locale` variable contains a "requested locale".
84168       // It won't become the `currentLocale` until after loadLocale() is called.
84169       var locale, localePath;
84170
84171       context.locale = function(loc, path) {
84172           if (!arguments.length) return currentLocale;
84173           locale = loc;
84174           localePath = path;
84175           return context;
84176       };
84177
84178       context.loadLocale = function(callback) {
84179           if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
84180               localePath = localePath || context.asset('locales/' + locale + '.json');
84181               d3_json(localePath, function(err, result) {
84182                   if (!err) {
84183                       addTranslation(locale, result[locale]);
84184                       setLocale(locale);
84185                       utilDetect(true);
84186                   }
84187                   if (callback) {
84188                       callback(err);
84189                   }
84190               });
84191           } else {
84192               if (locale) {
84193                   setLocale(locale);
84194                   utilDetect(true);
84195               }
84196               if (callback) {
84197                   callback();
84198               }
84199           }
84200       };
84201
84202
84203       /* reset (aka flush) */
84204       context.reset = context.flush = function() {
84205           context.debouncedSave.cancel();
84206           forEach(services, function(service) {
84207               if (service && typeof service.reset === 'function') {
84208                   service.reset(context);
84209               }
84210           });
84211           features.reset();
84212           history.reset();
84213           return context;
84214       };
84215
84216
84217       /* Init */
84218
84219       context.projection = geoRawMercator();
84220       context.curtainProjection = geoRawMercator();
84221
84222       locale = utilDetect().locale;
84223       if (locale && !dataLocales.hasOwnProperty(locale)) {
84224           locale = locale.split('-')[0];
84225       }
84226
84227       history = coreHistory(context);
84228       context.graph = history.graph;
84229       context.changes = history.changes;
84230       context.intersects = history.intersects;
84231
84232       // Debounce save, since it's a synchronous localStorage write,
84233       // and history changes can happen frequently (e.g. when dragging).
84234       context.debouncedSave = debounce(context.save, 350);
84235       function withDebouncedSave(fn) {
84236           return function() {
84237               var result = fn.apply(history, arguments);
84238               context.debouncedSave();
84239               return result;
84240           };
84241       }
84242
84243       context.perform = withDebouncedSave(history.perform);
84244       context.replace = withDebouncedSave(history.replace);
84245       context.pop = withDebouncedSave(history.pop);
84246       context.overwrite = withDebouncedSave(history.overwrite);
84247       context.undo = withDebouncedSave(history.undo);
84248       context.redo = withDebouncedSave(history.redo);
84249
84250       ui = uiInit(context);
84251
84252       connection = services.osm;
84253       background = rendererBackground(context);
84254       features = rendererFeatures(context);
84255       presets = presetIndex();
84256
84257       map = rendererMap(context);
84258       context.mouse = map.mouse;
84259       context.extent = map.extent;
84260       context.pan = map.pan;
84261       context.zoomIn = map.zoomIn;
84262       context.zoomOut = map.zoomOut;
84263       context.zoomInFurther = map.zoomInFurther;
84264       context.zoomOutFurther = map.zoomOutFurther;
84265       context.redrawEnable = map.redrawEnable;
84266
84267       forEach(services, function(service) {
84268           if (service && typeof service.init === 'function') {
84269               service.init(context);
84270           }
84271       });
84272
84273       background.init();
84274       features.init();
84275       presets.init();
84276       areaKeys = presets.areaKeys();
84277
84278
84279       return utilRebind(context, dispatch$$1, 'on');
84280   }
84281
84282   function osmWay() {
84283       if (!(this instanceof osmWay)) {
84284           return (new osmWay()).initialize(arguments);
84285       } else if (arguments.length) {
84286           this.initialize(arguments);
84287       }
84288   }
84289
84290
84291   osmEntity$$1.way = osmWay;
84292
84293   osmWay.prototype = Object.create(osmEntity$$1.prototype);
84294
84295
84296   assignIn(osmWay.prototype, {
84297       type: 'way',
84298       nodes: [],
84299
84300
84301       copy: function(resolver, copies) {
84302           if (copies[this.id]) return copies[this.id];
84303
84304           var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
84305
84306           var nodes = this.nodes.map(function(id) {
84307               return resolver.entity(id).copy(resolver, copies).id;
84308           });
84309
84310           copy = copy.update({ nodes: nodes });
84311           copies[this.id] = copy;
84312
84313           return copy;
84314       },
84315
84316
84317       extent: function(resolver) {
84318           return resolver.transient(this, 'extent', function() {
84319               var extent = geoExtent$$1();
84320               for (var i = 0; i < this.nodes.length; i++) {
84321                   var node = resolver.hasEntity(this.nodes[i]);
84322                   if (node) {
84323                       extent._extend(node.extent());
84324                   }
84325               }
84326               return extent;
84327           });
84328       },
84329
84330
84331       first: function() {
84332           return this.nodes[0];
84333       },
84334
84335
84336       last: function() {
84337           return this.nodes[this.nodes.length - 1];
84338       },
84339
84340
84341       contains: function(node) {
84342           return this.nodes.indexOf(node) >= 0;
84343       },
84344
84345
84346       affix: function(node) {
84347           if (this.nodes[0] === node) return 'prefix';
84348           if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
84349       },
84350
84351
84352       layer: function() {
84353           // explicit layer tag, clamp between -10, 10..
84354           if (isFinite(this.tags.layer)) {
84355               return Math.max(-10, Math.min(+(this.tags.layer), 10));
84356           }
84357
84358           // implied layer tag..
84359           if (this.tags.covered === 'yes') return -1;
84360           if (this.tags.location === 'overground') return 1;
84361           if (this.tags.location === 'underground') return -1;
84362           if (this.tags.location === 'underwater') return -10;
84363
84364           if (this.tags.power === 'line') return 10;
84365           if (this.tags.power === 'minor_line') return 10;
84366           if (this.tags.aerialway) return 10;
84367           if (this.tags.bridge) return 1;
84368           if (this.tags.cutting) return -1;
84369           if (this.tags.tunnel) return -1;
84370           if (this.tags.waterway) return -1;
84371           if (this.tags.man_made === 'pipeline') return -10;
84372           if (this.tags.boundary) return -10;
84373           return 0;
84374       },
84375
84376
84377       isOneWay: function() {
84378           // explicit oneway tag..
84379           var values = {
84380               'yes': true,
84381               '1': true,
84382               '-1': true,
84383               'reversible': true,
84384               'alternating': true,
84385               'no': false,
84386               '0': false
84387           };
84388           if (values[this.tags.oneway] !== undefined) {
84389               return values[this.tags.oneway];
84390           }
84391
84392           // implied oneway tag..
84393           for (var key in this.tags) {
84394               if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
84395                   return true;
84396           }
84397           return false;
84398       },
84399
84400       // Some identifier for tag that implies that this way is "sided",
84401       // i.e. the right side is the 'inside' (e.g. the right side of a
84402       // natural=cliff is lower).
84403       sidednessIdentifier: function() {
84404           for (var key in this.tags) {
84405               var value = this.tags[key];
84406               if (key in osmRightSideIsInsideTags && (value in osmRightSideIsInsideTags[key])) {
84407                   if (osmRightSideIsInsideTags[key][value] === true) {
84408                       return key;
84409                   } else {
84410                       // if the map's value is something other than a
84411                       // literal true, we should use it so we can
84412                       // special case some keys (e.g. natural=coastline
84413                       // is handled differently to other naturals).
84414                       return osmRightSideIsInsideTags[key][value];
84415                   }
84416               }
84417           }
84418
84419           return null;
84420       },
84421       isSided: function() {
84422           if (this.tags.two_sided === 'yes') {
84423               return false;
84424           }
84425
84426           return this.sidednessIdentifier() != null;
84427       },
84428
84429       lanes: function() {
84430           return osmLanes(this);
84431       },
84432
84433
84434       isClosed: function() {
84435           return this.nodes.length > 1 && this.first() === this.last();
84436       },
84437
84438
84439       isConvex: function(resolver) {
84440           if (!this.isClosed() || this.isDegenerate()) return null;
84441
84442           var nodes = uniq(resolver.childNodes(this));
84443           var coords = map$3(nodes, 'loc');
84444           var curr = 0;
84445           var prev = 0;
84446
84447           for (var i = 0; i < coords.length; i++) {
84448               var o = coords[(i+1) % coords.length];
84449               var a = coords[i];
84450               var b = coords[(i+2) % coords.length];
84451               var res = geoVecCross(a, b, o);
84452
84453               curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
84454               if (curr === 0) {
84455                   continue;
84456               } else if (prev && curr !== prev) {
84457                   return false;
84458               }
84459               prev = curr;
84460           }
84461           return true;
84462       },
84463
84464
84465       isArea: function() {
84466           // `highway` and `railway` are typically linear features, but there
84467           // are a few exceptions that should be treated as areas, even in the
84468           // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
84469           var lineKeys = {
84470               highway: {
84471                   rest_area: true,
84472                   services: true
84473               },
84474               railway: {
84475                   roundhouse: true,
84476                   station: true,
84477                   traverser: true,
84478                   turntable: true,
84479                   wash: true
84480               }
84481           };
84482
84483           if (this.tags.area === 'yes')
84484               return true;
84485           if (!this.isClosed() || this.tags.area === 'no')
84486               return false;
84487           for (var key in this.tags) {
84488               if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
84489                   return true;
84490               }
84491               if (key in lineKeys && this.tags[key] in lineKeys[key]) {
84492                   return true;
84493               }
84494           }
84495           return false;
84496       },
84497
84498
84499       isDegenerate: function() {
84500           return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
84501       },
84502
84503
84504       areAdjacent: function(n1, n2) {
84505           for (var i = 0; i < this.nodes.length; i++) {
84506               if (this.nodes[i] === n1) {
84507                   if (this.nodes[i - 1] === n2) return true;
84508                   if (this.nodes[i + 1] === n2) return true;
84509               }
84510           }
84511           return false;
84512       },
84513
84514
84515       geometry: function(graph) {
84516           return graph.transient(this, 'geometry', function() {
84517               return this.isArea() ? 'area' : 'line';
84518           });
84519       },
84520
84521
84522       // If this way is not closed, append the beginning node to the end of the nodelist to close it.
84523       close: function() {
84524           if (this.isClosed() || !this.nodes.length) return this;
84525
84526           var nodes = this.nodes.slice();
84527           nodes = nodes.filter(noRepeatNodes);
84528           nodes.push(nodes[0]);
84529           return this.update({ nodes: nodes });
84530       },
84531
84532
84533       // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
84534       unclose: function() {
84535           if (!this.isClosed()) return this;
84536
84537           var nodes = this.nodes.slice();
84538           var connector = this.first();
84539           var i = nodes.length - 1;
84540
84541           // remove trailing connectors..
84542           while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
84543               nodes.splice(i, 1);
84544               i = nodes.length - 1;
84545           }
84546
84547           nodes = nodes.filter(noRepeatNodes);
84548           return this.update({ nodes: nodes });
84549       },
84550
84551
84552       // Adds a node (id) in front of the node which is currently at position index.
84553       // If index is undefined, the node will be added to the end of the way for linear ways,
84554       //   or just before the final connecting node for circular ways.
84555       // Consecutive duplicates are eliminated including existing ones.
84556       // Circularity is always preserved when adding a node.
84557       addNode: function(id, index) {
84558           var nodes = this.nodes.slice();
84559           var isClosed = this.isClosed();
84560           var max = isClosed ? nodes.length - 1 : nodes.length;
84561
84562           if (index === undefined) {
84563               index = max;
84564           }
84565
84566           if (index < 0 || index > max) {
84567               throw new RangeError('index ' + index + ' out of range 0..' + max);
84568           }
84569
84570           // If this is a closed way, remove all connector nodes except the first one
84571           // (there may be duplicates) and adjust index if necessary..
84572           if (isClosed) {
84573               var connector = this.first();
84574
84575               // leading connectors..
84576               var i = 1;
84577               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
84578                   nodes.splice(i, 1);
84579                   if (index > i) index--;
84580               }
84581
84582               // trailing connectors..
84583               i = nodes.length - 1;
84584               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
84585                   nodes.splice(i, 1);
84586                   if (index > i) index--;
84587                   i = nodes.length - 1;
84588               }
84589           }
84590
84591           nodes.splice(index, 0, id);
84592           nodes = nodes.filter(noRepeatNodes);
84593
84594           // If the way was closed before, append a connector node to keep it closed..
84595           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
84596               nodes.push(nodes[0]);
84597           }
84598
84599           return this.update({ nodes: nodes });
84600       },
84601
84602
84603       // Replaces the node which is currently at position index with the given node (id).
84604       // Consecutive duplicates are eliminated including existing ones.
84605       // Circularity is preserved when updating a node.
84606       updateNode: function(id, index) {
84607           var nodes = this.nodes.slice();
84608           var isClosed = this.isClosed();
84609           var max = nodes.length - 1;
84610
84611           if (index === undefined || index < 0 || index > max) {
84612               throw new RangeError('index ' + index + ' out of range 0..' + max);
84613           }
84614
84615           // If this is a closed way, remove all connector nodes except the first one
84616           // (there may be duplicates) and adjust index if necessary..
84617           if (isClosed) {
84618               var connector = this.first();
84619
84620               // leading connectors..
84621               var i = 1;
84622               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
84623                   nodes.splice(i, 1);
84624                   if (index > i) index--;
84625               }
84626
84627               // trailing connectors..
84628               i = nodes.length - 1;
84629               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
84630                   nodes.splice(i, 1);
84631                   if (index === i) index = 0;  // update leading connector instead
84632                   i = nodes.length - 1;
84633               }
84634           }
84635
84636           nodes.splice(index, 1, id);
84637           nodes = nodes.filter(noRepeatNodes);
84638
84639           // If the way was closed before, append a connector node to keep it closed..
84640           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
84641               nodes.push(nodes[0]);
84642           }
84643
84644           return this.update({nodes: nodes});
84645       },
84646
84647
84648       // Replaces each occurrence of node id needle with replacement.
84649       // Consecutive duplicates are eliminated including existing ones.
84650       // Circularity is preserved.
84651       replaceNode: function(needleID, replacementID) {
84652           var nodes = this.nodes.slice();
84653           var isClosed = this.isClosed();
84654
84655           for (var i = 0; i < nodes.length; i++) {
84656               if (nodes[i] === needleID) {
84657                   nodes[i] = replacementID;
84658               }
84659           }
84660
84661           nodes = nodes.filter(noRepeatNodes);
84662
84663           // If the way was closed before, append a connector node to keep it closed..
84664           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
84665               nodes.push(nodes[0]);
84666           }
84667
84668           return this.update({nodes: nodes});
84669       },
84670
84671
84672       // Removes each occurrence of node id.
84673       // Consecutive duplicates are eliminated including existing ones.
84674       // Circularity is preserved.
84675       removeNode: function(id) {
84676           var nodes = this.nodes.slice();
84677           var isClosed = this.isClosed();
84678
84679           nodes = nodes
84680               .filter(function(node) { return node !== id; })
84681               .filter(noRepeatNodes);
84682
84683           // If the way was closed before, append a connector node to keep it closed..
84684           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
84685               nodes.push(nodes[0]);
84686           }
84687
84688           return this.update({nodes: nodes});
84689       },
84690
84691
84692       asJXON: function(changeset_id) {
84693           var r = {
84694               way: {
84695                   '@id': this.osmId(),
84696                   '@version': this.version || 0,
84697                   nd: map$3(this.nodes, function(id) {
84698                       return { keyAttributes: { ref: osmEntity$$1.id.toOSM(id) } };
84699                   }),
84700                   tag: map$3(this.tags, function(v, k) {
84701                       return { keyAttributes: { k: k, v: v } };
84702                   })
84703               }
84704           };
84705           if (changeset_id) {
84706               r.way['@changeset'] = changeset_id;
84707           }
84708           return r;
84709       },
84710
84711
84712       asGeoJSON: function(resolver) {
84713           return resolver.transient(this, 'GeoJSON', function() {
84714               var coordinates = map$3(resolver.childNodes(this), 'loc');
84715               if (this.isArea() && this.isClosed()) {
84716                   return {
84717                       type: 'Polygon',
84718                       coordinates: [coordinates]
84719                   };
84720               } else {
84721                   return {
84722                       type: 'LineString',
84723                       coordinates: coordinates
84724                   };
84725               }
84726           });
84727       },
84728
84729
84730       area: function(resolver) {
84731           return resolver.transient(this, 'area', function() {
84732               var nodes = resolver.childNodes(this);
84733
84734               var json = {
84735                   type: 'Polygon',
84736                   coordinates: [map$3(nodes, 'loc')]
84737               };
84738
84739               if (!this.isClosed() && nodes.length) {
84740                   json.coordinates[0].push(nodes[0].loc);
84741               }
84742
84743               var area = d3_geoArea(json);
84744
84745               // Heuristic for detecting counterclockwise winding order. Assumes
84746               // that OpenStreetMap polygons are not hemisphere-spanning.
84747               if (area > 2 * Math.PI) {
84748                   json.coordinates[0] = json.coordinates[0].reverse();
84749                   area = d3_geoArea(json);
84750               }
84751
84752               return isNaN(area) ? 0 : area;
84753           });
84754       }
84755   });
84756
84757
84758   // Filter function to eliminate consecutive duplicates.
84759   function noRepeatNodes(node, i, arr) {
84760       return i === 0 || node !== arr[i - 1];
84761   }
84762
84763   // For fixing up rendering of multipolygons with tags on the outer member.
84764   // https://github.com/openstreetmap/iD/issues/613
84765   function osmIsSimpleMultipolygonOuterMember(entity, graph) {
84766       if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
84767           return false;
84768
84769       var parents = graph.parentRelations(entity);
84770       if (parents.length !== 1)
84771           return false;
84772
84773       var parent = parents[0];
84774       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
84775           return false;
84776
84777       var members = parent.members, member;
84778       for (var i = 0; i < members.length; i++) {
84779           member = members[i];
84780           if (member.id === entity.id && member.role && member.role !== 'outer')
84781               return false; // Not outer member
84782           if (member.id !== entity.id && (!member.role || member.role === 'outer'))
84783               return false; // Not a simple multipolygon
84784       }
84785
84786       return parent;
84787   }
84788
84789
84790   function osmSimpleMultipolygonOuterMember(entity, graph) {
84791       if (entity.type !== 'way')
84792           return false;
84793
84794       var parents = graph.parentRelations(entity);
84795       if (parents.length !== 1)
84796           return false;
84797
84798       var parent = parents[0];
84799       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
84800           return false;
84801
84802       var members = parent.members, member, outerMember;
84803       for (var i = 0; i < members.length; i++) {
84804           member = members[i];
84805           if (!member.role || member.role === 'outer') {
84806               if (outerMember)
84807                   return false; // Not a simple multipolygon
84808               outerMember = member;
84809           }
84810       }
84811
84812       if (!outerMember)
84813           return false;
84814
84815       var outerEntity = graph.hasEntity(outerMember.id);
84816       if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
84817           return false;
84818
84819       return outerEntity;
84820   }
84821
84822
84823   // Join `toJoin` array into sequences of connecting ways.
84824
84825   // Segments which share identical start/end nodes will, as much as possible,
84826   // be connected with each other.
84827   //
84828   // The return value is a nested array. Each constituent array contains elements
84829   // of `toJoin` which have been determined to connect.
84830   //
84831   // Each consitituent array also has a `nodes` property whose value is an
84832   // ordered array of member nodes, with appropriate order reversal and
84833   // start/end coordinate de-duplication.
84834   //
84835   // Members of `toJoin` must have, at minimum, `type` and `id` properties.
84836   // Thus either an array of `osmWay`s or a relation member array may be used.
84837   //
84838   // If an member is an `osmWay`, its tags and childnodes may be reversed via
84839   // `actionReverse` in the output.
84840   //
84841   // The returned sequences array also has an `actions` array property, containing
84842   // any reversal actions that should be applied to the graph, should the calling
84843   // code attempt to actually join the given ways.
84844   //
84845   // Incomplete members (those for which `graph.hasEntity(element.id)` returns
84846   // false) and non-way members are ignored.
84847   //
84848   function osmJoinWays(toJoin, graph) {
84849       function resolve(member) {
84850           return graph.childNodes(graph.entity(member.id));
84851       }
84852
84853       function reverse(item) {
84854           var action = actionReverse(item.id, { reverseOneway: true });
84855           sequences.actions.push(action);
84856           return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
84857       }
84858
84859       // make a copy containing only the items to join
84860       toJoin = toJoin.filter(function(member) {
84861           return member.type === 'way' && graph.hasEntity(member.id);
84862       });
84863
84864       // Are the things we are joining relation members or `osmWays`?
84865       // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
84866       var i;
84867       var joinAsMembers = true;
84868       for (i = 0; i < toJoin.length; i++) {
84869           if (toJoin[i] instanceof osmWay) {
84870               joinAsMembers = false;
84871               break;
84872           }
84873       }
84874
84875       var sequences = [];
84876       sequences.actions = [];
84877
84878       while (toJoin.length) {
84879           // start a new sequence
84880           var item = toJoin.shift();
84881           var currWays = [item];
84882           var currNodes = resolve(item).slice();
84883           var doneSequence = false;
84884
84885           // add to it
84886           while (toJoin.length && !doneSequence) {
84887               var start = currNodes[0];
84888               var end = currNodes[currNodes.length - 1];
84889               var fn = null;
84890               var nodes = null;
84891
84892               // Find the next way/member to join.
84893               for (i = 0; i < toJoin.length; i++) {
84894                   item = toJoin[i];
84895                   nodes = resolve(item);
84896
84897                   // (for member ordering only, not way ordering - see #4872)
84898                   // Strongly prefer to generate a forward path that preserves the order
84899                   // of the members array. For multipolygons and most relations, member
84900                   // order does not matter - but for routes, it does. (see #4589)
84901                   // If we started this sequence backwards (i.e. next member way attaches to
84902                   // the start node and not the end node), reverse the initial way before continuing.
84903                   if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
84904                       (nodes[nodes.length - 1] === start || nodes[0] === start)
84905                   ) {
84906                       currWays[0] = reverse(currWays[0]);
84907                       currNodes.reverse();
84908                       start = currNodes[0];
84909                       end = currNodes[currNodes.length - 1];
84910                   }
84911
84912                   if (nodes[0] === end) {
84913                       fn = currNodes.push;               // join to end
84914                       nodes = nodes.slice(1);
84915                       break;
84916                   } else if (nodes[nodes.length - 1] === end) {
84917                       fn = currNodes.push;               // join to end
84918                       nodes = nodes.slice(0, -1).reverse();
84919                       item = reverse(item);
84920                       break;
84921                   } else if (nodes[nodes.length - 1] === start) {
84922                       fn = currNodes.unshift;            // join to beginning
84923                       nodes = nodes.slice(0, -1);
84924                       break;
84925                   } else if (nodes[0] === start) {
84926                       fn = currNodes.unshift;            // join to beginning
84927                       nodes = nodes.slice(1).reverse();
84928                       item = reverse(item);
84929                       break;
84930                   } else {
84931                       fn = nodes = null;
84932                   }
84933               }
84934
84935               if (!nodes) {     // couldn't find a joinable way/member
84936                   doneSequence = true;
84937                   break;
84938               }
84939
84940               fn.apply(currWays, [item]);
84941               fn.apply(currNodes, nodes);
84942
84943               toJoin.splice(i, 1);
84944           }
84945
84946           currWays.nodes = currNodes;
84947           sequences.push(currWays);
84948       }
84949
84950       return sequences;
84951   }
84952
84953   function osmRelation() {
84954       if (!(this instanceof osmRelation)) {
84955           return (new osmRelation()).initialize(arguments);
84956       } else if (arguments.length) {
84957           this.initialize(arguments);
84958       }
84959   }
84960
84961
84962   osmEntity$$1.relation = osmRelation;
84963
84964   osmRelation.prototype = Object.create(osmEntity$$1.prototype);
84965
84966
84967   osmRelation.creationOrder = function(a, b) {
84968       var aId = parseInt(osmEntity$$1.id.toOSM(a.id), 10);
84969       var bId = parseInt(osmEntity$$1.id.toOSM(b.id), 10);
84970
84971       if (aId < 0 || bId < 0) return aId - bId;
84972       return bId - aId;
84973   };
84974
84975
84976   assignIn(osmRelation.prototype, {
84977       type: 'relation',
84978       members: [],
84979
84980
84981       copy: function(resolver, copies) {
84982           if (copies[this.id]) return copies[this.id];
84983
84984           var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
84985
84986           var members = this.members.map(function(member) {
84987               return assignIn({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
84988           });
84989
84990           copy = copy.update({members: members});
84991           copies[this.id] = copy;
84992
84993           return copy;
84994       },
84995
84996
84997       extent: function(resolver, memo) {
84998           return resolver.transient(this, 'extent', function() {
84999               if (memo && memo[this.id]) return geoExtent$$1();
85000               memo = memo || {};
85001               memo[this.id] = true;
85002
85003               var extent = geoExtent$$1();
85004               for (var i = 0; i < this.members.length; i++) {
85005                   var member = resolver.hasEntity(this.members[i].id);
85006                   if (member) {
85007                       extent._extend(member.extent(resolver, memo));
85008                   }
85009               }
85010               return extent;
85011           });
85012       },
85013
85014
85015       geometry: function(graph) {
85016           return graph.transient(this, 'geometry', function() {
85017               return this.isMultipolygon() ? 'area' : 'relation';
85018           });
85019       },
85020
85021
85022       isDegenerate: function() {
85023           return this.members.length === 0;
85024       },
85025
85026
85027       // Return an array of members, each extended with an 'index' property whose value
85028       // is the member index.
85029       indexedMembers: function() {
85030           var result = new Array(this.members.length);
85031           for (var i = 0; i < this.members.length; i++) {
85032               result[i] = assignIn({}, this.members[i], {index: i});
85033           }
85034           return result;
85035       },
85036
85037
85038       // Return the first member with the given role. A copy of the member object
85039       // is returned, extended with an 'index' property whose value is the member index.
85040       memberByRole: function(role) {
85041           for (var i = 0; i < this.members.length; i++) {
85042               if (this.members[i].role === role) {
85043                   return assignIn({}, this.members[i], {index: i});
85044               }
85045           }
85046       },
85047
85048       // Same as memberByRole, but returns all members with the given role
85049       membersByRole: function(role) {
85050           var result = [];
85051           for (var i = 0; i < this.members.length; i++) {
85052               if (this.members[i].role === role) {
85053                   result.push(assignIn({}, this.members[i], {index: i}));
85054               }
85055           }
85056           return result;
85057       },
85058
85059       // Return the first member with the given id. A copy of the member object
85060       // is returned, extended with an 'index' property whose value is the member index.
85061       memberById: function(id) {
85062           for (var i = 0; i < this.members.length; i++) {
85063               if (this.members[i].id === id) {
85064                   return assignIn({}, this.members[i], {index: i});
85065               }
85066           }
85067       },
85068
85069
85070       // Return the first member with the given id and role. A copy of the member object
85071       // is returned, extended with an 'index' property whose value is the member index.
85072       memberByIdAndRole: function(id, role) {
85073           for (var i = 0; i < this.members.length; i++) {
85074               if (this.members[i].id === id && this.members[i].role === role) {
85075                   return assignIn({}, this.members[i], {index: i});
85076               }
85077           }
85078       },
85079
85080
85081       addMember: function(member, index) {
85082           var members = this.members.slice();
85083           members.splice(index === undefined ? members.length : index, 0, member);
85084           return this.update({members: members});
85085       },
85086
85087
85088       updateMember: function(member, index) {
85089           var members = this.members.slice();
85090           members.splice(index, 1, assignIn({}, members[index], member));
85091           return this.update({members: members});
85092       },
85093
85094
85095       removeMember: function(index) {
85096           var members = this.members.slice();
85097           members.splice(index, 1);
85098           return this.update({members: members});
85099       },
85100
85101
85102       removeMembersWithID: function(id) {
85103           var members = reject(this.members, function(m) { return m.id === id; });
85104           return this.update({members: members});
85105       },
85106
85107
85108       // Wherever a member appears with id `needle.id`, replace it with a member
85109       // with id `replacement.id`, type `replacement.type`, and the original role,
85110       // By default, adding a duplicate member (by id and role) is prevented.
85111       // Return an updated relation.
85112       replaceMember: function(needle, replacement, keepDuplicates) {
85113           if (!this.memberById(needle.id))
85114               return this;
85115
85116           var members = [];
85117
85118           for (var i = 0; i < this.members.length; i++) {
85119               var member = this.members[i];
85120               if (member.id !== needle.id) {
85121                   members.push(member);
85122               } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
85123                   members.push({id: replacement.id, type: replacement.type, role: member.role});
85124               }
85125           }
85126
85127           return this.update({members: members});
85128       },
85129
85130
85131       asJXON: function(changeset_id) {
85132           var r = {
85133               relation: {
85134                   '@id': this.osmId(),
85135                   '@version': this.version || 0,
85136                   member: map$3(this.members, function(member) {
85137                       return {
85138                           keyAttributes: {
85139                               type: member.type,
85140                               role: member.role,
85141                               ref: osmEntity$$1.id.toOSM(member.id)
85142                           }
85143                       };
85144                   }),
85145                   tag: map$3(this.tags, function(v, k) {
85146                       return { keyAttributes: { k: k, v: v } };
85147                   })
85148               }
85149           };
85150           if (changeset_id) r.relation['@changeset'] = changeset_id;
85151           return r;
85152       },
85153
85154
85155       asGeoJSON: function(resolver) {
85156           return resolver.transient(this, 'GeoJSON', function () {
85157               if (this.isMultipolygon()) {
85158                   return {
85159                       type: 'MultiPolygon',
85160                       coordinates: this.multipolygon(resolver)
85161                   };
85162               } else {
85163                   return {
85164                       type: 'FeatureCollection',
85165                       properties: this.tags,
85166                       features: this.members.map(function (member) {
85167                           return assignIn({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
85168                       })
85169                   };
85170               }
85171           });
85172       },
85173
85174
85175       area: function(resolver) {
85176           return resolver.transient(this, 'area', function() {
85177               return d3_geoArea(this.asGeoJSON(resolver));
85178           });
85179       },
85180
85181
85182       isMultipolygon: function() {
85183           return this.tags.type === 'multipolygon';
85184       },
85185
85186
85187       isComplete: function(resolver) {
85188           for (var i = 0; i < this.members.length; i++) {
85189               if (!resolver.hasEntity(this.members[i].id)) {
85190                   return false;
85191               }
85192           }
85193           return true;
85194       },
85195
85196
85197       isRestriction: function() {
85198           return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
85199       },
85200
85201
85202       isValidRestriction: function() {
85203           if (!this.isRestriction()) return false;
85204
85205           var froms = this.members.filter(function(m) { return m.role === 'from'; });
85206           var vias = this.members.filter(function(m) { return m.role === 'via'; });
85207           var tos = this.members.filter(function(m) { return m.role === 'to'; });
85208
85209           if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
85210           if (froms.some(function(m) { return m.type !== 'way'; })) return false;
85211
85212           if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
85213           if (tos.some(function(m) { return m.type !== 'way'; })) return false;
85214
85215           if (vias.length === 0) return false;
85216           if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
85217
85218           return true;
85219       },
85220
85221
85222       // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
85223       // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
85224       //
85225       // This corresponds to the structure needed for rendering a multipolygon path using a
85226       // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
85227       //
85228       // In the case of invalid geometries, this function will still return a result which
85229       // includes the nodes of all way members, but some Nds may be unclosed and some inner
85230       // rings not matched with the intended outer ring.
85231       //
85232       multipolygon: function(resolver) {
85233           var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
85234           var inners = this.members.filter(function(m) { return 'inner' === m.role; });
85235
85236           outers = osmJoinWays(outers, resolver);
85237           inners = osmJoinWays(inners, resolver);
85238
85239           outers = outers.map(function(outer) { return map$3(outer.nodes, 'loc'); });
85240           inners = inners.map(function(inner) { return map$3(inner.nodes, 'loc'); });
85241
85242           var result = outers.map(function(o) {
85243               // Heuristic for detecting counterclockwise winding order. Assumes
85244               // that OpenStreetMap polygons are not hemisphere-spanning.
85245               return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
85246           });
85247
85248           function findOuter(inner) {
85249               var o, outer;
85250
85251               for (o = 0; o < outers.length; o++) {
85252                   outer = outers[o];
85253                   if (geoPolygonContainsPolygon(outer, inner))
85254                       return o;
85255               }
85256
85257               for (o = 0; o < outers.length; o++) {
85258                   outer = outers[o];
85259                   if (geoPolygonIntersectsPolygon(outer, inner, false))
85260                       return o;
85261               }
85262           }
85263
85264           for (var i = 0; i < inners.length; i++) {
85265               var inner = inners[i];
85266
85267               if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
85268                   inner = inner.reverse();
85269               }
85270
85271               var o = findOuter(inners[i]);
85272               if (o !== undefined)
85273                   result[o].push(inners[i]);
85274               else
85275                   result.push([inners[i]]); // Invalid geometry
85276           }
85277
85278           return result;
85279       }
85280   });
85281
85282   function osmTurn(turn) {
85283       if (!(this instanceof osmTurn)) {
85284           return new osmTurn(turn);
85285       }
85286       assignIn(this, turn);
85287   }
85288
85289
85290   function osmIntersection(graph, startVertexId, maxDistance) {
85291       maxDistance = maxDistance || 30;    // in meters
85292       var vgraph = coreGraph$$1();           // virtual graph
85293       var i, j, k;
85294
85295
85296       function memberOfRestriction(entity) {
85297           return graph.parentRelations(entity)
85298               .some(function(r) { return r.isRestriction(); });
85299       }
85300
85301       function isRoad(way) {
85302           if (way.isArea() || way.isDegenerate()) return false;
85303           var roads = {
85304               'motorway': true,
85305               'motorway_link': true,
85306               'trunk': true,
85307               'trunk_link': true,
85308               'primary': true,
85309               'primary_link': true,
85310               'secondary': true,
85311               'secondary_link': true,
85312               'tertiary': true,
85313               'tertiary_link': true,
85314               'residential': true,
85315               'unclassified': true,
85316               'living_street': true,
85317               'service': true,
85318               'road': true,
85319               'track': true
85320           };
85321           return roads[way.tags.highway];
85322       }
85323
85324
85325       var startNode = graph.entity(startVertexId);
85326       var checkVertices = [startNode];
85327       var checkWays;
85328       var vertices = [];
85329       var vertexIds = [];
85330       var vertex;
85331       var ways = [];
85332       var wayIds = [];
85333       var way;
85334       var nodes = [];
85335       var node;
85336       var parents = [];
85337       var parent;
85338
85339       // `actions` will store whatever actions must be performed to satisfy
85340       // preconditions for adding a turn restriction to this intersection.
85341       //  - Remove any existing degenerate turn restrictions (missing from/to, etc)
85342       //  - Reverse oneways so that they are drawn in the forward direction
85343       //  - Split ways on key vertices
85344       var actions = [];
85345
85346
85347       // STEP 1:  walk the graph outwards from starting vertex to search
85348       //  for more key vertices and ways to include in the intersection..
85349
85350       while (checkVertices.length) {
85351           vertex = checkVertices.pop();
85352
85353           // check this vertex for parent ways that are roads
85354           checkWays = graph.parentWays(vertex);
85355           var hasWays = false;
85356           for (i = 0; i < checkWays.length; i++) {
85357               way = checkWays[i];
85358               if (!isRoad(way) && !memberOfRestriction(way)) continue;
85359
85360               ways.push(way);   // it's a road, or it's already in a turn restriction
85361               hasWays = true;
85362
85363               // check the way's children for more key vertices
85364               nodes = uniq(graph.childNodes(way));
85365               for (j = 0; j < nodes.length; j++) {
85366                   node = nodes[j];
85367                   if (node === vertex) continue;                                           // same thing
85368                   if (vertices.indexOf(node) !== -1) continue;                             // seen it already
85369                   if (node.loc && startNode.loc &&
85370                       geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue;   // too far from start
85371
85372                   // a key vertex will have parents that are also roads
85373                   var hasParents = false;
85374                   parents = graph.parentWays(node);
85375                   for (k = 0; k < parents.length; k++) {
85376                       parent = parents[k];
85377                       if (parent === way) continue;                 // same thing
85378                       if (ways.indexOf(parent) !== -1) continue;    // seen it already
85379                       if (!isRoad(parent)) continue;                // not a road
85380                       hasParents = true;
85381                       break;
85382                   }
85383
85384                   if (hasParents) {
85385                       checkVertices.push(node);
85386                   }
85387               }
85388           }
85389
85390           if (hasWays) {
85391               vertices.push(vertex);
85392           }
85393       }
85394
85395       vertices = uniq(vertices);
85396       ways = uniq(ways);
85397
85398
85399       // STEP 2:  Build a virtual graph containing only the entities in the intersection..
85400       // Everything done after this step should act on the virtual graph
85401       // Any actions that must be performed later to the main graph go in `actions` array
85402       ways.forEach(function(way) {
85403           graph.childNodes(way).forEach(function(node) {
85404               vgraph = vgraph.replace(node);
85405           });
85406
85407           vgraph = vgraph.replace(way);
85408
85409           graph.parentRelations(way).forEach(function(relation) {
85410               if (relation.isRestriction()) {
85411                   if (relation.isValidRestriction(graph)) {
85412                       vgraph = vgraph.replace(relation);
85413                   } else if (relation.isComplete(graph)) {
85414                       actions.push(actionDeleteRelation(relation.id));
85415                   }
85416               }
85417           });
85418       });
85419
85420
85421       // STEP 3:  Force all oneways to be drawn in the forward direction
85422       ways.forEach(function(w) {
85423           var way = vgraph.entity(w.id);
85424           if (way.tags.oneway === '-1') {
85425               var action = actionReverse(way.id, { reverseOneway: true });
85426               actions.push(action);
85427               vgraph = action(vgraph);
85428           }
85429       });
85430
85431
85432       // STEP 4:  Split ways on key vertices
85433       var origCount = osmEntity$$1.id.next.way;
85434       vertices.forEach(function(v) {
85435           // This is an odd way to do it, but we need to find all the ways that
85436           // will be split here, then split them one at a time to ensure that these
85437           // actions can be replayed on the main graph exactly in the same order.
85438           // (It is unintuitive, but the order of ways returned from graph.parentWays()
85439           // is arbitrary, depending on how the main graph and vgraph were built)
85440           var splitAll = actionSplit(v.id);
85441           if (!splitAll.disabled(vgraph)) {
85442               splitAll.ways(vgraph).forEach(function(way) {
85443                   var splitOne = actionSplit(v.id).limitWays([way.id]);
85444                   actions.push(splitOne);
85445                   vgraph = splitOne(vgraph);
85446               });
85447           }
85448       });
85449
85450       // In here is where we should also split the intersection at nearby junction.
85451       //   for https://github.com/mapbox/iD-internal/issues/31
85452       // nearbyVertices.forEach(function(v) {
85453       // });
85454
85455       // Reasons why we reset the way id count here:
85456       //  1. Continuity with way ids created by the splits so that we can replay
85457       //     these actions later if the user decides to create a turn restriction
85458       //  2. Avoids churning way ids just by hovering over a vertex
85459       //     and displaying the turn restriction editor
85460       osmEntity$$1.id.next.way = origCount;
85461
85462
85463       // STEP 5:  Update arrays to point to vgraph entities
85464       vertexIds = vertices.map(function(v) { return v.id; });
85465       vertices = [];
85466       ways = [];
85467
85468       vertexIds.forEach(function(id) {
85469           var vertex = vgraph.entity(id);
85470           var parents = vgraph.parentWays(vertex);
85471           vertices.push(vertex);
85472           ways = ways.concat(parents);
85473       });
85474
85475       vertices = uniq(vertices);
85476       ways = uniq(ways);
85477
85478       vertexIds = vertices.map(function(v) { return v.id; });
85479       wayIds = ways.map(function(w) { return w.id; });
85480
85481
85482       // STEP 6:  Update the ways with some metadata that will be useful for
85483       // walking the intersection graph later and rendering turn arrows.
85484
85485       function withMetadata(way, vertexIds) {
85486           var __oneWay = way.isOneWay();
85487
85488           // which affixes are key vertices?
85489           var __first = (vertexIds.indexOf(way.first()) !== -1);
85490           var __last = (vertexIds.indexOf(way.last()) !== -1);
85491
85492           // what roles is this way eligible for?
85493           var __via = (__first && __last);
85494           var __from = ((__first && !__oneWay) || __last);
85495           var __to = (__first || (__last && !__oneWay));
85496
85497           return way.update({
85498               __first:  __first,
85499               __last:  __last,
85500               __from:  __from,
85501               __via: __via,
85502               __to:  __to,
85503               __oneWay:  __oneWay
85504           });
85505       }
85506
85507       ways = [];
85508       wayIds.forEach(function(id) {
85509           var way = withMetadata(vgraph.entity(id), vertexIds);
85510           vgraph = vgraph.replace(way);
85511           ways.push(way);
85512       });
85513
85514
85515       // STEP 7:  Simplify - This is an iterative process where we:
85516       //  1. Find trivial vertices with only 2 parents
85517       //  2. trim off the leaf way from those vertices and remove from vgraph
85518
85519       var keepGoing;
85520       var removeWayIds = [];
85521       var removeVertexIds = [];
85522
85523       do {
85524           keepGoing = false;
85525           checkVertices = vertexIds.slice();
85526
85527           for (i = 0; i < checkVertices.length; i++) {
85528               var vertexId = checkVertices[i];
85529               vertex = vgraph.hasEntity(vertexId);
85530
85531               if (!vertex) {
85532                   if (vertexIds.indexOf(vertexId) !== -1) {
85533                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
85534                   }
85535                   removeVertexIds.push(vertexId);
85536                   continue;
85537               }
85538
85539               parents = vgraph.parentWays(vertex);
85540               if (parents.length < 3) {
85541                   if (vertexIds.indexOf(vertexId) !== -1) {
85542                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
85543                   }
85544               }
85545
85546               if (parents.length === 2) {     // vertex with 2 parents is trivial
85547                   var a = parents[0];
85548                   var b = parents[1];
85549                   var aIsLeaf = a && !a.__via;
85550                   var bIsLeaf = b && !b.__via;
85551                   var leaf, survivor;
85552
85553                   if (aIsLeaf && !bIsLeaf) {
85554                       leaf = a;
85555                       survivor = b;
85556                   } else if (!aIsLeaf && bIsLeaf) {
85557                       leaf = b;
85558                       survivor = a;
85559                   }
85560
85561                   if (leaf && survivor) {
85562                       survivor = withMetadata(survivor, vertexIds);      // update survivor way
85563                       vgraph = vgraph.replace(survivor).remove(leaf);    // update graph
85564                       removeWayIds.push(leaf.id);
85565                       keepGoing = true;
85566                   }
85567               }
85568
85569               parents = vgraph.parentWays(vertex);
85570
85571               if (parents.length < 2) {     // vertex is no longer a key vertex
85572                   if (vertexIds.indexOf(vertexId) !== -1) {
85573                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
85574                   }
85575                   removeVertexIds.push(vertexId);
85576                   keepGoing = true;
85577               }
85578
85579               if (parents.length < 1) {     // vertex is no longer attached to anything
85580                   vgraph = vgraph.remove(vertex);
85581               }
85582
85583           }
85584       } while (keepGoing);
85585
85586
85587       vertices = vertices
85588           .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
85589           .map(function(vertex) { return vgraph.entity(vertex.id); });
85590       ways = ways
85591           .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
85592           .map(function(way) { return vgraph.entity(way.id); });
85593
85594
85595       // OK!  Here is our intersection..
85596       var intersection = {
85597           graph: vgraph,
85598           actions: actions,
85599           vertices: vertices,
85600           ways: ways,
85601       };
85602
85603
85604
85605       // Get all the valid turns through this intersection given a starting way id.
85606       // This operates on the virtual graph for everything.
85607       //
85608       // Basically, walk through all possible paths from starting way,
85609       //   honoring the existing turn restrictions as we go (watch out for loops!)
85610       //
85611       // For each path found, generate and return a `osmTurn` datastructure.
85612       //
85613       intersection.turns = function(fromWayId, maxViaWay) {
85614           if (!fromWayId) return [];
85615           if (!maxViaWay) maxViaWay = 0;
85616
85617           var vgraph = intersection.graph;
85618           var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
85619
85620           var start = vgraph.entity(fromWayId);
85621           if (!start || !(start.__from || start.__via)) return [];
85622
85623           // maxViaWay=0   from-*-to              (0 vias)
85624           // maxViaWay=1   from-*-via-*-to        (1 via max)
85625           // maxViaWay=2   from-*-via-*-via-*-to  (2 vias max)
85626           var maxPathLength = (maxViaWay * 2) + 3;
85627           var turns = [];
85628
85629           step(start);
85630           return turns;
85631
85632
85633           // traverse the intersection graph and find all the valid paths
85634           function step(entity, currPath, currRestrictions, matchedRestriction) {
85635               currPath = clone(currPath || []);
85636               if (currPath.length >= maxPathLength) return;
85637               currPath.push(entity.id);
85638               currRestrictions = clone(currRestrictions || []);
85639               var i, j;
85640
85641               if (entity.type === 'node') {
85642                   var parents = vgraph.parentWays(entity);
85643                   var nextWays = [];
85644
85645                   // which ways can we step into?
85646                   for (i = 0; i < parents.length; i++) {
85647                       var way = parents[i];
85648
85649                       // if next way is a oneway incoming to this vertex, skip
85650                       if (way.__oneWay && way.nodes[0] !== entity.id) continue;
85651
85652                       // if we have seen it before (allowing for an initial u-turn), skip
85653                       if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
85654
85655                       // Check all "current" restrictions (where we've already walked the `FROM`)
85656                       var restrict = undefined;
85657                       for (j = 0; j < currRestrictions.length; j++) {
85658                           var restriction = currRestrictions[j];
85659                           var f = restriction.memberByRole('from');
85660                           var v = restriction.membersByRole('via');
85661                           var t = restriction.memberByRole('to');
85662                           var isOnly = /^only_/.test(restriction.tags.restriction);
85663
85664                           // Does the current path match this turn restriction?
85665                           var matchesFrom = (f.id === fromWayId);
85666                           var matchesViaTo = false;
85667                           var isAlongOnlyPath = false;
85668
85669                           if (t.id === way.id) {     // match TO
85670
85671                               if (v.length === 1 && v[0].type === 'node') {    // match VIA node
85672                                   matchesViaTo = (v[0].id === entity.id && (
85673                                       (matchesFrom && currPath.length === 2) ||
85674                                       (!matchesFrom && currPath.length > 2)
85675                                   ));
85676
85677                               } else {                                         // match all VIA ways
85678                                   var pathVias = [];
85679                                   for (k = 2; k < currPath.length; k +=2 ) {   // k = 2 skips FROM
85680                                       pathVias.push(currPath[k]);              // (path goes way-node-way...)
85681                                   }
85682                                   var restrictionVias = [];
85683                                   for (k = 0; k < v.length; k++) {
85684                                       if (v[k].type === 'way') {
85685                                           restrictionVias.push(v[k].id);
85686                                       }
85687                                   }
85688                                   var diff = difference(pathVias, restrictionVias);
85689                                   matchesViaTo = !diff.length;
85690                               }
85691
85692                           } else if (isOnly) {
85693                               for (k = 0; k < v.length; k++) {
85694                                   // way doesn't match TO, but is one of the via ways along the path of an "only"
85695                                   if (v[k].type === 'way' && v[k].id === way.id) {
85696                                       isAlongOnlyPath = true;
85697                                       break;
85698                                   }
85699                               }
85700                           }
85701
85702                           if (matchesViaTo) {
85703                               if (isOnly) {
85704                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
85705                               } else {
85706                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
85707                               }
85708                           } else {    // indirect - caused by a different nearby restriction
85709                               if (isAlongOnlyPath) {
85710                                   restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
85711                               } else if (isOnly) {
85712                                   restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
85713                               }
85714                           }
85715
85716                           // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
85717                           if (restrict && restrict.direct)
85718                               break;
85719                       }
85720
85721                       nextWays.push({ way: way, restrict: restrict });
85722                   }
85723
85724                   nextWays.forEach(function(nextWay) {
85725                       step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
85726                   });
85727
85728
85729               } else {  // entity.type === 'way'
85730                   if (currPath.length >= 3) {     // this is a "complete" path..
85731                       var turnPath = clone(currPath);
85732
85733                       // an indirect restriction - only include the partial path (starting at FROM)
85734                       if (matchedRestriction && matchedRestriction.direct === false) {
85735                           for (i = 0; i < turnPath.length; i++) {
85736                               if (turnPath[i] === matchedRestriction.from) {
85737                                   turnPath = turnPath.slice(i);
85738                                   break;
85739                               }
85740                           }
85741                       }
85742
85743                       var turn = pathToTurn(turnPath);
85744                       if (turn) {
85745                           if (matchedRestriction) {
85746                               turn.restrictionID = matchedRestriction.id;
85747                               turn.no = matchedRestriction.no;
85748                               turn.only = matchedRestriction.only;
85749                               turn.direct = matchedRestriction.direct;
85750                           }
85751                           turns.push(osmTurn(turn));
85752                       }
85753
85754                       if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
85755                   }
85756
85757                   if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
85758
85759                   // which nodes can we step into?
85760                   var n1 = vgraph.entity(entity.first());
85761                   var n2 = vgraph.entity(entity.last());
85762                   var dist = n1.loc && n2.loc && geoSphericalDistance(n1.loc, n2.loc);
85763                   var nextNodes = [];
85764
85765                   if (currPath.length > 1) {
85766                       if (dist > maxDistance) return;   // the next node is too far
85767                       if (!entity.__via) return;        // this way is a leaf / can't be a via
85768                   }
85769
85770                   if (!entity.__oneWay &&                     // bidirectional..
85771                       keyVertexIds.indexOf(n1.id) !== -1 &&   // key vertex..
85772                       currPath.indexOf(n1.id) === -1) {       // haven't seen it yet..
85773                       nextNodes.push(n1);                     // can advance to first node
85774                   }
85775                   if (keyVertexIds.indexOf(n2.id) !== -1 &&   // key vertex..
85776                       currPath.indexOf(n2.id) === -1) {       // haven't seen it yet..
85777                       nextNodes.push(n2);                     // can advance to last node
85778                   }
85779
85780                   nextNodes.forEach(function(nextNode) {
85781                       // gather restrictions FROM this way
85782                       var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
85783                           if (!r.isRestriction()) return false;
85784
85785                           var f = r.memberByRole('from');
85786                           if (!f || f.id !== entity.id) return false;
85787
85788                           var isOnly = /^only_/.test(r.tags.restriction);
85789                           if (!isOnly) return true;
85790
85791                           // `only_` restrictions only matter along the direction of the VIA - #4849
85792                           var isOnlyVia = false;
85793                           var v = r.membersByRole('via');
85794                           if (v.length === 1 && v[0].type === 'node') {   // via node
85795                               isOnlyVia = (v[0].id === nextNode.id);
85796                           } else {                                        // via way(s)
85797                               for (var i = 0; i < v.length; i++) {
85798                                   if (v[i].type !== 'way') continue;
85799                                   var viaWay = vgraph.entity(v[i].id);
85800                                   if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
85801                                       isOnlyVia = true;
85802                                       break;
85803                                   }
85804                               }
85805                           }
85806                           return isOnlyVia;
85807                       });
85808
85809                       step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
85810                   });
85811               }
85812           }
85813
85814
85815           // assumes path is alternating way-node-way of odd length
85816           function pathToTurn(path) {
85817               if (path.length < 3) return;
85818               var fromWayId, fromNodeId, fromVertexId;
85819               var toWayId, toNodeId, toVertexId;
85820               var viaWayIds, viaNodeId, isUturn;
85821
85822               fromWayId = path[0];
85823               toWayId = path[path.length - 1];
85824
85825               if (path.length === 3 && fromWayId === toWayId) {  // u turn
85826                   var way = vgraph.entity(fromWayId);
85827                   if (way.__oneWay) return null;
85828
85829                   isUturn = true;
85830                   viaNodeId = fromVertexId = toVertexId = path[1];
85831                   fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
85832
85833               } else {
85834                   isUturn = false;
85835                   fromVertexId = path[1];
85836                   fromNodeId = adjacentNode(fromWayId, fromVertexId);
85837                   toVertexId = path[path.length - 2];
85838                   toNodeId = adjacentNode(toWayId, toVertexId);
85839
85840                   if (path.length === 3) {
85841                       viaNodeId = path[1];
85842                   } else {
85843                       viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
85844                       viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);  // remove first, last
85845                   }
85846               }
85847
85848               return {
85849                   key:  path.join('_'),
85850                   path: path,
85851                   from: { node: fromNodeId, way:  fromWayId, vertex: fromVertexId },
85852                   via:  { node: viaNodeId,  ways: viaWayIds },
85853                   to:   { node: toNodeId,   way:  toWayId, vertex: toVertexId },
85854                   u:    isUturn
85855               };
85856
85857
85858               function adjacentNode(wayId, affixId) {
85859                   var nodes = vgraph.entity(wayId).nodes;
85860                   return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
85861               }
85862           }
85863
85864       };
85865
85866       return intersection;
85867   }
85868
85869
85870   function osmInferRestriction(graph, turn, projection) {
85871       var fromWay = graph.entity(turn.from.way);
85872       var fromNode = graph.entity(turn.from.node);
85873       var fromVertex = graph.entity(turn.from.vertex);
85874       var toWay = graph.entity(turn.to.way);
85875       var toNode = graph.entity(turn.to.node);
85876       var toVertex = graph.entity(turn.to.vertex);
85877
85878       var fromOneWay = (fromWay.tags.oneway === 'yes');
85879       var toOneWay = (toWay.tags.oneway === 'yes');
85880       var angle = (geoAngle(fromVertex, fromNode, projection) -
85881                   geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
85882
85883       while (angle < 0)
85884           angle += 360;
85885
85886       if (fromNode === toNode)
85887           return 'no_u_turn';
85888       if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
85889           return 'no_u_turn';   // wider tolerance for u-turn if both ways are oneway
85890       if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
85891           return 'no_u_turn';   // even wider tolerance for u-turn if there is a via way (from !== to)
85892       if (angle < 158)
85893           return 'no_right_turn';
85894       if (angle > 202)
85895           return 'no_left_turn';
85896
85897       return 'no_straight_on';
85898   }
85899
85900   function actionAddMember(relationId, member, memberIndex, insertPair) {
85901
85902       return function action(graph) {
85903           var relation = graph.entity(relationId);
85904
85905           // There are some special rules for Public Transport v2 routes.
85906           var isPTv2 = /stop|platform/.test(member.role);
85907
85908           if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
85909               // Try to perform sensible inserts based on how the ways join together
85910               graph = addWayMember(relation, graph);
85911           } else {
85912               // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
85913               // Stops and Platforms for PTv2 should be ordered first.
85914               // hack: We do not currently have the ability to place them in the exactly correct order.
85915               if (isPTv2 && isNaN(memberIndex)) {
85916                   memberIndex = 0;
85917               }
85918
85919               graph = graph.replace(relation.addMember(member, memberIndex));
85920           }
85921
85922           return graph;
85923       };
85924
85925
85926       // Add a way member into the relation "wherever it makes sense".
85927       // In this situation we were not supplied a memberIndex.
85928       function addWayMember(relation, graph) {
85929           var groups, tempWay, item, i, j, k;
85930
85931           // remove PTv2 stops and platforms before doing anything.
85932           var PTv2members = [];
85933           var members = [];
85934           for (i = 0; i < relation.members.length; i++) {
85935               var m = relation.members[i];
85936               if (/stop|platform/.test(m.role)) {
85937                   PTv2members.push(m);
85938               } else {
85939                   members.push(m);
85940               }
85941           }
85942           relation = relation.update({ members: members });
85943
85944
85945           if (insertPair) {
85946               // We're adding a member that must stay paired with an existing member.
85947               // (This feature is used by `actionSplit`)
85948               //
85949               // This is tricky because the members may exist multiple times in the
85950               // member list, and with different A-B/B-A ordering and different roles.
85951               // (e.g. a bus route that loops out and back - #4589).
85952               //
85953               // Replace the existing member with a temporary way,
85954               // so that `osmJoinWays` can treat the pair like a single way.
85955               tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
85956               graph = graph.replace(tempWay);
85957               var tempMember = { id: tempWay.id, type: 'way', role: member.role };
85958               var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
85959               groups = groupBy(tempRelation.members, function(m) { return m.type; });
85960               groups.way = groups.way || [];
85961
85962           } else {
85963               // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
85964               groups = groupBy(relation.members, function(m) { return m.type; });
85965               groups.way = groups.way || [];
85966               groups.way.push(member);
85967           }
85968
85969           members = withIndex(groups.way);
85970           var joined = osmJoinWays(members, graph);
85971
85972           // `joined` might not contain all of the way members,
85973           // But will contain only the completed (downloaded) members
85974           for (i = 0; i < joined.length; i++) {
85975               var segment = joined[i];
85976               var nodes = segment.nodes.slice();
85977               var startIndex = segment[0].index;
85978
85979               // j = array index in `members` where this segment starts
85980               for (j = 0; j < members.length; j++) {
85981                   if (members[j].index === startIndex) {
85982                       break;
85983                   }
85984               }
85985
85986               // k = each member in segment
85987               for (k = 0; k < segment.length; k++) {
85988                   item = segment[k];
85989                   var way = graph.entity(item.id);
85990
85991                   // If this is a paired item, generate members in correct order and role
85992                   if (tempWay && item.id === tempWay.id) {
85993                       if (nodes[0].id === insertPair.nodes[0]) {
85994                           item.pair = [
85995                               { id: insertPair.originalID, type: 'way', role: item.role },
85996                               { id: insertPair.insertedID, type: 'way', role: item.role }
85997                           ];
85998                       } else {
85999                           item.pair = [
86000                               { id: insertPair.insertedID, type: 'way', role: item.role },
86001                               { id: insertPair.originalID, type: 'way', role: item.role }
86002                           ];
86003                       }
86004                   }
86005
86006                   // reorder `members` if necessary
86007                   if (k > 0) {
86008                       if (j+k >= members.length || item.index !== members[j+k].index) {
86009                           moveMember(members, item.index, j+k);
86010                       }
86011                   }
86012
86013                   nodes.splice(0, way.nodes.length - 1);
86014               }
86015           }
86016
86017           if (tempWay) {
86018               graph = graph.remove(tempWay);
86019           }
86020
86021           // Final pass: skip dead items, split pairs, remove index properties
86022           var wayMembers = [];
86023           for (i = 0; i < members.length; i++) {
86024               item = members[i];
86025               if (item.index === -1) continue;
86026
86027               if (item.pair) {
86028                   wayMembers.push(item.pair[0]);
86029                   wayMembers.push(item.pair[1]);
86030               } else {
86031                   wayMembers.push(omit(item, 'index'));
86032               }
86033           }
86034
86035           // Put stops and platforms first, then nodes, ways, relations
86036           // This is recommended for Public Transport v2 routes:
86037           // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
86038           var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
86039
86040           return graph.replace(relation.update({members: newMembers}));
86041
86042
86043           // `moveMember()` changes the `members` array in place by splicing
86044           // the item with `.index = findIndex` to where it belongs,
86045           // and marking the old position as "dead" with `.index = -1`
86046           //
86047           // j=5, k=0                jk
86048           // segment                 5 4 7 6
86049           // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
86050           //
86051           // j=5, k=1                j k
86052           // segment                 5 4 7 6
86053           // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
86054           // members       0 1 2 3 x 5 4 6 7 8 9      moved
86055           //
86056           // j=5, k=2                j   k
86057           // segment                 5 4 7 6
86058           // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
86059           // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
86060           //
86061           // j=5, k=3                j     k
86062           // segment                 5 4 7 6
86063           // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
86064           //
86065           function moveMember(arr, findIndex, toIndex) {
86066               for (var i = 0; i < arr.length; i++) {
86067                   if (arr[i].index === findIndex) {
86068                       break;
86069                   }
86070               }
86071
86072               var item = clone(arr[i]);
86073               arr[i].index = -1;   // mark as dead
86074               item.index = toIndex;
86075               arr.splice(toIndex, 0, item);
86076           }
86077
86078
86079           // This is the same as `Relation.indexedMembers`,
86080           // Except we don't want to index all the members, only the ways
86081           function withIndex(arr) {
86082               var result = new Array(arr.length);
86083               for (var i = 0; i < arr.length; i++) {
86084                   result[i] = arr[i];
86085                   result[i].index = i;
86086               }
86087               return result;
86088           }
86089       }
86090
86091   }
86092
86093   function actionAddMidpoint(midpoint, node) {
86094       return function(graph) {
86095           graph = graph.replace(node.move(midpoint.loc));
86096
86097           var parents = intersection(
86098               graph.parentWays(graph.entity(midpoint.edge[0])),
86099               graph.parentWays(graph.entity(midpoint.edge[1])));
86100
86101           parents.forEach(function(way) {
86102               for (var i = 0; i < way.nodes.length - 1; i++) {
86103                   if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
86104                       graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
86105
86106                       // Add only one midpoint on doubled-back segments,
86107                       // turning them into self-intersections.
86108                       return;
86109                   }
86110               }
86111           });
86112
86113           return graph;
86114       };
86115   }
86116
86117   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
86118   function actionAddVertex(wayId, nodeId, index) {
86119       return function(graph) {
86120           return graph.replace(graph.entity(wayId).addNode(nodeId, index));
86121       };
86122   }
86123
86124   function actionChangeMember(relationId, member, memberIndex) {
86125       return function(graph) {
86126           return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
86127       };
86128   }
86129
86130   function actionChangePreset(entityID, oldPreset, newPreset) {
86131       return function action(graph) {
86132           var entity = graph.entity(entityID);
86133           var geometry = entity.geometry(graph);
86134           var tags = entity.tags;
86135
86136           if (oldPreset) tags = oldPreset.unsetTags(tags, geometry);
86137           if (newPreset) tags = newPreset.setTags(tags, geometry);
86138
86139           return graph.replace(entity.update({tags: tags}));
86140       };
86141   }
86142
86143   function actionChangeTags(entityId, tags) {
86144       return function(graph) {
86145           var entity = graph.entity(entityId);
86146           return graph.replace(entity.update({tags: tags}));
86147       };
86148   }
86149
86150   function actionCircularize(wayId, projection, maxAngle) {
86151       maxAngle = (maxAngle || 20) * Math.PI / 180;
86152
86153
86154       var action = function(graph, t) {
86155           if (t === null || !isFinite(t)) t = 1;
86156           t = Math.min(Math.max(+t, 0), 1);
86157
86158           var way = graph.entity(wayId),
86159               origNodes = {};
86160
86161           graph.childNodes(way).forEach(function(node) {
86162               if (!origNodes[node.id]) origNodes[node.id] = node;
86163           });
86164
86165           if (!way.isConvex(graph)) {
86166               graph = action.makeConvex(graph);
86167           }
86168
86169           var nodes = uniq(graph.childNodes(way)),
86170               keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
86171               points = nodes.map(function(n) { return projection(n.loc); }),
86172               keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
86173               centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
86174               radius = d3_median(points, function(p) { return geoVecLength(centroid, p); }),
86175               sign = d3_polygonArea(points) > 0 ? 1 : -1,
86176               ids;
86177
86178           // we need atleast two key nodes for the algorithm to work
86179           if (!keyNodes.length) {
86180               keyNodes = [nodes[0]];
86181               keyPoints = [points[0]];
86182           }
86183
86184           if (keyNodes.length === 1) {
86185               var index = nodes.indexOf(keyNodes[0]),
86186                   oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
86187
86188               keyNodes.push(nodes[oppositeIndex]);
86189               keyPoints.push(points[oppositeIndex]);
86190           }
86191
86192           // key points and nodes are those connected to the ways,
86193           // they are projected onto the circle, inbetween nodes are moved
86194           // to constant intervals between key nodes, extra inbetween nodes are
86195           // added if necessary.
86196           for (var i = 0; i < keyPoints.length; i++) {
86197               var nextKeyNodeIndex = (i + 1) % keyNodes.length,
86198                   startNode = keyNodes[i],
86199                   endNode = keyNodes[nextKeyNodeIndex],
86200                   startNodeIndex = nodes.indexOf(startNode),
86201                   endNodeIndex = nodes.indexOf(endNode),
86202                   numberNewPoints = -1,
86203                   indexRange = endNodeIndex - startNodeIndex,
86204                   nearNodes = {},
86205                   inBetweenNodes = [],
86206                   startAngle, endAngle, totalAngle, eachAngle,
86207                   angle, loc, node, origNode, j;
86208
86209               if (indexRange < 0) {
86210                   indexRange += nodes.length;
86211               }
86212
86213               // position this key node
86214               var distance = geoVecLength(centroid, keyPoints[i]);
86215               if (distance === 0) { distance = 1e-4; }
86216               keyPoints[i] = [
86217                   centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
86218                   centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
86219               ];
86220               loc = projection.invert(keyPoints[i]);
86221               node = keyNodes[i];
86222               origNode = origNodes[node.id];
86223               node = node.move(geoVecInterp(origNode.loc, loc, t));
86224               graph = graph.replace(node);
86225
86226               // figure out the between delta angle we want to match to
86227               startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
86228               endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
86229               totalAngle = endAngle - startAngle;
86230
86231               // detects looping around -pi/pi
86232               if (totalAngle * sign > 0) {
86233                   totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
86234               }
86235
86236               do {
86237                   numberNewPoints++;
86238                   eachAngle = totalAngle / (indexRange + numberNewPoints);
86239               } while (Math.abs(eachAngle) > maxAngle);
86240
86241
86242               // move existing nodes
86243               for (j = 1; j < indexRange; j++) {
86244                   angle = startAngle + j * eachAngle;
86245                   loc = projection.invert([
86246                       centroid[0] + Math.cos(angle) * radius,
86247                       centroid[1] + Math.sin(angle) * radius
86248                   ]);
86249
86250                   node = nodes[(j + startNodeIndex) % nodes.length];
86251                   origNode = origNodes[node.id];
86252                   nearNodes[node.id] = angle;
86253
86254                   node = node.move(geoVecInterp(origNode.loc, loc, t));
86255                   graph = graph.replace(node);
86256               }
86257
86258               // add new inbetween nodes if necessary
86259               for (j = 0; j < numberNewPoints; j++) {
86260                   angle = startAngle + (indexRange + j) * eachAngle;
86261                   loc = projection.invert([
86262                       centroid[0] + Math.cos(angle) * radius,
86263                       centroid[1] + Math.sin(angle) * radius
86264                   ]);
86265
86266                   // choose a nearnode to use as the original
86267                   var min$$1 = Infinity;
86268                   for (var nodeId in nearNodes) {
86269                       var nearAngle = nearNodes[nodeId],
86270                           dist = Math.abs(nearAngle - angle);
86271                       if (dist < min$$1) {
86272                           dist = min$$1;
86273                           origNode = origNodes[nodeId];
86274                       }
86275                   }
86276
86277                   node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
86278                   graph = graph.replace(node);
86279
86280                   nodes.splice(endNodeIndex + j, 0, node);
86281                   inBetweenNodes.push(node.id);
86282               }
86283
86284               // Check for other ways that share these keyNodes..
86285               // If keyNodes are adjacent in both ways,
86286               // we can add inBetween nodes to that shared way too..
86287               if (indexRange === 1 && inBetweenNodes.length) {
86288                   var startIndex1 = way.nodes.lastIndexOf(startNode.id),
86289                       endIndex1 = way.nodes.lastIndexOf(endNode.id),
86290                       wayDirection1 = (endIndex1 - startIndex1);
86291                   if (wayDirection1 < -1) { wayDirection1 = 1; }
86292
86293                   /* eslint-disable no-loop-func */
86294                   forEach(without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
86295                       if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
86296                           var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
86297                               endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
86298                               wayDirection2 = (endIndex2 - startIndex2),
86299                               insertAt = endIndex2;
86300                           if (wayDirection2 < -1) { wayDirection2 = 1; }
86301
86302                           if (wayDirection1 !== wayDirection2) {
86303                               inBetweenNodes.reverse();
86304                               insertAt = startIndex2;
86305                           }
86306                           for (j = 0; j < inBetweenNodes.length; j++) {
86307                               sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
86308                           }
86309                           graph = graph.replace(sharedWay);
86310                       }
86311                   });
86312                   /* eslint-enable no-loop-func */
86313               }
86314
86315           }
86316
86317           // update the way to have all the new nodes
86318           ids = nodes.map(function(n) { return n.id; });
86319           ids.push(ids[0]);
86320
86321           way = way.update({nodes: ids});
86322           graph = graph.replace(way);
86323
86324           return graph;
86325       };
86326
86327
86328       action.makeConvex = function(graph) {
86329           var way = graph.entity(wayId),
86330               nodes = uniq(graph.childNodes(way)),
86331               points = nodes.map(function(n) { return projection(n.loc); }),
86332               sign = d3_polygonArea(points) > 0 ? 1 : -1,
86333               hull = d3_polygonHull(points);
86334
86335           // D3 convex hulls go counterclockwise..
86336           if (sign === -1) {
86337               nodes.reverse();
86338               points.reverse();
86339           }
86340
86341           for (var i = 0; i < hull.length - 1; i++) {
86342               var startIndex = points.indexOf(hull[i]),
86343                   endIndex = points.indexOf(hull[i+1]),
86344                   indexRange = (endIndex - startIndex);
86345
86346               if (indexRange < 0) {
86347                   indexRange += nodes.length;
86348               }
86349
86350               // move interior nodes to the surface of the convex hull..
86351               for (var j = 1; j < indexRange; j++) {
86352                   var point = geoVecInterp(hull[i], hull[i+1], j / indexRange),
86353                       node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
86354                   graph = graph.replace(node);
86355               }
86356           }
86357           return graph;
86358       };
86359
86360
86361       action.disabled = function(graph) {
86362           if (!graph.entity(wayId).isClosed())
86363               return 'not_closed';
86364       };
86365
86366
86367       action.transitionable = true;
86368
86369
86370       return action;
86371   }
86372
86373   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
86374   function actionDeleteWay(wayId) {
86375
86376
86377       function canDeleteNode(node, graph) {
86378           return !graph.parentWays(node).length &&
86379               !graph.parentRelations(node).length &&
86380               !node.hasInterestingTags();
86381       }
86382
86383
86384       var action = function(graph) {
86385           var way = graph.entity(wayId);
86386
86387           graph.parentRelations(way)
86388               .forEach(function(parent) {
86389                   parent = parent.removeMembersWithID(wayId);
86390                   graph = graph.replace(parent);
86391
86392                   if (parent.isDegenerate()) {
86393                       graph = actionDeleteRelation(parent.id)(graph);
86394                   }
86395               });
86396
86397           uniq(way.nodes).forEach(function(nodeId) {
86398               graph = graph.replace(way.removeNode(nodeId));
86399
86400               var node = graph.entity(nodeId);
86401               if (canDeleteNode(node, graph)) {
86402                   graph = graph.remove(node);
86403               }
86404           });
86405
86406           return graph.remove(way);
86407       };
86408
86409
86410       return action;
86411   }
86412
86413   function actionDeleteMultiple(ids) {
86414       var actions = {
86415           way: actionDeleteWay,
86416           node: actionDeleteNode,
86417           relation: actionDeleteRelation
86418       };
86419
86420
86421       var action = function(graph) {
86422           ids.forEach(function(id) {
86423               if (graph.hasEntity(id)) { // It may have been deleted aready.
86424                   graph = actions[graph.entity(id).type](id)(graph);
86425               }
86426           });
86427
86428           return graph;
86429       };
86430
86431
86432       return action;
86433   }
86434
86435   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
86436   function actionDeleteRelation(relationId) {
86437
86438
86439       function canDeleteEntity(entity, graph) {
86440           return !graph.parentWays(entity).length &&
86441               !graph.parentRelations(entity).length &&
86442               !entity.hasInterestingTags();
86443       }
86444
86445
86446       var action = function(graph) {
86447           var relation = graph.entity(relationId);
86448
86449           graph.parentRelations(relation)
86450               .forEach(function(parent) {
86451                   parent = parent.removeMembersWithID(relationId);
86452                   graph = graph.replace(parent);
86453
86454                   if (parent.isDegenerate()) {
86455                       graph = actionDeleteRelation(parent.id)(graph);
86456                   }
86457               });
86458
86459           uniq(map$3(relation.members, 'id')).forEach(function(memberId) {
86460               graph = graph.replace(relation.removeMembersWithID(memberId));
86461
86462               var entity = graph.entity(memberId);
86463               if (canDeleteEntity(entity, graph)) {
86464                   graph = actionDeleteMultiple([memberId])(graph);
86465               }
86466           });
86467
86468           return graph.remove(relation);
86469       };
86470
86471
86472       return action;
86473   }
86474
86475   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
86476   function actionDeleteNode(nodeId) {
86477       var action = function(graph) {
86478           var node = graph.entity(nodeId);
86479
86480           graph.parentWays(node)
86481               .forEach(function(parent) {
86482                   parent = parent.removeNode(nodeId);
86483                   graph = graph.replace(parent);
86484
86485                   if (parent.isDegenerate()) {
86486                       graph = actionDeleteWay(parent.id)(graph);
86487                   }
86488               });
86489
86490           graph.parentRelations(node)
86491               .forEach(function(parent) {
86492                   parent = parent.removeMembersWithID(nodeId);
86493                   graph = graph.replace(parent);
86494
86495                   if (parent.isDegenerate()) {
86496                       graph = actionDeleteRelation(parent.id)(graph);
86497                   }
86498               });
86499
86500           return graph.remove(node);
86501       };
86502
86503
86504       return action;
86505   }
86506
86507   // Connect the ways at the given nodes.
86508   //
86509   // First choose a node to be the survivor, with preference given
86510   // to an existing (not new) node.
86511   //
86512   // Tags and relation memberships of of non-surviving nodes are merged
86513   // to the survivor.
86514   //
86515   // This is the inverse of `iD.actionDisconnect`.
86516   //
86517   // Reference:
86518   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
86519   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
86520   //
86521   function actionConnect(nodeIDs) {
86522       var action = function(graph) {
86523           var survivor;
86524           var node;
86525           var parents;
86526           var i, j;
86527
86528           // Choose a survivor node, prefer an existing (not new) node - #4974
86529           for (i = 0; i < nodeIDs.length; i++) {
86530               survivor = graph.entity(nodeIDs[i]);
86531               if (survivor.version) break;  // found one
86532           }
86533
86534           // Replace all non-surviving nodes with the survivor and merge tags.
86535           for (i = 0; i < nodeIDs.length; i++) {
86536               node = graph.entity(nodeIDs[i]);
86537               if (node.id === survivor.id) continue;
86538
86539               parents = graph.parentWays(node);
86540               for (j = 0; j < parents.length; j++) {
86541                   if (!parents[j].areAdjacent(node.id, survivor.id)) {
86542                       graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
86543                   }
86544               }
86545
86546               parents = graph.parentRelations(node);
86547               for (j = 0; j < parents.length; j++) {
86548                   graph = graph.replace(parents[j].replaceMember(node, survivor));
86549               }
86550
86551               survivor = survivor.mergeTags(node.tags);
86552               graph = actionDeleteNode(node.id)(graph);
86553           }
86554
86555           graph = graph.replace(survivor);
86556
86557           return graph;
86558       };
86559
86560
86561       action.disabled = function(graph) {
86562           var seen = {};
86563           var restrictionIDs = [];
86564           var survivor;
86565           var node, way;
86566           var relations, relation, role;
86567           var i, j, k;
86568
86569           // Choose a survivor node, prefer an existing (not new) node - #4974
86570           for (i = 0; i < nodeIDs.length; i++) {
86571               survivor = graph.entity(nodeIDs[i]);
86572               if (survivor.version) break;  // found one
86573           }
86574
86575           // 1. disable if the nodes being connected have conflicting relation roles
86576           for (i = 0; i < nodeIDs.length; i++) {
86577               node = graph.entity(nodeIDs[i]);
86578               relations = graph.parentRelations(node);
86579
86580               for (j = 0; j < relations.length; j++) {
86581                   relation = relations[j];
86582                   role = relation.memberById(node.id).role || '';
86583
86584                   // if this node is a via node in a restriction, remember for later
86585                   if (relation.isValidRestriction()) {
86586                       restrictionIDs.push(relation.id);
86587                   }
86588
86589                   if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
86590                       return 'relation';
86591                   } else {
86592                       seen[relation.id] = role;
86593                   }
86594               }
86595           }
86596
86597           // gather restrictions for parent ways
86598           for (i = 0; i < nodeIDs.length; i++) {
86599               node = graph.entity(nodeIDs[i]);
86600
86601               var parents = graph.parentWays(node);
86602               for (j = 0; j < parents.length; j++) {
86603                   var parent = parents[j];
86604                   relations = graph.parentRelations(parent);
86605
86606                   for (k = 0; k < relations.length; k++) {
86607                       relation = relations[k];
86608                       if (relation.isValidRestriction()) {
86609                           restrictionIDs.push(relation.id);
86610                       }
86611                   }
86612               }
86613           }
86614
86615
86616           // test restrictions
86617           restrictionIDs = uniq(restrictionIDs);
86618           for (i = 0; i < restrictionIDs.length; i++) {
86619               relation = graph.entity(restrictionIDs[i]);
86620               if (!relation.isComplete(graph)) continue;
86621
86622               var memberWays = relation.members
86623                   .filter(function(m) { return m.type === 'way'; })
86624                   .map(function(m) { return graph.entity(m.id); });
86625
86626               memberWays = uniq(memberWays);
86627               var f = relation.memberByRole('from');
86628               var t = relation.memberByRole('to');
86629               var isUturn = (f.id === t.id);
86630
86631               // 2a. disable if connection would damage a restriction
86632               // (a key node is a node at the junction of ways)
86633               var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
86634               for (j = 0; j < relation.members.length; j++) {
86635                   collectNodes(relation.members[j], nodes);
86636               }
86637
86638               nodes.keyfrom = uniq(nodes.keyfrom.filter(hasDuplicates));
86639               nodes.keyto = uniq(nodes.keyto.filter(hasDuplicates));
86640
86641               var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
86642               nodes.from = nodes.from.filter(filter);
86643               nodes.via = nodes.via.filter(filter);
86644               nodes.to = nodes.to.filter(filter);
86645
86646               var connectFrom = false;
86647               var connectVia = false;
86648               var connectTo = false;
86649               var connectKeyFrom = false;
86650               var connectKeyTo = false;
86651
86652               for (j = 0; j < nodeIDs.length; j++) {
86653                   var n = nodeIDs[j];
86654                   if (nodes.from.indexOf(n) !== -1)    { connectFrom = true; }
86655                   if (nodes.via.indexOf(n) !== -1)     { connectVia = true; }
86656                   if (nodes.to.indexOf(n) !== -1)      { connectTo = true; }
86657                   if (nodes.keyfrom.indexOf(n) !== -1) { connectKeyFrom = true; }
86658                   if (nodes.keyto.indexOf(n) !== -1)   { connectKeyTo = true; }
86659               }
86660               if (connectFrom && connectTo && !isUturn) { return 'restriction'; }
86661               if (connectFrom && connectVia) { return 'restriction'; }
86662               if (connectTo   && connectVia) { return 'restriction'; }
86663
86664               // connecting to a key node -
86665               // if both nodes are on a member way (i.e. part of the turn restriction),
86666               // the connecting node must be adjacent to the key node.
86667               if (connectKeyFrom || connectKeyTo) {
86668                   if (nodeIDs.length !== 2) { return 'restriction'; }
86669
86670                   var n0 = null;
86671                   var n1 = null;
86672                   for (j = 0; j < memberWays.length; j++) {
86673                       way = memberWays[j];
86674                       if (way.contains(nodeIDs[0])) { n0 = nodeIDs[0]; }
86675                       if (way.contains(nodeIDs[1])) { n1 = nodeIDs[1]; }
86676                   }
86677
86678                   if (n0 && n1) {    // both nodes are part of the restriction
86679                       var ok = false;
86680                       for (j = 0; j < memberWays.length; j++) {
86681                           way = memberWays[j];
86682                           if (way.areAdjacent(n0, n1)) {
86683                               ok = true;
86684                               break;
86685                           }
86686                       }
86687                       if (!ok) {
86688                           return 'restriction';
86689                       }
86690                   }
86691               }
86692
86693               // 2b. disable if nodes being connected will destroy a member way in a restriction
86694               // (to test, make a copy and try actually connecting the nodes)
86695               for (j = 0; j < memberWays.length; j++) {
86696                   way = memberWays[j].update({});   // make copy
86697                   for (k = 0; k < nodeIDs.length; k++) {
86698                       if (nodeIDs[k] === survivor.id) continue;
86699
86700                       if (way.areAdjacent(nodeIDs[k], survivor.id)) {
86701                           way = way.removeNode(nodeIDs[k]);
86702                       } else {
86703                           way = way.replaceNode(nodeIDs[k], survivor.id);
86704                       }
86705                   }
86706                   if (way.isDegenerate()) {
86707                       return 'restriction';
86708                   }
86709               }
86710           }
86711
86712           return false;
86713
86714
86715           // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
86716           function hasDuplicates(n, i, arr) {
86717               return arr.indexOf(n) !== arr.lastIndexOf(n);
86718           }
86719
86720           function keyNodeFilter(froms, tos) {
86721               return function(n) {
86722                   return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
86723               };
86724           }
86725
86726           function collectNodes(member, collection) {
86727               var entity = graph.hasEntity(member.id);
86728               if (!entity) return;
86729
86730               var role = member.role || '';
86731               if (!collection[role]) {
86732                   collection[role] = [];
86733               }
86734
86735               if (member.type === 'node') {
86736                   collection[role].push(member.id);
86737                   if (role === 'via') {
86738                       collection.keyfrom.push(member.id);
86739                       collection.keyto.push(member.id);
86740                   }
86741
86742               } else if (member.type === 'way') {
86743                   collection[role].push.apply(collection[role], entity.nodes);
86744                   if (role === 'from' || role === 'via') {
86745                       collection.keyfrom.push(entity.first());
86746                       collection.keyfrom.push(entity.last());
86747                   }
86748                   if (role === 'to' || role === 'via') {
86749                       collection.keyto.push(entity.first());
86750                       collection.keyto.push(entity.last());
86751                   }
86752               }
86753           }
86754       };
86755
86756
86757       return action;
86758   }
86759
86760   function actionCopyEntities(ids, fromGraph) {
86761       var copies = {};
86762
86763
86764       var action = function(graph) {
86765           ids.forEach(function(id) {
86766               fromGraph.entity(id).copy(fromGraph, copies);
86767           });
86768
86769           for (var id in copies) {
86770               graph = graph.replace(copies[id]);
86771           }
86772
86773           return graph;
86774       };
86775
86776
86777       action.copies = function() {
86778           return copies;
86779       };
86780
86781
86782       return action;
86783   }
86784
86785   function actionDeleteMember(relationId, memberIndex) {
86786       return function(graph) {
86787           var relation = graph.entity(relationId)
86788               .removeMember(memberIndex);
86789
86790           graph = graph.replace(relation);
86791
86792           if (relation.isDegenerate())
86793               graph = actionDeleteRelation(relation.id)(graph);
86794
86795           return graph;
86796       };
86797   }
86798
86799   function actionDeprecateTags(entityId) {
86800
86801       return function(graph) {
86802           var entity = graph.entity(entityId),
86803               newtags = clone(entity.tags),
86804               change = false,
86805               rule;
86806
86807           // This handles dataDeprecated tags with a single condition
86808           for (var i = 0; i < dataDeprecated.length; i++) {
86809
86810               rule = dataDeprecated[i];
86811               var match = toPairs(rule.old)[0],
86812                   replacements = rule.replace ? toPairs(rule.replace) : null;
86813
86814               if (entity.tags[match[0]] && match[1] === '*') {
86815
86816                   var value = entity.tags[match[0]];
86817                   if (replacements && !newtags[replacements[0][0]]) {
86818                       newtags[replacements[0][0]] = value;
86819                   }
86820                   delete newtags[match[0]];
86821                   change = true;
86822
86823               } else if (entity.tags[match[0]] === match[1]) {
86824                   newtags = assign({}, rule.replace || {}, omit(newtags, match[0]));
86825                   change = true;
86826               }
86827           }
86828
86829           if (change) {
86830               return graph.replace(entity.update({tags: newtags}));
86831           } else {
86832               return graph;
86833           }
86834       };
86835   }
86836
86837   function actionDiscardTags(difference) {
86838
86839       return function(graph) {
86840           function discardTags(entity) {
86841               var tags = {};
86842               var keys = Object.keys(entity.tags);
86843               var discarded = false;
86844
86845               for (var i = 0; i < keys.length; i++) {
86846                   var k = keys[i];
86847                   if (dataDiscarded[k] || !entity.tags[k]) {
86848                       discarded = true;
86849                   } else {
86850                       tags[k] = entity.tags[k];
86851                   }
86852               }
86853
86854               if (discarded) {
86855                   graph = graph.replace(entity.update({ tags: tags }));
86856               }
86857           }
86858
86859           difference.modified().forEach(discardTags);
86860           difference.created().forEach(discardTags);
86861
86862           return graph;
86863       };
86864   }
86865
86866   // Disconect the ways at the given node.
86867   //
86868   // Optionally, disconnect only the given ways.
86869   //
86870   // For testing convenience, accepts an ID to assign to the (first) new node.
86871   // Normally, this will be undefined and the way will automatically
86872   // be assigned a new ID.
86873   //
86874   // This is the inverse of `iD.actionConnect`.
86875   //
86876   // Reference:
86877   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
86878   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
86879   //
86880   function actionDisconnect(nodeId, newNodeId) {
86881       var wayIds;
86882
86883
86884       var action = function(graph) {
86885           var node = graph.entity(nodeId);
86886           var connections = action.connections(graph);
86887
86888           connections.forEach(function(connection) {
86889               var way = graph.entity(connection.wayID);
86890               var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
86891
86892               graph = graph.replace(newNode);
86893               if (connection.index === 0 && way.isArea()) {
86894                   // replace shared node with shared node..
86895                   graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
86896               } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
86897                   // replace closing node with new new node..
86898                   graph = graph.replace(way.unclose().addNode(newNode.id));
86899               } else {
86900                   // replace shared node with multiple new nodes..
86901                   graph = graph.replace(way.updateNode(newNode.id, connection.index));
86902               }
86903           });
86904
86905           return graph;
86906       };
86907
86908
86909       action.connections = function(graph) {
86910           var candidates = [];
86911           var keeping = false;
86912           var parentWays = graph.parentWays(graph.entity(nodeId));
86913
86914           parentWays.forEach(function(way) {
86915               if (wayIds && wayIds.indexOf(way.id) === -1) {
86916                   keeping = true;
86917                   return;
86918               }
86919               if (way.isArea() && (way.nodes[0] === nodeId)) {
86920                   candidates.push({ wayID: way.id, index: 0 });
86921               } else {
86922                   way.nodes.forEach(function(waynode, index) {
86923                       if (waynode === nodeId) {
86924                           candidates.push({ wayID: way.id, index: index });
86925                       }
86926                   });
86927               }
86928           });
86929
86930           return keeping ? candidates : candidates.slice(1);
86931       };
86932
86933
86934       action.disabled = function(graph) {
86935           var connections = action.connections(graph);
86936           if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
86937               return 'not_connected';
86938
86939           var parentWays = graph.parentWays(graph.entity(nodeId));
86940           var seenRelationIds = {};
86941           var sharedRelation;
86942
86943           parentWays.forEach(function(way) {
86944               if (wayIds && wayIds.indexOf(way.id) === -1)
86945                   return;
86946
86947               var relations = graph.parentRelations(way);
86948               relations.forEach(function(relation) {
86949                   if (relation.id in seenRelationIds) {
86950                       sharedRelation = relation;
86951                   } else {
86952                       seenRelationIds[relation.id] = true;
86953                   }
86954               });
86955           });
86956
86957           if (sharedRelation)
86958               return 'relation';
86959       };
86960
86961
86962       action.limitWays = function(_) {
86963           if (!arguments.length) return wayIds;
86964           wayIds = _;
86965           return action;
86966       };
86967
86968
86969       return action;
86970   }
86971
86972   // Join ways at the end node they share.
86973   //
86974   // This is the inverse of `iD.actionSplit`.
86975   //
86976   // Reference:
86977   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
86978   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
86979   //
86980   function actionJoin(ids) {
86981
86982       function groupEntitiesByGeometry(graph) {
86983           var entities = ids.map(function(id) { return graph.entity(id); });
86984           return assignIn({line: []}, groupBy(entities, function(entity) { return entity.geometry(graph); }));
86985       }
86986
86987
86988       var action = function(graph) {
86989           var ways = ids.map(graph.entity, graph);
86990           var survivorID = ways[0].id;
86991
86992           // Prefer to keep an existing way.
86993           for (var i = 0; i < ways.length; i++) {
86994               if (!ways[i].isNew()) {
86995                   survivorID = ways[i].id;
86996                   break;
86997               }
86998           }
86999
87000           var sequences = osmJoinWays(ways, graph);
87001           var joined = sequences[0];
87002
87003           // We might need to reverse some of these ways before joining them.  #4688
87004           // `joined.actions` property will contain any actions we need to apply.
87005           graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
87006
87007           var survivor = graph.entity(survivorID);
87008           survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
87009           graph = graph.replace(survivor);
87010
87011           joined.forEach(function(way) {
87012               if (way.id === survivorID) return;
87013
87014               graph.parentRelations(way).forEach(function(parent) {
87015                   graph = graph.replace(parent.replaceMember(way, survivor));
87016               });
87017
87018               survivor = survivor.mergeTags(way.tags);
87019
87020               graph = graph.replace(survivor);
87021               graph = actionDeleteWay(way.id)(graph);
87022           });
87023
87024           return graph;
87025       };
87026
87027
87028       action.disabled = function(graph) {
87029           var geometries = groupEntitiesByGeometry(graph);
87030           if (ids.length < 2 || ids.length !== geometries.line.length)
87031               return 'not_eligible';
87032
87033           var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
87034           if (joined.length > 1)
87035               return 'not_adjacent';
87036
87037           var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
87038           var relation;
87039           var tags = {};
87040           var conflicting = false;
87041
87042           joined[0].forEach(function(way) {
87043               var parents = graph.parentRelations(way);
87044               parents.forEach(function(parent) {
87045                   if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
87046                       relation = parent;
87047               });
87048
87049               for (var k in way.tags) {
87050                   if (!(k in tags)) {
87051                       tags[k] = way.tags[k];
87052                   } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
87053                       conflicting = true;
87054                   }
87055               }
87056           });
87057
87058           if (relation)
87059               return 'restriction';
87060
87061           if (conflicting)
87062               return 'conflicting_tags';
87063       };
87064
87065
87066       return action;
87067   }
87068
87069   function actionMerge(ids) {
87070
87071       function groupEntitiesByGeometry(graph) {
87072           var entities = ids.map(function(id) { return graph.entity(id); });
87073           return assignIn({point: [], area: [], line: [], relation: []},
87074               groupBy(entities, function(entity) { return entity.geometry(graph); }));
87075       }
87076
87077
87078       var action = function(graph) {
87079           var geometries = groupEntitiesByGeometry(graph),
87080               target = geometries.area[0] || geometries.line[0],
87081               points = geometries.point;
87082
87083           points.forEach(function(point) {
87084               target = target.mergeTags(point.tags);
87085               graph = graph.replace(target);
87086
87087               graph.parentRelations(point).forEach(function(parent) {
87088                   graph = graph.replace(parent.replaceMember(point, target));
87089               });
87090
87091               var nodes = uniq(graph.childNodes(target)),
87092                   removeNode = point;
87093
87094               for (var i = 0; i < nodes.length; i++) {
87095                   var node = nodes[i];
87096                   if (graph.parentWays(node).length > 1 ||
87097                       graph.parentRelations(node).length ||
87098                       node.hasInterestingTags()) {
87099                       continue;
87100                   }
87101
87102                   // Found an uninteresting child node on the target way.
87103                   // Move orig point into its place to preserve point's history. #3683
87104                   graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
87105                   target = target.replaceNode(node.id, point.id);
87106                   graph = graph.replace(target);
87107                   removeNode = node;
87108                   break;
87109               }
87110
87111               graph = graph.remove(removeNode);
87112           });
87113
87114           return graph;
87115       };
87116
87117
87118       action.disabled = function(graph) {
87119           var geometries = groupEntitiesByGeometry(graph);
87120           if (geometries.point.length === 0 ||
87121               (geometries.area.length + geometries.line.length) !== 1 ||
87122               geometries.relation.length !== 0)
87123               return 'not_eligible';
87124       };
87125
87126
87127       return action;
87128   }
87129
87130   // `actionMergeNodes` is just a combination of:
87131   //
87132   // 1. move all the nodes to a common location
87133   // 2. `actionConnect` them
87134
87135   function actionMergeNodes(nodeIDs) {
87136
87137       // If there is a single "interesting" node, use that as the location.
87138       // Otherwise return the average location of all the nodes.
87139       function chooseLoc(graph) {
87140           if (!nodeIDs.length) return null;
87141           var sum = [0,0];
87142           var interestingCount = 0;
87143           var interestingLoc;
87144
87145           for (var i = 0; i < nodeIDs.length; i++) {
87146               var node = graph.entity(nodeIDs[i]);
87147               if (node.hasInterestingTags()) {
87148                   interestingLoc = (++interestingCount === 1) ? node.loc : null;
87149               }
87150               sum = geoVecAdd(sum, node.loc);
87151           }
87152
87153           return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
87154       }
87155
87156
87157       var action = function(graph) {
87158           if (nodeIDs.length < 2) return graph;
87159           var toLoc = chooseLoc(graph);
87160
87161           for (var i = 0; i < nodeIDs.length; i++) {
87162               var node = graph.entity(nodeIDs[i]);
87163               graph = graph.replace(node.move(toLoc));
87164           }
87165
87166           return actionConnect(nodeIDs)(graph);
87167       };
87168
87169
87170       action.disabled = function(graph) {
87171           if (nodeIDs.length < 2) return 'not_eligible';
87172
87173           for (var i = 0; i < nodeIDs.length; i++) {
87174               var entity = graph.entity(nodeIDs[i]);
87175               if (entity.type !== 'node') return 'not_eligible';
87176           }
87177
87178           return actionConnect(nodeIDs).disabled(graph);
87179       };
87180
87181       return action;
87182   }
87183
87184   function actionMergePolygon(ids, newRelationId) {
87185
87186       function groupEntities(graph) {
87187           var entities = ids.map(function (id) { return graph.entity(id); });
87188           return assignIn({
87189                   closedWay: [],
87190                   multipolygon: [],
87191                   other: []
87192               }, groupBy(entities, function(entity) {
87193                   if (entity.type === 'way' && entity.isClosed()) {
87194                       return 'closedWay';
87195                   } else if (entity.type === 'relation' && entity.isMultipolygon()) {
87196                       return 'multipolygon';
87197                   } else {
87198                       return 'other';
87199                   }
87200               }));
87201       }
87202
87203
87204       var action = function(graph) {
87205           var entities = groupEntities(graph);
87206
87207           // An array representing all the polygons that are part of the multipolygon.
87208           //
87209           // Each element is itself an array of objects with an id property, and has a
87210           // locs property which is an array of the locations forming the polygon.
87211           var polygons = entities.multipolygon.reduce(function(polygons, m) {
87212               return polygons.concat(osmJoinWays(m.members, graph));
87213           }, []).concat(entities.closedWay.map(function(d) {
87214               var member = [{id: d.id}];
87215               member.nodes = graph.childNodes(d);
87216               return member;
87217           }));
87218
87219           // contained is an array of arrays of boolean values,
87220           // where contained[j][k] is true iff the jth way is
87221           // contained by the kth way.
87222           var contained = polygons.map(function(w, i) {
87223               return polygons.map(function(d, n) {
87224                   if (i === n) return null;
87225                   return geoPolygonContainsPolygon(
87226                       map$3(d.nodes, 'loc'),
87227                       map$3(w.nodes, 'loc'));
87228               });
87229           });
87230
87231           // Sort all polygons as either outer or inner ways
87232           var members = [],
87233               outer = true;
87234
87235           while (polygons.length) {
87236               extractUncontained(polygons);
87237               polygons = polygons.filter(isContained);
87238               contained = contained.filter(isContained).map(filterContained);
87239           }
87240
87241           function isContained(d, i) {
87242               return some(contained[i]);
87243           }
87244
87245           function filterContained(d) {
87246               return d.filter(isContained);
87247           }
87248
87249           function extractUncontained(polygons) {
87250               polygons.forEach(function(d, i) {
87251                   if (!isContained(d, i)) {
87252                       d.forEach(function(member) {
87253                           members.push({
87254                               type: 'way',
87255                               id: member.id,
87256                               role: outer ? 'outer' : 'inner'
87257                           });
87258                       });
87259                   }
87260               });
87261               outer = !outer;
87262           }
87263
87264           // Move all tags to one relation
87265           var relation = entities.multipolygon[0] ||
87266               osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
87267
87268           entities.multipolygon.slice(1).forEach(function(m) {
87269               relation = relation.mergeTags(m.tags);
87270               graph = graph.remove(m);
87271           });
87272
87273           entities.closedWay.forEach(function(way) {
87274               function isThisOuter(m) {
87275                   return m.id === way.id && m.role !== 'inner';
87276               }
87277               if (members.some(isThisOuter)) {
87278                   relation = relation.mergeTags(way.tags);
87279                   graph = graph.replace(way.update({ tags: {} }));
87280               }
87281           });
87282
87283           return graph.replace(relation.update({
87284               members: members,
87285               tags: omit(relation.tags, 'area')
87286           }));
87287       };
87288
87289
87290       action.disabled = function(graph) {
87291           var entities = groupEntities(graph);
87292           if (entities.other.length > 0 ||
87293               entities.closedWay.length + entities.multipolygon.length < 2)
87294               return 'not_eligible';
87295           if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
87296               return 'incomplete_relation';
87297       };
87298
87299
87300       return action;
87301   }
87302
87303   // Text diff algorithm following Hunt and McIlroy 1976.
87304   // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
87305   // comparison, Bell Telephone Laboratories CSTR #41 (1976)
87306   // http://www.cs.dartmouth.edu/~doug/
87307   //
87308   // Expects two arrays of strings.
87309   function LCS(file1, file2) {
87310     var equivalenceClasses;
87311     var file2indices;
87312     var newCandidate;
87313     var candidates;
87314     var line;
87315     var c, i, j, jX, r, s;
87316
87317     equivalenceClasses = {};
87318     for (j = 0; j < file2.length; j++) {
87319       line = file2[j];
87320       if (equivalenceClasses[line]) {
87321         equivalenceClasses[line].push(j);
87322       } else {
87323         equivalenceClasses[line] = [j];
87324       }
87325     }
87326
87327     candidates = [
87328       { file1index: -1, file2index: -1, chain: null }
87329     ];
87330
87331     for (i = 0; i < file1.length; i++) {
87332       line = file1[i];
87333       file2indices = equivalenceClasses[line] || [];
87334
87335       r = 0;
87336       c = candidates[0];
87337
87338       for (jX = 0; jX < file2indices.length; jX++) {
87339         j = file2indices[jX];
87340
87341         for (s = r; s < candidates.length; s++) {
87342           if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
87343             break;
87344           }
87345         }
87346
87347         if (s < candidates.length) {
87348           newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
87349           if (r === candidates.length) {
87350             candidates.push(c);
87351           } else {
87352             candidates[r] = c;
87353           }
87354           r = s + 1;
87355           c = newCandidate;
87356           if (r === candidates.length) {
87357             break; // no point in examining further (j)s
87358           }
87359         }
87360       }
87361
87362       candidates[r] = c;
87363     }
87364
87365     // At this point, we know the LCS: it's in the reverse of the
87366     // linked-list through .chain of candidates[candidates.length - 1].
87367
87368     return candidates[candidates.length - 1];
87369   }
87370
87371
87372   // We apply the LCS to give a simple representation of the
87373   // offsets and lengths of mismatched chunks in the input
87374   // files. This is used by diff3MergeIndices below.
87375   function diffIndices(file1, file2) {
87376     var result = [];
87377     var tail1 = file1.length;
87378     var tail2 = file2.length;
87379
87380     for (var candidate = LCS(file1, file2);
87381        candidate !== null;
87382        candidate = candidate.chain)
87383     {
87384       var mismatchLength1 = tail1 - candidate.file1index - 1;
87385       var mismatchLength2 = tail2 - candidate.file2index - 1;
87386       tail1 = candidate.file1index;
87387       tail2 = candidate.file2index;
87388
87389       if (mismatchLength1 || mismatchLength2) {
87390         result.push({
87391           file1: [tail1 + 1, mismatchLength1],
87392           file2: [tail2 + 1, mismatchLength2]
87393         });
87394       }
87395     }
87396
87397     result.reverse();
87398     return result;
87399   }
87400
87401
87402   // Given three files, A, O, and B, where both A and B are
87403   // independently derived from O, returns a fairly complicated
87404   // internal representation of merge decisions it's taken. The
87405   // interested reader may wish to consult
87406   //
87407   // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
87408   // 'A Formal Investigation of ' In Arvind and Prasad,
87409   // editors, Foundations of Software Technology and Theoretical
87410   // Computer Science (FSTTCS), December 2007.
87411   //
87412   // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
87413   function diff3MergeIndices(a, o, b) {
87414     var i;
87415     var m1 = diffIndices(o, a);
87416     var m2 = diffIndices(o, b);
87417
87418     var hunks = [];
87419     function addHunk(h, side) {
87420       hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
87421     }
87422     for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
87423     for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
87424     hunks.sort(function (x, y) { return x[0] - y[0]; });
87425
87426     var result = [];
87427     var commonOffset = 0;
87428     function copyCommon(targetOffset) {
87429       if (targetOffset > commonOffset) {
87430         result.push([1, commonOffset, targetOffset - commonOffset]);
87431         commonOffset = targetOffset;
87432       }
87433     }
87434
87435     for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
87436       var firstHunkIndex = hunkIndex;
87437       var hunk = hunks[hunkIndex];
87438       var regionLhs = hunk[0];
87439       var regionRhs = regionLhs + hunk[2];
87440       while (hunkIndex < hunks.length - 1) {
87441         var maybeOverlapping = hunks[hunkIndex + 1];
87442         var maybeLhs = maybeOverlapping[0];
87443         if (maybeLhs > regionRhs) {
87444           break;
87445         }
87446         regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
87447         hunkIndex++;
87448       }
87449
87450       copyCommon(regionLhs);
87451       if (firstHunkIndex === hunkIndex) {
87452         // The 'overlap' was only one hunk long, meaning that
87453         // there's no conflict here. Either a and o were the
87454         // same, or b and o were the same.
87455         if (hunk[4] > 0) {
87456           result.push([hunk[1], hunk[3], hunk[4]]);
87457         }
87458       } else {
87459         // A proper conflict. Determine the extents of the
87460         // regions involved from a, o and b. Effectively merge
87461         // all the hunks on the left into one giant hunk, and
87462         // do the same for the right; then, correct for skew
87463         // in the regions of o that each side changed, and
87464         // report appropriate spans for the three sides.
87465         var regions = {
87466           0: [a.length, -1, o.length, -1],
87467           2: [b.length, -1, o.length, -1]
87468         };
87469         for (i = firstHunkIndex; i <= hunkIndex; i++) {
87470           hunk = hunks[i];
87471           var side = hunk[1];
87472           var r = regions[side];
87473           var oLhs = hunk[0];
87474           var oRhs = oLhs + hunk[2];
87475           var abLhs = hunk[3];
87476           var abRhs = abLhs + hunk[4];
87477           r[0] = Math.min(abLhs, r[0]);
87478           r[1] = Math.max(abRhs, r[1]);
87479           r[2] = Math.min(oLhs, r[2]);
87480           r[3] = Math.max(oRhs, r[3]);
87481         }
87482         var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
87483         var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
87484         var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
87485         var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
87486         result.push([-1,
87487                      aLhs,      aRhs      - aLhs,
87488                      regionLhs, regionRhs - regionLhs,
87489                      bLhs,      bRhs      - bLhs]);
87490       }
87491       commonOffset = regionRhs;
87492     }
87493
87494     copyCommon(o.length);
87495     return result;
87496   }
87497
87498
87499   // Applies the output of diff3MergeIndices to actually
87500   // construct the merged file; the returned result alternates
87501   // between 'ok' and 'conflict' blocks.
87502   function diff3Merge(a, o, b, excludeFalseConflicts) {
87503     var result = [];
87504     var files = [a, o, b];
87505     var indices = diff3MergeIndices(a, o, b);
87506
87507     var okLines = [];
87508     function flushOk() {
87509       if (okLines.length) {
87510         result.push({ok: okLines});
87511       }
87512       okLines = [];
87513     }
87514     function pushOk(xs) {
87515       for (var j = 0; j < xs.length; j++) {
87516         okLines.push(xs[j]);
87517       }
87518     }
87519
87520     function isTrueConflict(rec) {
87521       if (rec[2] !== rec[6]) return true;
87522       var aoff = rec[1];
87523       var boff = rec[5];
87524       for (var j = 0; j < rec[2]; j++) {
87525         if (a[j + aoff] !== b[j + boff]) {
87526           return true;
87527         }
87528       }
87529       return false;
87530     }
87531
87532     for (var i = 0; i < indices.length; i++) {
87533       var x = indices[i];
87534       var side = x[0];
87535       if (side === -1) {
87536         if (excludeFalseConflicts && !isTrueConflict(x)) {
87537           pushOk(files[0].slice(x[1], x[1] + x[2]));
87538         } else {
87539           flushOk();
87540           result.push({
87541             conflict: {
87542               a: a.slice(x[1], x[1] + x[2]),
87543               aIndex: x[1],
87544               o: o.slice(x[3], x[3] + x[4]),
87545               oIndex: x[3],
87546               b: b.slice(x[5], x[5] + x[6]),
87547               bIndex: x[5]
87548             }
87549           });
87550         }
87551       } else {
87552         pushOk(files[side].slice(x[1], x[1] + x[2]));
87553       }
87554     }
87555
87556     flushOk();
87557     return result;
87558   }
87559
87560   function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
87561       var _option = 'safe';  // 'safe', 'force_local', 'force_remote'
87562       var _conflicts = [];
87563
87564
87565       function user(d) {
87566           return isFunction(formatUser) ? formatUser(d) : d;
87567       }
87568
87569
87570       function mergeLocation(remote, target) {
87571           function pointEqual(a, b) {
87572               var epsilon = 1e-6;
87573               return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
87574           }
87575
87576           if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
87577               return target;
87578           }
87579           if (_option === 'force_remote') {
87580               return target.update({loc: remote.loc});
87581           }
87582
87583           _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
87584           return target;
87585       }
87586
87587
87588       function mergeNodes(base, remote, target) {
87589           if (_option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
87590               return target;
87591           }
87592           if (_option === 'force_remote') {
87593               return target.update({nodes: remote.nodes});
87594           }
87595
87596           var ccount = _conflicts.length;
87597           var o = base.nodes || [];
87598           var a = target.nodes || [];
87599           var b = remote.nodes || [];
87600           var nodes = [];
87601           var hunks = diff3Merge(a, o, b, true);
87602
87603           for (var i = 0; i < hunks.length; i++) {
87604               var hunk = hunks[i];
87605               if (hunk.ok) {
87606                   nodes.push.apply(nodes, hunk.ok);
87607               } else {
87608                   // for all conflicts, we can assume c.a !== c.b
87609                   // because `diff3Merge` called with `true` option to exclude false conflicts..
87610                   var c = hunk.conflict;
87611                   if (isEqual(c.o, c.a)) {  // only changed remotely
87612                       nodes.push.apply(nodes, c.b);
87613                   } else if (isEqual(c.o, c.b)) {  // only changed locally
87614                       nodes.push.apply(nodes, c.a);
87615                   } else {       // changed both locally and remotely
87616                       _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
87617                       break;
87618                   }
87619               }
87620           }
87621
87622           return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
87623       }
87624
87625
87626       function mergeChildren(targetWay, children, updates, graph) {
87627           function isUsed(node, targetWay) {
87628               var parentWays = map$3(graph.parentWays(node), 'id');
87629               return node.hasInterestingTags() ||
87630                   without(parentWays, targetWay.id).length > 0 ||
87631                   graph.parentRelations(node).length > 0;
87632           }
87633
87634           var ccount = _conflicts.length;
87635
87636           for (var i = 0; i < children.length; i++) {
87637               var id = children[i];
87638               var node = graph.hasEntity(id);
87639
87640               // remove unused childNodes..
87641               if (targetWay.nodes.indexOf(id) === -1) {
87642                   if (node && !isUsed(node, targetWay)) {
87643                       updates.removeIds.push(id);
87644                   }
87645                   continue;
87646               }
87647
87648               // restore used childNodes..
87649               var local = localGraph.hasEntity(id);
87650               var remote = remoteGraph.hasEntity(id);
87651               var target;
87652
87653               if (_option === 'force_remote' && remote && remote.visible) {
87654                   updates.replacements.push(remote);
87655
87656               } else if (_option === 'force_local' && local) {
87657                   target = osmEntity$$1(local);
87658                   if (remote) {
87659                       target = target.update({ version: remote.version });
87660                   }
87661                   updates.replacements.push(target);
87662
87663               } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
87664                   target = osmEntity$$1(local, { version: remote.version });
87665                   if (remote.visible) {
87666                       target = mergeLocation(remote, target);
87667                   } else {
87668                       _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
87669                   }
87670
87671                   if (_conflicts.length !== ccount) break;
87672                   updates.replacements.push(target);
87673               }
87674           }
87675
87676           return targetWay;
87677       }
87678
87679
87680       function updateChildren(updates, graph) {
87681           for (var i = 0; i < updates.replacements.length; i++) {
87682               graph = graph.replace(updates.replacements[i]);
87683           }
87684           if (updates.removeIds.length) {
87685               graph = actionDeleteMultiple(updates.removeIds)(graph);
87686           }
87687           return graph;
87688       }
87689
87690
87691       function mergeMembers(remote, target) {
87692           if (_option === 'force_local' || isEqual(target.members, remote.members)) {
87693               return target;
87694           }
87695           if (_option === 'force_remote') {
87696               return target.update({members: remote.members});
87697           }
87698
87699           _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
87700           return target;
87701       }
87702
87703
87704       function mergeTags(base, remote, target) {
87705           function ignoreKey(k) {
87706               return dataDiscarded[k];
87707           }
87708
87709           if (_option === 'force_local' || isEqual(target.tags, remote.tags)) {
87710               return target;
87711           }
87712           if (_option === 'force_remote') {
87713               return target.update({tags: remote.tags});
87714           }
87715
87716           var ccount = _conflicts.length;
87717           var o = base.tags || {};
87718           var a = target.tags || {};
87719           var b = remote.tags || {};
87720           var keys = reject(union(keys$1(o), keys$1(a), keys$1(b)), ignoreKey);
87721           var tags = clone(a);
87722           var changed = false;
87723
87724           for (var i = 0; i < keys.length; i++) {
87725               var k = keys[i];
87726
87727               if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
87728                   if (o[k] !== a[k]) {      // changed locally..
87729                       _conflicts.push(t('merge_remote_changes.conflict.tags',
87730                           { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
87731
87732                   } else {                  // unchanged locally, accept remote change..
87733                       if (b.hasOwnProperty(k)) {
87734                           tags[k] = b[k];
87735                       } else {
87736                           delete tags[k];
87737                       }
87738                       changed = true;
87739                   }
87740               }
87741           }
87742
87743           return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
87744       }
87745
87746
87747       //  `graph.base()` is the common ancestor of the two graphs.
87748       //  `localGraph` contains user's edits up to saving
87749       //  `remoteGraph` contains remote edits to modified nodes
87750       //  `graph` must be a descendent of `localGraph` and may include
87751       //      some conflict resolution actions performed on it.
87752       //
87753       //                  --- ... --- `localGraph` -- ... -- `graph`
87754       //                 /
87755       //  `graph.base()` --- ... --- `remoteGraph`
87756       //
87757       var action = function(graph) {
87758           var updates = { replacements: [], removeIds: [] };
87759           var base = graph.base().entities[id];
87760           var local = localGraph.entity(id);
87761           var remote = remoteGraph.entity(id);
87762           var target = osmEntity$$1(local, { version: remote.version });
87763
87764           // delete/undelete
87765           if (!remote.visible) {
87766               if (_option === 'force_remote') {
87767                   return actionDeleteMultiple([id])(graph);
87768
87769               } else if (_option === 'force_local') {
87770                   if (target.type === 'way') {
87771                       target = mergeChildren(target, uniq(local.nodes), updates, graph);
87772                       graph = updateChildren(updates, graph);
87773                   }
87774                   return graph.replace(target);
87775
87776               } else {
87777                   _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
87778                   return graph;  // do nothing
87779               }
87780           }
87781
87782           // merge
87783           if (target.type === 'node') {
87784               target = mergeLocation(remote, target);
87785
87786           } else if (target.type === 'way') {
87787               // pull in any child nodes that may not be present locally..
87788               graph.rebase(remoteGraph.childNodes(remote), [graph], false);
87789               target = mergeNodes(base, remote, target);
87790               target = mergeChildren(target, union(local.nodes, remote.nodes), updates, graph);
87791
87792           } else if (target.type === 'relation') {
87793               target = mergeMembers(remote, target);
87794           }
87795
87796           target = mergeTags(base, remote, target);
87797
87798           if (!_conflicts.length) {
87799               graph = updateChildren(updates, graph).replace(target);
87800           }
87801
87802           return graph;
87803       };
87804
87805
87806       action.withOption = function(opt) {
87807           _option = opt;
87808           return action;
87809       };
87810
87811
87812       action.conflicts = function() {
87813           return _conflicts;
87814       };
87815
87816
87817       return action;
87818   }
87819
87820   // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
87821   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
87822   function actionMove(moveIds, tryDelta, projection, cache) {
87823       var _delta = tryDelta;
87824
87825       function setupCache(graph) {
87826           function canMove(nodeId) {
87827               // Allow movement of any node that is in the selectedIDs list..
87828               if (moveIds.indexOf(nodeId) !== -1) return true;
87829
87830               // Allow movement of a vertex where 2 ways meet..
87831               var parents = map$3(graph.parentWays(graph.entity(nodeId)), 'id');
87832               if (parents.length < 3) return true;
87833
87834               // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
87835               var parentsMoving = every(parents, function(id) { return cache.moving[id]; });
87836               if (!parentsMoving) delete cache.moving[nodeId];
87837
87838               return parentsMoving;
87839           }
87840
87841           function cacheEntities(ids) {
87842               for (var i = 0; i < ids.length; i++) {
87843                   var id = ids[i];
87844                   if (cache.moving[id]) continue;
87845                   cache.moving[id] = true;
87846
87847                   var entity = graph.hasEntity(id);
87848                   if (!entity) continue;
87849
87850                   if (entity.type === 'node') {
87851                       cache.nodes.push(id);
87852                       cache.startLoc[id] = entity.loc;
87853                   } else if (entity.type === 'way') {
87854                       cache.ways.push(id);
87855                       cacheEntities(entity.nodes);
87856                   } else {
87857                       cacheEntities(entity.members.map(function(member) {
87858                           return member.id;
87859                       }));
87860                   }
87861               }
87862           }
87863
87864           function cacheIntersections(ids) {
87865               function isEndpoint(way, id) {
87866                   return !way.isClosed() && !!way.affix(id);
87867               }
87868
87869               for (var i = 0; i < ids.length; i++) {
87870                   var id = ids[i];
87871
87872                   // consider only intersections with 1 moved and 1 unmoved way.
87873                   var childNodes = graph.childNodes(graph.entity(id));
87874                   for (var j = 0; j < childNodes.length; j++) {
87875                       var node = childNodes[j];
87876                       var parents = graph.parentWays(node);
87877                       if (parents.length !== 2) continue;
87878
87879                       var moved = graph.entity(id);
87880                       var unmoved = null;
87881                       for (var k = 0; k < parents.length; k++) {
87882                           var way = parents[k];
87883                           if (!cache.moving[way.id]) {
87884                               unmoved = way;
87885                               break;
87886                           }
87887                       }
87888                       if (!unmoved) continue;
87889
87890                       // exclude ways that are overly connected..
87891                       if (intersection(moved.nodes, unmoved.nodes).length > 2) continue;
87892                       if (moved.isArea() || unmoved.isArea()) continue;
87893
87894                       cache.intersections.push({
87895                           nodeId: node.id,
87896                           movedId: moved.id,
87897                           unmovedId: unmoved.id,
87898                           movedIsEP: isEndpoint(moved, node.id),
87899                           unmovedIsEP: isEndpoint(unmoved, node.id)
87900                       });
87901                   }
87902               }
87903           }
87904
87905
87906           if (!cache) {
87907               cache = {};
87908           }
87909           if (!cache.ok) {
87910               cache.moving = {};
87911               cache.intersections = [];
87912               cache.replacedVertex = {};
87913               cache.startLoc = {};
87914               cache.nodes = [];
87915               cache.ways = [];
87916
87917               cacheEntities(moveIds);
87918               cacheIntersections(cache.ways);
87919               cache.nodes = filter(cache.nodes, canMove);
87920
87921               cache.ok = true;
87922           }
87923       }
87924
87925
87926       // Place a vertex where the moved vertex used to be, to preserve way shape..
87927       //
87928       //  Start:
87929       //      b ---- e
87930       //     / \
87931       //    /   \
87932       //   /     \
87933       //  a       c
87934       //
87935       //      *               node '*' added to preserve shape
87936       //     / \
87937       //    /   b ---- e      way `b,e` moved here:
87938       //   /     \
87939       //  a       c
87940       //
87941       //
87942       function replaceMovedVertex(nodeId, wayId, graph, delta) {
87943           var way = graph.entity(wayId);
87944           var moved = graph.entity(nodeId);
87945           var movedIndex = way.nodes.indexOf(nodeId);
87946           var len, prevIndex, nextIndex;
87947
87948           if (way.isClosed()) {
87949               len = way.nodes.length - 1;
87950               prevIndex = (movedIndex + len - 1) % len;
87951               nextIndex = (movedIndex + len + 1) % len;
87952           } else {
87953               len = way.nodes.length;
87954               prevIndex = movedIndex - 1;
87955               nextIndex = movedIndex + 1;
87956           }
87957
87958           var prev = graph.hasEntity(way.nodes[prevIndex]);
87959           var next = graph.hasEntity(way.nodes[nextIndex]);
87960
87961           // Don't add orig vertex at endpoint..
87962           if (!prev || !next) return graph;
87963
87964           var key = wayId + '_' + nodeId;
87965           var orig = cache.replacedVertex[key];
87966           if (!orig) {
87967               orig = osmNode();
87968               cache.replacedVertex[key] = orig;
87969               cache.startLoc[orig.id] = cache.startLoc[nodeId];
87970           }
87971
87972           var start, end;
87973           if (delta) {
87974               start = projection(cache.startLoc[nodeId]);
87975               end = projection.invert(geoVecAdd(start, delta));
87976           } else {
87977               end = cache.startLoc[nodeId];
87978           }
87979           orig = orig.move(end);
87980
87981           var angle = Math.abs(geoAngle(orig, prev, projection) -
87982                   geoAngle(orig, next, projection)) * 180 / Math.PI;
87983
87984           // Don't add orig vertex if it would just make a straight line..
87985           if (angle > 175 && angle < 185) return graph;
87986
87987           // moving forward or backward along way?
87988           var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
87989           var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
87990           var d1 = geoPathLength(p1);
87991           var d2 = geoPathLength(p2);
87992           var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
87993
87994           // moving around closed loop?
87995           if (way.isClosed() && insertAt === 0) insertAt = len;
87996
87997           way = way.addNode(orig.id, insertAt);
87998           return graph.replace(orig).replace(way);
87999       }
88000
88001
88002       // Remove duplicate vertex that might have been added by
88003       // replaceMovedVertex.  This is done after the unzorro checks.
88004       function removeDuplicateVertices(wayId, graph) {
88005           var way = graph.entity(wayId);
88006           var epsilon = 1e-6;
88007           var prev, curr;
88008
88009           function isInteresting(node, graph) {
88010               return graph.parentWays(node).length > 1 ||
88011                   graph.parentRelations(node).length ||
88012                   node.hasInterestingTags();
88013           }
88014
88015           for (var i = 0; i < way.nodes.length; i++) {
88016               curr = graph.entity(way.nodes[i]);
88017
88018               if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
88019                   if (!isInteresting(prev, graph)) {
88020                       way = way.removeNode(prev.id);
88021                       graph = graph.replace(way).remove(prev);
88022                   } else if (!isInteresting(curr, graph)) {
88023                       way = way.removeNode(curr.id);
88024                       graph = graph.replace(way).remove(curr);
88025                   }
88026               }
88027
88028               prev = curr;
88029           }
88030
88031           return graph;
88032       }
88033
88034
88035       // Reorder nodes around intersections that have moved..
88036       //
88037       //  Start:                way1.nodes: b,e         (moving)
88038       //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
88039       //      |                 vertex: b
88040       //      e                 isEP1: true,  isEP2, false
88041       //
88042       //  way1 `b,e` moved here:
88043       //  a ----- c = b - d
88044       //              |
88045       //              e
88046       //
88047       //  reorder nodes         way1.nodes: b,e
88048       //  a ----- c - b - d     way2.nodes: a,c,b,d
88049       //              |
88050       //              e
88051       //
88052       function unZorroIntersection(intersection$$1, graph) {
88053           var vertex = graph.entity(intersection$$1.nodeId);
88054           var way1 = graph.entity(intersection$$1.movedId);
88055           var way2 = graph.entity(intersection$$1.unmovedId);
88056           var isEP1 = intersection$$1.movedIsEP;
88057           var isEP2 = intersection$$1.unmovedIsEP;
88058
88059           // don't move the vertex if it is the endpoint of both ways.
88060           if (isEP1 && isEP2) return graph;
88061
88062           var nodes1 = without(graph.childNodes(way1), vertex);
88063           var nodes2 = without(graph.childNodes(way2), vertex);
88064
88065           if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
88066           if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
88067
88068           var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
88069           var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
88070           var loc;
88071
88072           // snap vertex to nearest edge (or some point between them)..
88073           if (!isEP1 && !isEP2) {
88074               var epsilon = 1e-6, maxIter = 10;
88075               for (var i = 0; i < maxIter; i++) {
88076                   loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
88077                   edge1 = geoChooseEdge(nodes1, projection(loc), projection);
88078                   edge2 = geoChooseEdge(nodes2, projection(loc), projection);
88079                   if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
88080               }
88081           } else if (!isEP1) {
88082               loc = edge1.loc;
88083           } else {
88084               loc = edge2.loc;
88085           }
88086
88087           graph = graph.replace(vertex.move(loc));
88088
88089           // if zorro happened, reorder nodes..
88090           if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
88091               way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
88092               graph = graph.replace(way1);
88093           }
88094           if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
88095               way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
88096               graph = graph.replace(way2);
88097           }
88098
88099           return graph;
88100       }
88101
88102
88103       function cleanupIntersections(graph) {
88104           for (var i = 0; i < cache.intersections.length; i++) {
88105               var obj = cache.intersections[i];
88106               graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
88107               graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
88108               graph = unZorroIntersection(obj, graph);
88109               graph = removeDuplicateVertices(obj.movedId, graph);
88110               graph = removeDuplicateVertices(obj.unmovedId, graph);
88111           }
88112
88113           return graph;
88114       }
88115
88116
88117       // check if moving way endpoint can cross an unmoved way, if so limit delta..
88118       function limitDelta(graph) {
88119           function moveNode(loc) {
88120               return geoVecAdd(projection(loc), _delta);
88121           }
88122
88123           for (var i = 0; i < cache.intersections.length; i++) {
88124               var obj = cache.intersections[i];
88125
88126               // Don't limit movement if this is vertex joins 2 endpoints..
88127               if (obj.movedIsEP && obj.unmovedIsEP) continue;
88128               // Don't limit movement if this vertex is not an endpoint anyway..
88129               if (!obj.movedIsEP) continue;
88130
88131               var node = graph.entity(obj.nodeId);
88132               var start = projection(node.loc);
88133               var end = geoVecAdd(start, _delta);
88134               var movedNodes = graph.childNodes(graph.entity(obj.movedId));
88135               var movedPath = map$3(map$3(movedNodes, 'loc'), moveNode);
88136               var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
88137               var unmovedPath = map$3(map$3(unmovedNodes, 'loc'), projection);
88138               var hits = geoPathIntersections(movedPath, unmovedPath);
88139
88140               for (var j = 0; i < hits.length; i++) {
88141                   if (isEqual(hits[j], end)) continue;
88142                   var edge = geoChooseEdge(unmovedNodes, end, projection);
88143                   _delta = geoVecSubtract(projection(edge.loc), start);
88144               }
88145           }
88146       }
88147
88148
88149       var action = function(graph) {
88150           if (_delta[0] === 0 && _delta[1] === 0) return graph;
88151
88152           setupCache(graph);
88153
88154           if (cache.intersections.length) {
88155               limitDelta(graph);
88156           }
88157
88158           for (var i = 0; i < cache.nodes.length; i++) {
88159               var node = graph.entity(cache.nodes[i]);
88160               var start = projection(node.loc);
88161               var end = geoVecAdd(start, _delta);
88162               graph = graph.replace(node.move(projection.invert(end)));
88163           }
88164
88165           if (cache.intersections.length) {
88166               graph = cleanupIntersections(graph);
88167           }
88168
88169           return graph;
88170       };
88171
88172
88173       action.delta = function() {
88174           return _delta;
88175       };
88176
88177
88178       return action;
88179   }
88180
88181   function actionMoveNode(nodeID, toLoc) {
88182
88183       var action = function(graph, t) {
88184           if (t === null || !isFinite(t)) t = 1;
88185           t = Math.min(Math.max(+t, 0), 1);
88186
88187           var node = graph.entity(nodeID);
88188           return graph.replace(
88189               node.move(geoVecInterp(node.loc, toLoc, t))
88190           );
88191       };
88192
88193       action.transitionable = true;
88194
88195       return action;
88196   }
88197
88198   function actionNoop() {
88199       return function(graph) {
88200           return graph;
88201       };
88202   }
88203
88204   /*
88205    * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
88206    */
88207   function actionOrthogonalize(wayId, projection) {
88208       var threshold = 12, // degrees within right or straight to alter
88209           lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
88210           upperThreshold = Math.cos(threshold * Math.PI / 180);
88211
88212
88213       var action = function(graph, t) {
88214           if (t === null || !isFinite(t)) t = 1;
88215           t = Math.min(Math.max(+t, 0), 1);
88216
88217           var way = graph.entity(wayId),
88218               nodes = graph.childNodes(way),
88219               points = uniq(nodes).map(function(n) { return projection(n.loc); }),
88220               corner = {i: 0, dotp: 1},
88221               epsilon = 1e-4,
88222               node, loc, score, motions, i, j;
88223
88224           if (points.length === 3) {   // move only one vertex for right triangle
88225               for (i = 0; i < 1000; i++) {
88226                   motions = points.map(calcMotion);
88227                   points[corner.i] = addPoints(points[corner.i], motions[corner.i]);
88228                   score = corner.dotp;
88229                   if (score < epsilon) {
88230                       break;
88231                   }
88232               }
88233
88234               node = graph.entity(nodes[corner.i].id);
88235               loc = projection.invert(points[corner.i]);
88236               graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
88237
88238           } else {
88239               var best,
88240                   originalPoints = clone(points);
88241               score = Infinity;
88242
88243               for (i = 0; i < 1000; i++) {
88244                   motions = points.map(calcMotion);
88245                   for (j = 0; j < motions.length; j++) {
88246                       points[j] = addPoints(points[j],motions[j]);
88247                   }
88248                   var newScore = squareness(points);
88249                   if (newScore < score) {
88250                       best = clone(points);
88251                       score = newScore;
88252                   }
88253                   if (score < epsilon) {
88254                       break;
88255                   }
88256               }
88257
88258               points = best;
88259
88260               for (i = 0; i < points.length; i++) {
88261                   // only move the points that actually moved
88262                   if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
88263                       loc = projection.invert(points[i]);
88264                       node = graph.entity(nodes[i].id);
88265                       graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
88266                   }
88267               }
88268
88269               // remove empty nodes on straight sections
88270               for (i = 0; t === 1 && i < points.length; i++) {
88271                   node = graph.entity(nodes[i].id);
88272
88273                   if (graph.parentWays(node).length > 1 ||
88274                       graph.parentRelations(node).length ||
88275                       node.hasInterestingTags()) {
88276                       continue;
88277                   }
88278
88279                   var dotp = normalizedDotProduct(i, points);
88280                   if (dotp < -1 + epsilon) {
88281                       graph = actionDeleteNode(node.id)(graph);
88282                   }
88283               }
88284           }
88285
88286           return graph;
88287
88288
88289           function calcMotion(b, i, array) {
88290               var a = array[(i - 1 + array.length) % array.length],
88291                   c = array[(i + 1) % array.length],
88292                   p = subtractPoints(a, b),
88293                   q = subtractPoints(c, b),
88294                   scale, dotp;
88295
88296               scale = 2 * Math.min(geoVecLength(p, [0, 0]), geoVecLength(q, [0, 0]));
88297               p = normalizePoint(p, 1.0);
88298               q = normalizePoint(q, 1.0);
88299
88300               dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
88301
88302               // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
88303               if (array.length > 3) {
88304                   if (dotp < -0.707106781186547) {
88305                       dotp += 1.0;
88306                   }
88307               } else if (dotp && Math.abs(dotp) < corner.dotp) {
88308                   corner.i = i;
88309                   corner.dotp = Math.abs(dotp);
88310               }
88311
88312               return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
88313           }
88314       };
88315
88316
88317       function squareness(points) {
88318           return points.reduce(function(sum, val, i, array) {
88319               var dotp = normalizedDotProduct(i, array);
88320
88321               dotp = filterDotProduct(dotp);
88322               return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
88323           }, 0);
88324       }
88325
88326
88327       function normalizedDotProduct(i, points) {
88328           var a = points[(i - 1 + points.length) % points.length],
88329               b = points[i],
88330               c = points[(i + 1) % points.length],
88331               p = subtractPoints(a, b),
88332               q = subtractPoints(c, b);
88333
88334           p = normalizePoint(p, 1.0);
88335           q = normalizePoint(q, 1.0);
88336
88337           return p[0] * q[0] + p[1] * q[1];
88338       }
88339
88340
88341       function subtractPoints(a, b) {
88342           return [a[0] - b[0], a[1] - b[1]];
88343       }
88344
88345
88346       function addPoints(a, b) {
88347           return [a[0] + b[0], a[1] + b[1]];
88348       }
88349
88350
88351       function normalizePoint(point, scale) {
88352           var vector = [0, 0];
88353           var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
88354           if (length !== 0) {
88355               vector[0] = point[0] / length;
88356               vector[1] = point[1] / length;
88357           }
88358
88359           vector[0] *= scale;
88360           vector[1] *= scale;
88361
88362           return vector;
88363       }
88364
88365
88366       function filterDotProduct(dotp) {
88367           if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
88368               return dotp;
88369           }
88370
88371           return 0;
88372       }
88373
88374
88375       action.disabled = function(graph) {
88376           var way = graph.entity(wayId),
88377               nodes = graph.childNodes(way),
88378               points = uniq(nodes).map(function(n) { return projection(n.loc); });
88379
88380           if (squareness(points)) {
88381               return false;
88382           }
88383
88384           return 'not_squarish';
88385       };
88386
88387
88388       action.transitionable = true;
88389
88390
88391       return action;
88392   }
88393
88394   // `actionRestrictTurn` creates a turn restriction relation.
88395   //
88396   // `turn` must be an `osmTurn` object
88397   // see osm/intersection.js, pathToTurn()
88398   //
88399   // This specifies a restriction of type `restriction` when traveling from
88400   // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
88401   // (The action does not check that these entities form a valid intersection.)
88402   //
88403   // From, to, and via ways should be split before calling this action.
88404   // (old versions of the code would split the ways here, but we no longer do it)
88405   //
88406   // For testing convenience, accepts a restrictionID to assign to the new
88407   // relation. Normally, this will be undefined and the relation will
88408   // automatically be assigned a new ID.
88409   //
88410   function actionRestrictTurn(turn, restrictionType, restrictionID) {
88411
88412       return function(graph) {
88413           var fromWay = graph.entity(turn.from.way);
88414           var toWay = graph.entity(turn.to.way);
88415           var viaNode = turn.via.node && graph.entity(turn.via.node);
88416           var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
88417           var members = [];
88418
88419           members.push({ id: fromWay.id, type: 'way',  role: 'from' });
88420
88421           if (viaNode) {
88422               members.push({ id: viaNode.id,  type: 'node', role: 'via' });
88423           } else if (viaWays) {
88424               viaWays.forEach(function(viaWay) {
88425                   members.push({ id: viaWay.id,  type: 'way', role: 'via' });
88426               });
88427           }
88428
88429           members.push({ id: toWay.id, type: 'way',  role: 'to' });
88430
88431           return graph.replace(osmRelation({
88432               id: restrictionID,
88433               tags: {
88434                   type: 'restriction',
88435                   restriction: restrictionType
88436               },
88437               members: members
88438           }));
88439       };
88440   }
88441
88442   function actionRevert(id) {
88443       var action = function(graph) {
88444           var entity = graph.hasEntity(id),
88445               base = graph.base().entities[id];
88446
88447           if (entity && !base) {    // entity will be removed..
88448               if (entity.type === 'node') {
88449                   graph.parentWays(entity)
88450                       .forEach(function(parent) {
88451                           parent = parent.removeNode(id);
88452                           graph = graph.replace(parent);
88453
88454                           if (parent.isDegenerate()) {
88455                               graph = actionDeleteWay(parent.id)(graph);
88456                           }
88457                       });
88458               }
88459
88460               graph.parentRelations(entity)
88461                   .forEach(function(parent) {
88462                       parent = parent.removeMembersWithID(id);
88463                       graph = graph.replace(parent);
88464
88465                       if (parent.isDegenerate()) {
88466                           graph = actionDeleteRelation(parent.id)(graph);
88467                       }
88468                   });
88469           }
88470
88471           return graph.revert(id);
88472       };
88473
88474       return action;
88475   }
88476
88477   function actionRotate(rotateIds, pivot, angle, projection) {
88478
88479       var action = function(graph) {
88480           return graph.update(function(graph) {
88481               utilGetAllNodes(rotateIds, graph).forEach(function(node) {
88482                   var point = geoRotate([projection(node.loc)], angle, pivot)[0];
88483                   graph = graph.replace(node.move(projection.invert(point)));
88484               });
88485           });
88486       };
88487
88488       return action;
88489   }
88490
88491   /* Built-in method references for those with the same name as other `lodash` methods. */
88492   var nativeMax$8 = Math.max;
88493
88494   /**
88495    * Gets the index at which the first occurrence of `value` is found in `array`
88496    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
88497    * for equality comparisons. If `fromIndex` is negative, it's used as the
88498    * offset from the end of `array`.
88499    *
88500    * @static
88501    * @memberOf _
88502    * @since 0.1.0
88503    * @category Array
88504    * @param {Array} array The array to inspect.
88505    * @param {*} value The value to search for.
88506    * @param {number} [fromIndex=0] The index to search from.
88507    * @returns {number} Returns the index of the matched value, else `-1`.
88508    * @example
88509    *
88510    * _.indexOf([1, 2, 1, 2], 2);
88511    * // => 1
88512    *
88513    * // Search from the `fromIndex`.
88514    * _.indexOf([1, 2, 1, 2], 2, 2);
88515    * // => 3
88516    */
88517   function indexOf(array, value, fromIndex) {
88518     var length = array == null ? 0 : array.length;
88519     if (!length) {
88520       return -1;
88521     }
88522     var index = fromIndex == null ? 0 : toInteger(fromIndex);
88523     if (index < 0) {
88524       index = nativeMax$8(length + index, 0);
88525     }
88526     return baseIndexOf(array, value, index);
88527   }
88528
88529   // Split a way at the given node.
88530   //
88531   // Optionally, split only the given ways, if multiple ways share
88532   // the given node.
88533   //
88534   // This is the inverse of `iD.actionJoin`.
88535   //
88536   // For testing convenience, accepts an ID to assign to the new way.
88537   // Normally, this will be undefined and the way will automatically
88538   // be assigned a new ID.
88539   //
88540   // Reference:
88541   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
88542   //
88543   function actionSplit(nodeId, newWayIds) {
88544       var _wayIDs;
88545
88546       // If the way is closed, we need to search for a partner node
88547       // to split the way at.
88548       //
88549       // The following looks for a node that is both far away from
88550       // the initial node in terms of way segment length and nearby
88551       // in terms of beeline-distance. This assures that areas get
88552       // split on the most "natural" points (independent of the number
88553       // of nodes).
88554       // For example: bone-shaped areas get split across their waist
88555       // line, circles across the diameter.
88556       function splitArea(nodes, idxA, graph) {
88557           var lengths = new Array(nodes.length);
88558           var length;
88559           var i;
88560           var best = 0;
88561           var idxB;
88562
88563           function wrap(index) {
88564               return utilWrap(index, nodes.length);
88565           }
88566
88567           function dist(nA, nB) {
88568               var locA = graph.entity(nA).loc;
88569               var locB = graph.entity(nB).loc;
88570               var epsilon = 1e-6;
88571               return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
88572           }
88573
88574           // calculate lengths
88575           length = 0;
88576           for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
88577               length += dist(nodes[i], nodes[wrap(i-1)]);
88578               lengths[i] = length;
88579           }
88580
88581           length = 0;
88582           for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
88583               length += dist(nodes[i], nodes[wrap(i+1)]);
88584               if (length < lengths[i])
88585                   lengths[i] = length;
88586           }
88587
88588           // determine best opposite node to split
88589           for (i = 0; i < nodes.length; i++) {
88590               var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
88591               if (cost > best) {
88592                   idxB = i;
88593                   best = cost;
88594               }
88595           }
88596
88597           return idxB;
88598       }
88599
88600
88601       function split(graph, wayA, newWayId) {
88602           var wayB = osmWay({id: newWayId, tags: wayA.tags});   // `wayB` is the NEW way
88603           var origNodes = wayA.nodes.slice();
88604           var nodesA;
88605           var nodesB;
88606           var isArea = wayA.isArea();
88607           var isOuter = osmIsSimpleMultipolygonOuterMember(wayA, graph);
88608
88609           if (wayA.isClosed()) {
88610               var nodes = wayA.nodes.slice(0, -1);
88611               var idxA = indexOf(nodes, nodeId);
88612               var idxB = splitArea(nodes, idxA, graph);
88613
88614               if (idxB < idxA) {
88615                   nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
88616                   nodesB = nodes.slice(idxB, idxA + 1);
88617               } else {
88618                   nodesA = nodes.slice(idxA, idxB + 1);
88619                   nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
88620               }
88621           } else {
88622               var idx = indexOf(wayA.nodes, nodeId, 1);
88623               nodesA = wayA.nodes.slice(0, idx + 1);
88624               nodesB = wayA.nodes.slice(idx);
88625           }
88626
88627           wayA = wayA.update({nodes: nodesA});
88628           wayB = wayB.update({nodes: nodesB});
88629
88630           graph = graph.replace(wayA);
88631           graph = graph.replace(wayB);
88632
88633           graph.parentRelations(wayA).forEach(function(relation) {
88634               var member;
88635
88636               // Turn restrictions - make sure:
88637               // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
88638               //    (whichever one is connected to the VIA node/ways)
88639               // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
88640               if (relation.isRestriction()) {
88641                   var f = relation.memberByRole('from');
88642                   var v = relation.membersByRole('via');
88643                   var t = relation.memberByRole('to');
88644                   var i;
88645
88646                   // 1. split a FROM/TO
88647                   if (f.id === wayA.id || t.id === wayA.id) {
88648                       var keepB = false;
88649                       if (v.length === 1 && v[0].type === 'node') {   // check via node
88650                           keepB = wayB.contains(v[0].id);
88651                       } else {                                        // check via way(s)
88652                           for (i = 0; i < v.length; i++) {
88653                               if (v[i].type === 'way') {
88654                                   var wayVia = graph.hasEntity(v[i].id);
88655                                   if (wayVia && intersection(wayB.nodes, wayVia.nodes).length) {
88656                                       keepB = true;
88657                                       break;
88658                                   }
88659                               }
88660                           }
88661                       }
88662
88663                       if (keepB) {
88664                           relation = relation.replaceMember(wayA, wayB);
88665                           graph = graph.replace(relation);
88666                       }
88667
88668                   // 2. split a VIA
88669                   } else {
88670                       for (i = 0; i < v.length; i++) {
88671                           if (v[i].type === 'way' && v[i].id === wayA.id) {
88672                               member = {
88673                                   id: wayB.id,
88674                                   type: 'way',
88675                                   role: 'via'
88676                               };
88677                               graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
88678                               break;
88679                           }
88680                       }
88681                   }
88682
88683               // All other relations (Routes, Multipolygons, etc):
88684               // 1. Both `wayA` and `wayB` remain in the relation
88685               // 2. But must be inserted as a pair (see `actionAddMember` for details)
88686               } else {
88687                   if (relation === isOuter) {
88688                       graph = graph.replace(relation.mergeTags(wayA.tags));
88689                       graph = graph.replace(wayA.update({tags: {}}));
88690                       graph = graph.replace(wayB.update({tags: {}}));
88691                   }
88692
88693                   member = {
88694                       id: wayB.id,
88695                       type: 'way',
88696                       role: relation.memberById(wayA.id).role
88697                   };
88698
88699                   var insertPair = {
88700                       originalID: wayA.id,
88701                       insertedID: wayB.id,
88702                       nodes: origNodes
88703                   };
88704
88705                   graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
88706               }
88707           });
88708
88709           if (!isOuter && isArea) {
88710               var multipolygon = osmRelation({
88711                   tags: assignIn({}, wayA.tags, {type: 'multipolygon'}),
88712                   members: [
88713                       {id: wayA.id, role: 'outer', type: 'way'},
88714                       {id: wayB.id, role: 'outer', type: 'way'}
88715                   ]
88716               });
88717
88718               graph = graph.replace(multipolygon);
88719               graph = graph.replace(wayA.update({tags: {}}));
88720               graph = graph.replace(wayB.update({tags: {}}));
88721           }
88722
88723           return graph;
88724       }
88725
88726
88727       var action = function(graph) {
88728           var candidates = action.ways(graph);
88729           for (var i = 0; i < candidates.length; i++) {
88730               graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
88731           }
88732           return graph;
88733       };
88734
88735
88736       action.ways = function(graph) {
88737           var node = graph.entity(nodeId);
88738           var parents = graph.parentWays(node);
88739           var hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
88740
88741           return parents.filter(function(parent) {
88742               if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
88743                   return false;
88744
88745               if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
88746                   return false;
88747
88748               if (parent.isClosed()) {
88749                   return true;
88750               }
88751
88752               for (var i = 1; i < parent.nodes.length - 1; i++) {
88753                   if (parent.nodes[i] === nodeId) {
88754                       return true;
88755                   }
88756               }
88757
88758               return false;
88759           });
88760       };
88761
88762
88763       action.disabled = function(graph) {
88764           var candidates = action.ways(graph);
88765           if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length))
88766               return 'not_eligible';
88767       };
88768
88769
88770       action.limitWays = function(_) {
88771           if (!arguments.length) return _wayIDs;
88772           _wayIDs = _;
88773           return action;
88774       };
88775
88776
88777       return action;
88778   }
88779
88780   /*
88781    * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
88782    */
88783   function actionStraighten(wayId, projection) {
88784
88785       function positionAlongWay(n, s, e) {
88786           return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1])) /
88787                   (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
88788       }
88789
88790
88791       var action = function(graph, t) {
88792           if (t === null || !isFinite(t)) t = 1;
88793           t = Math.min(Math.max(+t, 0), 1);
88794
88795           var way = graph.entity(wayId),
88796               nodes = graph.childNodes(way),
88797               points = nodes.map(function(n) { return projection(n.loc); }),
88798               startPoint = points[0],
88799               endPoint = points[points.length-1],
88800               toDelete = [],
88801               i;
88802
88803           for (i = 1; i < points.length-1; i++) {
88804               var node = nodes[i],
88805                   point = points[i];
88806
88807               if (t < 1 || graph.parentWays(node).length > 1 ||
88808                   graph.parentRelations(node).length ||
88809                   node.hasInterestingTags()) {
88810
88811                   var u = positionAlongWay(point, startPoint, endPoint),
88812                       p = [
88813                           startPoint[0] + u * (endPoint[0] - startPoint[0]),
88814                           startPoint[1] + u * (endPoint[1] - startPoint[1])
88815                       ],
88816                       loc2 = projection.invert(p);
88817
88818                   graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
88819
88820               } else {
88821                   // safe to delete
88822                   if (toDelete.indexOf(node) === -1) {
88823                       toDelete.push(node);
88824                   }
88825               }
88826           }
88827
88828           for (i = 0; i < toDelete.length; i++) {
88829               graph = actionDeleteNode(toDelete[i].id)(graph);
88830           }
88831
88832           return graph;
88833       };
88834
88835
88836       action.disabled = function(graph) {
88837           // check way isn't too bendy
88838           var way = graph.entity(wayId),
88839               nodes = graph.childNodes(way),
88840               points = nodes.map(function(n) { return projection(n.loc); }),
88841               startPoint = points[0],
88842               endPoint = points[points.length-1],
88843               threshold = 0.2 * geoVecLength(startPoint, endPoint),
88844               i;
88845
88846           if (threshold === 0) {
88847               return 'too_bendy';
88848           }
88849
88850           for (i = 1; i < points.length-1; i++) {
88851               var point = points[i],
88852                   u = positionAlongWay(point, startPoint, endPoint),
88853                   p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
88854                   p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
88855                   dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
88856
88857               // to bendy if point is off by 20% of total start/end distance in projected space
88858               if (isNaN(dist) || dist > threshold) {
88859                   return 'too_bendy';
88860               }
88861           }
88862       };
88863
88864
88865       action.transitionable = true;
88866
88867
88868       return action;
88869   }
88870
88871   // `actionUnrestrictTurn` deletes a turn restriction relation.
88872   //
88873   // `turn` must be an `osmTurn` object with a `restrictionID` property.
88874   // see osm/intersection.js, pathToTurn()
88875   //
88876   function actionUnrestrictTurn(turn) {
88877       return function(graph) {
88878           return actionDeleteRelation(turn.restrictionID)(graph);
88879       };
88880   }
88881
88882   /* Reflect the given area around its axis of symmetry */
88883   function actionReflect(reflectIds, projection) {
88884       var useLongAxis = true;
88885
88886
88887       // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
88888       // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
88889       function getSmallestSurroundingRectangle(graph, nodes) {
88890           var points = nodes.map(function(n) { return projection(n.loc); }),
88891               hull = d3_polygonHull(points),
88892               centroid = d3_polygonCentroid(hull),
88893               minArea = Infinity,
88894               ssrExtent = [],
88895               ssrAngle = 0,
88896               c1 = hull[0];
88897
88898           for (var i = 0; i <= hull.length - 1; i++) {
88899               var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1],
88900                   angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]),
88901                   poly = geoRotate(hull, -angle, centroid),
88902                   extent = poly.reduce(function(extent, point) {
88903                           return extent.extend(geoExtent$$1(point));
88904                       }, geoExtent$$1()),
88905                   area = extent.area();
88906
88907               if (area < minArea) {
88908                   minArea = area;
88909                   ssrExtent = extent;
88910                   ssrAngle = angle;
88911               }
88912               c1 = c2;
88913           }
88914
88915           return {
88916               poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
88917               angle: ssrAngle
88918           };
88919       }
88920
88921
88922       var action = function(graph, t) {
88923           if (t === null || !isFinite(t)) t = 1;
88924           t = Math.min(Math.max(+t, 0), 1);
88925
88926           var nodes = utilGetAllNodes(reflectIds, graph),
88927               ssr = getSmallestSurroundingRectangle(graph, nodes);
88928
88929           // Choose line pq = axis of symmetry.
88930           // The shape's surrounding rectangle has 2 axes of symmetry.
88931           // Reflect across the longer axis by default.
88932           var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ],
88933               q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ],
88934               p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ],
88935               q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
88936               p, q;
88937
88938           var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
88939           if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
88940               p = p1;
88941               q = q1;
88942           } else {
88943               p = p2;
88944               q = q2;
88945           }
88946
88947           // reflect c across pq
88948           // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
88949           var dx = q[0] - p[0];
88950           var dy = q[1] - p[1];
88951           var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
88952           var b = 2 * dx * dy / (dx * dx + dy * dy);
88953           for (var i = 0; i < nodes.length; i++) {
88954               var node = nodes[i];
88955               var c = projection(node.loc);
88956               var c2 = [
88957                   a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
88958                   b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
88959               ];
88960               var loc2 = projection.invert(c2);
88961               node = node.move(geoVecInterp(node.loc, loc2, t));
88962               graph = graph.replace(node);
88963           }
88964
88965           return graph;
88966       };
88967
88968
88969       action.useLongAxis = function(_) {
88970           if (!arguments.length) return useLongAxis;
88971           useLongAxis = _;
88972           return action;
88973       };
88974
88975
88976       action.transitionable = true;
88977
88978
88979       return action;
88980   }
88981
88982   function actionDetachNode(nodeID) {
88983
88984       var action = function(graph) {
88985           var node = graph.entity(nodeID);
88986
88987           // Create a new node to replace the one we will detach
88988           var replacement = osmNode({ loc: node.loc });
88989           graph = graph.replace(replacement);
88990
88991           // Process each way in turn, updating the graph as we go
88992           graph = graph.parentWays(node)
88993               .reduce(function(accGraph, parentWay) {
88994                   return accGraph.replace(parentWay.replaceNode(nodeID, replacement.id));
88995               }, graph);
88996
88997           // Process any relations too
88998           return graph.parentRelations(node)
88999               .reduce(function(accGraph, parentRel) {
89000                   return accGraph.replace(parentRel.replaceMember(node, replacement));
89001               }, graph);
89002       };
89003
89004
89005       action.disabled = function(graph) {
89006           var node = graph.entity(nodeID);
89007           var parentRels = graph.parentRelations(node);
89008
89009           for (var i = 0; i < parentRels.length; i++) {
89010               var relation = parentRels[i];
89011               if (!relation.isValidRestriction()) continue;
89012
89013               for (var j = 0; j < relation.members.length; j++) {
89014                   var m = relation.members[j];
89015                   if (m.id === nodeID && (m.role === 'via' || m.role === 'location_hint')) {
89016                       return 'restriction';
89017                   }
89018               }
89019           }
89020
89021           return false;
89022       };
89023
89024
89025       return action;
89026   }
89027
89028
89029
89030   var index$6 = /*#__PURE__*/Object.freeze({
89031     d3combobox: d3combobox
89032   });
89033
89034   var Connection = services.osm;
89035
89036   var debug = false;
89037
89038   var iD = /*#__PURE__*/Object.freeze({
89039     Connection: Connection,
89040     debug: debug,
89041     lib: index$6,
89042     d3: index$3,
89043     Context: coreContext,
89044     setAreaKeys: setAreaKeys,
89045     Difference: coreDifference,
89046     Graph: coreGraph$$1,
89047     History: coreHistory,
89048     Tree: coreTree,
89049     geoCross: geoVecCross,
89050     geoInterp: geoVecInterp,
89051     geoRoundCoordinates: geoVecFloor,
89052     geoEuclideanDistance: geoVecLength,
89053     Entity: osmEntity$$1,
89054     Node: osmNode,
89055     Relation: osmRelation,
89056     Way: osmWay,
89057     BackgroundSource: rendererBackgroundSource,
89058     Background: rendererBackground,
89059     Features: rendererFeatures,
89060     Map: rendererMap,
89061     TileLayer: rendererTileLayer,
89062     Detect: utilDetect,
89063     uiPreset: uiPresetEditor,
89064     actionAddEntity: actionAddEntity,
89065     actionAddMember: actionAddMember,
89066     actionAddMidpoint: actionAddMidpoint,
89067     actionAddVertex: actionAddVertex,
89068     actionChangeMember: actionChangeMember,
89069     actionChangePreset: actionChangePreset,
89070     actionChangeTags: actionChangeTags,
89071     actionCircularize: actionCircularize,
89072     actionConnect: actionConnect,
89073     actionCopyEntities: actionCopyEntities,
89074     actionDeleteMember: actionDeleteMember,
89075     actionDeleteMultiple: actionDeleteMultiple,
89076     actionDeleteNode: actionDeleteNode,
89077     actionDeleteRelation: actionDeleteRelation,
89078     actionDeleteWay: actionDeleteWay,
89079     actionDeprecateTags: actionDeprecateTags,
89080     actionDiscardTags: actionDiscardTags,
89081     actionDisconnect: actionDisconnect,
89082     actionJoin: actionJoin,
89083     actionMerge: actionMerge,
89084     actionMergeNodes: actionMergeNodes,
89085     actionMergePolygon: actionMergePolygon,
89086     actionMergeRemoteChanges: actionMergeRemoteChanges,
89087     actionMove: actionMove,
89088     actionMoveNode: actionMoveNode,
89089     actionNoop: actionNoop,
89090     actionOrthogonalize: actionOrthogonalize,
89091     actionRestrictTurn: actionRestrictTurn,
89092     actionReverse: actionReverse,
89093     actionRevert: actionRevert,
89094     actionRotate: actionRotate,
89095     actionSplit: actionSplit,
89096     actionStraighten: actionStraighten,
89097     actionUnrestrictTurn: actionUnrestrictTurn,
89098     actionReflect: actionReflect,
89099     actionDetachNode: actionDetachNode,
89100     behaviorAddWay: behaviorAddWay,
89101     behaviorBreathe: behaviorBreathe,
89102     behaviorCopy: behaviorCopy,
89103     behaviorDrag: behaviorDrag,
89104     behaviorDrawWay: behaviorDrawWay,
89105     behaviorDraw: behaviorDraw,
89106     behaviorEdit: behaviorEdit,
89107     behaviorHash: behaviorHash,
89108     behaviorHover: behaviorHover,
89109     behaviorLasso: behaviorLasso,
89110     behaviorOperation: behaviorOperation,
89111     behaviorPaste: behaviorPaste,
89112     behaviorSelect: behaviorSelect,
89113     behaviorTail: behaviorTail,
89114     coreContext: coreContext,
89115     coreDifference: coreDifference,
89116     coreGraph: coreGraph$$1,
89117     coreHistory: coreHistory,
89118     coreTree: coreTree,
89119     data: data,
89120     dataWikipedia: wikipedia$2,
89121     dataAddressFormats: dataAddressFormats,
89122     dataDeprecated: dataDeprecated,
89123     dataDiscarded: dataDiscarded,
89124     dataLocales: dataLocales,
89125     dataPhoneFormats: dataPhoneFormats,
89126     dataShortcuts: dataShortcuts,
89127     dataImperial: dataImperial,
89128     dataDriveLeft: dataDriveLeft,
89129     dataEn: en,
89130     geoExtent: geoExtent$$1,
89131     geoLatToMeters: geoLatToMeters,
89132     geoLonToMeters: geoLonToMeters,
89133     geoMetersToLat: geoMetersToLat,
89134     geoMetersToLon: geoMetersToLon,
89135     geoMetersToOffset: geoMetersToOffset,
89136     geoOffsetToMeters: geoOffsetToMeters,
89137     geoScaleToZoom: geoScaleToZoom,
89138     geoSphericalDistance: geoSphericalDistance,
89139     geoZoomToScale: geoZoomToScale,
89140     geoAngle: geoAngle,
89141     geoChooseEdge: geoChooseEdge,
89142     geoEdgeEqual: geoEdgeEqual,
89143     geoHasLineIntersections: geoHasLineIntersections,
89144     geoHasSelfIntersections: geoHasSelfIntersections,
89145     geoRotate: geoRotate,
89146     geoLineIntersection: geoLineIntersection,
89147     geoPathHasIntersections: geoPathHasIntersections,
89148     geoPathIntersections: geoPathIntersections,
89149     geoPathLength: geoPathLength,
89150     geoPointInPolygon: geoPointInPolygon,
89151     geoPolygonContainsPolygon: geoPolygonContainsPolygon,
89152     geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
89153     geoViewportEdge: geoViewportEdge,
89154     geoRawMercator: geoRawMercator,
89155     geoVecAdd: geoVecAdd,
89156     geoVecAngle: geoVecAngle,
89157     geoVecCross: geoVecCross,
89158     geoVecDot: geoVecDot,
89159     geoVecEqual: geoVecEqual,
89160     geoVecFloor: geoVecFloor,
89161     geoVecInterp: geoVecInterp,
89162     geoVecLength: geoVecLength,
89163     geoVecSubtract: geoVecSubtract,
89164     geoVecScale: geoVecScale,
89165     modeAddArea: modeAddArea$$1,
89166     modeAddLine: modeAddLine$$1,
89167     modeAddPoint: modeAddPoint$$1,
89168     modeAddNote: modeAddNote$$1,
89169     modeBrowse: modeBrowse,
89170     modeDragNode: modeDragNode$$1,
89171     modeDragNote: modeDragNote$$1,
89172     modeDrawArea: modeDrawArea,
89173     modeDrawLine: modeDrawLine,
89174     modeMove: modeMove$$1,
89175     modeRotate: modeRotate$$1,
89176     modeSave: modeSave$$1,
89177     modeSelect: modeSelect,
89178     modeSelectData: modeSelectData$$1,
89179     modeSelectNote: modeSelectNote$$1,
89180     operationCircularize: operationCircularize,
89181     operationContinue: operationContinue,
89182     operationDelete: operationDelete,
89183     operationDisconnect: operationDisconnect,
89184     operationMerge: operationMerge,
89185     operationMove: operationMove,
89186     operationOrthogonalize: operationOrthogonalize,
89187     operationReflectShort: operationReflectShort,
89188     operationReflectLong: operationReflectLong,
89189     operationReverse: operationReverse,
89190     operationRotate: operationRotate,
89191     operationSplit: operationSplit,
89192     operationStraighten: operationStraighten,
89193     operationDetachNode: operationDetachNode,
89194     osmChangeset: osmChangeset,
89195     osmEntity: osmEntity$$1,
89196     osmNode: osmNode,
89197     osmNote: osmNote,
89198     osmRelation: osmRelation,
89199     osmWay: osmWay,
89200     osmIntersection: osmIntersection,
89201     osmTurn: osmTurn,
89202     osmInferRestriction: osmInferRestriction,
89203     osmLanes: osmLanes,
89204     osmIsSimpleMultipolygonOuterMember: osmIsSimpleMultipolygonOuterMember,
89205     osmSimpleMultipolygonOuterMember: osmSimpleMultipolygonOuterMember,
89206     osmJoinWays: osmJoinWays,
89207     osmOneWayTags: osmOneWayTags,
89208     osmPavedTags: osmPavedTags,
89209     osmIsInterestingTag: osmIsInterestingTag,
89210     presetCategory: presetCategory,
89211     presetCollection: presetCollection,
89212     presetField: presetField,
89213     presetPreset: presetPreset,
89214     presetIndex: presetIndex,
89215     rendererBackgroundSource: rendererBackgroundSource,
89216     rendererBackground: rendererBackground,
89217     rendererFeatures: rendererFeatures,
89218     rendererMap: rendererMap,
89219     rendererTileLayer: rendererTileLayer,
89220     services: services,
89221     serviceMapillary: serviceMapillary,
89222     serviceNominatim: serviceNominatim,
89223     serviceOpenstreetcam: serviceOpenstreetcam,
89224     serviceOsm: serviceOsm,
89225     serviceStreetside: serviceStreetside,
89226     serviceTaginfo: serviceTaginfo,
89227     serviceVectorTile: serviceVectorTile,
89228     serviceWikidata: serviceWikidata,
89229     serviceWikipedia: serviceWikipedia,
89230     svgAreas: svgAreas$$1,
89231     svgData: svgData$$1,
89232     svgDebug: svgDebug$$1,
89233     svgDefs: svgDefs,
89234     svgIcon: svgIcon,
89235     svgLabels: svgLabels,
89236     svgLayers: svgLayers,
89237     svgLines: svgLines$$1,
89238     svgMapillaryImages: svgMapillaryImages$$1,
89239     svgMapillarySigns: svgMapillarySigns$$1,
89240     svgMidpoints: svgMidpoints$$1,
89241     svgNotes: svgNotes$$1,
89242     svgMarkerSegments: svgMarkerSegments,
89243     svgOpenstreetcamImages: svgOpenstreetcamImages$$1,
89244     svgOsm: svgOsm,
89245     svgPassiveVertex: svgPassiveVertex,
89246     svgPath: svgPath,
89247     svgPointTransform: svgPointTransform,
89248     svgPoints: svgPoints$$1,
89249     svgRelationMemberTags: svgRelationMemberTags,
89250     svgSegmentWay: svgSegmentWay,
89251     svgStreetside: svgStreetside$$1,
89252     svgTagClasses: svgTagClasses,
89253     svgTouch: svgTouch,
89254     svgTurns: svgTurns,
89255     svgVertices: svgVertices$$1,
89256     uiFields: uiFields,
89257     uiFieldDefaultCheck: uiFieldCheck,
89258     uiFieldOnewayCheck: uiFieldCheck,
89259     uiFieldCheck: uiFieldCheck,
89260     uiFieldMultiCombo: uiFieldCombo,
89261     uiFieldNetworkCombo: uiFieldCombo,
89262     uiFieldSemiCombo: uiFieldCombo,
89263     uiFieldTypeCombo: uiFieldCombo,
89264     uiFieldCombo: uiFieldCombo,
89265     uiFieldUrl: uiFieldText,
89266     uiFieldNumber: uiFieldText,
89267     uiFieldTel: uiFieldText,
89268     uiFieldEmail: uiFieldText,
89269     uiFieldText: uiFieldText,
89270     uiFieldAccess: uiFieldAccess,
89271     uiFieldAddress: uiFieldAddress,
89272     uiFieldCycleway: uiFieldCycleway,
89273     uiFieldLanes: uiFieldLanes,
89274     uiFieldLocalized: uiFieldLocalized,
89275     uiFieldMaxspeed: uiFieldMaxspeed,
89276     uiFieldStructureRadio: uiFieldRadio,
89277     uiFieldRadio: uiFieldRadio,
89278     uiFieldRestrictions: uiFieldRestrictions,
89279     uiFieldTextarea: uiFieldTextarea,
89280     uiFieldWikidata: uiFieldWikidata,
89281     uiFieldWikipedia: uiFieldWikipedia,
89282     uiIntro: uiIntro,
89283     uiInfoPanels: uiInfoPanels,
89284     uiPanelBackground: uiPanelBackground,
89285     uiPanelHistory: uiPanelHistory,
89286     uiPanelLocation: uiPanelLocation,
89287     uiPanelMeasurement: uiPanelMeasurement,
89288     uiSettingsCustomBackground: uiSettingsCustomBackground,
89289     uiSettingsCustomData: uiSettingsCustomData,
89290     uiInit: uiInit,
89291     uiAccount: uiAccount,
89292     uiAttribution: uiAttribution,
89293     uiBackground: uiBackground,
89294     uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
89295     uiBackgroundOffset: uiBackgroundOffset,
89296     uiChangesetEditor: uiChangesetEditor,
89297     uiCmd: uiCmd,
89298     uiCommit: uiCommit,
89299     uiCommitChanges: uiCommitChanges,
89300     uiCommitWarnings: uiCommitWarnings,
89301     uiConfirm: uiConfirm,
89302     uiConflicts: uiConflicts,
89303     uiContributors: uiContributors,
89304     uiCurtain: uiCurtain,
89305     uiDataEditor: uiDataEditor$$1,
89306     uiDataHeader: uiDataHeader,
89307     uiDisclosure: uiDisclosure,
89308     uiEditMenu: uiEditMenu,
89309     uiEntityEditor: uiEntityEditor,
89310     uiFeatureInfo: uiFeatureInfo,
89311     uiFeatureList: uiFeatureList,
89312     uiField: uiField,
89313     uiFieldHelp: uiFieldHelp,
89314     uiFlash: uiFlash,
89315     uiFormFields: uiFormFields,
89316     uiFullScreen: uiFullScreen,
89317     uiGeolocate: uiGeolocate,
89318     uiHelp: uiHelp,
89319     uiInfo: uiInfo,
89320     uiInspector: uiInspector,
89321     uiLasso: uiLasso,
89322     uiLoading: uiLoading,
89323     uiMapData: uiMapData,
89324     uiMapInMap: uiMapInMap,
89325     uiModal: uiModal,
89326     uiModes: uiModes,
89327     uiNotice: uiNotice,
89328     uiNoteComments: uiNoteComments,
89329     uiNoteEditor: uiNoteEditor$$1,
89330     uiNoteHeader: uiNoteHeader,
89331     uiNoteReport: uiNoteReport,
89332     uiPresetEditor: uiPresetEditor,
89333     uiPresetIcon: uiPresetIcon,
89334     uiPresetList: uiPresetList,
89335     uiRadialMenu: uiRadialMenu,
89336     uiRawMemberEditor: uiRawMemberEditor,
89337     uiRawMembershipEditor: uiRawMembershipEditor,
89338     uiRawTagEditor: uiRawTagEditor,
89339     uiRestore: uiRestore,
89340     uiSave: uiSave,
89341     uiScale: uiScale,
89342     uiSelectionList: uiSelectionList,
89343     uiSidebar: uiSidebar$$1,
89344     uiSourceSwitch: uiSourceSwitch,
89345     uiSpinner: uiSpinner,
89346     uiSplash: uiSplash,
89347     uiStatus: uiStatus,
89348     uiSuccess: uiSuccess$$1,
89349     uiTagReference: uiTagReference,
89350     uiToggle: uiToggle,
89351     uiTooltipHtml: uiTooltipHtml,
89352     uiUndoRedo: uiUndoRedo,
89353     uiVersion: uiVersion,
89354     uiViewOnOSM: uiViewOnOSM,
89355     uiZoom: uiZoom,
89356     utilAsyncMap: utilAsyncMap,
89357     utilCallWhenIdle: utilCallWhenIdle,
89358     utilCleanTags: utilCleanTags,
89359     utilDisplayName: utilDisplayName,
89360     utilDisplayNameForPath: utilDisplayNameForPath,
89361     utilDisplayType: utilDisplayType,
89362     utilEditDistance: utilEditDistance,
89363     utilEntitySelector: utilEntitySelector,
89364     utilEntityOrMemberSelector: utilEntityOrMemberSelector,
89365     utilEntityOrDeepMemberSelector: utilEntityOrDeepMemberSelector,
89366     utilFastMouse: utilFastMouse,
89367     utilFunctor: utilFunctor,
89368     utilGetAllNodes: utilGetAllNodes,
89369     utilGetPrototypeOf: utilGetPrototypeOf,
89370     utilGetSetValue: utilGetSetValue,
89371     utilHashcode: utilHashcode,
89372     utilHighlightEntity: utilHighlightEntity,
89373     utilIdleWorker: utilIdleWorker,
89374     utilKeybinding: utilKeybinding,
89375     utilNoAuto: utilNoAuto,
89376     utilPrefixCSSProperty: utilPrefixCSSProperty,
89377     utilPrefixDOMProperty: utilPrefixDOMProperty,
89378     utilQsString: utilQsString,
89379     utilRebind: utilRebind,
89380     utilSetTransform: utilSetTransform,
89381     utilSessionMutex: utilSessionMutex,
89382     utilStringQs: utilStringQs,
89383     utilTagText: utilTagText,
89384     utilTiler: utilTiler,
89385     utilTriggerEvent: utilTriggerEvent,
89386     utilWrap: utilWrap,
89387     d3combobox: d3combobox,
89388     validationDeprecatedTag: validationDeprecatedTag,
89389     validationDisconnectedHighway: validationDisconnectedHighway,
89390     validationManyDeletions: validationManyDeletions,
89391     validationMissingTag: validationMissingTag,
89392     validationOldMultipolygon: validationOldMultipolygon,
89393     validationTagSuggestsArea: validationTagSuggestsArea
89394   });
89395
89396   window.iD = iD;
89397
89398 }());
89399 //# sourceMappingURL=iD.js.map